在web开发中,经常要处理异常,这样无论用户进行怎样的操作,都不会把异常页面展现给用户,这样可以给用户一个好的感受,现在来说下struts2进行开发中进行的异常处理。
1,在servlet中进行异常处理,在web.xml中配置文件中加入以下代码:
<!-- 处理异常 -->
<error-page>
<error-code>404</error-code>
<location>/commons/error404.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/commons/errornull.jsp</location>
</error-page>
2,struts2进行异常处理首先需要添加exception拦截器,而默认拦截器栈已经加入了这个拦截器,所以不用特意的声明。struts2的异常映射声明有两种,全局声明和局部声明。
注意:当异常发生时,struts2会根据抛出的异常去异常映射文件中寻找在继承关系上与该异常最接近的映射进行匹配。例如,action抛出一个IOException,这个异常是Exception
的直接子类。所以会匹配到Exception映射。再者,action抛出一个BatchUpdateException,它既是SQLException的子类,同时也是Exception的子类。但是它和SQLException的继
承关系最接近,所以它会匹配到SQLException
< struts>
<package name="default">
...
<global-results>
<result name="login" type="redirect">/Login.action</result>
<result name="Exception">/Exception.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.sql.SQLException" result="SQLException"/>
<exception-mapping exception="java.lang.Exception" result="Exception"/>
</global-exception-mappings>
...
<action name="DataAccess" class="com.company.DataAccess">
<exception-mapping exception="com.company.SecurityException" result="login"/>
<result name="SQLException" type="chain">SQLExceptionAction</result>
<result>/DataAccess.jsp</result>
</action>
...
</package>
< /struts>
说明:全局异常也只有在package包下进行配置,只对下面的action起作用,在struts没有如struts中那样的异常。局部异常和全局异常的搭配使用。
用三个例子说明,当访问DataAccess时如果发生异常
一个java.sql.SQLException将会chain到另一个action SQLExceptionAction
一个 com.company.SecurityException 将会重定向到Login.action
任何其他继承了java.lang.Exception 的异常将会转至Exception.jsp
值栈中的Exception值:默认情况下,发生异常时,struts2会向值栈中压入一下两个值
exception 异常对象本身
exceptionStack
stack trace的值
在jsp中可以打印出异常信息
< %@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
< %@ taglib prefix="s" uri="s" %>
< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
< html>
<head>
<title>系统异常</title>
</head>
<body>
<h3>出错信息,请与管理员联系</h3>
< s:actionerror/>
< p>
<s:property value="%{exception.message}"/>
< /p>
< h3>详细信息</h3>
< p>
<s:property value="%{exceptionStack}"/>
< /p>
</body>
< /html>