在本例中,列举了从页面传递单个对象/对象集合/对象map集合到服务端;以及页面从服务端获取单个对象/对象集合/对象map集合/单个对象的string形式/多个对象的string形式的方法。关于使用多个对象的string形式,下文会有说明。
新建Dynamic Web Project工程, 工程名为dwr3test。
复制DWR3最新的类库到/WEB-INF/lib内。
web.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<description>DWR controller servlet</description>
<servlet-name>DWR controller servlet</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>classes</param-name>
<param-value>
entity.Student,
service.DwrService
</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DWR controller servlet</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
</web-app>
用于dwr传递的Student对象,内容如下:
package entity;
import java.io.Serializable;
import org.directwebremoting.annotations.DataTransferObject;
import org.directwebremoting.annotations.RemoteProperty;
@DataTransferObject
public class Student implements Serializable {
private static final long serialVersionUID = -5350994043280204179L;
public Student(){}
public Student(String oid,String name){
this.oid=oid;
this.name=name;
}
@RemoteProperty
private String oid;
@RemoteProperty
private String name;
public String getOid() {
return oid;
}
public void setOid(String oid) {
this.oid = oid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
StringBuilder sb=new StringBuilder();
sb.append("oid: ");
sb.append(this.oid);
sb.append("/nname:");
sb.append(this.name);
return sb.toString();
}
}
用于实现dwr的服务端内容如下:
package service;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import mydesign.dwr.DwrObjTransferManager;
import org.directwebremoting.annotations.RemoteMethod;
import org.directwebremoting.annotations.RemoteProxy;
import entity.Student;
@RemoteProxy
public class DwrService implements Serializable {
private static final long serialVersionUID = -3257953602189665211L;
@RemoteMethod
public Student addStudent(Student student){
return student;
}
@RemoteMethod
public String addAryStudents(List<Student> aryStu){
for(Student stu : aryStu){
System.out.println(stu);
}
return "成功";
}
@RemoteMethod
public String addMapStudents(LinkedHashMap<String,Student> mapStu){
Set<String> keys= mapStu.keySet();
Iterator<String>iterator= keys.iterator();
while(iterator.hasNext()){
String key=iterator.next();
Student stu=mapStu.get(key);
System.out.println("key: "+key);
System.out.println(stu);
}
return "成功";
}
@RemoteMethod
public Student getStudent(String oid) throws Exception{
if(oid.equals("1"))
throw new Exception("wwww wrong");
else
return genStudent();
}
@RemoteMethod
public List<Student> getLstStudents(){
List<Student>lst=new ArrayList<Student>();
lst.add(genStudent());
return lst;
}
@RemoteMethod
public Map<String,Student> getMapStudents(){
Map<String,Student> map=new LinkedHashMap<String,Student>();
map.put("first",genStudent());
return map;
}
@RemoteMethod
public String getArrayInString(){
Student[] studs=new Student[2];
studs[0]=new Student("1","abc");
studs[1]=new Student("2","xyz");
String result=DwrObjTransferManager.decorator(new String[]{"oid","name"}, studs);
return result;
}
@RemoteMethod
public String getSingleInString(){
return "{oid:'1',name:'abc'}";
}
@RemoteMethod
public String getDwrService(){
return this.toString();
}
private Student genStudent(){
return new Student("2","aaa");
}
}
DwrObjTransferManager对象是用于将一个对象数组生成字符串。返回到jsp页面时通过eval('('+ data + ')')的方式获取对象数组。它的好处在于如果对象的属性太多,但在页面只需要其中的几个属性,则无须通过DWR的反射方式来获取整个对象的信息。而且如果对象数组的量大时,DWR的方式会很耗时间的。现在人为的指定需要用到的属性,则会节约好多时间。它采用装饰者模式的设计思想。Decorate方法返回的格式是“[{属性名:属性值, 属性名:属性值...},{属性名:属性值, 属性名:属性值...}...]”,如果属性值是字符串,则将有’’套着属性值的内容。这个对象的内容如下:
package mydesign.dwr;
import java.lang.reflect.Field;
import entity.Student;
public class DwrObjTransferManager {
/**
* @param fieldNames:属性名
* @param objects:对象集合
* @return
*/
public static String decorator(String[] fieldNames,Object[] objects){
if(fieldNames==null || fieldNames.length==0)
throw new IllegalArgumentException("you must offer an available string-array");
if(objects==null || objects.length==0)
throw new IllegalArgumentException("you must offer an available object-array");
AbstractDecorator former=null;
ObjectDecorator[] objDecorators=new ObjectDecorator[objects.length];
for(int i=0;i<objects.length;i++){
ObjectDecorator objDecorator=new ObjectDecorator(former, objects[i], fieldNames);
former=objDecorator;
objDecorators[i]=objDecorator;
}
//设置最后一个对象装修为上一个装修者
MapDecorator mapDecorator=new MapDecorator(objDecorators[objDecorators.length-1]);
return mapDecorator.decorate();
}
public static void main(String[] args){
Student[] studs=new Student[2];
studs[0]=new Student("1","abc");
studs[1]=new Student("2","xyz");
String result=DwrObjTransferManager.decorator(new String[]{"oid","name"}, studs);
System.out.println(result);
}
}
abstract class AbstractDecorator {
protected AbstractDecorator former;
public abstract String decorate();
}
class ObjectDecorator extends AbstractDecorator {
private Object object;
private String[] fieldNames;
public ObjectDecorator(AbstractDecorator former,Object object,String[] fieldNames){
this.former=former;
this.object=object;
this.fieldNames=fieldNames;
}
@Override
public String decorate() {
String result="";
if(former!=null)
result=former.decorate()+",";
result+=this.transfer();
return result;
}
private String transfer(){
String result="{";
StringBuffer tempString=new StringBuffer();
for(int i=0;i<fieldNames.length;i++){
Class clz=this.object.getClass();
Field fld;
try {
fld=clz.getDeclaredField(fieldNames[i]);
fld.setAccessible(true);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(fieldNames[i]+" is not existing in class: "+clz.getName());
}
String value;
try {
value=fld.get(this.object).toString();
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
tempString.append(",")
.append(fieldNames[i]).append(":");
if(fld.getType().getName().equals(String.class.getName()))
tempString.append("'"+value+"'");
else
tempString.append(value);
}
result+=tempString.toString().substring(1)+"}";
return result;
}
}
class MapDecorator extends AbstractDecorator{
public MapDecorator(AbstractDecorator former){
this.former=former;
}
@Override
public String decorate() {
String result="[";
if(this.former!=null)
result+=this.former.decorate();
result+="]";
return result;
}
}
index.jsp的内容如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Index</title>
</head>
<body>
<input type="button" name="addStudent" onclick="addStudent()" value="向后台传一个对象">
<input type="button" name="addStudent" onclick="addAryStudents()" value="向后台传一个对象数组或集合">
<input type="button" name="addMapStudents" onclick="addMapStudents()" value="向后台传一个MAP">
<input type="button" name="getStudent" onclick="getStudent()" value="向后台获取一个对象">
<input type="button" name="getLstStudents" onclick="getLstStudents()" value="向后台获取一个对象LIST集合">
<input type="button" name="getMapStudents" onclick="getMapStudents()" value="向后台获取一个对象MAP集合">
<input type="button" name="getArrayInString" onclick="getArrayInString()" value="向后台获取字符串并组装成对象集合">
<input type="button" name="getSingleInString" onclick="getSingleInString()" value="向后台获取字符串并组装成对象">
<input type="button" name="getDwrService" onclick="getDwrService()" value="向后台获取服务对象">
</body>
<script type='text/javascript' src='/Struts2_Spring2_Dwr3/dwr/interface/DwrService.js'></script>
<script type='text/javascript' src='/Struts2_Spring2_Dwr3/dwr/engine.js'></script>
<script type="text/javascript" src='/Struts2_Spring2_Dwr3/dwr/util.js'></script>
<script type="text/javascript">
var metaData={
callback:function(str,arg0) {
alert("oid: "+str.oid+" name: "+str.name);
alert("arg0:"+arg0);},
timeout:5000,
arg:"i am arg",//可用于callback的arg0,以及exceptionHandler的arg0
callbackArg:"i am callbackArg",//专用于callback的arg0,它的定义覆盖了arg在callback方法的arg0的值
errorHandler:function(message,exceptionObj) {
alert("in errorHandler: " + message);
alert("exceptionObj.javaClassName:"+ exceptionObj.javaClassName+" exceptionObj.message:"+exceptionObj.message);
},
exceptionHandler:function(message,exceptionObj,arg0) {
alert("in exceptionHandler: " + message);
alert("exceptionObj.javaClassName:"+ exceptionObj.javaClassName+" exceptionObj.message:"+exceptionObj.message);
alert("arg0:"+arg0);
}
};
function addStudent(){
var student={
oid:"111",
name:"fred"
};
DwrService.addStudent(student,metaData);
}
function addAryStudents(){
var ary=[];
var student1={
oid:"111",
name:"fred"
};
var student2={
oid:"222",
name:"tom"
};
ary[0]=student1;
ary[1]=student2;
DwrService.addAryStudents(ary,function(result){
alert("向后台传一个对象数组: "+result);
});
}
function addMapStudents(){
var ary={
"first":{oid:"111", name:"fred"},
"second":{oid:"222", name:"tom"}
};
DwrService.addMapStudents(ary,function(result){
alert("向后台传一个对象数组: "+result);
});
}
function getStudent(){
DwrService.getStudent("2",metaData);
}
function getLstStudents(){
DwrService.getLstStudents(function(result){
for(var index in result){
var stu=result[index];
alert("index: "+index+" oid: "+stu.oid+" name: "+stu.name);
}
});
}
function getMapStudents(){
DwrService.getMapStudents(function(result){
for(var index in result){
var stu=result[index];
alert("index: "+index+" oid: "+stu.oid+" name: "+stu.name);
}
});
}
function getArrayInString(){
DwrService.getArrayInString(function(data){
var datas = eval('('+ data + ')');
//alert("oid: "+datas.oid+" name: "+datas.name);
/*
var result = (datas[0])['list'];
for(var index in result){
var stu=result[index];
alert("index: "+index+" oid: "+stu.oid+" name: "+stu.name);
}
*/
for(var i=0;i<datas.length;i++){
var stu=datas[i];
alert("index: "+i+" oid: "+stu.oid+" name: "+stu.name);
}
});
}
function getSingleInString(){
DwrService.getSingleInString(function(data){
var datas = eval('('+ data + ')');
alert("oid: "+datas.oid+" name: "+datas.name);
});
}
function getDwrService(){
DwrService.getDwrService(function(result){
alert(result);
});
}
</script>
</html>