1. 用于测试的Action类:
package com.huey.action;
import com.huey.exception.MyException;
/**
*
* @version 2013-08-18
* @author huey2672
*
*/
public class HelloAction {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String hello() throws Exception {
if (name.equals("")) {
throw new MyException("Empty String");
}
name = name.toUpperCase();
System.out.println("Hello, " + name + "~");
return "success";
}
}
2. Struts2的异常处理机制是在struts.xml文件中配置<exception-mapping .../>元素完成的,配置该元素需指定如下两个属性:
result:指定Action出现异常时,系统返回的逻辑视图;
exception:exception指定了该异常映射所设置的异常类型。
根据<exception-mapping .../>元素出现的位置不同,异常映射可分为局部与全局异常映射:
局部异常映射:将<exception-mapping .../>元素作为<action .../>元素的子元素配置;
全局异常映射:将<exception-mapping .../>元素作为<global-exception-mappings>元素的子元素配置。
全局异常映射对所有的Action都有效,但局部异常映射只对该异常映射所在的Action内有效。如果局部异常映射和全局异常映射配置了同一个异常类型,在该Action内局部异常映射会覆盖全局异常映射。
在struts.xml文件中配置Struts2的异常处理机制:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="hello" extends="struts-default">
<!-- 定义全局结果映射 -->
<global-results>
<result name="error">error.jsp</result>
</global-results>
<!-- 定义全局异常映射 -->
<global-exception-mappings>
<!-- result指定Action出现异常时,系统返回的逻辑视图
exception指定了该异常映射所设置的异常类型 -->
<!-- 当出现空指针异常时,返回逻辑视图error -->
<exception-mapping result="error" exception="java.lang.NullPointerException"/>
</global-exception-mappings>
<action name="helloAction" class="com.huey.action.HelloAction"
method="hello">
<!-- 定义局部异常映射 -->
<!-- 当出现自定义的异常时,返回逻辑视图error -->
<exception-mapping result="error" exception="com.huey.exception.MyException"/>
<result name="success">hello.jsp</result>
</action>
</package>
</struts>
3. 编写示例中的视图资源,index.jsp、hello.jsp和error.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>
<form action="helloAction" method="post">
<input type="text" name="name" />
<input type="submit" value="Hello"/>
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!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>Hello</title>
</head>
<body>
Hello, <s:property value="name"/>~
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!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>Error</title>
</head>
<body>
<%-- 输出异常信息 --%>
Exception: <s:property value="exception"/>
</body>
</html>
4. 测试:
在index.jsp页面中,输入框不填写任何字符串,直接提交表单,验证java.lang.NullPointerException的异常映射。
在浏览器中键入http://localhost:8080/ExceptionDemo/helloAction(ExceptionDemo是Web应用名),验证com.huey.exception.MyException的异常映射。