Struts2中的異常處理
因為在Action的execute方法宣告時就丟擲了Exception異常,所以我們無需再execute方法中捕捉異常,僅需在struts.xml 中配置異常處理。
為了使用Struts2的異常處理機制,必須開啟Struts2的異常對映功能,這需要exception攔截器。在struts-default.xml檔案中已經開啟了exception攔截器。
宣告式異常捕捉
Struts2的異常處理機制是通過在struts.xml檔案中配置<exception-mapping……/>元素完成的,配置該元素時,需要指定兩個屬性: exception:指定該異常型別的完全限定名。 result:指定邏輯檢視名。
根據<exception-mapping……/>元素出現位置的不同,異常對映又可分為兩種:
區域性異常對映:將<exception-mapping… />元素作為<action…/>元素的子元素配置; 全域性異常對映:將<exception-mapping… />元素作為<global-exception-mappings… />元素的子元素配置;
全域性異常對映對所有的Action都有效,但區域性異常對映僅對該異常對映所在的Action有效。
如果區域性異常對映和全域性異常對映配置了同一個異常型別,在<action…./>元素內的區域性異常對映將覆蓋全域性異常對映。
Struts.xml
<package name="ssh2" extends="struts-default"> <global-results> <result name="sql">/exception.jsp</result> <result name="root">/exception.jsp</result> </global-results> **<global-exception-mappings> <exception-mapping exception="java.sql.SQLException" result="sql"/> <exception-mapping exception="java.lang.Exception" result="root"/> </global-exception-mappings>** <action name="login" class="loginAction"> <result>/welcome.jsp</result> <result name="nullPointer">/nullPointer.jsp</result> <exception-mapping exception="java.lang.NullPointerException" result="nullPointer"/> </action> </package>
我們可以使用Struts2的標籤輸出異常資訊:
輸出異常的message屬性資訊:<s:property value=“exception.message” />
輸出異常堆疊資訊:<s:property value=“exceptionStack” />。
有了處理系統異常的基礎,我們來看一看自定義異常:
package com.exception ;
public class MyException extends Exception
{
private String message;
public MyException(String message)
{
super(message);
this.message = message ;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
public String execute() throws Exception
{
if(!"hello".equals(usename) || !"world".equals(password))
{
throw new MyException("使用者名稱或密碼錯誤,您發現了吧!");
}
return "success" ;
}
在action配置中的異常處理
<struts>
<package name="struts2" extends="struts-default">
<action name="login" class="com.struts2.LoginAction">
<exception-mapping result="myex" exception="com.exception.MyException">
</exception-mapping>
<result name="myex">/error.jsp</result>
<result name="success">/result.jsp</result>
</action>
</package>
</struts>
在全域性配置中的異常處理
<struts>
<package name="struts2" extends="struts-default">
<global-results>
<result name="myexception1">/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="myexception1"
exception="com.exception.MyException">
</exception-mapping>
</global-exception-mappings>
<action name="login" class="com.struts2.LoginAction">
<result name="success">/result.jsp</result>
</action>
</package>
</struts>
錯誤頁面error.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<body>
<!-- 這個exception 是 exception="com.exception.MyException" -->
<s:property value="exception.message"/>
</body>
</html>
總結
區域性異常處理比全域性異常處理高,並且可覆蓋全域性異常處理,如果定義了全域性異常對映,那麼會對所有的Action生效,反之定義了局部異常對映則會對當前Action生效,
如果在全域性區域和區域性區域定義了相同的異常對映,首先去區域性異常區域找result結果頁面,如果找到了,則直接跳轉到錯誤結果頁面,不管全域性有沒有相同的結果,都被區域性所覆蓋,如果在區域性區域沒找到,則去全域性區域找。