一、## 實際開發中推薦的異常處理 ##
把所有的異常拋給表現層來處理,即一直向上拋,拋給方法的調用者,而不是使用try/catch語句捕獲異常。在struts中最上面的方法調用者就是action類,則將所有異常拋給action,在xml文件中進行配置後,由struts來處理這些異常。
二、## 源代碼 ##
struts.xml文件的action配置:
<action name="test" class="org.Test.action.TestAction">
<result name="success">/index.jsp</result>
<!-- result的聲明放在exception前面 -->
<result name="error">/error.jsp</result>
<!-- 發生java.lang.ArithmeticException異常時,跳轉到name爲error的result -->
<exception-mapping result="error" exception="java.lang.ArithmeticException"/>
</action>
當調用TestAction時,若捕捉到java.lang.ArithmeticException的異常,則會找到name爲error的result,然後跳轉到error.jsp頁面
TestAction.java文件:
package org.Test.action;
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport {
@Override
public String execute() throws Exception {
int i = 1 / 0;
return SUCCESS;
}
}
調用TestAction時,int i = 1/0;會出現java.lang.ArithmeticException異常
error.jsp頁面:
<body>
服務器忙,稍後再試……
<br>
<s:property value="exception" />
<br>
<s:property value="exception.message" />
<br>
<s:property value="exception.stackTrace" />
<br>
<s:debug></s:debug>
</body>
程序異常時提示用戶服務器忙,同時輸出相關的異常信息
在error.jsp頁面的開頭需要導入Struts2 標籤庫,從而可以使用 Struts2的標籤,代碼如下:
<%@ taglib prefix="s" uri="/struts-tags"%>
@taglib表明引用標籤。類似java中的import語句
prefix=”s” 引用的名稱在頁面可以使用,就像java中生成的一個對象名,以後調用的時候直接使用就可以了
uri=”/struts-tags”%表示標籤庫的路徑。相當於import一個具體的類。
三、## 運行結果 ##
依次顯示的是異常詳細信息(exception),異常信息(exception.message),異常路徑(exception.stackTrace),以及調試標籤(debug)
點擊debug標籤還可以看到ValueStack的信息
四、## 更多改進 ##
struts.xml文件中加入<global-results>
和<global-exception-mappings>
標籤如下:
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="default" />
<!-- 全局的result,相當於在每個action標籤裏面加入了這個result標籤 -->
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<!-- 全局的exception-mapping,相當於在每個action標籤裏面加入了這個exception-mapping標籤 -->
<global-exception-mappings>
<exception-mapping result="error" exception="java.lang.Exception"/>
</global-exception-mappings>
<action name="test" class="org.Test.action.TestAction">
<result>/index.jsp</result>
<!-- result的聲明放在exception前面 -->
<result name="error">/error.jsp</result>
<!-- 發生java.lang.ArithmeticException異常時,跳轉到name爲error的result -->
<exception-mapping result="error" exception="java.lang.ArithmeticException"/>
</action>
<action name="default">
<result>/index.jsp</result>
</action>
</package>
則以後凡是捕獲到了異常,都會跳轉到error.jsp頁面,對於用戶來說,看到的不是滿頁的報錯信息,更加的人性化。