




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
如何开始用DWR
有两种方法开始DWR,简单的方式是下载WAR文件然后看看。但是这不能帮你知道如何轻松的把DWR整合到你的
web应用中,所以还是推荐你按照下面的3个步弊做:
1.安装DWR的Jar包
卜,载dwr.jar文件之把它放到你的webapp的WEBTNF/lib目录卜。那里可能已经有很多其他的jar文件了。
2.编辑配置文件
需要把下面的代码加到WEB-INF/web.xml文件中。〈servlet)那部分需要和其他的〈servlet)在一起,
<servlet-mapping)部分也一样,
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<disp1a)^-name>DWRServlet</display-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-naine>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
在WEB-1NF目录下的web.xml旁边创建•个dwr.xml文件。可以从最简单的配置开始:
<!DOCTYPEdwrPUBLIC
Z,-//GetAheadLimited//DTDDirectWebRemoting1.0〃EN〃
“http:〃www.gctahcad.ltd.uk/dwr/dwr10.dtd”>
<dwr>
<allow>
<createcreator—new”javascript=,,JDatc,>
<paramname="class”value="java.util.Date”/)
</create>
<createcreator="new"javascript="Demo”>
<paramname="class”valueiyour.java.Bean,7>
</create>
</allow>
</dwr>
DWR配置文件定义了那些DWR会创建提供远程调用的Javascript类。在上面的例子中我们定义了两个类来提供远
程调用,并为其提供的Javascript类的名字。
在上面我们使用了new创建器,它会调用没有参数的构造函数来创建实例,但是所有JavaBean必须有这一构造
函数。还要注意DWR有一些限制:
小
不要出现Javascript保留关键字:和保留关键字同名的函数指定被排除。多数
Javascript的关键字和Java是相同的。所以你不可能有一个方法叫做"try。,但是
该死"delete。”对与Javascript有着特殊意义,而对Java则不是。
Javascript方法重载是不支持的,所以尽量不要再Java中使用。
3.访问下面的URL
http://IocaIhost:8080/[YOUR-WEBAPP]/dwr/
你可以看见•个页面,里面有第二步中的类。接着往里点,你会看到所有可以调用的方法列发。这个页面是动态
生成用来测试的例子。
自己动手试一下!
怎么在你的web应用中使用
在文档中有很多例子演示如何动态更改页面中的文字、更新列表、操作表单,还有直接更改table中的内容。每
一个都有如何实现的介绍。
另一种方式是看刚才的页面中提供的代码:
到http://localhost:8080/\[vOUR-WEBAPP\]/dwr/页面,点击你的类。查看源码,找到执行方法的那几行,把
那些文字粘贴到你的HTML或JSE中。
要包括下面这些能产生神奇效果的Javascript文件的锌接。
<script
src='/[YOUR-WEBAPP]/dwr/interface/[YOUR-SCRTPT].js*></script>
<scriptsrc=,/[YOUR-WEBAPP]/dwr/engine.js*></script>
你也可以把其中/[YOUR-WEBAPP:/替换成你的web页面的相对路径。
DWR根据dwr.xml生成和Java代码类似的Javascript代码。
相对而言Java同步调用,创建与Java代码匹配的Ajax远程调用接口的最大挑战来至与实现Ajax的异步调用特
性。
DWR通过引入回调函数来解决这个问题,当结果被返回时,DWR会调月这个函数。
有两种推荐的方式来使用DWR实现远程方法调用。可以通过把回调函数放在参数列表里,也可以把I可调函数放到
元数据对象里。
当然也可以把回调函数做为第一个参数,但是不建议使用这种方法。因为这种方法在处理自动处理http对象时(查
看"AllernativeMelhod")上会有问题。这个方法主要是为向下兼容而存在的。
简单的回调函数
假设你有一个这样的Java方法:
publicclassRemote{
publicStringgetData(intindex){...}
}
我们可以在Javascript中这样使用:
<scripttype=〃texl/javascript”
src^^[WEBAPP]/dwr/interface/Remote.js,z></script>
<scripttype="text/javascript”
src=,/FWEBAPPl/dwr/engine.js,z></script>
•••
functionhandleGetData(str){
alert(str);
)
Remote.getData(42,handleGetData);
42是Java方法getDataO的一个参数。
此外你也可以使用这种覆缩格式:
Remote.getData(42,function(str){alert(str);});
调用元数据对象(Meta-Data)
另外一种语法时使用"调用元数据对象”来指定【可调函数和其他的选项。上面的例子可以写成这样:
Remote.getData(42,{
callback:function(str){alert(str);}
});
这种方法有很多优点:易于阅读,更重要的指定额外的调用选项。
超时和错误处理
在回调函数的元数据中你可以指定超时和错误的处理方式。例如:
Remote.getData(42,{
calIback:function(str){alert(str);),
timeout:5000,
errorHandler:function(message){alert(''Oops:"+message);)
});
查找回调函数
有些情况下我们很难区分各种回调选项(记住,Javascript是不支持函数市载的)。例如:
Remote.method({timeout:3},{errorHandler:somefunc});
这两个参数之一是bean的参数,另一个是元数据对象,但是我们不能清楚的告诉DWR哪个是哪个。为了可以跨
浏览器,我们假定null==undefined。所以当前的情况,规则是:
•如果第•个或最后•个是•个函数,那么它就是回调函数,没有元数据对象,并且其他参数都是Java
的方法参数。
•另外,如果最后一个参数是一个对象,这个对象中有一个calIback成员,并且它是个函数,那么这个
对象就是元数据对象,其他的都是Java方法参数。
•另外,如果第一个参数是null,我们就假设没有回调函数,并且其他的都是Java方法参数。尽管如
此,我们会检杳最后一个参数是不是null,如果是就发出警告。
•最后如果最后一个参数是null,那么就没有callback函装。
•另外,发出错误信号拈个糟糕的请求格式。
创造一个与Java对象匹配的Javascript对象
假设你有这样的Java方法:
publicclassRemote(
publicvoidsetPerson(Personp){
this.person=p;
)
)
Person对象的结构是这样的:
publicPerson{
privateStringname;
privateintage;
privateDate[]appointments;
//gettersandsetters
)
那么你可以在Javascript中这样写:
varp={
name:^FredBloggs”,
age:42,
appointments:[newDate(),newDate(z,lJan2008〃)]
);
Remote.setPerson(p);
在Javascript没有出现的字段,在Java中就不会被设置。
因为setter都是返回'void',我们就不相要使用callback函数了。如果你想要一个返同void的服务端方法的
完整版,你也可以加上callback函数。很明显DWR不会向它传递任何参数。
TransformerFactoryConfigurationError
这个问题的现象是在启动有DWR的谭eb应用时出现如下slacktrace
rootcause
javax.xml.transform.TransformerFactoryConfigurationError:
Providerorg.apache,xalan.processor.TransformerFactorylmplnot
found
javax.xml.transform.TransformerFactory.newlnstance(Unknown
Source)
这个问题和DWR没有什么关系,那是因为Tomcat没有配置好。比较简单的解决办法是下载Xalan替换掉
STOMCAT-IIOME/common/lib目录下的xalan.jar文件。【州R2.0能更好的处理这个问题,但是本质的问题还是因为
DWR的XML序列化需要有XSLT解析器的支持。
如果你用JDK5还是有这个问题的话,你可以增加以卜.VM参数来使Tomcat正常工作。
-Djavax.xml.transform.TransformerFactory=
com.sun.org.apache,xalan.internal,xsltc.trax.TransformerFactoryI
mpl
XML解析错误
在刚开始用DWR的时候经常遇到的•个错误就是XML解析错误。其实这和DWR没有■多大关系,主要是因为Tomcat
里面自带的Xerces的问题,要不是该有的时候没有,要不是不该有的时候有了。
♦JDK1.3白身没有XML解析器,所以你需要xcrccshupl.jar和xiiilyis.jar.
•JDK1.4.0和JDK1.4.1虽然有了XML解析器,但是有很多bug,所以你还是需要把xerceslmpl.jar
放至ljLomcat\conmon\endorsed目录下。
•JDK1.4.2和JDK5后带的XML解析器工作的很好,你就不需要再加其他的了。
另外要提的一点是,不同版本的Tomcal需要的XML解析器不一样。所以要注意检查它和JDK的版本兼
容性。
用BEAWeblogic的Classpath问题
Weblogic8.1(有可能其他版本同样)可能找不到DWR的类。
这大多出现在dwr.jar放在AP4INF目录卜.(APP」NF/lib)的情况。在这种情况卜DWR依然可以工作,例如debug
页面可以看见,但是DWR找不到你的类。
解决办法是把dwr.jar放到WEB-INF/lib目录下。
没有cookies的情况下用DWR
当不能用cookies时,servlet规范通过CRL重写来支持HttpSession«DWR2.x通过它生成的URL来支持这项功
能。但是DWRLx没有这个功能。你可以通过以下办法让DWR1.x也支持cookies:
•从dwr.jar中提取engine.js,保存到你的文件系统中,就像jsp文件一样.
•修改"DW'REngine.sendDala=Junction(batch)方法,加入一行:
statslnfo十=“;jsessionid="+<%="'"+session.getld()+“'%>
这样就可以让DWR1.X支持url重写了。DWR2+默认支持。
传递额外的数据到callback函数
通常我们需要传递额外的数据到callback函数,但是因为所有的回调函数都只有•个参数(远程方法的返回结
果3这就需要一些小技巧了。
解决方案就是使用Javascript的闭包以特性。
例如,你的回调函数原本需要像这个样子:
functioncalIbackFunc(dataEromServer,dataFromBrowser){
//用dataFromServer和dataFromBrowser做些事情
)
那么你可以像这个组织你的函数:
vardataFromBrowser=…;
//定义一个闭包函数来存储dataFromBrowser的引用,并调用
dataFromServer
varcallbackProxy=function(dataFromServer){
calIbackFunc(dataFromServer,dataFromBrowser);
};
varcal1MetaData={cal1back:cal1backProxy};
Remote,method(params,cal1MetaData);
(调用元数据在脚本介绍中有•解蟀)
换句话说,现在你作为callback函数传递过来的不是一个真正的callback,他只是一个做为代理的闭包,用来
传递客户端的数据。
你可以用更简介的形式:
vardataFromBrowser二…;
Remote,method(params,{
calIback:function(dataFromServer){
callbackl;unc(dataEromServer,dataFromBrowser);
}
});
服务器性能优化
CPU瓶颈:经过严格的测试DWR的性能没什么问题。DWR上性能消耗同web服务器和网络比起来可以忽略不计。如
果你真的需耍提升DWR的性能的话,可以把log级别设置ERROR或FATAL,但是土要还是耍看你的编码情况。
Network瓶颈:DWR没有管理你的浏览器缓存的功能,所以它会不断的重复读取DWR的javascript文件。这里有
一个简单的解决办法,把javascript文件复制到你的wcb-app中,这样web服务器就可以更好的利用它了。你
也可以考虑把所有的javascript文件合并成一个文件,然后用DOJO的压缩程序用处理一个来节省流量。
我们可以做一个补丁,让DWR在web-app启动的时候用时间做为javascript文件的时间戳,但是这个并不十分
重要,因为上面的补丁太简单了而且可以压缩合并Javascript文件。
WEB-INF/web.xml参考手册
在web.xml中最简单的配置就是简单加入DWR的servlet,没有这个配置DWR就不会起作用:
<servlet>
<servlet-name>dwr-invoker</servlet-naine>
<servlet-class>uk.Itd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
〈servlet-mapping〉
<servlet-name>dwr-invoker</servlet-nanie>
<url-pattern>/dwr/*</url-pattern>
〈/servlet-mapping)
此外还可以加入一些重要和有一用的参数。
Logging
DWR可以工作在JDK1.3h,而JDK1.3不支持java.util,logging,但是我们想强迫任何人使用commons-logging
或者log4j,所以当没有logging类的时候DWR就使用HttpServlet.log。方法。尽管如此,如果DWR发现了
commons-logging,就是使用它,
Commons-Logging
几乎每一个人都在使用commons-logging我因为大多数的servlet容器在使用它。所以如果你的web应用中没
有明显的加入commonsTogging包,它也会默认的配置好。
在这种情况下,logging是由java,util,loggin炉或者12gll产配置文件控制的。详细配置查看文档。
HttpServlet.log()
如果你用HttpServlet.log(),下面的配置控制logging:
<init-param>
<param-name>1ogLeveK/param-name>
<param-value>DEBUG</param-value>
</init-param>
可用的值有:FATAL,ERROR,WARN(默认),INFO和DEBUG.
多个dwr.xml文件和J2EE安全
一般来说,你只需要一个dwr.xnl文件,并且放置在默认的位置:WEB-INF/dwr.xmlo如果那样的话,你可以不
用了解下面的配置。
有三个原因使你希望指定不同位置的dwr.xml文件。
•你希望让dwr.xml文件和它能访问到的资源在一起。在这种情况下你需要一个这样的配置:
<param-value>WEB-I^F/classes/com/yourco/dwr/dwr.xml\/param-value>o
•你有大量的远程调用类,希望把他们分成多个文件。在这种情况下你需要重复卜面的配置几次,每一个
中有不同的param-name,并且以'config'开头。DNR会依次把他们都读进来。
•DWR可以使用Servlet规范的J2EE的URL安全机制来给不同的用户不同的访问权限。你只需要简单的
定义多个dwrservlet,并且制定不同的名字,url和访问叹限。
如果你希望使用这一功能.那么语法是这样的:
<init-param>
<param-name>config*****</param-name>
<param-value>WEB-lNF/dwr.xml</param-value>
<description>Whatconfigfiledoweuse?</description>
</init-param>
在这里config*****意思是paramname要以字符串config开头。这个参数可以根据需要使用多次,但是不能相
同。
•个使用J2EE的安全机制的例子:
<servlet>
<servlet-name>dwr-user-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRScrvlet</servlet-class>
<init-param>
<param-name>config-user</param-name>
<param-value>WEB-INF/dwr-user.xml</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>dwr-admin-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config-admin</param-name>
<param-valuc>WEB-INF/dwr-admin.xml</param-va1uc>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-admin-invoker</servlet-name>
<url-pattern>/dwradmin/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dwr-user-invoker</servlet-name>
<url-pattern>/dwruser/*</url-pattern>
</servlet-mapping>
<security-constraint>
<display-name>dwr-admin</display-name)
<web-resource-collection>
<wcb-resourcc-name>dwr-adniin-collection</web-resource-name>
<url-pattern>/dwradmin/*</url-pattern>
〈/web-resource-collection)
<auth-constraint>
<role-name>admin</ro1e_name>
Gauth-constraint〉
</security-constraint>
<security-constraint>
<display-name>dwr-user</display-name>
<web-resource-col1ection>
<web-resource-name>dwr-user-collection</web-resource-name>
<url-pattern>/dwruser/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>
使用插件(Plug-in)
DWR里的很多部件都是可插入的,所以可以通过替换掉DWR的默认实现类来改变其功能。你可以在<init-Param>
中的paratn-name中指定你要替换的接口,并在param-value中指定自己的接口实现类。
可插入点是:
•uk.ltd.getahead.dwr.AccessControl
•uk.ltd.getahead.dwr.Configuration
•uk.Itd.gctahcad.dwr.ConverterManagcr
•uk.ltd.getahead.dwr.CreatorManager
•uk.ltd.getahead.dwr.Processor
•uk.ltd.getahead.dwr.ExecutionContext
这些可插入点默认的实现都在uk.ltd.getahead.dwr.impl中。
使用debug/test模式
你可以通过下面的参数让DWR进入debug/test模式:
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
在debug模式里,DWR会为每•个远程调用类生成•个测试页面。这对于检查DWR是否工作和工作的怎么样站很
有用的。这个模式还可以警告你一些存在的问题:javascript保留字问题,或者函数重我问题。
尽管如此,这个模式不应该使用在实际部署环境里面,因为它可以为攻击者提供你的服务的大量信息。如果你的
网站设计的好的话,这些信息不会耕助攻击者窥视你的网站内容,但是还是不要给任何人一个找到你错误的机会
好。
DWR就是照上面的样子做的,没有任何保证,所以你的网站的安全是沐的责任。请小心。
配置DWR-dwr.xml
dwr.xml是DWR的配置文件。默认情况下,应该把它放到WEBIW目录(web.xml的目录)下。
DTD
这里还有•个dwr.xml对应的DTD文档演以及•个用DTDDo产生成的参考手册勤
创建dwr.xml文件
dwr.xml文件的结构如下:
<!D0CTYPEdwrPUBLIC
/z-//GetAheadLirnited//DTDDirectWebRemoving1.0〃EN〃
“http:〃www.getahead.Itcl.uk/dwr/dwrlO.dtd〃>
<dwr>
<!-initisonlyneededifyouareextendingDWR->
<init>
<creatorclass="..."/>
<converterid="…"class=
</init>
<!-withoutallow,DWRisn,tallowedtodoanything—>
<allow>
<createcreator—].."javascript=,\..?,/>
<convertconverter=〃…"match=〃…7>
</allow>
<!-youmayneedtotellDWRaboutmethodsignatures->
<signatures>
</signatures>
</dwr>
术语
这里是一些必须理解的术语-参数会被converted,远程Bean会被created。所以如果你有一个叫A的beam
它有一个方法叫A.blah(B)那么你需要一个A的creator和一个B的converter<.
<allow>
。〃加段落里面定义的试DWR可以创建和转换的关。
Creators
我们要调用的每个类都需要一个<create...>定义。creator有几种。比较通用的是new关键字和Spring.更多
的信息可以参见[Crealers]文科。
Converters
我们必须保证所有的参数都可以被转换。JDK中的多数类型已经有转换器了,但是你需要给DWR转换你的代码的
权利。一般来说Javaliean的参数需要一个〈convert...>定义。
默认情况下,如下类型不需要定义就可以转换:
•所有的原生类型boolean,ini,double,等等
•原生类型的对象类型Boolean,Integer,等等
•java.lang.String
•java.util.Date和SQL中的Date
以上类型组成的数组
以上类型的集合类型(Lists,Sets,Maps,Iterators,等)
从DOM,XOM,JDOM和D0M4J中的DOM对象(类似Eleraeni和Document)
要了解如何转换你的JavaBean或者其他类型的参数请查看Conveners文档。
<init>
可选的init部分用来声明创造bean的类和转换bean的类。多数情况下你不需要用到他们。如果你需要定义一
个新的Creator[JavaDoca]和Converter[JavaDoca],那么你就需要在这里定义他们。但是建议你现检查
-•下DWR是不是已经支持了。
在init部分里有了定义只是告诉DWR这些扩展类的存在,给出了如何使用的信息。这时他们还没布•被使用。这
中方式很像Java中的import语句。多数类需要在使用前兆import一下,但是只有import语句并不表明这个类
已经被使用了。每一个creator和converter都用id属性,以便后面使用。
Signatures〉
DWR使用反射来找出在转换时应该用那种类型。有时类型信息并不明确,这时你可以在这里写下方法的签名来明
确类型。详细信息查看Signatures部分。
多个dwr.xml文件
可以有多个dwr.xnd文件(详细卜息见web.xml文档)。每个文件中的定义会被加在一起。DWR用这个功能来加载
基础配置文件。我们可以看看标准被配置文件来了解dwr.xml的内容。
转换器
转换器在客户端和服务器之间转换数据.
下面这些转换器有单独章9.介绍
•ArrayConverter
•BeanandObjectConverters
•ColleciionConverter
•EnumConverter
•DOMObjects
•Hibernate整合
ServleiObjects(HttpServletRequest,HttpSession,etc)
基础的转换器
原生类型,String,像BigDecimal这样的简单对象的转换器已经有了。你不需要在dwr.xml中〈allow〉部分的
<corwert》中定义。它们默认支持。
默认支持的类型包括:boolean,byte,short,int,long,float,double,char,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和
java.lang.String
Date转换器
Date转换器负责在Javascript的Date类型与Java中的Date类型(java.util.Date,java.sql.Date,
java.sql.Timesorjava.sql.Timestamp)之间进行转换。同基础的转换器一样,DateConverter默认是支持的。
如果你右一个Javascript的字符串(例如~U1Jan20lU"),你想把它转换成Java的Date类型力两个办法:化
javascript中用Date,parse0卫它解析成Date类型,然后用DWR的DateConverter传递给服务器;或者把它作
为字符串传递给Server,再用Java中的SimploDateFormat(或者类似的)来解析。
同样,如果你有个Java的Dale类型并且希望在HTML使用它。你可以先用SimpleDateFormat把它转换成字符串
再使用。也可以直接传Date给Javascript,然后用Javascript格式化。第一•种方式简单一些,尽管浪费了你的
转换器,而且这样做也会是浏览器上的显示逻辑受到限制。其实后面的方法更好,也有一些工具可以帮你,例如:
TheJavascriptToolboxDateformatte].
WebDevelopersNotesonDateformatting'
其他对象
其实创建自己的转换器也很简单。Converter接口的Javadoc包含了帝息。其实这种需要很少出现。在你写自己
的Converter之前先看看BeanConverter,它有可能就是你要的。
TheCreators-创造器
dwr.xml文件中的create元素的结构如下:
<allow>
<createcreator="…"javascript="…’scope=>
<paramname="…"value="…"/>
<authmethod="…"role=〃…〃/>
<excludemethod="…"/>
<includcmethod=〃…”/>
</create>
</allow>
这里的多数元素都是可选的你真正必须知道的是指定一个creator和一个javascript名字。
creator属性是必须的・它用来指定使用那种创造器。
默认情况下DWRL1有8种创造器。它们是:
•new:用Java的new关键字创造对象。
•none:它不创建对象,看下面的原因。(vl.1+)
•scripted:通过BSF使用脚本语言创建对象,例如BcanShell或Groovy。
•spri,:通过Spring框架访问Bean。
•jsf:使用JSF的Bean。(vl.1+)
•struts:使用Struts的FormBcan。(vl.1+)
•pageflow:访问Beehive或Weblogic的PageFlow。(vl.1+)
如果你需要写自己的创造器,你必须在init部分注册它.
javascript属性用于指定浏览器中这个被创造出来的对象的名字。你不能使用Javascripl的关漫字。
scope属性非常类似servlel规范中的scope。它允许你指定这个bean在什么生命范围。选项有"applicalion",
"session","request"和"page"。这些值对于Servlet和JSP开发者来说应该相当熟悉了。
scope属性是可选的。默认是"page”。如果要使用"session”需要cookies。当前的DWR不支持IXR重写。
param元素被用来指定创造器的其他参数,每种构造器各有不同。例如,"new”创造器需要知道要创建的对象类
型是什么。每一个创造器的参数在各自的文档中能找到。清查看上面的链接。
include和exclude元素允许创造器来限制类中方法的访问。一个创造器必须指定include列表或exclude列表
之一。如果是include列衣则暗示默认的访问策略是"拒绝";如果是exclude列表则暗示默认的访问策略是"允
许"。
例如要拒绝防范除了se”?从左〃以外的所白方法,你应该把如下内容添加到dwr.xml中。
<createcreator="new"javascript="Fred"〉
<paramname="class"value="com.example.Fred,7>
<includemethod=,,setWibble,7>
</create>
对于加入到create元素中的类的所有方法都是默认可见的。
auth元素允讣你指定•个"匕匕的角色作为将来的访问控制检宣:
<createcreator="new"javascript="Fred"〉
<paramname="class“value=,,com.example.Fred,7>
<authmethod="setWibble"role=,,admin,,/>
</create>
'none,创造器
'none'创造器不创建任何对象-它会假设你不需要创建对象。这有可能是对的,有两个原因。
你可能在使用的scope不是"page"(看上面),并在在前面已经把这个对象创建到这个scope中了,这时你就不需
要再创建对象了。
还有一种情况是要调用的方法是静态的,这时也不需要创建对象。DWR会在调用创建器之前先检查一下这个方法
是不是睁态的。
对于上诉两种情况,你仍然需要class参数,用来告诉DWR它是在操作的对象类型是什么。
使用静态方法
DWR会在调用创建器之前先检查一下这个方法是不是静态的,如果是那么创造器不会被调用。很显然这个逻辑适
用于所有创造据,尽管如此"nu:l”创造器是最容易配置的。
适用单例类
对于单例类的创建,最好适用BeanShell和BSF来实例化对象。详细信息参见:Scripted'创造器
其他创造器
我么偶尔也需要一些新的创造器,最常见的是一个1-jbCreator.讨论新的创造器的好地方是在邮件到因R
DWR和HttpSessionBindingListeners
DWRl.x中存贮已经创造的Bean的方法需要注意,它在每次请求时都会调用相同的setAttribute0方法。就是
说,如果一个Bean在dwr.xml中的声明周期设置为session,再每次调用bean中的方法时,DWR都会执行一次
session.setAttribute(yourBean)。这看上去没有什么危害,但姑如果你要使用servlet的事件机制的,就是
说用了HttpSessionBindingListener接口,你就会发现valueBound和valueUnbound事件在每次调用时都会发
生,而不是你想像的在bean被创建时以及session过期时。
DWR2只在第一次创建对象时调用setAttribute0。
dwr.xml中的签名(Signatures)
signatures段使IWR能确定集合中存放的数据类型。例如下面的定义中我们无法知道list中存放的是什么类型。
publicclassCheck
(
publicvoidsetLotteryResults(Listnos)
signatures段允许我们暗示DWR应该用什么类型去处理。格式对以了解JDK5的泛型的人来说很容易理解。
〈signatures)
<![CDATA[
importjava.util.List;
importcom.example.Check;
Check.setLotteryResults(List<Integcr>nos);
]]>
</signatures>
DWR中又一个解析器专门来做这件事,所以即使你的环境时JDKL3“R也能正常工作。
解析规则基本上会和你预想规则的一样(有两个例外),所以java.lang下面的类型会被默认importo
第一个是DWR1.0中解析器的bug,某些环境下不能返回正确类型。所以你也不用管它了。
第二个是这个解析相时"阳光(sunnyday)”解析器。就是说它非常宽桧,不想编译器那样严格的保证你一定正确。
所以有时它也会允许你丢失import:
<signatures>
<![CDATA[
importjava.util.List;
Check.setLotteryResults(List<lnteger>);
]]>
</signatures>
将来的DWR版本会使用一个更正式的解析器,这个编译器会基于官方Java定义,所以你最好不要使用太多这个
不严格的东西。
signatures段只是用来确定泛理参数中的类型参数。DWR会自己使用反射机制或者运行时类型确定类型,或者假
设它是一个String类型。所以:
不需要signatures-没有泛型参数:
publicvoidmethod(Stringp);
publicvoidmethod(String[]p);
需要signatures-DWR不能通过反射确定:
publicvoidmethod(List<Date>p);
publicvoidmethod(Map<String,WibbleBean>p);
不需要signatures-DWR能正确的猜出:
publicvoidmethod(List<String>p);
publicvoidmethod(Map<String,String>p);
不需要signatures-DWR可以通过运行时类型确定:
publicList<Date>method(Stringp);
没有必要让Javascript中的所有对象的key都是String类型-你可以使用其他类型作为key。但是他们在使用
之前会被转换成String类型。DWR1.x用Javascript的特性把key转换成String.DWR2.0可能会用toStringO
方法,在服务段进行这一转换。
engine,jsFunctions
engine.js对DWR非常重要,因为它是用来转换来至动态生成的接口的javascript函数调用的,所以只耍用到
DWR的地方就需要它。
Theengine.jsfile
每一个页面都需要下面这些语句来引入主DWR引擎。
<scripttype='text/javascript'
src='/[YOl-R-WEB-APP]/dwr/engine.js'>
</script>
使用选项
下面这些选项可以通过DBEngine.setXO函数来设置全局属性。例如:
DWREngine.setTimeout(1000);
或者在单次调用级别上(假设Remote被DWR暴露出来了):
Remote.singleMethod(params,{
cal1back:function(data){...},
timeout:2000
});
远程调用可以批量执行来减少反应时间,endBatch函数中可以设置选项。
DWREngine.beginBatch();
Rpmotp.mpthndInBatch1(params,cal1hackI);
Remote.methodInBatch2(params,callback2);
DWREngine.endBatch({
timeout:3000
});
可以混合这几种方式,那样的话单次调用或者批量:调用级别上的设置可以复写全局设置(就像你抬望的那样)。当
你在一个批量处理中多次设置了某个选项,DBR会保留最后一个。所以如果Remote.singleMethodO例子在batch
里面,DWR会使用3000ms做为超时的时间。
callback和exceplionllandle】•两个选项只能在单次调用中使用,不能用于批量调用。
preHook和poslHook选项两个选项是可添加的,就是说你可以为每一次调用添加多个hook。全局的prellook会
在批量调用和单次调用之前被调用。同样全局的postHook会在单次调用和批量调用之后被调用。
如果以上叙述让你感到混乱,不用担心。DWR的的设计往往和你想象中的•样,所以其实这些并不复杂。
选项索引
下面是可用选项列表。
OptionGlobalBatchCallSummary
async1.11.11.1设置是否为异步调用,不推荐同步调用
headers2.02.02.0在XHR调用中加入额外的头信息
parameters2.02.02.0可以通过Meta-datarequest.getParameter()取得的元数据
httpMethod2.02.02.0选择GET或者POST.1.x中叫'verb'
选择是使用xhr;iframe或者script-tag来实现远程调用.1.x中叫
rocTvDe2.02.02.0
'method'
某个调用是否应该设置为batch中的一部分或者直接的。这个选项和上
面都有些不同。
skipBatch1.0*2.1?-
*没有setSkipBatch。方法,批量调用是通过beginBatch()和
endBatch。来控制的。
timeout1.01.11.1设定超时时长,单位ms
处理器(Handler)
OptionGlobalBatchCallSummary
当出了什么问题时的动作。1.x中还包括服务端的异常。从2.0
errorHandler1.01.11.1
开好i服务端异常通过'exceptionHandler'处理
当因为浏览器的bug引起问题时的动作,所以默认这个设匿为
warninqHandler1.02.02.0
null(关闭)
textHtmIHandler2.02.02.0当得到不正常的text/html页面时的动作(通常表示超时)
调用处理器(CallHandler)(注册到单独调用上的,而不是
batch中的所有调用)
OptionGlobalBatchCallSummary
调用成功以后的要执行的回调函数,应该只有一个参数:远程调
callback--1.0
用得到的数据
exceptionHandler--2.0远程调用失败的动作,一般是服务端异常或者数据转换问题。
Hooks(一个batch中可以注册多个hook)
OptionGlobalBatchCallSummary
DreHook1.01.11.1远程调用前执行的函数
DostHook1.01.11.1远程调用后执行的函数
全局选项(在单次调用或者批量调用中不可用)
OptionGlobalBatchCallSummary
ordered1.0--DWR是否支持顺序调用
pollType2.0--选择xhr或者iframe的反转Ajax
reverseAjax2.0--是否查找inbound调用
废弃的选项
OptionGlobalBatchCallSummary
verb1.01.11.12.0废弃。使用'httpMethod'代替
method1.01.11.12.0废弃。使用'rpcType'代替
将来的
OptionGlobalBatchCallSummary
onBackButton2.1?2.1?-用户按了back按钮后的动作
onForwardButton2.1?2.1?-用户按了forward按钮的动作
保证的责任
DWR的目的是让你确切的知道所有调用的动作。知道/浏览器存在的bug,这是可以做到了。
如果你设置了calIback,exceptionHandler,errorHandIer,warningHandler和textHtmlllandler.DWR就应
该总是为每一个请求提供响应。
CallBatching
你可以使用batch来批量的执行远程调用。这样可以减少与服务器的交互次数,所以可以提交反应速度。
一个batch以DWREngine.begi{'Batch()开始,并以DWREngine.endB3tchO结束。当DBEngine.endBatch()被
调用,我们就结束了远程调用的分组,这样DWR就在一次与服务器的交互中执行它们。
DWR会小心的处理保证所有的同调函数都会被调用,所以你可以明显的打开和关闭批处理。只要别忘了调用
endBatch(),否则所有的远程调用永远的处丁列队中。
警告
很明显,把一些远程调用放在一起执行也会产生一些影响。例如不能在batch里面执行同步调用。
所有的元数据选项,例如hooks,timeouts和errorHandlers都在batch级别的,而不是单次调用级别上的。所
以如果一个batch中有两个调用设置了不同的超时,除了最后一个其他的都被忽略。
顺序调用
因为Ajax一般是异步调用,所以远程调用不会按照发送的顺序返回。DBEngine.setOrdered(boolean)允许结
果严格按照发送的顺序返向。DVR在旧的请求安全返网以后才去发送新的请求。
我们一定辐要保证请求按照发送的顺序返回吗?(默认为false)
警告:把这个设置为仃uc会减慢你的应用程序,如果一个消息丢失,浏览器就会没有响应。很多时候即使用
异步调用也有更好的解决办法,所以在用这一功能之前先好好考虑一下。
处理错误和警告
当因为一些原因调用失败,DWR就会调用错误和警告handler(根据错误的激烈程度),并传递错误消息。
你可以用这种方法来在alert窗口或状态来中显示错误信息。
你可以使用DWREngine.〃力〃〃,来改变错误处理方式,同样通过
DWREngine.setH'
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上海市浦东新区川沙中学2025届高考仿真模拟化学试卷含解析
- 河北省“五个一联盟”2025年高三下学期联合考试化学试题含解析
- 2025年跨境电商产业园合作协议书
- 2025年重组葡激酶项目合作计划书
- 2025届江西省南昌市东湖区第十中学高考压轴卷化学试卷含解析
- 心律失常患者护理
- 2025届上海市静安区高考化学三模试卷含解析
- 2025届青海省西宁市城西区海湖中学高考化学二模试卷含解析
- 2025年化学材料:灌浆料合作协议书
- 四年级数学(三位数乘两位数)计算题专项练习及答案
- 书香浸润心灵 阅读伴我成长读书伴我成长主题班会课件
- 完工工程量确认单
- 国开土地利用规划形考任务1-4答案
- 岗位价值评估表
- 学校食堂招标书学校食堂招标书
- 遵义会议与遵义会议精神简化版教学课件
- 安全隐患排查情况登记表(学生宿舍)
- 经阴道无张力尿道中段吊带术术
- 《病毒》优质课一等奖课件
- 权责发生制课件ppt
- 气化炉的类型
评论
0/150
提交评论