什么是
DWR?
DWR
是英文
Direct Web Remoting
的缩写,是一套易于用
Java
实现的
Ajax
框架,利用
DWR
可以轻松实现页面的无刷新效果。
图(
1
)
图(
1
)就是典型的
DWR
调用过程:
对 select 框的选择(此处应有
select
的
onchange
事件来调用页面上的
eventHandler
函数),会调用服务器端的
Java
函数
AjaxService.getOptions()
,该
Java
方法返回一个
String
数组到页面上,同时,调用回调函数
populateList()
,通过
DWR
自带的方法将该数组的值添加到下拉框中。
整个过程中页面不会刷新,但页面上的结果会有所不同。
dwr.xml 介绍术语:
参数会被 converted, 远程
Bean
会被
created,
所以如果有一个叫
A
的
bean
,它有一个方法叫
A.blah(B)
,那么你需要一个
A
的
creator
和一个
B
的
converter
。
DWR 的配置文件
dwr.xml
大致分为三个部分:
1.
<init>
<init> 标签用于声明自己的创造器
2.
<allow>
<allow> 标签是必须的,否则
DWR
什么也做不了
实例:
<allow>
<create creator = “new” javascript = ”testClass”>
<param name=”class” value=”/com.dwr.TestClass” />
<include method=”testMethod1” />
</create>
</allow>
<create> 标签中指定
javascript
中可以访问的
java
类,并定义
DWR
应当如何获得将要进行远程调用的类的实例。
creator = “new” 属性指定
java
类实例的生成方式,
new
意味着
DWR
应当调用类的默认构造函数来获得实例,当然还有其它方式
javascript=”testClass” 属性指定
javascript
代码访问对象时使用的名称。
<param> 标签指定要公开给
javascript
的
java
类名
<include> 标签指定要公开给
javascript
的方法,不指定的话就公开所有方法
<exclude> 标签指定要防止被访问的方法。
l <converter>
我们必须保证所有的参数都可以被转换, JDK 中的大多数类型已经有转换器了,但是你需要给
DWR
转换你的代码的权利,一般来说
JavaBean
的参数需要
<convert…>
定义,默认情况下,如下类型不需要定义就可以转换:
1. 所有原生类型
boolean
、
int
、
double
等
2. 原生类型的对象类型
Integer
、
Double
等
3.
Java.lang.String
、
java.util.Data
和
SQL
中的
Date
4. 以上类型组成的数组
5. 以上类型的集合类型
(List
、
Set
、
Map
、
Iterator
等
)
3.
<signatures>
signatures 使
DWR
能确定集合中存放的数据类型。例如下面的定义中我们无法知道
list
中存放的是什么类型。
public class Check{
Public void setLotteryResults(List nos){
…….
}
}
Signatures 允许我们暗示
DWR
应该使用什么类型去处理,如下:
<signatures>
<![CDATA[
import java.util.List;
import com.exapmle.Check;
Check.setLotteryResults(List<Integer> nos);
]]>
< /signatures >
Signatures 只是用来确定泛型参数中的类型参数。
DWR
会自己使用反射机制或运行时类型来确定类型,或者假设它是一个
String
类型,所以:
l 不需要 signatures —没有泛型参数
Public void method(String p);
Public void method(String[] p);
l 需要 signatures —
DWR
不能通过反射确定
Public void method(list<DATE> p);
Public void method(Map<String, WibbleBean> p);
l 不需要 signatures —
DWR
能够正确的猜出
Public void method(String p);
l 不需要 signatures —
DWR
可以通过运行时类型确定
Public List<DATE> method(String p);
Reverse Ajax 通常情况下的
Ajax
过程:
Reverse Ajax ——反向
Ajax
,即服务器端的
java
方法可以取得浏览器端的
Web
上下文,并可以调用
javascript
的方法,将服务器端的数据异步地传输给浏览器。
DWR 支持
3
种从服务器端发送数据给客户端的方式:
l Polling
轮询:客户端在每个时间周期内向服务器发送请求,看看服务器有没有数据更新,如果有,就向服务器请求数据。
l Comet
Comet 基于
HTTP
长连接的服务器推动方式。客户端向服务器端发送请求后,服务器端将数据通过
response
发送给客户端,但不会将此
response
关闭,而是一直通过
response
将最新的数据发送给客户端浏览器,知道客户端浏览器关闭。
l Piggybacking
服务器端将最近的数据排成队列,等待客户端下一次请求,接收到请求后就将等待更新的数据发给客户端。

对 select
整个过程中页面不会刷新,但页面上的结果会有所不同。
dwr.xml
参数会被 converted,
DWR
1.
<init>
2.
<allow>
实例:
<allow>
<create creator = “new” javascript = ”testClass”>
<param name=”class” value=”/com.dwr.TestClass” />
<include method=”testMethod1” />
</create>
</allow>
<create>
creator = “new”
javascript=”testClass”
<param>
<include>
<exclude>
l <converter>
我们必须保证所有的参数都可以被转换, JDK
1.
2.
3.
4.
5.
3.
signatures
public class Check{
Public void setLotteryResults(List nos){
…….
}
}
Signatures
<signatures>
<![CDATA[
import java.util.List;
import com.exapmle.Check;
Check.setLotteryResults(List<Integer> nos);
]]>
< /signatures >
Signatures
l 不需要 signatures
Public void method(String p);
Public void method(String[] p);
l 需要 signatures
Public void method(list<DATE> p);
Public void method(Map<String, WibbleBean> p);
l 不需要 signatures
Public void method(String p);
l 不需要 signatures
Public List<DATE> method(String p);
Reverse Ajax

Reverse Ajax
DWR
l Polling
轮询:客户端在每个时间周期内向服务器发送请求,看看服务器有没有数据更新,如果有,就向服务器请求数据。

l Comet
Comet

l Piggybacking
服务器端将最近的数据排成队列,等待客户端下一次请求,接收到请求后就将等待更新的数据发给客户端。
