(十)struts2的异常处理机制

成熟的MVC框架应该提供成熟的异常处理机制。当然可以在方法中手动捕捉异常,当捕捉到特定异常时,返回特定逻辑视图名。

这种方式非常繁琐,需要在方法中写大量try catch块,最大的缺点还是一旦需要改变异常处理方法时,需要修改代码。

最好的方式是通过声明式的方式管理异常处理。struts2提供了一种声明式的异常处理方式。

一、原理

    我们看Action接口中的execute方法声明。
    public String execute() throws Exception 

    这就意味着我们重写该方法时,无需进行任何异常处理,而是把异常抛给struts2框架处理. 

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

    异常映射功能是由 exception的拦截器帮我们做的。

    struts2的异常处理机制是通过在struts.xml中配置<exception-mapping..../>元素完成。
        属性:
            exception:异常类型
            result:出现该异常时,系统转入result指定的结果 

二、局部异常映射和全局异常映射

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

局部异常映射:将<exception-mapping..../>元素作为<action.../>的子元素配置
如果全局异常映射和局部异常映射配置了同一个异常类型,在该Action内,局部覆盖全局。

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

 

三、异常处理案例

 

 我们做一个简单的登陆应用

(1)编写我们的Action类

        public class LoginAction implements Action{
            private String username;
            private String password;
            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;
            }
            public String execute()throws Exception{ 
                //当用户名为monster时,抛出我们的自定义异常
                if(getUsername().equals("monster")){
                    throw new MyException("自定义异常");
                } 
                //当用户名为sql时,抛出sql异常
                if(getUsername().equalsIgnoreCase("sql")){
                    throw new SQLException("用户名不能为sql");
                }
                if(getUsername().equals("cad")&&getPassword().equals("123456")){
                    return "success";
                }else
                {
                    return "error";
                }
            }

        }

(2)我们编写我们的登陆jsp页面

        <body>
            <form action="${pageContext.request.contextPath }/login" method="post">
                用户名:<input type="text" name="username"><br>
                密  码:<input type="password" name="password"><br>
                <input type="submit" value="提交">
            </form>
        </body> 

(3)我们编写我们的配置文件struts.xml

    <package name="p2" extends="struts-default">
        //全局结果视图定义
        <global-results>
            <result name="sql">/exception.jsp</result>
        </global-results>

        //全局异常定义
        <global-exception-mappings>
            //出现sql异常,就转入到视图名为sql的视图结果
            <exception-mapping result="sql" exception="java.sql.Exception"></exception-mapping>
        </global-exception-mappings> 

        <action name="login" class="com.cad.struts2.LoginAction" > 
                //局部异常定义
                <exception-mapping result="my" exception="conm.cad.struts2.MyException"></exception-mapping>
                <result name="my">/exception.jsp</result>
                <result name="success">/welcome.jsp</result>
                <result name="error">/error.jsp</result>    
        </action>
    </package>  

  

  

  

posted @ 2018-08-09 12:29  跃小云  阅读(436)  评论(0编辑  收藏  举报