异常映射是处理Action类异常的一个有力工具,通过异常映射我们可以提供更加友好的用户界面,而不是一堆错误代码信息。Action方法抛出的异常能够被自动捕捉然后经过映射指向一个预定义好了的Result。声明式的策略对于抛出运行时异常的框架尤其有用。
和框架的很多其它部分一样,我们需要使用一个拦截器来启动异常映射功能。在struts-default.xml文件中已经为我们把这个拦截器准备好了,因此我们可以直接使用:
<interceptors>
<interceptor name="exception"
class="com.opensymphony.xwork.interceptor.ExceptionMappingInterceptor"/>
</interceptors>
为了使用异常映射,我们还需要为每个异常分配指定的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
这就说明异常拦截器首先会寻找与所抛出异常在遗传关系上最接近的异常,如果局部映射与全局映射同时有,那么使用局部映射。