異常映射是處理Action類異常的一個有力工具,經過異常映射咱們能夠提供更加友好的用戶界面,而不是一堆錯誤代碼信息。Action方法拋出的異常可以被自動捕捉而後通過映射指向一個預約義好了的Result。聲明式的策略對於拋出運行時異常的框架尤爲有用。sql
和框架的不少其它部分同樣,咱們須要使用一個攔截器來啓動異常映射功能。在struts-default.xml文件中已經爲咱們把這個攔截器準備好了,所以咱們能夠直接使用:app
<interceptors>
<interceptor name="exception"
class="com.opensymphony.xwork.interceptor.ExceptionMappingInterceptor"/>
</interceptors>
爲了使用異常映射,咱們還須要爲每一個異常分配指定的Result。同Result同樣框架爲咱們提供了兩種方式來聲明異常映射:全局異常映射和局部異常映射(僅僅只針對某一個action mapping)。當Action類拋出異常時異常攔截器會按照以下的規則對異常進行匹配:框架
1.根據所拋出的異常類型在局部異常映射與全局異常映射中尋找與之匹配的異常,注意,這要包括所拋出異常的全部祖先類。在這些可以匹配上的異常中找出與它遺傳關係上最近的異常(本身跟本身是最接近的),而後根據這個異常映射的result屬性去和action mapping中配置的Result進行匹配。jsp
2.若是在局部異常映射和全局異常映射中同時出現了知足需求的異常映射,那麼以局部異常映射爲準。工具
下面以例子進行說明:測試
<global-exception-mappings>spa
<exception-mapping result="global" code
exception="java.sql.SQLException"></exception-mapping>xml
<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
這就說明異常攔截器首先會尋找與所拋出異常在遺傳關係上最接近的異常,若是局部映射與全局映射同時有,那麼使用局部映射。