標籤:
1、小案例代碼:
jsp介面:
<body> <s:property value="exceptionStack"/><br> <s:property value="exception"/><br> <s:property value="exception.getMessage"/> <form action="product-details.action" method="post"> ProductName:<input type="text" name="productName"/><br> ProductDesc:<input type="text" name="productDesc"/><br> ProductPrice:<input type="text" name="productPrice"/><br> <input type="submit" value="Submit"/> </form> </body>
Action類(在其中故意寫了一個 java.lang.ArithmeticException: / by zero):
public String save() { int i=1/0; return "detailes"; }
struts.xml
<action name="product-details" class="com.luwenhu.struts2.Model.Product" method="save"><exception-mapping result="input" exception="java.lang.ArithmeticException"></exception-mapping><result name="input">/WEB-INF/pages/input.jsp</result><result name="detailes">/WEB-INF/pages/details.jsp</result></action>
2、源碼分析
(1)從struts-default.xml中struts2提供了一個預設的攔截器棧(defaultStack)
(2)攔截器棧中有個exception攔截器,所屬類為com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor
(3)查看ExceptionMappingInterceptor這個類的intercept(攔截)方法,觀察其怎麼進行工作的。
觀察這個方法,攔截器在捕獲到異常e的時候會:
a.將這個異常交個handleLogging()方法
b.根據struts.xml的配置內容,通過ExceptionMappingConfig,配置異常結果處理
c.將異常處理放置(publish)到值棧中
3、debug驗證
(1)我們在捕獲到異常(191行)後進行斷點,然後觀察變數以及它的值,發現成功捕獲到java.lang.ArithmeticException: / by zero
↓
(2)繼續執行到196行,mappingConfig對應著struts.xml中的異常配置
<-------->
↓
注意帶值棧棧頂此時還是test對象:
(3) 繼續執行代碼至201行,執行完之後,我門發現值棧的棧頂發生了變化。此時棧頂為ExceptionHolder,也就是說異常資訊成功放置到了值棧中
↓
就上就是ExceptionMappingInterceptor攔截器的工作原理!
Debug查看Struts2中ExceptionMappingInterceptor攔截器怎麼把ExceptionHolder放入值棧中,以及理解攔截器的工作原理。。。