深入详解Struts2——异常处理

struts2提供了符合资深框架特点声明式异常处理机制。在struts2中,我们可以再struts.xml文件中配置异常映射,将一种异常类型和一个结果对应起来,由这个结果负责对异常做出响应。struts2通过拦截器对action抛出的异常进行捕获,这个拦截器是:

com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor

代码如下:

public String intercepor(ActionInvocation invocation) throws Exception{
    String result;
    try{
        // 在try语句中调用invocation.invoke(),invoke方法在内部调用Action的方法
        return = invocation.invoke();
    }catch(Exception e){
        // 如果Action的方法执行抛出了异常,执行流程将跳转到catch语句中
        if(logEnabled){
            handleLogging(e);
        }
        // 得到配置的异常映射列表
        List exceptionMappings = invocation.getProxy().getConfig().getExceptionMappings();
        // 在异常映射列表中,查找异常类型对应的结果代码
        String mappedResult = this.findResultFromExceptions(exceptionMappings,e);
        if(mappedResult != null){
            result = mappedResult;
            publishException(invocation,new ExceptionHolder(e));
        }else{
            throw e;
        }
    }
    return result;
}

要使用struts2的声明式异常处理,就需要配置ExceptionMappingInterceptor拦截器。在struts2的默认配置文件Struts-default.xml中,ExceptionMappingInterceptor已经配置好,如下所示:

<package name="struts-default" abstract="true">
    ...
    <interceptors>
        <interceptor name="exception" class="com.opensymphony.xwork.interceptor.ExceptionMappingInterceptor" />
        ...
    </interceptors>
    <interceptor-stack name="defaultStack">
        <interceptor-ref name="exception" />
        ...
    <default-interceptor-ref name="defaultStack" />
</package>

下面我们看一个全局和局部异常的例子

<struts>
    <package name="default" extends="struts-default">
        <global-results>
            <!-- 全局结果定义 -->
            <result name="login" type="redirect">/login.action</result>
            <result name="sqlException" type="chain">
                /sqlExceptionAction.action
            </result>
            <result name="exception">/exception.jsp</result>
        </global-results>
        <global-exception-mappings>
            <!-- 全局异常映射定义-->
            <exception-mapping  exception="java.sql.SQLException" result="sqlException" />
            <exception-mapping exception="java.lang.Exception" result="exception" />
        </global-exception-mappings>
        <action name="dataAccess" class="org.struts.DataAccess" >
            <!-- 在dataAccess action中局部异常映射定义-->
            <exception-mapping exception="org.struts.SecurityException" result="login" />
            <result>/dataAccess.jsp</result>
        </action>
    </packeage>
</struts>

在结果页面,可以使用Struts2的标签来访问异常信息,例如:
<s:property value="exception.message" /> 取出异常对象的描述信息
<s:property value="exceptinStack" /> 取出异常发生时的栈跟踪信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值