之前整理东西都是搞到QQ空间去
感觉还是不方便,就开个博客方便记录
DWR貌似用的人很少了,网上资料也不多,记录一下,免得到时又忘了,例子来源于李刚的《疯狂Ajax讲义》
菜鸟一枚,感觉书讲得还可以
这个入门案例还是比较详细的(虽然也许没用),各种类型的参数以及返回类型(老老实实的getters、setters,声明泛型,可以省掉很多麻烦)
1、导包
<dependency>
<groupId>org.directwebremoting</groupId>
<artifactId>dwr</artifactId>
<version>3.0.2-RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
2、配置web.xml
<?xml version="1.0" encoding="utf-8"?>
<web-app 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_3_0.xsd">
<!-- 配置DWR的核心Servlet -->
<servlet>
<!-- 指定DWR核心Servlet的名字 -->
<servlet-name>dwr-invoker</servlet-name>
<!-- 指定DWR核心Servlet的实现类 -->
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<!-- 指定DWR核心Servlet处于调试状态 -->
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<!-- 指定DWR核心Servlet的URL映射 -->
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<!-- 指定DWR核心Servlet映射的URL -->
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
</web-app>
3、配置dwr.xml(放在WEB-INF下)
<?xml version="1.0" encoding="utf-8"?>
<!-- 指定DWR配置文件的DTD等信息 -->
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"
"http://getahead.org/dwr/dwr30.dtd">
<!-- DWR配置文件的根元素是dwr -->
<dwr>
<!-- allow是核心元素,用来定义java对象和JavaScript对象的对应关系 -->
<allow>
<!-- 使用new创建一个JavaScript对象,该对象名为hello -->
<create creator="new" javascript="hello">
<!-- 创建hello对象使用的java类为day01.HelloDwr -->
<param name="class" value="day01.HelloDwr"/>
</create>
<!-- 对Person类使用bean转换器 -->
<convert converter="bean" match="day01.Person"/>
<!-- 对没有setter和getter的Cat类使用object转换器 -->
<convert converter="object" match="day01.Cat">
<!-- 指定force="true"强制使用反射访问私有属性 -->
<param name="force" value="true"/>
</convert>
<!-- 使用<convert converter="bean" match="day01.*"/> 表示包下所有类使用bean转换器-->
<!-- 使用<convert converter="bean" match="*"/> 表示所有类使用bean转换器-->
<!-- 使用exclude表明不会转换property1,property2两个属性,多属性使用逗号隔开
<convert converter="object" match="day01.Cat">
<param name="exclude" value="property1,property2"/>
</convert> -->
</allow>
<!-- 如何集合没有使用泛型来限制元素类型,则使用<signatures>来声明集合元素的数据类型-->
<signatures>
<![CDATA[
import java.util.List;
import day01.HelloDwr;
import day01.Person;
import day01.Cat;
HelloDwr.sendListNoGeneric(String,List<Person>,List<Cat>);
]]>
</signatures>
</dwr>
4、需要调用的类及调用方法的JSP
public class Cat {
private String name;
public String sex;
public Cat() {
}
public Cat(String name) {
this.name = name;
}
public Cat(String name, String sex) {
this.name = name;
this.sex = sex;
}
}
public class Person {
private String name;
private String age;
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public Person() {
}
public Person(String name,String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class HelloDwr {
public String hello(String name,String age){
return name+",您好!您已开始DWR的学习之旅!您的年龄是:"+age+"岁。";
}
public String sendObject(Person p){
return p.getName()+",您好!您已学会了使用JavaBean参数,您的年龄是:"+p.getAge()+"岁。";
}
public Person getBean(String name,String age){
return new Person(name,age);
}
public Cat getObject(String name){
return new Cat("没有setter和getter的猫的名字:"+name);
}
public List<Person> getPersonList(){
List<Person> result = new ArrayList<Person>();
result.add(new Person("集合A","1"));
result.add(new Person("集合B","2"));
result.add(new Person("集合C","3"));
return result;
}
public Person[] getPersonArray(){
Person[] result = new Person[3];
result[0]=new Person("数组A","4");
result[1]=new Person("数组B","5");
result[2]=new Person("数组C","6");
return result;
}
public Map<String,Person> getPersonMap(){
Map<String,Person> result = new HashMap<String,Person>();
result.put("MapFirst", new Person("MapA","7"));
result.put("MapSecond", new Person("MapB","8"));
result.put("MapThird", new Person("MapC","9"));
return result;
}
public String sendList(List<Person> p1){
String result = "";
for(Person p : p1){
result += "名字:"+p.getName()+" 年龄"+p.getAge()+"<br/>";
}
result = "前端发送来的Bean集合:<br/>"+result;
return result;
}
public String sendListNoGeneric(String str,List p1,List c1){
String result = "";
for(Object p : p1){
result += "名字:"+((Person)p).getName()+" 年龄"+((Person)p).getAge()+"<br/>";
}
for(Object c : c1){
result += "猫性别:"+((Cat)c).sex+"<br/>";
}
result = str+result;
return result;
}
public String sendMap(Map<String,Person> pmap){
String result = "";
for(String key : pmap.keySet()){
result += "键为:"+key+" 值为"+pmap.get(key).getName()+"+"+pmap.get(key).getAge()+"<br/>";
}
return result;
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Dwr入门</title>
<script type='text/javascript' src='/day01/dwr/engine.js'></script>
<script type='text/javascript' src='/day01/dwr/util.js'></script>
<script type='text/javascript' src='/day01/dwr/interface/hello.js'></script>
<script>
var name;
var age;
var getNameAndAge = function() {
name = document.getElementById('name').value;
age = document.getElementById('age').value;
}
var showData = function(data){
document.getElementById('show').innerHTML = data;
}
var cb = function(data) {
showData(data);
}
var beanCb = function(data) {
var str = "JavaBean的名字:"+ data.name + ",JavaBean的年龄:" + data.age;
showData(str);
}
var objCb = function(data) {
showData(data.name);
}
var listOrArrayCb = function(data) {
var result = "";
for (var i = 0; i < data.length; i++) {
result += "名字:"+data[i].name+" 年龄:"+data[i].age+"<br>";
}
showData(result);
}
var mapCb = function(data) {
var result = "";
for (var key in data) {
result += "键为:"+key+" 值为:"+data[key].name+"+"+data[key].age+"<br>";
}
showData(result);
}
var sendListCb = function(data){
showData(data);
}
var sendMapCb = function(data){
showData(data);
}
var sendMessage = function() {
getNameAndAge();
hello.hello(name, age, cb);
}
var sendObject = function() {
getNameAndAge();
hello.sendObject({name : name,age : age}, cb);
}
var getBean = function() {
getNameAndAge();
hello.getBean(name, age, beanCb);
}
var getObject = function() {
getNameAndAge();
hello.getObject(name, objCb);
}
var getBeanList = function() {
hello.getPersonList(listOrArrayCb);
}
var getBeanArray = function() {
hello.getPersonArray(listOrArrayCb);
}
var getBeanMap = function() {
hello.getPersonMap(mapCb);
}
var sendBeanList = function() {
//创建JavaScript数组
var args = [{name:"客户端beanA",age:"x"},{name:"客户端beanB",age:"y"},{name:"客户端beanC",age:"z"}];
hello.sendList(args,sendListCb);
}
var sendListNoGeneric = function() {
//创建JavaScript数组
var str = "前端发送来的无泛型集合:<br/>";
var args = [{name:"客户端无泛型A",age:"x"},{name:"客户端无泛型B",age:"y"},{name:"客户端无泛型C",age:"z"}];
var args1 = [{name:"客户端无泛型A",sex:"公"},{name:"客户端无泛型A",sex:"母"},{name:"客户端无泛型A",sex:"看不出来"}];
hello.sendListNoGeneric(str,args,args1,sendListCb);
}
var sendMap = function() {
//创建JavaScript对象
var args = {mapFirst:{name:"客户端mapA",age:"x"},mapSecond:{name:"客户端mapB",age:"y"},mapThird:{name:"客户端mapC",age:"z"}};
hello.sendMap(args,sendMapCb);
}
</script>
<body>
<h2>Dwr入门</h2>
请输入您的名字:
<input id="name" name="name" type="text" />
<br /> 请输入您的年龄:
<input id="age" name="age" type="text" />
<br />
<button onclick="sendMessage();">发送简单请求</button>
<br />
<button onclick="sendObject();">发送对象参数</button>
<br />
<button onclick="getBean();">返回JavaBean</button>
<br />
<button onclick="getObject();">返回Object</button>
<br />
<button onclick="getBeanList();">返回Bean集合</button>
<br />
<button onclick="getBeanArray();">返回Bean数组</button>
<br />
<button onclick="getBeanMap();">返回Bean的Map集合</button>
<br />
<button onclick="sendBeanList();">发送JavaBean集合</button>
<br />
<button onclick="sendListNoGeneric();">发送无泛型集合</button>
<br />
<button onclick="sendMap();">发送Map集合</button>
<br />
<br /> 下面是服务器的回应:
<br />
<div id="show"></div>
</body>
</html>
最后再贴一张转换关系图