DWR(三):转换器

转换器:转换器的作用是完成POJO(Java对象)和JavaScript类型之间的相互转换,从而保证Ajax交互的正常通信;

为什么使用:因为除了基本的数据类型、String型之外的自定义Java数据类型,DWR是无法识别的,必须在配置文件中定义转换器;

1.基本转换器

对于基本的数据类型Dwr已经提供了转换器,无需再次配置

基本的数据类型有:

 boolean, byte, short, int, long, float, double, char, java.lang.Boolean, java.lang.Byte, java.lang.Short, java.lang.Integer, java.lang.Long, java.lang.Float, java.lang.Double, java.lang.Character, java.math.BigInteger, java.math.BigDecimal 和 java.lang.String

2.日期时间类型转换器

Dwr是提供转换器的。

若是 有一个字符串"2016-01-01",要转成时间类型做参数,

①可以用JS的Date.parse()方法,将字符串转成Date类型,然后就交由Dwr的转换器处理了;

②往后端传"2016-01-01"字符串,然后由后端Java进行数据类型转换;(个人认为这样做很low);

前端JSP

var time = Date.parse("2015-01-01");
    var t2 = new Date( time );

     AdminManager.setTime(t2,function(data){
         alert("回调函数");
        });

后端Java

public void setTime(Date date){
        System.out.println("传入的时间是:"+(new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss")).format(date));
    }

3.对象转换器

Java自定义的对象转换为javaScript对象的方式分两种:
Bean转换器:利用getter、setter方法;若Java对象的属性没有设置getter、setter方法该属性是无法被转换的;
Object转换器:利用反射原理;若Java对象的属性没有设置getter、setter方法该属性是可以被转换的;若该属性的private,则需要设置 foce;(该方式本人没有试验成功)

黑名单、白名单

dwr的XML

            <!--java 自定义对象的 Bean转换方式 -->
    <convert converter="bean" match="com.devan.test.admin.Admin">
        <!-- <param name="include" value="adminPass"></param> --> <!-- 白名单 -->
        <!-- <param name="exclude" value="adminPass"></param> --> <!-- 黑名单 -->
    </convert>
/* 前端调用 */
function setBean(){
    var objJSON = {adminName:"姓名",adminPass:"密码"};
     AdminManager.setAdmin(objJSON,function(data){
    });
}
/** 后端 Java**/    
public void setAdmin(Admin admin){
        System.out.println("获得Java-Bean");
        System.out.println("参数输出:");
        System.out.println("name-"+admin.getAdminName());
        System.out.println("pass-"+admin.getAdminPass());
    }

所有测试代码如下:

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>testDwr</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
<!--   ①##后端 DWR -->
<!--   Dwr核心Servlet -->
  <servlet>
      <servlet-name>dwrAdmin</servlet-name>
      <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>true</param-value>
     </init-param>
     <init-param>
        <param-name>config-admin</param-name>
        <param-value>WEB-INF/dwr_xml/admin.xml</param-value>
     </init-param>
  </servlet>
  <!--   Dwr核心Servlet Url映射-->
  <servlet-mapping>
      <servlet-name>dwrAdmin</servlet-name>
      <url-pattern>/adminUrl/*</url-pattern>
  </servlet-mapping>
  
  <!--   ##前端 DWR -->
<!--   Dwr核心Servlet -->
  <servlet>
      <servlet-name>dwrFace</servlet-name>
      <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>true</param-value>
     </init-param>
    <init-param>
        <param-name>config-face</param-name>
        <param-value>WEB-INF/dwr_xml/face.xml</param-value>
     </init-param>
     
  </servlet>
  <!--   Dwr核心Servlet Url映射-->
  <servlet-mapping>
      <servlet-name>dwrFace</servlet-name>
      <url-pattern>/faceUrl/*</url-pattern>
  </servlet-mapping>
  
  


</web-app>

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>
  
<!--   创造器 -->
    <create creator="new" javascript="AdminManager">
      <param name="class" value="com.devan.test.admin.AdminManager"/>
    </create>
    
<!--   转换器 -->
                <!--java 自定义对象的 Bean转换方式 -->
    <convert converter="bean" match="com.devan.test.admin.Admin">
        <!-- <param name="include" value="adminPass"></param> --> <!-- 白名单 -->
        <!-- <param name="exclude" value="adminPass"></param> --> <!-- 黑名单 -->
    </convert>
                <!--java 自定义对象的 Object转换方式 -->
    <!-- <convert converter="object" match="com.devan.test.admin.Admin">
        <param name="foce" value="true"/>
    </convert> -->
    
  </allow>

</dwr>

JavaBean对象

package com.devan.test.admin;

public class Admin {
    
    private String adminName;
    private String adminPass;
    private int sex = 12;
    public String getAdminName() {
        return adminName;
    }
    public void setAdminName(String adminName) {
        this.adminName = adminName;
    }
    public String getAdminPass() {
        return adminPass;
    }
    public void setAdminPass(String adminPass) {
        this.adminPass = adminPass;
    }

}

Java 操作类

package com.devan.test.admin;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Date;

public class AdminManager {
    //String 
    public String  getStr(){
        return "返回String类型";
    }
    public void setStr(String str){
        System.out.println("获得传递的参数"+str);
    }
    
    //日期时间
    public Date getTime(){
        return new Date();
    }
    
    public void setTime(Date date){
        System.out.println("传入的时间是:"+(new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss")).format(date));
    }
    
    
    //Java Bean
    public Admin getAdmin(){
        Admin admin = new Admin();
        admin.setAdminName("管理员");
        admin.setAdminPass("123456");
        return admin;
    }
    public void setAdmin(Admin admin){
        System.out.println("获得Java-Bean");
        System.out.println("参数输出:");
        System.out.println("name-"+admin.getAdminName());
        System.out.println("pass-"+admin.getAdminPass());
    }
    
    
    // 纯数组
    public String[] getArrayBase(){
        String[] items = {"A","B","C","D","F"};
        return items;
    }
    public void setArrayBase(String[] items){
        System.out.println("传入的数组:");
        for(String str:items){
            System.out.print(str+"、");
            
        }
        System.out.println();
    }
    // Java对象
    public ArrayList<Admin> getArrayObject(){
            ArrayList<Admin> adminList = new ArrayList<Admin>();
            Admin admin_1 = new Admin();
            admin_1.setAdminName("管理员1");
            admin_1.setAdminPass("12345");
            
            Admin admin_2 = new Admin();
            admin_2.setAdminName("管理员2");
            admin_2.setAdminPass("67890");
            
            adminList.add(admin_1);
            adminList.add(admin_2);
            
            return adminList;
        }
    public void setArrayObject(ArrayList<Admin> adminList){
        for(Admin admin:adminList){
            System.out.println("-------");
            System.out.println(admin.getAdminName()+"--"+admin.getAdminPass());
        }
    }
    
    
}

前端访问 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>Insert title here</title>
<!-- JS -->
<script type="text/javascript" src="./js/jquery.js"></script>
<script type='text/javascript' src='/testDwr/adminUrl/engine.js'></script>
 <script type='text/javascript' src='/testDwr/adminUrl/util.js'></script>
<script type='text/javascript' src='/testDwr/adminUrl/interface/AdminManager.js'></script>
  
<script type="text/javascript">
$(function(){
    
});

function getStr(){
    AdminManager.getStr(function(data){
        alert(data);
    });
}

function setStr(){
    AdminManager.setStr("TEST",function(data){
        alert(data);
    });
}

/* Bean */
function getBean(){
    console.log("Yan-1");
     AdminManager.getAdmin(function(data){
        alert(data.adminName);
        console.log("JavaBean");
        console.log(data);
    });
}
function setBean(){
    var objJSON = {adminName:"姓名",adminPass:"密码"};
     AdminManager.setAdmin(objJSON,function(data){
    });
}

/* Date Time */
function getTime(){
     AdminManager.getTime(function(data){
         alert(data);
         alert(new Date());
            console.log("Time");
            console.log(data);
        });
}
function setTime(){
    var now = new Date();
    var time = Date.parse("2015-01-01");
    var t2 = new Date( time );

     AdminManager.setTime(t2,function(data){
        });
}

/* Array */
                /* Base */
function getArrayBase(){
    AdminManager.getArrayBase(function(data){
         alert(data);
         console.log(data);
        });
}
function setArrayBase(){
    var arrayJSON = ["AA","BB","CC","DD"] ;
    AdminManager.setArrayBase(arrayJSON,function(data){
        });
}
                /* Objcet */
function getArrayObj(){
    AdminManager.getArrayObject(function(data){
         alert(data);
         console.log(data);
        });
}
function setArrayObj(){
    var arrayJSON = [{adminName:"管理员A",adminPass:"A123"},{adminName:"管理员B",adminPass:"B456"}] ;
    AdminManager.setArrayObject(arrayJSON,function(data){
        });
}
</script>
</head>
<body>
<h3>基本类型</h3>
<button onclick="getStr()">获得String</button><br>
<button onclick="setStr()">设置String</button><br>

<h3>Date Time</h3>    
<button onclick="getTime()">获得日期时间</button><br>        
<button onclick="setTime()">设置日期时间</button><br>

<h3>Java  Bean</h3>    
<button onclick="getBean()">获得Java-Bean</button><br>
<button onclick="setBean()">设置Java-Bean</button><br>


<h3>数组</h3>
<h5>纯数组</h5>
<button onclick="getArrayBase()">获得Array-Base</button><br>
<button onclick="setArrayBase()">设置Array-Base</button><br>

<h5>Obj数组</h5>
<button onclick="getArrayObj()">获得Array-Object</button><br>
<button onclick="setArrayObj()">设置Array-Object</button><br>
    
        
</body>
</html>
原文地址:https://www.cnblogs.com/devan/p/5252258.html