`

Struts2异常处理

 
阅读更多

传统异常处理方式

Java中的所有异常的根类是ThrowableThrowable类派生ExceptionError

Error表示Java程序中出现一个非常严重的错误。

Exception异常处理的过程中,一般通过try catch finally语句,或者使用throws Exception来捕获异常。

但这种方式需要书写大量的catch块,非常烦琐。最大的问题是,异常处理与代码耦合。一旦需要改变异常处理方式,必须修改代码。

 

 

Struts2异常机制

 

Struts2的异常处理哲学

Struts2提供一种声明式的异常处理方式。

 

Struts2中,Actionexecute()方法抛出全部异常。异常交给Struts2框架处理。

public String execute() throws Exception

 

Struts2框架接收到Action抛出的异常后,将根据struts.xml文件配置的异常映射,转入指定的视图资源。

Struts2异常处理机制源于Struts2拦截器。在struts-default.xml中已经配置了相关的拦截器。

 

声明异常捕捉

通过在struts.xml中配置异常映射元素<exception-mapping.../>Struts2便能够处理异常了。无需在Action中编写任何异常处理代码。

 

异常映射拦截器

Struts2通过拦截器对action抛出的异常进行捕获,这个拦截器是:

com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor

 

struts2的默认配置文件struts-default.xml中,拦截器ExceptionMappingInterceptor已经配置。配置片段如下:

<package name="struts-default" abstract="true">

………

<interceptor name="exception” class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>

………………

 <interceptor-stack name="defaultStack">

                <interceptor-ref name="exception"/>

………………

 <default-interceptor-ref name="defaultStack"/>

 

struts-default包继承的”子”包中的action都将使用默认的拦截器栈defaultStack(除非action引用了其他的拦截器),而在这个拦截器栈中引用了exception拦截器(defaultStack栈中第一个引用的拦截器)。因此,在默认情况下,所有的action自然就引用了exception拦截器,而不需要再配置它了。

 

 

配置异常映射

使用exception-mapping元素来配置异常映射,将异常类型映射到指定的结果。

 

exception-mapping元素有二个属性:

exception:指定异常映射所设置的异常类型。即指定一个异常类型的完整类名

result:此属性指定Action出现该异常时,系统转入result属性所指向的结果。

 

根据<exception-mapping.../>元素出现位置的不同,异常映射分为两种:

局部异常映射: <exception-mapping.../>元素作为<action…/>元素的子元素配置。

全局异常映射: <exception-mapping.../>元素作为<global-exception-mapping…/>元素的子元素配置。

全局映射对所有Action都有效,但局部异常仅对异常映射所在的Action内有效。

如果局部异常映射和全局异常映射配置了同一类型,在该Action内,局部异常映射会覆盖全局异常映射。

 

全局异常映射的result属性值通常不要使用局部结果,局部异常映射的result属性值既可以使用全局结果,也可以使用局部结果。

 

result映射的查找规则一样,当一个异常发生时,exception拦截器将首先查找抛出异常的action中的局部拦截器映射,然后再查找全局的异常映射。只要找到一个匹配的,那么对应的结果就这被处理。

 

 

 

输出异常信息

ExceptionMappingInterceptor捕获Action处理方法抛出的异常后,除了从异常映射的配置中查找对应的结果名外,还会将下列两个值放到值栈中,以便在结果页面中访问异常信息。

exception:异常对象本身。

exceptionStack:保存异常发生时的栈跟踪信息。

 

在结果页面中。可以使用struts2的标签来访问异常信息:

<s:property value=”exception”/>  输出异常对象本身。

<s:property value=exception.message />取出异常对象的描述信息。

<s:property value=”exceptionStack” /> 输出异常堆栈信息。

 

 

 

 

 

 

例:

此处省去Action与映射结果页面的编写。

 

<struts>

<package name=”default” extends=”struts-default”>

    <global-results>

    <result name=”login” type=”redirect”>/login.action</result>

    <result name=”sqlException” type=”chain”>/sqlException</result>

    <result name=”exception”>/exception.jsp</result>

</global-results >

 

         <!--全局异常映射-->

    <global-exception-mappings>

        <exception-mapping result=”sqlException” exception=”java.sql.SQLException”></exception-mapping>

        <exception-mapping result=”exception” exception=”java.sql.Exception”></exception-mapping>

    </global-exception-mappings>

 

    <action name=”dataAccess” class=”com.xxx.DataAccess”>

        <!--局部异常映射-->

        <exception-mapping result=”login” exception=”com.xxx.XXXException”></exception-mapping>

        <result>/dataAccess.jsp</result>

</action>

</package>

</struts >

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics