要想根据出现不同的错误来控制响应不同的视图,Struts2提供了以配置的方式来处理不同的异常信息。
我们可以使用<exception-mapping>元素作为<global-exception-mappings>和<action>元素的子元素来配置全局异常映射和局部异常映射。
<exception-mapping>元素有两个属性:
exception:指定此异常映射所设置的异常类型。
result:指定在处理完Action中所抛出的exception属性中指定的异常时,所要转入的逻辑视图名。
下面我们结合一个具体事例来学习Struts2的异常处理机制。
我们来模拟用户登录的过程中,根据出现不同的错误信息,定位到不同的逻辑视图名,产生不同的响应结果。
1、 创建LoginAction类:
public class LoginAction { private String userName; private String password; private String tip;
public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }
public String execute() throws Exception { if(StringUtils.isEmpty(getUserName())) throw new java.lang.NullPointerException("用户名不能为空!");① if(StringUtils.isEmpty(getPassword())) throw new java.lang.NullPointerException("密码不能为空!"); if(getPassword().length()>6) throw new java.lang.ArrayIndexOutOfBoundsException("密码不能超过六位!");②
if("scott".equals(this.getUserName()) && "123".equals(this.getPassword())){ this.setUserName("artsn"); return "success"; }else{ throw new Exception("用户名密码错误!");③ } } } |
2、 配置Action信息
<package name="sample1" extends="struts-default"> <global-results> <result name="error">/error.jsp</result> </global-results> <global-exception-mappings> <exception-mapping result="error" exception="java.lang.Exception">③ </exception-mapping> </global-exception-mappings> <action name="login" class="org.struts2.samples.LoginAction"> <exception-mapping result="nullError" exception="java.lang.NullPointerException">① </exception-mapping> <exception-mapping result="outOfError" exception="java.lang.ArrayIndexOutOfBoundsException">② </exception-mapping> <result name="nullError">/nullError.jsp</result> <result name="outOfError">/outOfError.jsp</result> <result>/login.jsp</result> </action> </package> |
3、 jsp文件
login.jsp
<%@ page language="java" contentType="text/html; charset=gb2312" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W< xmlnamespace prefix ="st1" ns ="urn:schemas-microsoft-com:office:smarttags" />3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> <html> <title>登录</title> <body> <s:form action="login.action"> <s:textfield name="userName" label="用户名" required="true" /> <s:password name="password" label="密码" required="true"/> <s:submit value="登录"></s:submit> </s:form> </body> </html> |
error.jsp
<%@ page language="java" contentType="text/html; charset=gb2312" pageEncoding="gb2312"%> <%@ 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> <title>Error</title> <body> <h1><s:property value="exception.message"/>Error!(手工抛出Exception异常!)</h1> </body> </html> |
nullError.jsp
<%@ page language="java" contentType="text/html; charset=gb2312" pageEncoding="gb2312"%> <%@ 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> <title>错误提示页面</title> <body> <h1><s:property value="exception.message"/>(空指针错误!)</h1> </body> </html> |
outOfError.jsp
<%@ page language="java" contentType="text/html; charset=gb2312" pageEncoding="gb2312"%> <%@ 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> <title>错误提示页面</title> <body> <h1><s:property value="exception.message"/>(数组越界错误!)</h1> </body> </html> |
首先我们来看看Action类中execute()方法中①②③处,根据不同的逻辑分别抛出了空指针错误、数组越界错误和通用的错误。
接下来我们在struts.xml文件中配置响应的异常处理信息,在这里我们把空指针错误、数组越界错误定义成了局部异常信息,将通用错误定义成全局的异常信息。
接下来,我们运行程序输入测试数据触发响应的错误,我们可以看到生成不同错误对应的响应结果。
从这个例子中我们可以看出Struts2的异常处理还是十分方便的。当然我们也可以在execute()方法中手动的捕获异常,然后根据不同的异常返回不同的逻辑视图名。但是我们不推荐这样子处理。