(六)Struts2进阶之异常处理

任何成熟的框架都提供异常处理机制,当然也可以采用手动捕获异常的方式,但这种方式繁琐,最好采用声明式的方式管理异常处理,声明式的异常处理机制使得异常处理和代码的耦合度降低,有利于维护。


1.异常处理机制

Struts2的异常处理流程图如下
24.png

当Action处理用户的请求时,如果出现了异常1,则转入视图资源1,如果出现异常2,则转入视图资源2。


2.配置异常

使用<exception-mapping>标签在struts.xml中配置异常。

该标签有两个属性result和exception,都是必须的。

  • result属性:用于指定Action抛出异常时,系统转入该属性值对应的<action>或者<global-results>中配置的<result>元素。
  • exception属性:用于指定Action出现的异常所对应的异常类型。

根据<exception-mapping>标签的位置,可分为局部异常映射和全局异常映射

  • 局部异常映射:将<exception-mapping>标签作为<action>标签的子元素。
  • 全局异常映射:将<exception-mapping>标签作为<global-exception-mappings>标签的子元素。

和全局result、局部result类似,全局异常对所有的Action都有效,且如果异常相同,局部异常会覆盖全局异常。

还记得(三)struts2进阶之实现Action这篇文章吗?我们在里面都是用一个登陆的小例子讲解的,现在我们再次用那个小例子

局部异常映射

创建一个LoginAction5继承ActionSupport,代码如下

@SuppressWarnings("serial")
public class LoginAction5 extends ActionSupport {
    private String username;
    private String password;

    public LoginAction5() {}

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String execute() throws Exception {
        if("admin".equals(username) && "admin".equals(password)) {
            return SUCCESS;
        } else {
            // 抛出异常
            throw new RuntimeException();
        }
    }
}

可以看到execute()方法抛出了异常,现在去struts.xml中增加一条Action的配置

<!-- 异常捕获 -->
<action name="login5" class="com.codeliu.action.LoginAction5">
    <!-- 局部异常映射 -->
    <exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
    <result>/success.jsp</result>
    <result name="error">/error.jsp</result>
</action>

当我们输入的账户名密码符合要求的时候,就会进入success.jsp,当输入的密码不符合要求的时候,Action执行execute方法后就会抛出一个RuntimeException,被捕获后,就会根据<exception-mapping >中的result属性的值,去寻找相应的result,然后进入error.jsp。

全局异常映射

LoginAction5的代码不变,我们只是改变struts.xml的代码

<struts> 
    <!-- Struts2的Action都必须配置在package里,此处使用默认package -->
    <package name="default" namespace="/" extends="struts-default">
        <!-- 全局异常映射,必须在所有action的 前面-->
        <global-exception-mappings>
            <exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
        </global-exception-mappings>

        <!-- 异常捕获 -->
        <action name="login5" class="com.codeliu.action.LoginAction5">
            <!-- 局部异常映射 -->
            <!-- <exception-mapping result="error" exception="java.lang.Exception"></exception-mapping> -->
            <result>/success.jsp</result>
            <result name="error">/error.jsp</result>
        </action>
    </package>
</struts>

这样配置的话,如果在action中没有找到对应的异常映射,就会去找全局异常映射,最后的结果和上面的一样。

注意:全局异常映射必须配置在所有action的前面!

猜你喜欢

转载自blog.csdn.net/a_helloword/article/details/80386068