1、如何开始用 DWR有两种方法开始 DWR,简单的方式是下载 WAR 文件然后看看。但是这不能帮你知道如何轻松的把 DWR 整合到你的 web 应用中,所以还是推荐你按照下面的 3 个步骤做:1. 安装 DWR 的 Jar 包下载 dwr.jar 文件 。把它放到你的 webapp 的 WEB-INF/lib 目录下。那里可能已经有很多其他的 jar 文件了。2. 编辑配置文件需要把下面的代码加到 WEB-INF/web.xml 文件中。那部分需要和其他的 在一起,部分也一样。dwr-invokerDWR Servletuk.ltd.getahead.dwr.DWRServletdebugtru
2、edwr-invoker/dwr/*在 WEB-INF 目录下的 web.xml 旁边创建一个 dwr.xml 文件。可以从最简单的配置开始:DWR 配置文件定义了那些 DWR 会创建提供远程调用的 Javascript 类。在上面的例子中我们定义了两个类来提供远程调用,并为其提供的 Javascript 类的名字。在上面我们使用了 new 创建器,它会调用没有参数的构造函数来创建实例,但是所有JavaBean 必须有这一构造函数。还要注意 DWR 有一些限制: 不要出现 Javascript 保留关键字;和保留关键字同名的函数指定被排除。多数 Javascript 的关键字和 Java 是相
3、同的。所以你不可能有一个方法叫做“try()“。但是该死“delete()“对与 Javascript 有着特殊意义,而对 Java 则不是。 Javascript 方法重载是不支持的,所以尽量不要再 Java 中使用。 3. 访问下面的 URLhttp:/localhost:8080/YOUR-WEBAPP/dwr/你可以看见一个页面,里面有第二步中的类。接着往里点,你会看到所有可以调用的方法列表。这个页面是动态生成用来测试的例子。自己动手试一下!怎么在你的 web 应用中使用在文档中有很多例子演示如何动态更改页面中的文字、更新列表、操作表单,还有直接更改 table 中的内容。每一个都有如
4、何实现的介绍。另一种方式是看刚才的页面中提供的代码:到 http:/localhost:8080/YOUR-WEBAPP/dwr/ 页面,点击你的类。查看源码,找到执行方法的那几行,把那些文字粘贴到你的 HTML 或 JSP 中。要包括下面这些能产生神奇效果的 Javascript 文件的链接。你也可以把其中/YOUR-WEBAPP/替换成你的 web 页面的相对路径。DWR 根据 dwr.xml 生成和 Java 代码类似的 Javascript 代码。相对而言 Java 同步调用,创建与 Java 代码匹配的 Ajax 远程调用接口的最大挑战来至与实现 Ajax 的异步调用特性。DWR 通
5、过引入回调函数来解决这个问题,当结果被返回时,DWR 会调用这个函数。有两种推荐的方式来使用 DWR 实现远程方法调用。可以通过把回调函数放在参数列表里,也可以把回调函数放到元数据对象里。当然也可以把回调函数做为第一个参数,但是不建议使用这种方法。因为这种方法在处理自动处理 http 对象时(查看“Alternative Method“)上会有问题。这个方法主要是为向下兼容而存在的。简单的回调函数假设你有一个这样的 Java 方法:public class Remote public String getData(int index) . 我们可以在 Javascript 中这样使用:.fun
6、ction handleGetData(str) alert(str);Remote.getData(42, handleGetData);42 是 Java 方法 getData()的一个参数。此外你也可以使用这种减缩格式:Remote.getData(42, function(str) alert(str); );调用元数据对象(Meta-Data)另外一种语法时使用“调用元数据对象“来指定回调函数和其他的选项。上面的例子可以写成这样:Remote.getData(42, callback:function(str) alert(str); );这种方法有很多优点:易于阅读,更重要的指定额
7、外的调用选项。超时和错误处理在回调函数的元数据中你可以指定超时和错误的处理方式。例如:Remote.getData(42, callback:function(str) alert(str); ,timeout:5000,errorHandler:function(message) alert(“Oops: “ + message); );查找回调函数有些情况下我们很难区分各种回调选项(记住,Javascript 是不支持函数重载的)。例如:Remote.method( timeout:3 , errorHandler:somefunc );这两个参数之一是 bean 的参数,另一个是元数据对
8、象,但是我们不能清楚的告诉 DWR哪个是哪个。为了可以跨浏览器,我们假定 null = undefined。 所以当前的情况,规则是: 如果第一个或最后一个是一个函数,那么它就是回调函数,没有元数据对象,并且其他参数都是 Java 的方法参数。 另外,如果最后一个参数是一个对象,这个对象中有一个 callback 成员,并且它是个函数,那么这个对象就是元数据对象,其他的都是 Java 方法参数。 另外,如果第一个参数是 null ,我们就假设没有回调函数,并且其他的都是Java 方法参数。尽管如此,我们会检查最后一个参数是不是 null,如果是就发出警告。 最后如果最后一个参数是 null,那
9、么就没有 callback 函数。 另外,发出错误信号是个糟糕的请求格式。 创造一个与 Java 对象匹配的 Javascript 对象假设你有这样的 Java 方法:public class Remote public void setPerson(Person p) this.person = p;Person 对象的结构是这样的:public Person private String name;private int age;private Date appointments;/ getters and setters .那么你可以在 Javascript 中这样写:var p = n
10、ame:“Fred Bloggs“,age:42,appointments: new Date(), new Date(“1 Jan 2008“) ;Remote.setPerson(p);在 Javascript 没有出现的字段,在 Java 中就不会被设置。因为 setter 都是返回void,我们就不需要使用 callback 函数了。如果你想要一个返回void 的服务端方法的完整版,你也可以加上 callback 函数。很明显 DWR 不会向它传递任何参数。TransformerFactoryConfigurationError这个问题的现象是在启动有 DWR 的 Web 应用时出现如
11、下 stack trace:root causejavax.xml.transform.TransformerFactoryConfigurationError:Provider org.apache.xalan.processor.TransformerFactoryImpl not foundjavax.xml.transform.TransformerFactory.newInstance(Unknown Source)这个问题和 DWR 没有什么关系,那是因为 Tomcat 没有配置好。比较简单的解决办法是下载 Xalan 替换掉$TOMCAT-HOME/common/lib 目录下的
12、 xalan.jar 文件。DWR2.0能更好的处理这个问题,但是本质的问题还是因为 DWR 的 XML 序列化需要有 XSLT 解析器的支持。如果你用 JDK5 还是有这个问题的话,你可以增加以下 VM 参数来使 Tomcat 正常工作。-Djavax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImplXML 解析错误在刚开始用 DWR 的时候经常遇到的一个错误就是 XML 解析错误。其实这和 DWR 没有多大关系,主要是因为 Tomcat 里
13、面自带的 Xerces 的问题,要不是该有的时候没有,要不是不该有的时候有了。 JDK 1.3 自身没有 XML 解析器,所以你需要 xercesImpl.jar 和 xml-apis.jar. JDK 1.4.0 和 JDK 1.4.1 虽然有了 XML 解析器,但是有很多 bug,所以你还是需要把 xercesImpl.jar 放到 tomcatcommonendorsed 目录下。 JDK 1.4.2 和 JDK 5 自带的 XML 解析器工作的很好,你就不需要再加其他的了。另外要提的一点是,不同版本的 Tomcat 需要的 XML 解析器不一样。所以要注意检查它和 JDK 的版本兼容性
14、。 用 BEA Weblogic 的 Classpath 问题Weblogic 8.1(有可能其他版本同样)可能找不到 DWR 的类。这大多出现在 dwr.jar 放在 APP-INF 目录下(APP_INF/lib)的情况。在这种情况下 DWR依然可以工作,例如 debug 页面可以看见,但是 DWR 找不到你的类。解决办法是把 dwr.jar 放到 WEB-INF/lib 目录下。没有 cookies 的情况下用 DWR当不能用 cookies 时,servlet 规范通过 URL 重写来支持 HttpSession。DWR 2.x 通过它生成的 URL 来支持这项功能。但是 DWR 1.
15、x 没有这个功能。你可以通过以下办法让DWR 1.x 也支持 cookies: 从 dwr.jar 中提取 engine.js,保存到你的文件系统中,就像 jsp 文件一样. 修改“DWREngine._sendData = function(batch)“ 方法, 加入一行: statsInfo += “;jsessionid=“ + 这样就可以让 DWR 1.x 支持 url 重写了。DWR 2+默认支持。传递额外的数据到 callback 函数 通常我们需要传递额外的数据到 callback 函数,但是因为所有的回调函数都只有一个参数(远程方法的返回结果) ,这就需要一些小技巧了。 解决
16、方案就是使用 Javascript 的闭包 特性。 例如,你的回调函数原本需要像这个样子: function callbackFunc(dataFromServer, dataFromBrowser) / 用 dataFromServer 和 dataFromBrowser 做些事情 那么你可以像这个组织你的函数: var dataFromBrowser = .; / 定义一个闭包函数来存储 dataFromBrowser 的引用,并调用 dataFromServer var callbackProxy = function(dataFromServer) callbackFunc(dataF
17、romServer, dataFromBrowser); ; var callMetaData = callback:callbackProxy ; Remote.method(params, callMetaData);(调用元数据在脚本介绍中有解释) 换句话说,现在你作为 callback 函数传递过来的不是一个真正的 callback,他只是一个做为代理的闭包,用来传递客户端的数据。 你可以用更简介的形式: var dataFromBrowser = .; Remote.method(params, callback:function(dataFromServer) callbackFu
18、nc(dataFromServer, dataFromBrowser); );服务器性能优化CPU 瓶颈:经过严格的测试 DWR 的性能没什么问题。DWR 上性能消耗同 web 服务器和网络比起来可以忽略不计。如果你真的需要提升 DWR 的性能的话,可以把 log 级别设置ERROR 或 FATAL,但是主要还是要看你的编码情况。Network 瓶颈: DWR 没有管理你的浏览器缓存的功能,所以它会不断的重复读取 DWR的 javascript 文件。这里有一个简单的解决办法,把 javascript 文件复制到你的 web-app 中,这样 web 服务器就可以更好的利用它了。你也可以考虑把
19、所有的 javascript 文件合并成一个文件,然后用 DOJO 的压缩程序 处理一个来节省流量。我们可以做一个补丁,让 DWR 在 web-app 启动的时候用时间做为 javascript 文件的时间戳,但是这个并不十分重要,因为上面的补丁太简单了而且可以压缩合并 Javascript 文件。WEB-INF/web.xml 参考手册在 web.xml 中最简单的配置就是简单加入 DWR 的 servlet,没有这个配置 DWR 就不会起作用:dwr-invokeruk.ltd.getahead.dwr.DWRServletdwr-invoker/dwr/*此外还可以加入一些重要和有用的参
20、数。Logging DWR 可以工作在 JDK1.3 上,而 JDK1.3 不支持 java.util.logging,但是我们想强迫任何人使用 commons-logging 或者 log4j,所以当没有 logging 类的时候 DWR 就使用HttpServlet.log()方法。尽管如此,如果 DWR 发现了 commons-logging,就是使用它。 Commons-Logging 几乎每一个人都在使用 commons-logging ,因为大多数的 servlet 容器在使用它。所以如果你的 web 应用中没有明显的加入 commons-logging 包,它也会默认的配置好。
21、在这种情况下,logging 是由 java.util.logging 或者 log4j 配置文件控制的。详细配置查看文档。 HttpServlet.log() 如果你用 HttpServlet.log(), 下面的配置控制 logging: logLevel DEBUG 可用的值有:FATAL, ERROR, WARN (默认), INFO 和 DEBUG。 多个 dwr.xml 文件 和 J2EE 安全 一般来说,你只需要一个 dwr.xml 文件,并且放置在默认的位置: WEB-INF/dwr.xml。 如果那样的话,你可以不用了解下面的配置。 有三个原因使你希望指定不同位置的 dwr.
22、xml 文件。 你希望让 dwr.xml 文件和它能访问到的资源在一起。在这种情况下你需要一个这样的配置: WEB-INF/classes/com/yourco/dwr/dwr.xml 。 你有大量的远程调用类,希望把他们分成多个文件。在这种情况下你需要重复下面的配置几次,每一个中有不同的 param-name,并且以 config 开头。DWR 会依次把他们都读进来。 DWR 可以使用 Servlet 规范的 J2EE 的 URL 安全机制来给不同的用户不同的访问权限。你只需要简单的定义多个 dwr servlet,并且制定不同的名字,url 和访问权限。 如果你希望使用这一功能,那么语法是
23、这样的: config* WEB-INF/dwr.xml What config file do we use? 在这里 config*意思是 param-name 要以字符串 config 开头。这个参数可以根据需要使用多次,但是不能相同。 一个使用 J2EE 的安全机制的例子: dwr-user-invoker uk.ltd.getahead.dwr.DWRServlet config-user WEB-INF/dwr-user.xml dwr-admin-invoker uk.ltd.getahead.dwr.DWRServlet config-admin WEB-INF/dwr-adm
24、in.xml dwr-admin-invoker /dwradmin/* dwr-user-invoker /dwruser/* dwr-admin dwr-admin-collection /dwradmin/* admin dwr-user dwr-user-collection /dwruser/* user 使用插件(Plug-in) DWR 里的很多部件都是可插入的,所以可以通过替换掉 DWR 的默认实现类来改变其功能。你可以在 中的 param-name 中指定你要替换的接口,并在 param-value 中指定自己的接口实现类。 可插入点是: uk.ltd.getahead.dw
25、r.AccessControl uk.ltd.getahead.dwr.Configuration uk.ltd.getahead.dwr.ConverterManager 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 模式: debug true 在 debug
26、 模式里,DWR 会为每一个远程调用类生成一个测试页面。这对于检查 DWR 是否工作和工作的怎么样是很有用的。这个模式还可以警告你一些存在的问题:javascript保留字问题,或者函数重载问题。 尽管如此,这个模式不应该使用在实际部署环境里面,因为它可以为攻击者提供你的服务的大量信息。如果你的网站设计的好的话,这些信息不会帮助攻击者窥视你的网站内容,但是还是不要给任何人一个找到你错误的机会好。 DWR 就是照上面的样子做的,没有任何保证,所以你的网站的安全是你的责任。请小心。配置 DWR - dwr.xmldwr.xml 是 DWR 的配置文件。默认情况下,应该把它放到 WEB-INF 目录
27、(web.xml 的目录)下。DTD这里还有一个 dwr.xml 对应的 DTD 文档 以及一个用 DTDDoc 生成的参考手册 。创建 dwr.xml 文件dwr.xml 文件的结构如下:.术语这里是一些必须理解的术语 - 参数会被 converted,远程 Bean 会被 created。所以如果你有一个叫 A 的 bean,它有一个方法叫 A.blah(B) 那么你需要一个 A 的 creator和一个 B 的 converter。allow 段落里面定义的试 DWR 可以创建和转换的类。Creators我们要调用的每个类都需要一个定义。creator 有几种。比较通用的是 new关键字
28、和 Spring。更多的信息可以参见Creaters文档。Converters我们必须保证所有的参数都可以被转换。JDK 中的多数类型已经有转换器了,但是你需要给 DWR 转换你的代码的权利。一般来说 JavaBean 的参数需要一个定义。默认情况下,如下类型不需要定义就可以转换: 所有的原生类型 boolean,int,double, 等等 原生类型的对象类型 Boolean,Integer,等等 java.lang.String java.util.Date 和 SQL 中的 Date 以上类型组成的数组 以上类型的集合类型 (Lists, Sets, Maps, Iterators, 等
29、) 从 DOM, XOM, JDOM 和 DOM4J 中的 DOM 对象 (类似 Element 和 Document) 要了解如何转换你的 JavaBean 或者其他类型的参数请查看 Converters 文档。可选的 init 部分用来声明创造 bean 的类和转换 bean 的类。多数情况下你不需要用到他们。如果你需要定义一个新的 Creator JavaDoc 和 Converter JavaDoc , 那么你就需要在这里定义他们。但是建议你现检查一下 DWR 是不是已经支持了。在 init 部分里有了定义只是告诉 DWR 这些扩展类的存在,给出了如何使用的信息。这时他们还没有被使用。
30、这中方式很像 Java 中的 import 语句。多数类需要在使用前先import 一下,但是只有 import 语句并不表明这个类已经被使用了。每一个 creator 和converter 都用 id 属性,以便后面使用。DWR 使用反射来找出在转换时应该用那种类型。有时类型信息并不明确,这时你可以在这里写下方法的签名来明确类型。详细信息查看 Signatures 部分。多个 dwr.xml 文件可以有多个 dwr.xml 文件( 详细信息见 web.xml 文档)。每个文件中的定义会被加在一起。DWR 用这个功能来加载基础配置文件。我们可以看看标准被配置文件来了解 dwr.xml 的内容。
31、转换器转换器在客户端和服务器之间转换数据.下面这些转换器有单独章节介绍 Array Converter Bean and Object Converters Collection Converter Enum Converter DOM Objects Hibernate 整合 Servlet Objects (HttpServletRequest, HttpSession, etc) 基础的转换器原生类型,String,像 BigDecimal 这样的简单对象的转换器已经有了。你不需要在dwr.xml 中部分的 中定义。它们默认支持。默认支持的类型包括: boolean, byte, sho
32、rt, 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.StringDate 转换器Date 转换器负责在 Javascript 的 Date 类型与 Java 中的 Date 类型(ja
33、va.util.Date, java.sql.Date, java.sql.Times or java.sql.Timestamp)之间进行转换。同基础的转换器一样,DateConverter 默认是支持的。如果你有一个 Javascript 的字符串 (例如“01 Jan 2010“) ,你想把它转换成 Java 的Date 类型有两个办法:在 javascript 中用 Date.parse()把它解析成 Date 类型,然后用DWR 的 DateConverter 传递给服务器;或者把它作为字符串传递给 Server,再用 Java中的 SimpleDateFormat(或者类似的)来解
34、析。同样,如果你有个 Java 的 Date 类型并且希望在 HTML 使用它。你可以先用SimpleDateFormat 把它转换成字符串再使用。也可以直接传 Date 给 Javascript,然后用 Javascript 格式化。第一种方式简单一些,尽管浪费了你的转换器,而且这样做也会是浏览器上的显示逻辑受到限制。其实后面的方法更好,也有一些工具可以帮你,例如: The Javascript Toolbox Date formatter Web Developers Notes on Date formatting 其他对象其实创建自己的转换器也很简单。Converter 接口的 Jav
35、adoc 包含了信息。其实这种需要很少出现。在你写自己的 Converter 之前先看看 BeanConverter,它有可能就是你要的。The Creators 创造器dwr.xml 文件中的 create 元素的结构如下:.这里的多数元素都是可选的 - 你真正必须知道的是指定一个 creator 和一个 javascript名字。creator 属性 是必须的 - 它用来指定使用那种创造器。默认情况下 DWR1.1 有 8 种创造器。它们是: new: 用 Java 的 new 关键字创造对象。 none: 它不创建对象,看下面的原因。 (v1.1+) scripted: 通过 BSF 使
36、用脚本语言创建对象,例如 BeanShell 或 Groovy。 spring: 通过 Spring 框架访问 Bean。 jsf: 使用 JSF 的 Bean。 (v1.1+) struts: 使用 Struts 的 FormBean。 (v1.1+) pageflow: 访问 Beehive 或 Weblogic 的 PageFlow。 (v1.1+) 如果你需要写自己的创造器,你必须在 init 部分注册它。javascript 属性 用于指定浏览器中这个被创造出来的对象的名字。你不能使用Javascript 的关键字。scope 属性 非常类似 servlet 规范中的 scope。
37、它允许你指定这个 bean 在什么生命范围。选项有“application“, “session“, “request“ 和“page“ 。这些值对于 Servlet 和JSP 开发者来说应该相当熟悉了。scope 属性是可选的。默认是“page“ 。如果要使用“session“需要 cookies。当前的DWR 不支持 ULR 重写。param 元素 被用来指定创造器的其他参数,每种构造器各有不同。例如,“new“创造器需要知道要创建的对象类型是什么。每一个创造器的参数在各自的文档中能找到。请查看上面的链接。include 和 exclude 元素 允许创造器来限制类中方法的访问。一个创造器
38、必须指定include 列表或 exclude 列表之一。如果是 include 列表则暗示默认的访问策略是“拒绝“;如果是 exclude 列表则暗示默认的访问策略是“允许“。例如要拒绝防范除了 setWibble()以外的所有方法,你应该把如下内容添加到 dwr.xml中。对于加入到 create 元素中的类的所有方法都是默认可见的。auth 元素 允许你指定一个 J2EE 的角色作为将来的访问控制检查:none 创造器none 创造器不创建任何对象 - 它会假设你不需要创建对象。这有可能是对的,有两个原因。你可能在使用的 scope 不是“page“(看上面),并在在前面已经把这个对象创
39、建到这个scope 中了,这时你就不需要再创建对象了。还有一种情况是要调用的方法是静态的,这时也不需要创建对象。DWR 会在调用创建器之前先检查一下这个方法是不是静态的。对于上诉两种情况,你仍然需要 class 参数,用来告诉 DWR 它是在操作的对象类型是什么。使用静态方法DWR 会在调用创建器之前先检查一下这个方法是不是静态的,如果是那么创造器不会被调用。很显然这个逻辑适用于所有创造器,尽管如此“null“创造器是最容易配置的。适用单例类对于单例类的创建,最好适用 BeanShell 和 BSF 来实例化对象。详细信息参见Scripted创造器其他创造器我么偶尔也需要一些新的创造器,最常见
40、的是一个 EjbCreator。讨论新的创造器的好地方是在邮件列表 。DWR 和 HttpSessionBindingListenersDWR1.x 中存贮已经创造的 Bean 的方法需要注意,它在每次请求时都会调用相同的 setAttribute() 方法。就是说,如果一个 Bean 在 dwr.xml 中的声明周期设置为session,再每次调用 bean 中的方法时,DWR 都会执行一次 session.setAttribute(yourBean) 。这看上去没有什么危害,但是如果你要使用servlet 的事件机制的,就是说用了 HttpSessionBindingListener 接口
41、,你就会发现valueBound 和 valueUnbound 事件在每次调用时都会发生,而不是你想像的在 bean被创建时以及 session 过期时。DWR2 只在第一次创建对象时调用 setAttribute() 。dwr.xml 中的签名(Signatures)signatures 段使 DWR 能确定集合中存放的数据类型。例如下面的定义中我们无法知道list 中存放的是什么类型。public class Checkpublic void setLotteryResults(List nos).signatures 段允许我们暗示 DWR 应该用什么类型去处理。格式对以了解 JDK5
42、的泛型的人来说很容易理解。nos);DWR 中又一个解析器专门来做这件事,所以即便你的环境时 JDK1.3 DWR 也能正常工作。解析规则基本上会和你预想规则的一样(有两个例外) ,所以 java.lang 下面的类型会被默认 import。第一个是 DWR1.0 中解析器的 bug,某些环境下不能返回正确类型。所以你也不用管它了。第二个是这个解析器时“阳光(sunny day)“解析器。就是说它非常宽松,不想编译器那样严格的保证你一定正确。所以有时它也会允许你丢失 import:);将来的 DWR 版本会使用一个更正式的解析器,这个编译器会基于官方 Java 定义,所以你最好不要使用太多这个
43、不严格的东西。signatures 段只是用来确定泛型参数中的类型参数。 DWR 会自己使用反射机制或者运行时类型确定类型,或者假设它是一个 String 类型。所以:不需要 signatures - 没有泛型参数:public void method(String p);public void method(String p);需要 signatures - DWR 不能通过反射确定:public void method(List p);public void method(Map p);不需要 signatures - DWR 能正确的猜出:public void method(List
44、p);public void method(Map p);不需要 signatures - DWR 可以通过运行时类型确定:public List method(String p);没有必要让 Javascript 中的所有对象的 key 都是 String 类型 - 你可以使用其他类型作为 key。但是他们在使用之前会被转换成 String 类型。DWR1.x 用 Javascript 的特性把key 转换成 String。DWR2.0 可能会用 toString()方法,在服务段进行这一转换。engine.js Functions engine.js 对 DWR 非常重要,因为它是用来转换
45、来至动态生成的接口的 javascript 函数调用的,所以只要用到 DWR 的地方就需要它。 The engine.js file 每一个页面都需要下面这些语句来引入主 DWR 引擎。 使用选项 下面这些选项可以通过 DWREngine.setX() 函数来设置全局属性。例如: DWREngine.setTimeout(1000);或者在单次调用级别上(假设 Remote 被 DWR 暴露出来了) : Remote.singleMethod(params, callback:function(data) . , timeout:2000 );远程调用可以批量执行来减少反应时间。endBatc
46、h 函数中可以设置选项。 DWREngine.beginBatch(); Remote.methodInBatch1(params, callback1); Remote.methodInBatch2(params, callback2); DWREngine.endBatch( timeout:3000 );可以混合这几种方式,那样的话单次调用或者批量调用级别上的设置可以复写全局设置(就像你希望的那样)。当你在一个批量处理中多次设置了某个选项,DWR 会保留最后一个。所以如果 Remote.singleMethod() 例子在 batch 里面,DWR 会使用 3000ms 做为超时的时间。
47、 callback 和 exceptionHandler 两个选项只能在单次调用中使用,不能用于批量调用。 preHook 和 postHook 选项两个选项是可添加的,就是说你可以为每一次调用添加多个hook。全局的 preHook 会在批量调用和单次调用之前被调用。同样全局的 postHook 会在单次调用和批量调用之后被调用。 如果以上叙述让你感到混乱,不用担心。DWR 的的设计往往和你想象中的一样,所以其实这些并不复杂。 选项索引 下面是可用选项列表。 Option Global Batch Call Summaryasync 1.1 1.1 1.1 设置是否为异步调用,不推荐同步调用
48、headers 2.0 2.0 2.0 在 XHR 调用中加入额外的头信息parameters 2.0 2.0 2.0可以通过 Meta-datarequest.getParameter()取得的元数据httpMethod 2.0 2.0 2.0 选择 GET 或者 POST. 1.x 中叫verbrpcType 2.0 2.0 2.0 选择是使用 xhr, iframe 或者 script-tag 来实现远程调用. 1.x 中叫methodskipBatch 1.0* 2.1? -某个调用是否应该设置为 batch 中的一部分或者直接的。这个选项和上面都有些不同。*没有 setSkipBat
49、ch()方法,批量调用是通过beginBatch()和 endBatch()来控制的。timeout 1.0 1.1 1.1 设定超时时长,单位 ms处理器(Handler) Option Global Batch Call SummaryerrorHandler 1.0 1.1 1.1当出了什么问题时的动作。1.x 中还包括服务端的异常。从 2.0 开始服务端异常通过exceptionHandler处理warningHandler 1.0 2.0 2.0当因为浏览器的 bug 引起问题时的动作,所以默认这个设置为 null(关闭)textHtmlHandler 2.0 2.0 2.0当得到不正常的 text/html 页面时的动作(通常表示超时)调用处理器(Call Handler) (注册到单独调用上的,而不是 batch 中的所有调用) Option Global Batch Call Su