DWR3.0实现对象的传递

在本例中,列举了从页面传递单个对象/对象集合/对象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",//可用于callbackarg0,以及exceptionHandlerarg0

        callbackArg:"i am callbackArg",//专用于callbackarg0,它的定义覆盖了argcallback方法的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>

猜你喜欢

转载自blog.csdn.net/yyb_gz/article/details/5652191
dwr