将基于互联网的Java应用软件做得更具交互性并不一定很困难,直接互联网远程(Direct Web Remoting(DWR))工具包可以帮您实现AJAX中大部分工作。
以往,我们使用过ToDoTasks软件,并将其添加到工作架构中,这样人们可以通过浏览器来查阅报告,这个月,我们将继续前进一步,创建一个更具交互性的浏览器体验。
现在,我们可以通过编写我们自己的servlet或JSP代码来生成更加智能的网页以实现这一点,这种方法行得通,但是在浏览器中使用AJAX/DHTML进行人机交互变得越来越普遍,但它的工作量也是非常大的,而且在维护软件方面也存在潜在的困难,现在有更加快捷的方法,这就是我们将要使用的DWR。
DWR的意思是直接互联网远程工作(Direct Web Remoting),在DWR背后的基本思想是使存在于服务器上的Java类对于运行在浏览器中的JavaScript代码是可见的。
DWR是基于所需要的Java类方法和字段的,DWR创建的JavaScript代码也是访问这些类和字段所必需的,因此您不必自己编写AJAX代码,一下是一个简单的例子:
package com.builder.uk.todotasks;
public class Adder {
public Adder() {}
public int add(int x,int y) { return x+y; }
}
然后,在一个HTML文件中适当的位置进行适当的配置:
<script type='text/javascript' src='http://www00.zdnet.com.cn:8080/dwr/interface/Adder.js'></script>
<script type='text/javascript' src='http://www00.zdnet.com.cn:8080/dwr/engine.js'></script>
<script type='text/javascript' src='http://www00.zdnet.com.cn:8080/dwr/util.js'></script>
这将会调用DWR为Adder生成JavaScript界面,并包括DWR“引擎”代码和DWR工具代码。在页面的脚本中我们可以通过一个调用来访问Adder:
Adder.add(doneAdd,100,200);
脚本中的doneAdd是一个函数引用,该函数是在一个请求完成的时候被调用的,调用的结果就是Adder.add:
function doneAdd(result) {
alert(result);
}
这在我们的例子中将会弹出"300"的结果。
在建立我们的新用户界面之前,我们在ToDoTasks上的第一站将是让它工作,所以继续使用上一篇文章中的源代码,并添加DWR。首先,下载DWR,DWR 2.0目前还在开发中,所以我们使用现在的1.1版,下载dwr.jar文件。我们将它添加到以前创建的网络应用软件文件夹而不是将jar文件放到libs文件夹中,所以我们webapp/WEB-INF中创建一个lib文件夹并将dwr.jar拷贝到此位置。
在dwr.jar的内部就是DWR所使用的servlet和资源,所以我们需要将DWR servlet和网络应用软件连接起来。编辑webapp/WEB-INF/web.xml文件并加入以下语句:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<display-name>DWR Servlet</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>条目之后定义DWR servlet并在现有的<servlet-mapping>条目之后添加:
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
为了映射DWR servlet来处理所有对/dwr/*的请求。我们使用早前展示过的的代码在src/com/builder/uk/todotasks/创建了Adder.java文件。
现在就只有一个步骤了:配置DWR。DWR是通过webapp/WEB-INF文件夹中一个名为dwr.xml的文件配置的,此文件可以控制哪些Java类对于JavaScript是可见的,以下是连接Adder的dwr.xml的例子:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
<allow>
<create creator="new" javascript="Adder" scope="session">
<param name="class" value="com.builder.uk.todotasks.Adder"/>
</create>
</allow>
</dwr>
在<dwr>元素之内有一个<allow>元素可以控制哪些类是允许被访问的,在<allow>之内,我们有一个<create>元素,它定义了DWR在何时创建类的一个实例。在此处,creator的属性被设定为"new",它规定了实例被创建时将使用Java的'new'操作符。其它的creator值还包括"scripted",用于通过一种脚本语言创建实例,"spring"、"jsf"、"struts"以及"pageflow"用于通过这些架构来创建实例,而"null"则用于静态类。
Javascript属性指定了该实例在JavaScript代码中使用的名称,最后scope属性设定了对象何时出现以及存续时间,在此,我们指定了"session"所以它将在服务器上浏览器会话开始的时候创建。
<create>元素可以包含许多元素,<param>元素是传送到creator的,所以在这种情况下,我们将"class"参数设定为Java类的名字。
现在我们可以运行ToDoTasks程序了,并在浏览器中打开http://localhost:8080/dwr/,在此我们可以看到DWR类的列表,这个页面是DWR测试/调试的前台,我们可以在<servlet>定义中打开它。

图1
当我们点击 Adder的链接,我们将得到Adder的测试页面。

图2
这首先展示了使用Adder时,我们向一个JavaScript页面所需要添加的代码,然后它列出了可供调用的方法,这是一个动态列表,您可以向add()项目的字段中输入值,并点击执行来调用软件/服务器端的方法。

图3
这包含了DWR的基础,为了钻研得深入一些,我们使用了一个新版本的ToDoTasks,您可以用它来构建和运行。和Adder的例子一样,它拥有基于DWR的前端界面,可以查看、编辑和删除任务。

图4
为了管理前端界面,我们创建了一个名为TasksSession的类。这包含了一个Task实例的ArrayList,它可以根据一个SortOrder变量进行排序,该变量可以封装该字段以实现排序,无论是升序还是降序。