这是一个Web Project
首先是web.xml文件
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <!-- 指定DWR配置文件。该文件名可随意,它主要取决于下面所指定的文件名 --> <!-- 如果只有一个DWR配置文件,则可以写为如下形式,即仅指定一个config初始化参数名 --> <!-- 并且如果DWR的配置文件为dwr.xml,那么它默认的就会到WEB-INF目录下寻找该文件 --> <!-- <init-param> <param-name>config</param-name> <param-value>WEB-INF/dwr.xml</param-value> </init-param> --> <!-- 若存在多个DWR配置文件,则可以写为config-1、config-2的形式 --> <!-- <init-param> <param-name>config-1</param-name> <param-value>WEB-INF/dwr11.xml</param-value> </init-param> <init-param> <param-name>config-2</param-name> <param-value>WEB-INF/dwr22.xml</param-value> </init-param> --> <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> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
然后是DWR的配置文件dwr.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd"> <dwr> <allow> <!-- 通过javascript属性指定DWR为我们生成的客户端JavaScript文件的名称 --> <create creator="new" javascript="JSHello"> <!-- 指定所要发布的Java类 --> <param name="class" value="com.jadyer.dwr.Hello" /> <!-- 指定所要发布的方法。若没有使用<include>标签指定,则默认发布该类中的所有方法 --> <include method="sayHello" /> </create> <create creator="new" javascript="JSPersonManager"> <param name="class" value="com.jadyer.dwr.PersonManager" /> </create> <!-- DWR会自动将Java中的简单数据类型转换为JavaScript表示,其中包括Java原生类型、封装类型、String、Date、数组、集合 DWR也可以将JavaBean对象转换成JavaScript表示,但是出于安全性的原因,要求显式的配置,这时可以使用<convert>标签 match="com.jadyer.model.Person"属性====指定所要转换的JavaBean名称 converter="bean"属性===================指定采用JavaBean命名规范的方式转换 在<convert>标签中还可以使用<param>标签指定所要转换的JavaBean属性,默认它会转换该JavaBean中的所有属性 这是<param>标签的示例代码<param name="include" value="id, name, ghouls" /> --> <convert match="com.jadyer.model.Ghoul" converter="bean" /> <convert match="com.jadyer.model.Person" converter="bean" /> </allow> </dwr> <!-- 【DWR====Direct Web Remoting====http://directwebremoting.org/dwr/】 1..添加DWR的支持 DWR依赖于commons-logging.jar文件,所以将下载到的dwr.jar和commons-logging-1.1.1.jar添加到Web Project中 这是dwr.jar文件的下载地址https://java.net/downloads/dwr/Development%20Builds/Build%20116/dwr.jar 2..在web.xml中对org.directwebremoting.servlet.DwrServlet进行相关配置 3..创建DWR配置文件 4..生成JavaScript文件 假设这里的Web Project为dwr_demo。将dwr_demo部署后,访问http://127.0.0.1:8088/dwr_demo/dwr 然后在所显式出的页面中点击JHello链接,这时会看到一大片文本,比较明显的就是三个js文件 <script type='text/javascript' src="/dwr_demo/dwr/interface/JHello.js"></script> <script type='text/javascript' src="/dwr_demo/dwr/engine.js"></script> <script type='text/javascript' src="/dwr_demo/dwr/util.js"></script> 紧接着我们会看到sayHello("" )和Execute按钮,这时我们可以点击Execute按钮测试一下 5..在页面中引入DWR生成的JavaScript文件 拷贝该页面中的三段引入js文件的代码到我们的前台页面中 其中JHello.js是由DWR自动生成的,engine.js和util.js是公共的js文件,任何一个DWR项目中都会使用到 由于这三个js文件是由DWR自动生成的,所以并不需要额外的把它们放到我们的Web Project中 6..在前台页面中编写客户端代码 -->
接着是用于测试并显示DWR效果的index.jsp页面
<%@ page language="java" pageEncoding="UTF-8"%> <script type='text/javascript' src="/dwr_demo/dwr/interface/JSHello.js"></script> <script type='text/javascript' src="/dwr_demo/dwr/interface/JSPersonManager.js"></script> <script type='text/javascript' src="/dwr_demo/dwr/engine.js"></script> <script type='text/javascript' src="/dwr_demo/dwr/util.js"></script> <script type="text/javascript"> /** * 返回字符串 */ function sayHello(){ //文件名.方法名。。文件名即生成的js文件名。。方法名即dwr.xml指定的方法名 //第一个参数就是方法参数。。若该方法不需要传入参数,即可省略 //第二个参数就是回调函数 JSHello.sayHello(callbackForSayHello); JSHello.sayHello("玄玉", callbackForSayHello); } //回调函数的参数,就是服务器端返回的字符串,即sayHello()方法的返回值 //这里的serverReturnString就类似于xmlHttpRequest.responseText function callbackForSayHello(serverReturnString){ alert(serverReturnString); } /** * 返回数组 */ function getArray(){ JSPersonManager.getArray(callbackForGetArray); } function callbackForGetArray(array){ var array = eval(array); alert(array.length + " " + array[0] + " " + array[1] + " " + array[2]); } /** * 返回集合 */ function getList(){ JSPersonManager.getList(callbackForGetList); } function callbackForGetList(list){ var ghouls = eval(list); /* var example = document.getElementById("example"); for(var i=0; i<ghouls.length; i++){ example.options[i] = new Option(ghouls[i].name, ghouls[i].id); } */ //dwr.util是DWR框架提供的工具对象,是在util.js中定义的 //以前它叫做DWRUtil,不过现在已经改为dwr.util了 dwr.util.removeAllOptions("example"); //移除下拉框中的所有信息 dwr.util.addOptions("example", ghouls, "id", "name"); //添加下拉框信息。参数分别为<option>的id、集合数据、value、text } /** * 返回对象 */ function getPerson(){ JSPersonManager.getPerson(callbackForGetPerson); } function callbackForGetPerson(Object){ var person = eval(Object); var ghouls = person.ghouls; dwr.util.removeAllOptions("example"); dwr.util.addOptions("example", ghouls, "id", "name"); } </script> <input type="button" value="返回字符串" onclick="sayHello()"/> <input type="button" value="返回数组" onclick="getArray()"/> <input type="button" value="返回集合" onclick="getList()"/> <input type="button" value="返回对象" onclick="getPerson()"/> 案例:<select id="example"></select>
下面是所用到的两个JavaBean类
package com.jadyer.model; /** * 盗墓笔记人员名单 */ public class Ghoul { private Integer id; private String name; /* 两个属性的setter和getter略 */ public Ghoul(){} public Ghoul(Integer id, String name){ this.id = id; this.name = name; } } /** * 这是当前Web Project所用到的两个JavaBean类 */ package com.jadyer.model; import java.util.Set; /** * 复杂对象 */ public class Person { private Integer id; private String name; private Set<Ghoul> ghouls; /* 三个属性的setter和getter略 */ public Person(){} public Person(Integer id, String name){ this.id = id; this.name = name; } }
这是一个需要由DWR发布的普通Java类
package com.jadyer.dwr; public class Hello { public String sayHello(String name){ System.out.println("------sayHello is invoked------"); if(null == name){ return "你好,无名氏"; }else{ return "你好," + name; } } }
最后一个是需要由DWR发布的包含了复杂Java对象的类
package com.jadyer.dwr; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import com.jadyer.model.Ghoul; import com.jadyer.model.Person; public class PersonManager { /** * 获取数组 */ public String[] getArray(){ return new String[]{"张起灵", "汪藏海", "铁面生"}; } /** * 获取java.util.List */ public List<Ghoul> getList(){ List<Ghoul> ghouls = new ArrayList<Ghoul>(); ghouls.add(new Ghoul(1, "陈文锦")); ghouls.add(new Ghoul(2, "吴三省")); ghouls.add(new Ghoul(3, "谢连环")); return ghouls; } /** * 获取复杂对象 */ public Person getPerson(){ Person person = new Person(28, "玄玉"); Set<Ghoul> ghouls = new HashSet<Ghoul>(); ghouls.add(new Ghoul(1, "吴邪")); ghouls.add(new Ghoul(2, "齐羽")); ghouls.add(new Ghoul(3, "霍玲")); person.setGhouls(ghouls); return person; } }