DWR中的异常处理以及util.js的初步用例

本文介绍了一个使用DWR(Direct Web Remoting)实现的Java Web应用案例。通过配置web.xml及dwr.xml,演示了如何发布Java类供JavaScript远程调用,并展示了异常处理与DWR实用工具的具体应用。

完整版见https://jadyer.github.io/




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;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值