Let`s drink code
This is the web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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_2_5.xsd">
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<!-- 配置debug参数为true后,就可以访问DWR的控制台了,访问地址为http://ip:port/webApp/dwr/ -->
<!-- 开发阶段可以开启控制台,但在产品交付时,务必关掉控制台 -->
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
</web-app>
This is the DWR Config File----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="JSUserManager">
<param name="class" value="com.jadyer.dwr.UserManager" />
</create>
<convert match="com.jadyer.model.User" converter="bean" />
<convert match="com.jadyer.model.Group" converter="bean" />
<!-- 将Java中的异常对象转换为JavaScript表示 -->
<convert match="java.lang.Exception" converter="exception" />
<!-- 在转换Java中的异常时,通常也会把StackTraceElement一并转换了 -->
<convert match="java.lang.StackTraceElement" converter="bean" />
</allow>
</dwr>
This is the DWRException test page----exception.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<script type="text/javascript" src="<%=request.getContextPath()%>/dwr/interface/JSUserManager.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/dwr/engine.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/dwr/util.js"></script>
<script type="text/javascript">
var user = {id:1, username:"张起灵", group:{id:2,name:"张大佛爷"}}; //典型的json
// /**
// * DWR异常处理的第一种方式:回调函数处理
// */
// JSUserManager.addUser(user, callbackAddUser); //直接将json对象传给后台,它会被自动转换成方法所需的实体类
// function callbackAddUser(serverReturnData){
// alert(serverReturnData); //相比第二种异常处理方式,此时DWR返回的信息比较单一
// }
/**
* DWR异常处理的第二种方式:元数据处理
*/
JSUserManager.addUser(user, {
//此时根本就不会执行该回调函数,所以这里也就不需要提供回调函数了
//callback:function callbackAddUser(serverReturnData){alert(serverReturnData);},
errorHandler:function(errorMsg, exception){
alert(errorMsg); //print Error message
alert(dwr.util.toDescriptiveString(exception, 4)); //print Error Details
alert(exception.javaClassName); //打印异常类的名称
for(var ex in exception){
alert(ex); //打印exception所包含的对象名称
}
}
});
</script>
This is the DWRUtil test page----util.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<script type="text/javascript" src="<%=request.getContextPath()%>/dwr/interface/JSUserManager.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/dwr/engine.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/dwr/util.js"></script>
<script type="text/javascript">
function calAdd() {
var a = dwr.util.getValue("a"); //it means document.getElementById("a").value
var b = dwr.util.getValue("b");
JSUserManager.calculatorAdd(parseInt(a), parseInt(b), function(serverReturnData){
alert(serverReturnData);
});
}
function initAddress() {
dwr.util.removeAllOptions('address'); //移除<select id="address"/>下的所有options
var addressData = [{id:1,name:"黑龙江"}, {id:2,name:"哈尔滨"}, {id:3,name:"道里区"}]; //定义一个map
dwr.util.addOptions("address", addressData, "id", "name"); //四个参数:selectid,map,valueprop,textprop
}
function addAddress() {
var addressName = dwr.util.getValue("addressName");
var addressData = [{id:addressName, name:addressName}];
dwr.util.addOptions("address", addressData, "id", "name");
}
function initUsers() {
JSUserManager.list(function(serverReturnData){
dwr.util.addRows("users", serverReturnData, cellFuncs, {escapeHtml:false});
});
}
var cellFuncs = [
function(data){return data.id},
function(data){return data.username},
function(data){return data.group.name},
function(data){return "<input type='button' value='Test' onclick='alert(\"GoodJob\");'/>";}
];
function removeUsers() {
dwr.util.removeAllRows('users');
}
function addColorUsers() {
JSUserManager.list(function(serverReturnData){
dwr.util.addRows("users", serverReturnData, cellFuncs, {
rowCreator:function(options){
var row = document.createElement("tr");
var index = options.rowIndex * 50;
row.style.color = "rgb(" + index + ",0,0)";
return row;
},
cellCreator:function(options) {
var td = document.createElement("td");
var index = 255 - (options.rowIndex * 50);
td.style.backgroundColor = "rgb(" + index + ",255,255)";
td.style.fontWeight = "bold";
return td;
},
escapeHtml:false
});
});
}
</script>
<input type="button" value="计算二者和" onclick="calAdd()"><input id="a" type="text"/> + <input id="b" type="text"/>
<br/>
<br/>
<input type="button" value="初始化地址" onclick="initAddress()"/><select id="address"></select>
<br/>
<br/>
<input type="button" value="添加新地址" onclick="addAddress()"/><input id="addressName" type="text"/>
<br/>
<br/>
<input type="button" value="初始化用户" onclick="initUsers()"/>
<input type="button" value="移除所有用户" onclick="removeUsers()"/>
<input type="button" value="新增炫彩用户" onclick="addColorUsers()"/>
<table border="6">
<thead>
<tr>
<td>ID</td>
<td>userName</td>
<td>groupName</td>
<td>operate</td>
</tr>
</thead>
<tbody id="users">
</tbody>
</table>
这是一个需要由DWR发布的Java类----UserManager.java
package com.jadyer.dwr;
import java.util.ArrayList;
import java.util.List;
import com.jadyer.exception.UserException;
import com.jadyer.model.Group;
import com.jadyer.model.User;
public class UserManager {
public void addUser(User user){
System.out.println("新增用户:" + user.getUsername());
throw new UserException("新增用户失败:权限不足");
}
public List<User> list(){
List<User> userList = new ArrayList<User>();
userList.add(new User(1, "张起灵", new Group(1,"张启山族长")));
userList.add(new User(2, "吴三省", new Group(2,"狗五爷之子")));
userList.add(new User(3, "黑眼镜", new Group(2,"坑王之三叔")));
return userList;
}
public int calculatorAdd(int a, int b){
System.out.println("正在计算: " + a + " + " + b + " 的值");
return a + b;
}
}
下面是我们自定义的异常类----UserException.java
package com.jadyer.exception;
@SuppressWarnings("serial")
public class UserException extends RuntimeException {
public UserException() {}
public UserException(String message, Throwable cause) {
super(message, cause);
}
public UserException(String message) {
super(message);
}
public UserException(Throwable cause) {
super(cause);
}
}
最后是用到的两个实体类
package com.jadyer.model;
public class User {
private int id;
private String username;
private Group group;
/*== 三个属性的setter和getter略 ==*/
public User() {}
public User(int id, String username, Group group) {
this.id = id;
this.username = username;
this.group = group;
}
}
public class Group {
private int id;
private String name;
/*== 二个属性的setter和getter略 ==*/
public Group() {}
public Group(int id, String name) {
this.id = id;
this.name = name;
}
}
本文介绍了一个使用DWR(Direct Web Remoting)实现的Java Web应用案例。通过配置web.xml及dwr.xml,演示了如何发布Java类供JavaScript远程调用,并展示了异常处理与DWR实用工具的具体应用。
1705

被折叠的 条评论
为什么被折叠?



