在项目中如何进行DWR框架的配置文件及应用示例.docx
《在项目中如何进行DWR框架的配置文件及应用示例.docx》由会员分享,可在线阅读,更多相关《在项目中如何进行DWR框架的配置文件及应用示例.docx(18页珍藏版)》请在冰豆网上搜索。
在项目中如何进行DWR框架的配置文件及应用示例
1.1在项目中如何进行DWR框架的配置文件及应用示例
1.1.1DWR框架的系统配置文件dwr.xml中的标签定义说明
1、DWR框架的系统配置文件基本的格式
任何一个dwr.xml的文件都需要包含DWRDOCTYPE的声明行,格式定义示例如下:
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEdwrPUBLIC"-//GetAheadLimited//DTDDirectWebRemoting1.0//EN""http:
//www.getahead.ltd.uk/dwr/dwr10.dtd">
(1)而对于DWR2.X版
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEdwrPUBLIC"-//GetAheadLimited//DTDDirectWebRemoting2.0//EN""http:
//www.getahead.ltd.uk/dwr//dwr20.dtd">
(2)而对于DWR3.X版
DOCTYPEdwrPUBLIC"-//GetAheadLimited//DTDDirectWebRemoting3.0//EN""http:
//getahead.org/dwr/dwr30.dtd">
2、DWR框架的系统配置文件中整个配置文件的大体结构定义示例
...
其中的标签是申明被用来创建远程beans而且这个类能被用来转换,在init部分中的定义只是告诉DWR框架在项目中存在有这些扩展类,并给出了如何使用它们的信息,但他们还没有被使用。
这种方式很像Java程序中的import语句,多数程序类需要在使用前先采用import语句进行引用说明,但是只有import语句并不表明这个程序类已经被程序代码使用了。
每一个creator标签和converter标签都要定义有id属性,以便在后面的配置定义中使用它们。
3、DWR框架的系统配置文件中的各个组成标签
(1)标签
利用它来实现对远程对象(服务器端的JavaBean组件)转变为客户端的JavaScript对象。
(2)标签
利用它来实现将服务器端的某中类的类型转变为JavaScript中能够识别的对象类型。
(3)签名(Signatures)
1.1.2DWR框架的系统配置文件dwr.xml中的标签的说明
1、dwr.xml文件中的标签的一般结构
下面的标签实现Java类的对象创建的配置定义。
...
2、dwr.xml文件具体的应用示例
上面的配置信息表示将java.util.Date提供给客户端调用,并且引用名称是JDate。
当我们在客户端调用JDate.toString(reply)时,后台将采用java.util.Date的默认构造方法创建一个实例,然后调用实例的toString方法。
客户端的javascript将返回给reply对象(此时reply是java.util.Date的字符串形式)。
3、标签中的各个属性
(1)标签的作用是告诉DWR应当公开给Ajax请求的服务器端类以及该类中的方法
并定义DWR应当如何获得要进行远程的类的实例,因此上面的标签表示将java.util.Date类暴露为JavaScript代码中的JDate类。
这样,开发人员就可以直接在JavaScript以JDate类的方式来实现对服务器端的java.util.Date类进行访问。
(2)creator属性是必须要定义的
它用来指定使用那种“创造器”(采用什么形式创建对象),默认情况下DWR1.1版本有8种创造器,它们分别是:
1)new(新建出该对象)
用Java的new关键字创造对象(其中的creator属性被设置为值new表示要创建对象实例)
这意味着DWR应当调用类的默认构造函数来获得实例----因此,在我们的JavaBean中应该提供一个默认构造函数。
并且默认情况下,实例化的对象处于页面范围内,因此请求完成之后就不再可用----当然,我们也可以通过scope="application"来设置为其它的作用范围。
2)none:
它不创建出某个客户端对象
none创造器不创建任何对象-----要调用的方法是静态的,这时不需要创建对象。
此时我们仍然需要class参数,用来告诉DWR此时操作的对象类型是什么。
Jmath.sin();
3)scripted:
通过BSF使用脚本语言创建对象,例如BeanShell或Groovy。
如果我们不想每个请求都新建一个对象,所有请求使用一个实例(单例对象)。
我们可以这样配置(但需要bsf.jar---apache的开源API-bsf.jar)
[CDATA[
importcom.px1987.Sington;
returnSington.getInstance();
]]>
4)spring(将在SpringIoC容器中所创建出的Bean对象直接转换为客户端的JavaScript)
通过Spring框架访问Bean。
5)jsf:
使用JSF的Bean
6)struts:
使用Struts的FormBean
7)pageflow:
访问Beehive或Weblogic的PageFlow
(3)create标签中的javascript属性指定从JavaScript代码访问对象时使用的名称。
(4)scope属性(非常类似Servlet规范中的scope)
它允许我们指定这个bean在什么生命范围,选项下面的几种
1)application
2)session
3)request
4)page
这些值对于Servlet和JSP开发者来说应该相当熟悉了。
其中scope属性是可选的。
默认是"page"。
如果要使用"session"需要cookies。
(5)嵌套在create标签元素内的param子标签元素指定creator要创建对象的Java类名称
param元素用来为创造器指定其它参数,每种构造器各有不同。
例如,“new”创造器需要知道要创建的对象类型是什么。
每一个创造器的参数请参考前面各个示例。
(6)include标签元素指定应当公开的方法的名称
显式地说明要公开的方法是避免偶然间允许访问有害功能的良好实践——如果漏了这个元素,类的所有方法都会公开给远程调用。
反过来,可以用exclude元素指定那些想防止被访问的方法。
value="com.px1987.dwrexampl.model.TimeInfoJavaBean"/>
(7)标签的功能及定义示例
它与前面的include标签相反。
value="com.px1987.dwrexampl.model.TimeInfoJavaBean"/>
(8)auth标签元素允许我们指定一个J2EE的角色作为将来的访问控制检查
4、DWR框架的配置文件dwr.xml中的标签的说明
(1)主要的作用
转换器在客户端和服务器之间(也就是JavaScript—Java之间)转换数据类型(用户自己定义的类的类型)
convert元素的作用是告诉DWR在服务器端Java对象表示和序列化的JavaScript之间如何转换用户自定义的数据类型。
如果在类中把一个对象作为参数(例如A.method(Bb)),从javascript调用此方法时,DWR需要了解如何把javascript传过来的参数自动转为对应的JavaBean的对象。
(2)DWR自动地在Java和JavaScript表示之间调整简单(标准)数据类型
这些类型包括Java原生类型和它们各自的类表示,还有String、Date、数组和集合类型。
DWR也能把JavaBean转换成JavaScript表示,但是出于安全性的原因,做这件事要求我们显式的配置-----也就是要利用标签。
默认情况下,如下数据类型不需要定义就可以自动由DWR来进行转换:
1)所有的原生(基本)的数据类型
boolean,byte,short,int,long,float,double,char
2)原生类型的对象类型
java.lang.Boolean、java.lang.Byte、java.lang.Short、java.lang.Integer、java.lang.Long、java.lang.Float、java.lang.Double和java.lang.Character、java.math.BigInteger和java.math.BigDecimal等等
3)java.lang.String
4)java.util.Date和java.sql包中的Date类
注意:
因此,当开发人员对服务器端中的某个JavaBean组件中的方法进行调用时,如果输入参数或者输出参数是上面的数据类型时,开发人员都不需要进行自己定义转换(利用下面的标签)。
(3)关于Date转换器的注意问题
Date转换器负责在Javascript的Date类型与Java中的Date类型(java.util.Date,java.sql.Date,java.sql.Timesorjava.sql.Timestamp)之间进行转换。
同基础的转换器一样,Date转换器默认是支持的。
如果我们有一个Javascript的字符串(例如"01Jan2010"),我们想把它转换成Java的Date类型-----则有两个办法:
在javascript中用Date.parse()把它解析成Date类型,然后用DWR的Date转换器传递给服务器;或者把前面的Javascript的字符串传递给服务器端的方法,再用Java中的SimpleDateFormat(或者类似的)来解析。
同样,如果我们有个Java的Date类型并且希望在HTML使用它------我们可以先用SimpleDateFormat把它转换成字符串再使用。
也可以直接传Date给Javascript,然后用Javascript格式化。
(4)以上类型所组成的数组
数组实体不太容易理解,默认情况下DWR能转换所有原生类型的数组,还有所有marshallable对象的数组。
这些marshallable对象包括前面介绍的String和Date类型。
(5)以上类型的集合类型(Lists,Sets,Maps,Iterators等)
1)各种服务器端Java中的集合类型转换为JavaScript中的数组。
2)所应该注意的是
仅仅通过反射方法是无法知道集合元素中的数据类型,我们可以应用dwr.xml文件的签名(Signatures)配置部分设置类型的转换处理过程(请见下面的说明)。
(6)从DOM,XOM,JDOM和DOM4J中的DOM对象(类似Element和Document)
DWR自动将DOM、DOM4J、JDOM和XOM转换成DOM树------并且都仅仅返回Document、Element和Node。
DWR会自动将这些转换成浏览器DOM对象,通常在启动JDOMConverter时会有一个提示信息。
除非我们想采用JDOMconverter否则可以忽略。
.
INFO:
Missingclassdefforconverter'jdom'.Failedtoloaduk.ltd.getahead.dwr.convert.JDOMConverter.Cause:
org/jdom/Document
因为DWR没有办法知道我们是否采用JDOMconverter,所以提示信息是info级别。
如果我们想采用JDOMconverter,则必须很清楚地知道JDOMconverter是否可以被加载,这就是DWR保留上面的提示信息的原因。
4、标签的应用示例
(1)如果在项目中存在有一个VO类
该VO类UserInfoVO的程序代码定义如下:
packagecom.px1987.dwrexample.model;
publicclassUserInfoVO{
...
publicjava.lang.IntegergetId(){
returnid;
}
publicvoidsetId(java.lang.Integerid){
this.id=id;
this.hashCode=Integer.MIN_VALUE;
}
publicjava.lang.StringgetUserName(){
returnuserName;
}
publicvoidsetUserName(java.lang.Stringusername){
this.userName=username;
}
publicjava.lang.StringgetPasswd(){
returnpasswd;
}
publicvoidsetPasswd(java.lang.Stringpasswd){
this.passwd=passwd;
}
....
}
(2)在dwr.xml文件中开发人员可以采用下面的配置定义来设置前面的UserInfoVO程序类
converter="bean"match="com.px1987.dwrexample.model.UserInfoVO">
注意:
1)converter="bean"属性指定转换的方式采用Java中的JavaBean标准命名规范
2)match="com.px1987.dwrexample.model.UserInfoVO"属性指定要转换的JavaBean的类名称(全局)
3)标签指定要转换的JavaBean的各个属性。
(3)对标签的说明
上面的convert元素告诉DWR用自己基于Introspection(自检)的bean转换器处理com.test.UserInfo类中的公开方法返回的UserInfo类(该类为VO类或者POJO类)
并指定序列化中应当包含UserInfo类的哪个成员-----成员的命名指定要采用JavaBean中的标准命名规范,所以DWR会调用对应的get方法-----从而允许类型com.test.UserInfo类的对象在服务器和客户机之间传输。
1)可以为某一个单独的类打开转换器
match="com.px1987.dwrexample.model.UserInfoVO"/>
2)如果要允许转换一个包或者子包下面的所有类,我们可以这样写:
3)如果需要转换所有的JavaBean:
(4)对标签中的include和exclude的含义
限制属性转换仅仅对于Bean有意义,很明显基本类型的转换是不要需要这个功能的,所以只有BeanConverter及其子类型(HibernateBeanConverter))有这个功能。
这就保证了DWR不会调用UserInfo.getName()和UserInfo.getId两个方法。
另外如果我们喜欢“白名单”而不是“黑名单”的话,则可以采用include来罗列出:
安全上比较好的设计是使用“白名单”而不是“黑名单”。
5、标签的应用示例
(1)在示例项目中添加TimeInfoVOBean程序类
packagecom.px1987.dwrexampl.model;
publicclassTimeInfoVOBean{
privateStringhourText;
privateStringminuteText;
privateStringsecondText;
publicTimeInfoVOBean(){
}
publicStringgetHourText(){
returnhourText;
}
publicvoidsetHourText(StringhourText){
this.hourText=hourText;
}
publicStringgetMinuteText(){
returnminuteText;
}
publicvoidsetMinuteText(StringminuteText){
this.minuteText=minuteText;
}
publicStringgetSecondText(){
returnsecondText;
}
publicvoidsetSecondText(StringsecondText){
this.secondText=secondText;
}
}
(2)业务类TimeInfoJavaBean的程序代码示例
packagecom.px1987.dwrexampl.model;
importjava.util.*;
publicclassTimeInf