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