struts2異常處理,
在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>