`
阅读更多
DWR中文文档v0.9
DWR 2.0
方佳玮 编著

部分原创/部分整理/部分翻译


版权声明
本书目前仅发行网络版,完全免费,转载请注明作者信息。任何出版社或个人未经作者
允许不得出版印刷。
另外如果发现本人的部分内容有所抄袭,请不要来找我理论,我本来做的就是公益事情。
版权所有,侵仅必究。


参考网站及资料


DWR官方网站

http://getahead.ltd.uk/dwr/

JavaScud Wiki

http://wiki.javascud.org/display/dwrcn/Home

IBM中国

http://www.ibm.com/developerworks/cn/


























前言
Ajax向我们袭来的时候,很多写代码的程序员看到了Ajax的发展前景,但并不是每一
个程序员都能将页面与代码完美整合在一起,DOM、CSS、javascript让人眼花缭乱,不知
从何下手。
本书的读者必须有一定的Jsp,JavaScript,应用服务器(比如Tomcat)的基础和使用经
验,否则请在看此教程前先去了解一下。当然附录里有一些JavaScript的教程。
本书可以当作一本DWR完整的教程,也可以当作一本详细介绍DWR的“词典”,我
的目的只是通过本书,希望您能够了解一些DWR的基本知识、常用的用户界面组件、远程
方法调用等。并能够搭建DWR开发环境,实现DWR的快速开发。


非常感谢JavaScud Wiki网站,省去了我很多翻译时间,同时感谢网站的几位翻译人员。
由于本人也刚刚接触DWR,书中难免会有一些错误和表达不是太好的地方,请读者谅
解并提出您的宝贵意见。我很希望得到读者对本书的评价和建议。您可以把你在学习本书的
过程中所遇到的问题和建议发送到我的邮箱 jorwen.fang@gmail.com ,以便我对本书下一个
版本的更新,我会在第一时间给您回复。
感谢您阅读本书!希望这本书对你来说是一本有用的书。我是上海华东理工大学03届
计算机(金山)专业的方佳玮。
方佳玮

2007-01-22




目录
第1章. DWR入门 ................................................................................................................................ 8
1.1 简介 ................................................................................................................................. 8
1.2 第一个DWR程序:Hello World ....................................................................................... 9
1.2.1 将DWR放入你的工程 ............................................................................................. 9
1.2.2 编辑配置文件 ........................................................................................................... 9
1.2.3 编写service ........................................................................................................... 10
1.2.4 测试DWR .............................................................................................................. 10
1.2.5 编写一个jsp ........................................................................................................... 11
1.3 本章总结......................................................................................................................... 12
第2章. web.xml配置 .......................................................................................................................... 13
2.1 主要配置......................................................................................................................... 13
2.2 常用<init-param>参数列表 ............................................................................................. 14
2.2.1 安全参数 ................................................................................................................ 14
2.2.2 Ajax服务器加载时保护参数 ................................................................................... 14
2.2.3 其他参数 ................................................................................................................ 15
2.3 日志配置......................................................................................................................... 16
2.4 多个dwr.xml配置和J2EE角色定义 .............................................................................. 16
2.5 插件配置......................................................................................................................... 18
2.6 测试模式配置 ................................................................................................................. 19
第3章. dwr.xml配置 ........................................................................................................................... 20
3.1 纵览 ............................................................................................................................... 20
3.2 <init>标签 ....................................................................................................................... 20
3.3 <allow>标签 ................................................................................................................... 21
3.3.1 Creator ................................................................................................................... 21
3.3.2 Converter ............................................................................................................... 25
3.4 <signatures>标签 ........................................................................................................... 30
第4章. 整合 ....................................................................................................................................... 32
4.1 DWR与Servlet .............................................................................................................. 32
4.1.1 使用webContext的方法: .................................................................................... 32
4.1.2 方法选择 ................................................................................................................ 32
4.2 DWR与Spring ............................................................................................................... 34
4.2.1 让DWR和Spring一起工作的检查列表 ................................................................. 34
4.2.2 Spring Creator ....................................................................................................... 34
4.2.3 找到Spring配置文件 ............................................................................................. 34
4.2.4 使用Spring配置DWR ........................................................................................... 35
4.3 DWR与JSF ................................................................................................................... 36
4.3.1 JSF Creator ........................................................................................................... 36
4.3.2 Servlet Filter .......................................................................................................... 36
4.4 DWR与Struts ................................................................................................................ 37
4.4.1 Struts creator ......................................................................................................... 37
4.4.2 开始顺序 ................................................................................................................ 37
4.5 DWR与Weblogic或PageFlow ..................................................................................... 38
4.6 DWR与Hibernate ......................................................................................................... 39
4.6.1 让DWR和Hibernate一起工作的检查列表 ............................................................ 39
4.6.2 HibernateBeanConverter ....................................................................................... 39
4.6.3 Session管理 .......................................................................................................... 39
4.7 DWR与WebWork ......................................................................................................... 40
4.7.1 配置dwr.xml .......................................................................................................... 40
4.7.2 在JSP中导入脚本 ................................................................................................. 40
4.7.3 高级 ....................................................................................................................... 41
4.8 DWR与Acegi ................................................................................................................ 42
4.8.1 问题提出 ................................................................................................................ 42
4.8.2 解决方案 ................................................................................................................ 42
第5章. DWR中的JavaScript简介 ..................................................................................................... 44
5.1 简单的回调函数 .............................................................................................................. 44
5.2 调用元数据对象 .............................................................................................................. 45
5.3 查找回调函数 ................................................................................................................. 45
5.4 创造一个与Java对象匹配的Javascript对象 ................................................................. 46
第6章. engine.js 功能 ........................................................................................................................ 47
6.1 使用选项......................................................................................................................... 47
6.2 选项索引......................................................................................................................... 48
6.2.1 处理器(Handler) .................................................................................................... 48
6.2.2 调用处理器(Call Handler) .................................................................................... 48
6.2.3 Hooks (一个batch中可以注册多个hook) ............................................................. 49
6.2.4 全局选项(在单次调用或者批量调用中不可用) ....................................................... 49
6.2.5 废弃的选项 ............................................................................................................. 49
6.2.6 未来版本的选项 ..................................................................................................... 49
6.3 选项说明......................................................................................................................... 50
6.3.1 批量调用 ................................................................................................................ 50
6.3.2 顺序调用 ................................................................................................................ 50
6.3.3 错误警告和超时 ..................................................................................................... 50
6.3.4 远程调 Hooks ........................................................................................................ 51
6.3.5 远程调用选项 ......................................................................................................... 51
第7章. util.js 功能 .............................................................................................................................. 54
7.1 $() ................................................................................................................................. 54
7.2 addOptions and removeAllOptions ................................................................................ 54
7.3 addRows and removeAllRows ....................................................................................... 55
7.4 getText ........................................................................................................................... 56
7.5 getValue ......................................................................................................................... 56
7.6 getValues ....................................................................................................................... 57
7.7 onReturn ........................................................................................................................ 57
7.8 selectRange ................................................................................................................... 57
7.9 setValue ......................................................................................................................... 58
7.10 setValues ....................................................................................................................... 58
7.11 toDescriptiveString ......................................................................................................... 58
7.12 useLoadingMessage ...................................................................................................... 58
7.13 Submission box .............................................................................................................. 61
第8章. DWR进阶 ............................................................................................................................... 63
8.1 DWR Annotations ........................................................................................................ 63
8.1.1 初始配置 ................................................................................................................ 63
8.1.2 远程访问类 ............................................................................................................. 63
8.1.3 对象转换 ................................................................................................................ 64
8.2 错误和异常处理 .............................................................................................................. 64
8.2.1 错误处理 ................................................................................................................ 64
8.2.2 异常 ....................................................................................................................... 65
8.2.3 找出更多的信息 ..................................................................................................... 65
8.3 传递额外的数据到callback函数 .................................................................................... 66
8.4 从其他的URL读取数据 ................................................................................................. 67
8.5 安全 ............................................................................................................................... 68
第9章. 范例精讲 ................................................................................................................................ 71
9.1 购物车 ............................................................................................................................ 71
9.1.1 介绍 ....................................................................................................................... 71
9.1.2 实现目录 ................................................................................................................ 72
9.1.3 测试部署 ................................................................................................................ 74
9.1.4 调用远程对象 ......................................................................................................... 75
9.1.5 实现购物车 ............................................................................................................. 77
9.1.6 调用远程的 Cart 方法 ........................................................................................... 79
9.1.7 演示结果 ................................................................................................................ 81
9.1.8 总结 ....................................................................................................................... 81
第10章. 附录 ............................................................................................................................... 83
10.1 常见问题......................................................................................................................... 83
10.1.1 TransformerFactoryConfigurationError .................................................................. 83
10.1.2 XML解析错误 ........................................................................................................ 83
10.1.3 使用weblogic的类路径问题 .................................................................................. 83
10.1.4 没有cookies的情况下用DWR .................................................................... 84
10.2 JavaScript高级应用 ....................................................................................................... 85
10.2.1 用变量操纵函数 ..................................................................................................... 85
10.2.2 高阶函数 ................................................................................................................ 86
10.2.3 动态类型 ................................................................................................................ 87
10.2.4 灵活的对象模型 ..................................................................................................... 89
10.2.5 本节总结 ................................................................................................................ 91


第1章. DWR入门

1.1 简介

DWR是一个可以允许你去创建AJAX WEB站点的JAVA开源库。它可以让你在浏览器中的Javascript代
码调用Web服务器上的Java代码,就像在Java代码就在浏览器中一样。
DWR包含2个主要部分:

. 一个运行在服务器端的Java Servlet,它处理请求并且向浏览器发回响应。
. 运行在浏览器端的JavaScript,它发送请求而且还能动态更新网页。



DWR工作原理是通过动态把Java类生成为Javascript。它的代码就像Ajax魔法一样,你感觉调用就像发
生在浏览器端,但是实际上代码调用发生在服务器端,DWR负责数据的传递和转换。这种从Java到
JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制,而且DWR
的优点在于不需要任何的网页浏览器插件就能运行在网页上。
Java从根本上讲是同步机制,然而AJAX却是异步的。所以你调用远程方法时,当数据已经从网络上返回
的时候,你要提供有反调 (callback) 功能的DWR。
这个图片显示了DWR如何选择一个下拉列表的内容作为JavaScript 的onclick事件的结果。
DWR动态在JavaScript里生成一个AjaxService类,去匹配服务气端的代码。由eventHandler去调用它,
然后DWR处理所有的远程细节,包括倒置 (converting) 所有的参数以及返回Javascript和Java之的
值。在示例中,先在eventHandler方法里调用AjaxService的getOptions() 方法,然后通过反调 (callback)
方法populateList(data) 得到返回的数据,其中data就是String[]{"1", "2", "3"},最后再使用DWR utility 把
data加入到下拉列表。
好了,DWR介绍完了,现在大家肯定很想知道如何做出第一个DWR吧!然后我们在下一章节以一个
HelloWorld示例带领大家入门。


1.2 第一个DWR程序:Hello World

有2中方法可以帮助你入门DWR,一个方法是去下载WAR文件并且去完整看一下代码,但是这样并不能
帮助你发现DWR是如何简单地集成到你当前地WEB应用,所以以下几个简单地步骤推荐看一下:

1.2.1 将DWR放入你的工程

1) 从官方网站下载dwr.jar包。然后将它放在你webapp的WEB-INF/lib目录下。
2) 将下载的dwr-版本号-src.zip \java\org\directwebremoting内的engine.js和util.js放入WEB应用
中,比如js文件夹下。


1.2.2 编辑配置文件

1. web.xml

以下几行代码必须被添加到WEN-INF/web.xml文件中。注意,要把<servlet>和其他<servlet>放在一起,
<servlet-mapping>要和其他<servlet-mapping>放在一起


<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class> org.directwebremoting.servlet.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-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>





2. dwr.xml

在web.xml的同一目录下,创建dwr.xml,并且将要被调用的java类写入其中。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting
2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="new" javascript="service">
<param name="class" value="helloWorld.Service" />
</create>
</allow>
</dwr>






1.2.3 编写service

就像没有dwr一样,写一个简单类并加一个方法


package helloWorld;
public class Service {
public String sayHello(String yourName) {
//可以是访问数据库的复杂代码
return "Hello World " + yourName;
}
}





1.2.4 测试DWR

将代码放入应用服务器(比如Tomcat),启动。

然后在地址栏输入http://localhost:8080/你的工程/dwr
然后点击service,会看到刚才写的sayHello()的方法,输入自己的名字然后点击“Execute”,如果发现
确实是正确的返回结果,说明测试通过了,可以进入下一步了。




1.2.5 编写一个jsp

接下来最后一步就是创建一个jsp文件
1) 要引用几个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js
2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样
3) js里的service.sayHello和java类的那个有一点区别,多了个参数,用来callback返回的数据

<%@ page language="java" pageEncoding="UTF-8"%>
<html>
<head>
<title>My JSP 'first_dwr.jsp' starting page</title>
<script type='text/javascript' src='js/util.js'></script>
<script type='text/javascript' src='js/engine.js'></script>
<script type='text/javascript' src='dwr/interface/service.js'>
</script>
<script type="text/javascript">
function firstDwr(){
service.sayHello("Jorwen",callBackHello);
}
function callBackHello(data){
alert(data);
}
</script>
</head>





<body>
<input type="button" name="button" value="测试" onclick="firstDwr()">
</body>
</html>





地址栏输入http://localhost:8080/你的工程/first_dwr.jsp
显示的结果如下:


1.3 本章总结

相信看了此章节,大家一般都能做出这个实例来,也算是DWR刚入门了,在以后的教程里将详细介绍DWR
各个功能。帮助大家能开发出任何Ajax需求的功能来。更多进阶的例子可以参考范例精讲,您也可以通过
看范例学习DWR然后有疑问再查看该文档的相关章节。




第2章. web.xml配置

2.1 主要配置

要加入到你的web.xml最少的代码就是简单地去申明DWR servlet,没有它DWR就不起作用。


<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>




在DWR2.x里,DwrServlets是类org.directwebremoting.servlet.DwrServlet ,尽管
uk.ltd.getahead.dwr.DWRServlet仍然可以用。在DWR 1.x你不得不使用后者。
有些额外的servlet参数,在有些地方很重要。尤其debug参数
这个扩展DWR的标准结构是使用<init-params>。放在<servlet>内,就像如下使用


<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>




另外,启动服务时,如果报如下错。


java.lang.IllegalArgumentException: DefaultContainer can't find a
classes




是DWR2.0 加入了JDK5的注释(annotations).DwrServlet初始化的时候会去检查注释的类,找不到就
抱错了。如果你不用annotations也可以忽略掉这个错误。不过看起来总是不爽。解决方案如下


<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>




<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>classes</param-name>
<param-value>java.lang.Object</param-value>
</init-param>
</servlet>





2.2 常用<init-param>参数列表

2.2.1 安全参数

allowGetForSafariButMakeForgeryEasier
开始版本:2.0
默认值:false
描述:设置成true使DWR工作在Safari 1.x , 会稍微降低安全性。


crossDomainSessionSecurity
开始版本:2.0
默认值:true

描述:设置成false使能够从其他域进行请求。注意,这样做会在安全性上有点冒险,参考一下这篇文章,
在没有理解这个后果前不要设置成为false。


debug
开始版本:1.0
默认值:false
描述:设置成true使DWR能够debug和进入测试页面
scriptSessionTimeout
开始版本:2.0
默认值:1800000(30分钟)
描述:script session 的超时设置
maxCallCount
开始版本:2.0rc2 和 1.1.4
默认值:20
描述:一次批量(batch)允许最大的调用数量。(帮助保护Dos攻击)


2.2.2 Ajax服务器加载时保护参数

pollAndCometEnabled
开始版本:2.0


默认值:false
描述:设置成true能增加服务器的加载能力,尽管DWR有保护服务器过载的机制。
maxWaitingThreads
开始版本:2.0
默认值:100
描述:最大等待线程数量。
preStreamWaitTime
开始版本:2.0
默认值:29000(单位:毫秒)
描述:对一个打开流前的反应,等待的最大时间
postStreamWaitTime
开始版本:2.0
默认值:1000(单位:毫秒)
描述:对一个打开流后的反应,等待的最大时间


2.2.3 其他参数

ignoreLastModified
开始版本:2.0
默认值:false
描述:默认值支持最后修改,这样就允许服务器端对客户端请求较少资源。设置为true就能屏蔽支持。
scriptCompressed
开始版本:1.1
默认值:false

描述:DWR能够执行简单的压缩,设置为true可以激活此功能。另外还有一个未公开的有关系的重要参
数“compressionLevel”,此参数允许你配置压缩类型。查看这里得到更多详细资料。
sessionCookieName
开始版本:2.0
默认值:JSESSIONID
描述:DWR通过检查文档和提取当前session ID支持URL重写。一些servlet引擎使用非标准的cookie
名。参数允许你改变默认值。
welcomeFiles
开始版本:2.0
默认值:index.html, index.htm, index.jsp
描述:类似于web.xml的<welcome-file-list>标签



2.3 日志配置

DWR工作在JDK1.3中不支持java.util.logging,但我们并不强迫任何人都去使用commons-logging或者
log4j,所以在使用HttpServlet.log()方法时DWR将正常工作,如果没有日志类的话。然而如果DWR可以
使用,那么它将使用日志。
Commoms-Logging
由于大多数servlet容器都使用它,几乎每个人都将使用commons-logging。所以如果你的webapp不明确
使用commons-logging,它将被默认设为可以使用。
在这些日志将被一些配置文件所约束,比如java.util.logging或者log4j,可以去查看他们各自的文档获得
详情。
HttpServlet.log()
如果你正在使用HttpServlet.log(), 以下的代码用来控制DWR日志


<init-param>
<param-name>logLevel</param-name>
<param-value>DEBUG</param-value>
</init-param>




值可以是:FATAL,ERROR,WARN(默认),INFO,DEBUG

2.4 多个dwr.xml配置和J2EE角色定义

一般来说只需要一个dwr.xml文件,并且会被设为默认位置WEB-INF/dwr.xml。所以你不需要配置。
有3个原因说明你为何需要指定不同位置的dwr.xml文件:

. 你想保持dwr.xml的文件请参照下面的例子




<param-value>WEB-INF/classes/com/yourco/dwr/dwr.xml</param-value>





. 你可以有很多的远程方法类并且希望指定文件。在这个例子里将指定不同文件开始配置,不同
的param-name将重复多次DWR将轮流读取它们。




. DWR能够使J2EE URL具有给与不同用户组不同权限的安全机制。通过起不同名字,URL和权
限。



就像如下例子去使用


<init-param>
<param-name>config*****</param-name>
<param-value>WEB-INF/dwr.xml</param-value>
<description>What config file do we use?</description>
</init-param>




用一个字符串”config” 作为开始,设置param-name,每个param-name必须不同。


<servlet>
<servlet-name>dwr-user-invoker</servlet-name>
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</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>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
<init-param>
<param-name>config-admin</param-name>
<param-value>WEB-INF/dwr-admin.xml</param-value>
</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>
<web-resource-name>dwr-admin-collection</web-resource-name>
<url-pattern>/dwradmin/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<display-name>dwr-user</display-name>




<web-resource-collection>
<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>





2.5 插件配置

大多数DWR的功能是可以作为插件的,所以就通过替换默认的类可以改变DWR的功能。你可以通过包
含<init-param>去覆盖默认的实现。举个例子:


<init-param>
<param-name>
org.directwebremoting.extend.ServerLoadMonitor
</param-name>
<param-value>com.example.MyCustomServerLoadMonitor</param-value>
</init-param>




没有规定我们越过主要的版本丢弃这些接口,但是我们将尝试提供简单的升级路径。
DWR2.0插件

. org.directwebremoting.Container
. org.directwebremoting.WebContextFactory.WebContextBuilder
. org.directwebremoting.ServerContextFactory.ServerContextBuilder
. org.directwebremoting.servlet.UrlProcessor
. org.directwebremoting.extend.AccessControl
. org.directwebremoting.extend.AjaxFilterManager
. org.directwebremoting.extend.ConverterManager
. org.directwebremoting.extend.CreatorManager
. org.directwebremoting.extend.DebugPageGenerator
. org.directwebremoting.extend.HtmlCallMarshaller
. org.directwebremoting.extend.HtmlPollHandler
. org.directwebremoting.extend.PageNormalizer
. org.directwebremoting.extend.PlainCallMarshaller
. org.directwebremoting.extend.PlainPollHandler
. org.directwebremoting.extend.Remoter
. org.directwebremoting.extend.ScriptSessionManager
. org.directwebremoting.extend.ServerLoadMonitor


默认的实现大多数在org.directwebremoting.impl包,细节是在ContainerUtil.setupDefaults()指定的。


DWR1.1插件

. uk.ltd.getahead.dwr.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包

2.6 测试模式配置

通过添加如下参数,设置debug测试模式


<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>




在debug模式里,DWR将为每个allow的类(请看下面的dwr.xml配置章节)生成测试页面。这些能变得非
常有用帮助了解DWR能做什么和如何工作。这个模式也能警告你以防止javascript的保留字,或者重载问
题。
然而这个模式不应该被用在现场部署,因为他能给黑客或者攻击者许多关于服务器的详细信息。




第3章. dwr.xml配置

3.1 纵览

dwr.xml是你用来配置DWR的文件,默认是将其放入WEB-INF文件夹。
创建一个dwr.xml文件
dwr.xml有如下的结构:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting
2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd">
<dwr>
<!-- 仅当需要扩展DWR时才需要 -->
<init>
<creator id="..." class="..." />
<converter id="..." class="..." />
</init>
<!-- 没有它DWR什么也做不了 -->
<allow>
<create creator="..." javascript="..." />
<convert converter="..." match="..." />
</allow>
<!-- 有必要告诉DWR方法签名 -->
<signatures>...</signatures>
</dwr>





3.2 <init>标签

这个初始化部分申明被用来创建远程beans而且这个类能被用来以某种过程转换。大多数例子你将不需要
用它,如果你想去定义一个新的Creator或者Converter,就要在此被申明。
在init部分里有了定义只是告诉DWR这些扩展类的存在,给出了如何使用的信息。这时他们还没有被使
用。这种方式很像Java中的import语句。多数类需要在使用前先import一下,但是只有import语句并不
表明这个类已经被使用了。每一个creator和converter都用id属性,以便后面使用。



3.3 <allow>标签

allow部分定义了DWR能够创建和转换的类。

3.3.1 Creator

每一个在类中被调用的方法需要一个<create …>有若干类型的creator,使用“new”关键字或者Spring 框
架等。
create元素是如下的结构


<allow>
<create creator="..." javascript="..." scope="...">
<param name="..." value="..." />
<auth method="..." role="..." />
<exclude method="..." />
<include method="..." />
</create>
...
</allow>





1. creator属性

1).new:Java用“new”关键字创造对象
是DWR默认的creator,如下所示

<create id="new" class="org.directwebremoting.create.NewCreator"/>



没有必要把它加入dwr.xml,它已经在DWR内部文件了。
这个creator将使用默认构造器创建类的实例,以下是用new创建器的好处


. 安全:DWR创造的对象生存的时间越短,多次调用中间的值不一致的错误机会越少。
. 内存消耗低: 如果你的站点用户量非常大,这个创造器可以减少VM的内存溢出。



2).none: 它不创建对象,看下面的原因。 (v1.1+)
none创建器不创建任何对象,它会假设你不须要创建对象。有2个使用的原因:


. 你可能在使用的scope不是"page"(看上面),并在在前面已经把这个对象创建到这个scope中了,
这时你就不需要再创建对象了。
. 还有一种情况是要调用的方法是静态的,这时也不需要创建对象。DWR会在调用创建器之前先检
查一下这个方法是不是静态的。




对于上诉两种情况,你仍然需要class参数,用来告诉DWR它是在操作的对象类型是什么。



3). scripted: 通过BSF使用脚本语言创建对象,例如BeanShell或Groovy。

要使用这个创造器,你需要把一些辅助库放到WEB-INF/lib文件夹下:比如BSF的jar包,你要用
的脚本语言的jar包。
new创造器在DWR中已经默认声明了:
<creator id="script" class="uk.ltd.getahead.dwr.create.ScriptedCreator"/>
这个创造器用BSF来执行脚本得到Bean,例如:


<allow>
...
<create creator="script" javascript="EmailValidator">
<param name="language" value="beanshell" />
<param name="script">
import org.apache.commons.validator.EmailValidator;
return EmailValidator.getInstance();
</param>
</create>
...
</allow>




script创造器有如下参数:

参数

DWR版本

描述

language

1.0

脚本语言,字符串,例如'beanshell'. (必需)

script

1.0

要执行的脚本。 (必需,除非scriptPath参数存在)

scriptPath

1.1

脚本文件路径。 (必需,除非script参数存在)

reloadable

1.1

是否检测脚本文件的改动,以重新加载 (可选, 默认true)

class

1.0

创造出对象的类型(可选). 如果没有DWR通过创造器得到类型。




注意:
当一个类是用script创造出来的,并且scope是session或application,如果你的脚本改变,session中的
类和script中的类就不一致了。这样会出现错误。虽然web容器不用重启,但是用户需要先登出(或以某种
方式清空session),然后再登录。
当clazz参数不为空,并且用来创造新实例,DWR简单的调用 class.newInstance() 方法。这种方法是没
问题的,除非脚本正在用某个参数创建一个类,或者调用某个函数来配置这个类。 不幸的是,每次请求都
要重新运行script并造成上面的问题。



4). spring: 通过Spring框架访问Bean。

详情请见DWR与Spring整合
5). jsf: 使用JSF的Bean。 (v1.1+)

详情请见DWR与JSF整合
6). struts: 使用Struts的FormBean。 (v1.1+)

详情请见DWR与Struts整合
7). pageflow: 访问Weblogic或Beehive的PageFlow。 (v1.1+)

详情请见DWR与Weblogic或Beehive的PageFlow整合
8). ejb3:使用EJB3 session bean。(v2.0+)
一个正在实验的创造器,用来访问EJB Session beans。直到进行更多的测试和正式的维护,否则还
不能作为产品被使用。
如果你想写自己的creator,你必须在<init>里注册它。


2. javascript属性

在浏览器里给你创建的对象命名。避免使用JavaScript保留字。这个名字将在页面里作为js被导入,就像
第2章节的那个jsp:
dwr.xml

<create creator="new" javascript="service">
<param name="class" value="helloWorld.Service" />
</create>




html / jsp

<html>
<head>

<script type='text/javascript' src='dwr/interface/service.js'>






3. scope属性

和定义在servlet的scope一样大的范围,它允许你指定哪个bean是可以获得的。选项可以是:application,
session, request和page。这些值应该已经被开发者们熟悉了。
scope选项是可选的,默认为page, 使用session请求cookies。目前,DWR还不支持URL重写。



4. param元素

被用来指定创造器的其他参数,每种构造器各有不同。例如,"new"创造器需要知道要创建的对象类型是什
么。每一个创造器的参数在各自的文档中能找到。

5. include和exclude元素

允许一个创造器去限制进入类的方法。一个创造器必须指定include列表或exclude列表之一。如果是
include列表则暗示默认的访问策略是"拒绝",include中的每个方法就是允许访问的方法;如果是exclude
列表则暗示默认的访问策略是"允许",exclude中的每个方法就是拒绝访问的方法。
比如:


<create creator="new" javascript="Fred">
<param name="class" value="com.example.Fred" />
<include method="setWibble" />
</create>




说明你只能在DWR中使用Fred的是setWibble方法。


6. auth元素

允许你指定一个J2EE的角色作为将来的访问控制检查:


<create creator="new" javascript="Fred">
<param name="class" value="com.example.Fred" />
<auth method="setWibble" role="admin" />
</create>





7. 使用静态方法

DWR会在调用创建器之前先检查一下这个方法是不是静态的,如果是那么创造器不会被调用。很显然这个
逻辑适用于所有创造器,尽管如此"null"创造器是最容易配置的。


8. 使用单例类

对于单例类的创建,最好适用BeanShell和BSF来实例化对象。请参考scripted创造器。


9. DWR与HttpSessionBindingListeners

DWR1.x中存贮已经创造的Bean的方法需要注意,它在每次请求时都会调用相同的 setAttribute() 方法。
就是说,如果一个Bean在dwr.xml中的声明周期设置为session,再每次调用bean中的方法时,DWR
都会执行一次 session.setAttribute(yourBean) 。这看上去没有什么危害,但是如果你要使用servlet的事
件机制的,就是说用了HttpSessionBindingListener接口,你就会发现valueBound和valueUnbound事件
在每次调用时都会发生,而不是你想像的在bean被创建时以及session过期时。
DWR2 只在第一次创建对象时调用 setAttribute() 。


3.3.2 Converter

我们需要确认所有的参数能被转换。许多JDK提供的类型使你能够使用,但是你如果要转换你自己的代码,
就必须告诉DWR。一般是指JavaBean的参数需要一个<convert…>标签作为入口。
你不需要在dwr.xml中<allow>部分的<convert>中定义。它们默认支持。

. 所有主要的类型,boolean, int , double等等。
. 包装类,Boolean, Integer等等。
. java.lang.String
. java.util.Date 和 java.sql.Times,java.sql.Timestamp。
. 数组(存放以上类型的)
. 集合类型 (List, Set, Map, Iterator等等) (存放以上类型的)
. DOM对象(来自于DOM, XOM, JDOM和DOM4J)




1. 日期转换器

如果你有一个String(例如:“2001-02-11”)在Javascript,你想把它转换成Java日期。那么你有2种
选择,一是使用Date.parse()然后使用DataConverter传入服务器端,还有一种选择是把该String传入,
然后用java的SimpleDateFormat(或者其他的)来转换。
同样,如果你有个Java的Date类型并且希望在HTML使用它。你可以先用SimpleDateFormat把它转换
成字符串再使用。也可以直接传Date给Javascript,然后用Javascript格式化。第一种方式简单一些,尽
管浪费了你的转换器,而且这样做也会是浏览器上的显示逻辑受到限制。其实后面的方法更好,也有一些
工具可以帮你,例如:

. The Javascript Toolbox Date formatter
. Web Developers Notes on Date formatting


2. 数组转换器

数组实体不太容易理解。默认情况下DWR能转换所有原生类型的数组,还有所有marshallable对象的数
组。这些marshallable对象包括前面介绍的String和Date类型。match属性看上去很怪。


<convert converter="array" match="[Z"/>
<convert converter="array" match="[B"/>
<convert converter="array" match="[S"/>
<convert converter="array" match="[I"/>
<convert converter="array" match="[J"/>
<convert converter="array" match="[F"/>
<convert converter="array" match="[D"/>
<convert converter="array" match="[C"/>
<convert converter="array" match="[L*"/>




上面没有解释 * 的作用 - 它是通配符,表示匹配接下来的所有字符串。这也是DWR可以转换任意类型的
数组的原因。



3. bean和对象转换器

两个没有默认打开的转换器是Bean 和 Object 转换器。Bean转换器可以把POJO转换成Javascript的
接合数组(类似与Java中的Map),或者反向转换。这个转换器默认情况下是没打开的,因为DWR要获得
你的允许才能动你的代码。
Object转换器很相似,不同的是它直接应用于对象的成员,而不是通过getter和setter方法。下面的例子
都是可以用object来替换bean的来直接访问对象成员。
如果你有一个在 <create ...> 中声明的远程调用Bean。它有个一参数也是一个bean,并且这个bean有
一个setter存在一些安全隐患,那么攻击者就可能利用这一点。
你可以为某一个单独的类打开转换器:


<convert converter="bean" match="your.full.package.BeanName"/>




如果要允许转换一个包或者子包下面的所有类,可以这样写:


<convert converter="bean" match="your.full.package.*"/>




显而易见,这样写是允许转换所有的JavaBean:


<convert converter="bean" match="*"/>





. BeanConverter 和 JavaBeans 规范
用于被BeanConverter转换的Bean必须符合JavaBeans的规范,因为转换器用的是Introspection,
而不是Reflection。这就是说属性要符合一下条件:有getter和setter,setter有一个参数,并且这个
参数的类型是getter的返回类型。setter应该返回void,getter应该没有任何参数。setter没有重载。
以上这些属于常识。就在eclipse里自动为每个属性添加setter,getter那种类型,如果你用的不是
JavaBean,那么你应该用ObjectConverter.




. 设置Javascript变量
DWR可以把Javascript对象(又名maps,或联合数组)转换成JavaBean或者Java对象。例子:




public class Remoted {
public void setPerson(Person p) {
// ...
}
}
public class Person {
public void setName(String name) { ... }
public void setAge(int age) { ... }
// ...
}




如果这个Remoted已经被配置成Creator了,Persion类也定义了BeanConverter,那么你可以通过下面
的方式调用Java代码:


var p = { name:"Fred", age:21 };
Remoted.setPerson(p);





. 限制转换器
就像你可以在creator的定义中剔出一些方法一样,converter也有类似的定义。



限制属性转换仅仅对于Bean有意义,很明显原生类型是不要需要这个功能的,所以只有
BeanConverter及其子类型(HibernateBeanConverter))有这个功能。
语法是这样的:


<convert converter="bean" match="com.example.Fred">
<param name="exclude" value="property1, property2" />
</convert>




这就保证了DWR不会调用 fred.getProperty1() 和fred.getProperty2两个方法。另外如果你喜欢"白
名单"而不是"黑名单"的话:


<convert converter="bean" match="com.example.Fred">
<param name="include" value="property1, property2" />
</convert>




安全上比较好的设计是使用"白名单"而不是"黑名单"。


. 访问对象的私有成员
通过'object'转换器的参数的一个名为force的参数,可以让DWR通过反射来访问对象私有成员。



语法是这样的:


<convert converter="object" match="com.example.Fred">
<param name="force" value="true" />
</convert>




直到DWR1.1.3,这里有一个bug,public的field反而不能被发现,所以你需要在public成员上设置
force=true。




4. 集合类型转换器

有个两个默认的转换器,针对Map和Collection:


<convert converter="collection" match="java.util.Collection"/>
<convert converter="map" match="java.util.Map"/>




一般来说这些转换器可以递归转换它们的内容。
但是也有两点不足之处:


. 仅仅用反射机制是没有方法明确集合里面是什么类型的。所以这两个转换器不能把集合里面的东西转
换成有意义的Javascript对象。
. 不能明确是那种类型的集合。 虽然我们不能让他们自动的起作用,我们可以在dwr.xml中用
signatures语法声明它们类型,使之正确转换。




5. 枚举类型转换器

枚举类型转换器默认是没有打开的。它在Java5中的Enum和Javascript的String之间进行转换。这个转
换器默认关闭是因为DWR要在转换你的代码之前得到你的同意。
枚举类型转换器是DWR 1.1版以后才支持的。
你可以这样设置来打开这个转换器:


<convert converter="enum" match="your.full.package.EnumName"/>




设置Javascript,一个简单的例子。假设你有下面的Java代码:


public class Remoted {
public void setStatus(Status p) {
// ...
}
}
enum Status {
PASS, FAIL,
}




如果Remoted类已经配置好Creator,并且Status枚举类型已经设置了EnumConverter。那么你就可以
在javascript中这样调用:


Remoted.setStatus("PASS");




6. DOM 对象

DWR可以自动转换来之DOM,DOM4J,JDOM和XOM的DOM树。你可以简单得用上面这些类库返回一
个Document、Element或者Node,DWR会把他们自动转换成浏览器的DOM对象。
在程序启动的时候会有一个常见的关于JDOM转换器的警告,你可以放心的忽略它,除非你要用JDOM:


INFO: Missing classdef for converter 'jdom'. Failed to load
uk.ltd.getahead.dwr.convert.JDOMConverter. Cause: org/jdom/Document




因为DWR没有办法知道你是否想用JDOM,所以这个信息设在INFO级别的。
如果你曾经尝试过使用JDOM,你会意识到在这种情况下这个转换器不可用的 - 这也是我们显示这个信息
的原因。
exist-db.org,我相信DWR能同exist-db很好的工作,因为它是建立在W3C DOM之上的,而DWR也支
持这个。




3.4 <signatures>标签

DWR使用反射机制在转换过程中找到它应该使用的类型。有时候类型的信息无法获得,在这种情况下你要
在此处用方法签名给予暗示。
signatures段使DWR能确定集合中存放的数据类型。例如下面的定义中我们无法知道list中存放的是什么
类型。


public class Check {
public void setLotteryResults(List nos)
{
...
}
}




signatures段允许我们暗示DWR应该用什么类型去处理。格式对以了解JDK5的泛型的人来说很容易理
解。


<signatures>
<![CDATA[
import java.util.List;
import com.example.Check;
Check.setLotteryResults(List<Integer> nos);
]]>
</signatures>




DWR中又一个解析器专门来做这件事,所以即便你的环境时JDK1.3 DWR也能正常工作。
解析规则基本上会和你预想规则的一样(有两个例外),所以java.lang下面的类型会被默认import。
第一个是DWR1.0中解析器的bug,某些环境下不能返回正确类型。所以你也不用管它了。
第二个是这个解析器时"阳光(sunny day)"解析器。就是说它非常宽松,不想编译器那样严格的保证你一定
正确。所以有时它也会允许你丢失import:


<signatures>
<![CDATA[
import java.util.List;
Check.setLotteryResults(List<Integer>);
]]>
</signatures>






将来的DWR版本会使用一个更正式的解析器,这个编译器会基于官方Java定义,所以你最好不要使用太
多这个不严格的东西。
signatures段只是用来确定泛型参数中的类型参数。DWR会自己使用反射机制或者运行时类型确定类型,
或者假设它是一个String类型。所以:
不需要signatures - 没有泛型参数:


public void method(String p);
public void method(String[] p);




需要signatures - DWR不能通过反射确定:


public void method(List<Date> p);
public void method(Map<String, WibbleBean> p);




不需要signatures - DWR能正确的猜出:


public void method(List<String> p);
public void method(Map<String, String> p);




不需要signatures - DWR可以通过运行时类型确定:


public List<Date> method(String p);




没有必要让Javascript中的所有对象的key都是String类型 - 你可以使用其他类型作为key。但是他们在
使用之前会被转换成String类型。DWR1.x用Javascript的特性把key转换成String。DWR2.0可能会用
toString()方法,在服务段进行这一转换。




第4章. 整合

4.1 DWR与Servlet

有2个Java类你一般需要用在DWR中,是webContext和WebContextFactory
在DWR 1.x 它们在uk.ltd.getahead.dwr 包, DWR 2.0+在org.directwebremoting包。这2个类给与你
访问标准Http servlet对象的入口。这些对象是:


. HttpServletRequest
. HttpServletResponse
. HttpSession
. ServletContext
. ServletConfig




4.1.1 使用webContext的方法:



import uk.ltd.getahead.dwr.WebContext;
import uk.ltd.getahead.dwr.WebContextFactory;
//
WebContext ctx = WebContextFactory.get();
req = ctx.getHttpServletRequest();




处理Http request和response做为只读是非常重要的。因为,当Http headers也许会通过,那么有些浏
览器会忽略它们(比如IE忽略缓存参数)。任何尝试改变Http body将会导致DWR错误。
WebContext使用一个本地线程变量,所以你能使用以上的代码放在任何地方。


也可以看一下 DWR的Java文档 ,或者详细看一下 WebContext 。
WebContext代替了DWR1.1中的ExecutionContext。


4.1.2 方法选择

在没有写依赖于DWR的代码时,要能够访问Http servlet对象是可以做到的(比如HttpServletRequest,
HttpServletResponse, HttpSession, ServletContext or ServletConfig)。DWR将自动填充它。
举个例子:


public class Remote {
public void method(int param, ServletContext cx, String s) { ... }
}






然后你将可以从Javascript中通访问它尽管没有ServletContext参数:


Remote.method(42, "test", callback);




DWR将为你填充这个参数。


对这个方法这里有个小小的警告,你要保证你的没有把’callback function’作为第一个参数,而应该把它作
为最后一个参数,或者作为元数据对象




4.2 DWR与Spring

4.2.1 让DWR和Spring一起工作的检查列表

1. 确认你用的是最新版的DWR。Spring创造器已经有了变化,所以你最好检查一下DWR的最新版本。
2. 确认你的Spring的Bean在DWR外面运行良好。
3. 配置DWR和Spring一起工作。 (看下面)
4. 查看演示页面: http://localhost:8080/[ YOUR-WEBAPP ]/dwr ,检查spring的Bean是否出现。



DWR对于Spring没有运行期依赖,所以如果你不使用Spring那么Spring的支持不会产生任何影响到。


4.2.2 Spring Creator

这个创造器会在spring beans.xml里查询beans,并且会使用Spring去创建它们。如果你已经使用Spring,
这个创造器会非常有用。否则将完全没有任何用处。
要让DWR使用Spring创造器去创建和远程调用beans,要像如下所示:


<allow>
...
<create creator="spring" javascript="Fred">
<param name="beanName" value="Shiela" />
</create>
</allow>





4.2.3 找到Spring配置文件

有3个方法可以找到Spring配置文件

1. ContextLoaderListener

最简单的用法使从Spring-MVC里使用

org.springframework.web.context.ContextLoaderListener



你不必使用整个Spring-MVC去确认这个普遍的解决方案使多么好。只要再你的web.xml里配置:


<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/beans.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>






2. 使用location参数

如果你喜欢指定的beans.xml在你的dwr.xml文件中,那么你能使用location参数。你可以指定你希望数
量的,必须有唯一的以”location”开头的命名。比如:location-1, location-2。这些locations是作为参数传
到Spring的ClassPathXmlApplicationContext:


<allow>
...
<create creator="spring" javascript="Fred">
<param name="beanName" value="Shiela" />
<param name="location" value="beans.xml" />
</create>
</allow>





3. 设置beenFactory目录

Spring创造器有一个静态的方法:setOverrideBeanFactory(BeanFactory),这个方法提供一个可编程的方
式去覆盖任何BeanFactories。


4.2.4 使用Spring配置DWR

Bram Smeets写了一个有意思的blog,教你配置DWR使用beans.xml代替WEB-INF/web.xml。
我也对于如何在beans.xml中指定dwr.xml很感兴趣,尽管这看上去有些Spring传染病的感觉。




4.3 DWR与JSF

DWR包括两个JSF的扩展点,一个创造器和一个ServletFilter。

4.3.1 JSF Creator

DWR1.1中有一个体验版的JsfCreator。你可以在dwr.xml中这样使用:


<allow>
...
<create creator="jsf" javascript="ScriptName">
<param name="managedBeanName" value="beanName" />
<param name="class" value="your.class" />
</create>
...
</allow>




这将允许你通过DWR调用ManagedBean。


4.3.2 Servlet Filter

DWR/Faces 过滤器允许你不在JSF的生命周期里调用FacesContext中的Bean。
要使用JsfCreator,你应该把DWR/Faces过滤器加到web.xml中。


<filter>
<filter-name>DwrFacesFilter</filter-name>
<filter-class>
uk.ltd.getahead.dwr.servlet.FacesExtensionFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>DwrFacesFilter</filter-name>
<url-pattern>/dwr/*</url-pattern>
</filter-mapping>




这两个需要放在web.xml中与其他的filter和filter-mapping放在一起。




4.4 DWR与Struts

DWR能够和任何框架结合。这个网站是个极端巧妙的证据,因为它把DWR使用在Drupal(PHP)。
DWR和Struts整合有2个层次。最基础的层次就是同时使用这两个框架,这是非常容易的,但是这样就
不允许在DWR和Struts之间共享Action了。
DWR能构调用任何方法,所以你也能从调用一个Struts action,除非你不想那么做。ActionForm的内容
是什么,当返回ActionForward时DWR怎么做?
一个比较好方法是重构你想调用的Action,提取出Action的逻辑。DWR和你的Action就可以同时调用相
同的方法了。


4.4.1 Struts creator

DWR1.1增加了一个StrutsCreator。你可以在dwr.xml中这样使用:


<allow>
...
<create creator="struts" javascript="ScriptName">
<param name="formBean" value="formBeanName" />
</create>
...
</allow>




这样你就能从DWR调用FormBeans。


4.4.2 开始顺序

如果正在使用Struts创造器,那么你应该确保Struts初始化在DWR之前。你要保证你在web.xml里有一
个<load-on-startup>的值,其中Struts的值比DWR设置地要低。




4.5 DWR与Weblogic或PageFlow

DWR中有一个创造器可以和Weblogic或者Beehive中的PageFlow一起工作。
PageFlow creator
DWR1.1中加入了一个PageFlowCreator。你可以这样使用:


<allow>
...
<create creator="pageflow" javascript="ScriptName"/>
...
</allow>








4.6 DWR与Hibernate

4.6.1 让DWR和Hibernate一起工作的检查列表

1. 确保你使用的是最新的DWR。Hibernate转换器是新东西,所以你需要下载最新版本
2. 确保你的Hiberante在没有DWR的时候工作正常。
3. 如果是Spring和Hibernate一起使用,那么你最好先了解一下如何将整合Spring。
4. 配置DWR,使之与Hibernate一起工作。 (看下面)。
5. 查看演示页面:http://localhost:8080/YOUR-WEBAPP/dwr,确定Spring的Bean可以出现。




4.6.2 HibernateBeanConverter

除了我们可以决定是否要使用lazy loaded属性,这个转换器非常类似于标准的BeanConverter。
在DWR1.1 Hibernate转换器被称为“hibernate”并且作用在hibernate2, 在DWR2.x有2个转换器被
称为“hibernate2”并且作用在hibernate3。
使用HibernateBeanConverter也许有点风险,原因如下:

. 结构:HibernateBeanConverter不符合MVC模式,所以不能把对象在数据曾和表现曾之间进行隔离。
这个风险可以通过在上面加上独立的bean来减轻。
. 性能: DWR试图通过相同的序列化方式来转换所有可以得到的属性(除了DWR仅仅读JavaBean属
性的时候)。所以可能会出现通过HTTP序列化了你的整个数据的情况。通常这并不是你想要的。要
减少这一风险可以使用BeanConverter(HibernateBeanConverter衍生于它)的排除某些属性的功能,
如下所示:




<param name="exclude" value="propertyToExclude1, propertyToExclude2"/>




HibernateBeanConverter会尝试不去读取没有初始化的属性。如果你只是想读取所有的东西那么应该使用
BeanConverter。
建议使用Hibernate3,实际上Hibernate2的情况,你会发现你得到的都是空的Bean。


4.6.3 Session管理

如果你使用Hibernate对象,你需要知道每一个DWR请求都是一个新的Servlet请求,所以你需要保证为
每个请求打开一个Hiberante的Session。


如果你用Spring,那么可以很方便的使用Spring里面的OpenSessionInViewFilter,它可以保证为每个请
求打开一个Hiberante的Session。类似的解决方案在其它Framework中也存在。




4.7 DWR与WebWork

WebWork支持在DWR2.0m3以后才有。
要可以通过DWR调用WW的Action,要做两件事。

4.7.1 配置dwr.xml

你必须在dwr的配置文件中加入这样的配置:


<create creator="none" javascript="DWRAction">
<param name="class"
value="org.directwebremoting.webwork.DWRAction" />
<include method="execute" />
</create>
<convert converter="bean"
match="org.directwebremoting.webwork.ActionDefinition">
<param name="include"
value="namespace,action,method,executeResult" />
</convert>
<convert converter="bean"
match="org.directwebremoting.webwork.AjaxResult" />




这样你AjaxWebWork Action调用返回一个action实例(而不是文字)。然后你必须包括action对象的转换
器定义(package级别或单独action)。


<convert converter="bean" match="your_action_package.*"/>





4.7.2 在JSP中导入脚本

下面这些代码开启DWR调用Action的功能。你还要导入DWRActionUtil.js脚本(在你的web脚本路径中)
像这样在JS中调用Action:


DWRActionUtil.execute(id, params, callback, [displayMessage]);





1. id 参数



. actionUri: 要调用action的URI(没有 .action). 例如:




DWRActionUtil.execute('/ajax/TestFM', 'myform', 'doOnTextResult');






. actionDefinitionObject: 在xwork.xml中定义的action对象. 必须指定下面的内容:
. namespace: xwork.xml中action的名称空间
. action: xwork.xml中action的名字
. executeResult: true|false (是否执行action的结果, 如果false直接返回action实例)


例如:


DWRActionUtil.execute({
namespace:'/ajax',
action:'TestJS',
executeResult:'true'
}, 'data', doOnJSResult, "stream...");





2. params 参数

. emptyParams: 传递{}忽略任何参数。例子:




DWRActionUtil.execute('/ajax/TestFM', {}, doOnJSResult, "stream...");





. fieldId: 被转换为action调用参数的字段的id。


例子:


<input id="mytext" name="mytext" value="some value" type="text"/>
DWRActionUtil.execute('/ajax/TestFM', 'mytext', doOnJSResult,
"stream...");





. formId: 表单的id. 所有的input值被转换为action调用参数。



Note : 如果你的action使用了parameter拦截器,那么你的action会得到正确的参数值,请参考WebWork
的文档。


3. callback 参数

. callbackFunction: 在DWR中,这个函数在
分享到:
评论

相关推荐

    Ajax&DWR帮助文档.rar

    Ajax&DWR帮助文档.rar: 包含: DWR中文文档.pdf AJAX入门手册.chm

    dwr中文文档和实例.rar

    dwr中文文档和实例介绍详细,是学习Ajax必不可少的资料

    DWR 中文文档(Java与Ajax).rar

    DWR 中文文档(Java与Ajax).rar

    dwr源码.rar_DWR源代码

    DWR核心源代码,对研究DWR原理具有重要的作用,结合dwr官方文档进行学习

    DWR中文文档,通俗易懂,新手进!

    DWR中文文档,通俗易懂,新手进!不懂的说话....最近比较闲...

    DWR与界面开发.rar

    网上找来的DWR与界面开发的几个文档打包

    java大全(ajax apress extjs java2 极限编程).rar

    Ajax+DWR中文文档.pdf Apress.Pro.Apache.Ant.Nov.2005.pdf Building a Java chat server.pdf EN_Java 极限编程_PDF.pdf extjs实用开发指南.pdf Java2参考大全(第四版).pdf

    OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR).rar

    资源内容:项目全套源码+完整文档 源码说明: 全部项目源码都是经过测试校正后百分百成功运行。 SpringBoot 毕业设计,SpringBoot 课程设计,基于SpringBoot+Vue开发的,含有代码注释,新手也可看懂。ssm整合开发,...

    Java顺发物流管理系统源码(源码+数据库+开发文档+部署手册+用户分析需求手册).rar

    jsp物流管理系统源码(源码+数据库+开发文档+部署手册+用户分析需求手册).rar 我们在学习了Java各种基础知识之后,最需要做的就是学会应用,开发一些项目把所学的知识应用起来,下面的这个《顺发物流管理系统源码》...

    档案管理系统源码12个合集.zip

    crm(整个项目是基于BS模式,应用Struts2+Spring+Hibernate 、DWR和ExtJS五个框架实现了一个绚丽的客户关系管理系统).rar dangan(给客户做的一个档案管理系统,可以增加图片,归档,扫描).rar DocManager20081030...

    精通JS脚本之ExtJS框架.part2.rar

    2.1.1 文档对象 2.1.2 表单及其元素对象 2.1.3 浏览器信息对象 2.1.4 窗口对象 2.1.5 网址对象 2.1.6 历史记录对象 2.2 基本事件处理 2.3 2级DOM事件模型 2.3.1 事件传播 2.3.2 注册事件处理程序 2.3.3 ...

    精通JS脚本之ExtJS框架.part1.rar

    2.1.1 文档对象 2.1.2 表单及其元素对象 2.1.3 浏览器信息对象 2.1.4 窗口对象 2.1.5 网址对象 2.1.6 历史记录对象 2.2 基本事件处理 2.3 2级DOM事件模型 2.3.1 事件传播 2.3.2 注册事件处理程序 2.3.3 ...

    房屋出租系统House.rar

    该项目采用MVC三层架构,使用Struts开发,其中还用了dwr等技术,使用SQLServer 2005数据库,资源内附说明文档,详细见其文档,在此共享,希望对大家工作学习有所帮助,祝大家学习工作开心顺利,天天进步

    jQueryTest.rar

    这段代码创建一个document元素的jQuery对象, 然后当html DOM文档准备完毕后调用此实例. 你可以无限次的调用这个函数. 另外,在真正的jQuery风格代码中,这个函数还有一个缩写形式.简单的传递一个函数给$()函数:3....

    Ajax详解.rar

    请访问 Ajax 技术资源中心,这是有关 Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何新信息都能在这里找到。 但是,Ajax 不仅仅 是一种时尚,它是一种构建网站的强大方法,...

    ajax相关资料整理

    ajax官方文档 AJAX WEB2.0技术详解.pdf AJAX表格分页模板.doc ajax专家开发手记 如何使用Dojo的DatePicker控件制作联动日期选择器.doc Dwr相关.doc ajax框架:dwr 实战.pdf 突破JavaScript编程实例五十讲.rar ...

    (3.0版本)自己写的struts2+hibernate+spring实例

    分别是关于项目中所使用的dwr的配置.table组件的配置说明文档.junit单元测试说明文档.还有我写这个例子时应该注意的一些东西.外加一些关于struts2和hibernate的技巧心得整理. 说一下这次3.0更新的内容.可能大家在我...

Global site tag (gtag.js) - Google Analytics