转换器:转换器的作用是完成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>