異常映射是處理Action類異常的一個有力工具,通過異常映射我們可以提供更加友好的用戶界面,而不是一堆錯誤代碼信息。Action方法拋出的異常能夠被自動捕捉然後經過映射指向一個預定義好了的Result。聲明式的策略對於拋出運行時異常的框架尤其有用。
和框架的很多其它部分一樣,我們需要使用一個攔截器來啓動異常映射功能。在struts-default.xml文件中已經爲我們把這個攔截器準備好了,因此我們可以直接使用:
爲了使用異常映射,我們還需要爲每個異常分配指定的Result。同Result一樣框架爲我們提供了兩種方式來聲明異常映射:全局異常映射和局部異常映射(僅僅只針對某一個action mapping)。當Action類拋出異常時異常攔截器會按照如下的規則對異常進行匹配:
1.根據所拋出的異常類型在局部異常映射與全局異常映射中尋找與之匹配的異常,注意,這要包括所拋出異常的所有祖先類。在這些能夠匹配上的異常中找出與它遺傳關係上最近的異常(自己跟自己是最接近的),然後根據這個異常映射的result屬性去和action mapping中配置的Result進行匹配。
2.如果在局部異常映射和全局異常映射中同時出現了滿足需求的異常映射,那麼以局部異常映射爲準。
下面以例子進行說明:
<global-exception-mappings>
<exception-mapping result="global"
exception="java.sql.SQLException"></exception-mapping>
<exception-mapping result="test"
exception="java.lang.Exception"></exception-mapping>
</global-exception-mappings>
<action name="exception"
class="tutorial.ExceptionAction">
<exception-mapping result="sql"
exception="java.sql.SQLException"></exception-mapping>
<exception-mapping result="all"
exception="java.lang.Exception"></exception-mapping>
<result name="sql">/exception.jsp</result>
<result name="global">/global.jsp</result>
<result name="test">/test.jsp</result>
<result name="all">/all.jsp</result>
</action>
上面是一個struts配置文件的片段,定義了兩個全局異常映射和兩個局部異常映射,我做了如下幾個測試:
1.當Action類拋出SQLException時,局部映射起作用,頁面轉向exception.jsp
2.註釋局部映射中的java.sql.SQLException,當Action類拋出SQLExceptiop時,全局映射起作用,頁面轉向global.jsp
這就說明異常攔截器首先會尋找與所拋出異常在遺傳關係上最接近的異常,如果局部映射與全局映射同時有,那麼使用局部映射。