IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Struts2学习之异常处理

    果冻想发表于 2016-07-06 14:06:16
    love 0

    最通俗的做法

    比如,现在让你来为Struts2框架设计一个异常处理机制,你会怎么设计?大多数人会这样来实现:

    public class LoginAction
    {
        public String execute()
        {
            try
            {
                ...
            }
            catch (异常1 e)
            {
                return 结果1
            }
            catch (异常2 e)
            {
                return 结果2
            }
        }
    }
    

    的确,我们经常写这样的代码,这样的代码看起来层次也挺清晰的;但是这种处理方式完全是手动处理异常,非常繁琐,而且可维护性不好,如果我们需要改变异常处理方式,则必须修改Action代码。那么如何做到不修改Action代码,而且还能完美的处理异常呢?接下来看看Struts2框架是如何来完成的。

    Struts2框架的做法

    Struts2允许通过struts.xml文件来配置异常的处理。我们在重写execute方法时,从它的定义中可以看出:

    public String execute() throws Exception
    

    execute方法可以抛出全部异常,这也意味着我们完全无须进行任何异常处理,而是把异常直接抛给Struts2框架处理即可;Struts2框架接收到Action抛出的异常之后,将根据struts.xml文件配置的异常映射,转入指定的视图资源。

    Struts2框架的异常机制使用的是Struts2中广泛使用的拦截器技术来实现的,在struts-default.xml文件中,我们可以看到这样的一段配置代码:

        <interceptors>
            ...
            <!--执行异常处理的拦截器-->
            <interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
    
            <!--Struts2默认的拦截器栈-->
            <interceptor-stack name="defaultStack">
                <!--引用异常映射拦截器-->
                <interceptor-ref name="exception"/>
                ...
            </interceptor-stack name="defaultStack">
        </interceptors>
    

    正是通过上面配置的拦截器,实现了Struts2的异常机制。可见,通过Struts2框架的异常处理机制,我们需要做的是在struts.xml配置文件中配置异常和视图资源的映射关系。接下来详细的说说在struts.xml中如何进行异常配置。

    struts.xml中捕捉异常

    Struts2的异常处理机制是通过在struts.xml文件中配置<exception-mapping .../>元素完成的,配置该元素时,需要指定如下两个属性:

    • exception:该属性指定该异常映射所设置的异常类型
    • result:该属性指定Action出现该异常时,系统返回result属性值对应的逻辑视图名

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

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

    与这篇《Struts2学习之处理结果》文章中总结的类似,全局异常映射对该包中所有的Action都有效,但是局部异常仅对该异常映射所在的Action内有效。如果局部异常映射和全局异常映射配置了同一个异常类型,在该Action内,局部异常映射会覆盖全局异常映射。

    下面通过一个简单的Demo来演示如何在struts.xml中配置异常映射。

    public class LoginAction extends ActionSupport
    {
        private String userName;
        private String password;
    
        // ...
    
        public String execute() throws Exception
        {
            if (getUserName().equalsIgnoreCase("user"))
            {
                throw new MyException("自定义异常");
            }
            else if (getUserName().equalsIgnoreCase("sql"))
            {
                throw new SQLException("用户名不能为SQL");
            }
    
            if (getUserName().equals("jelly")
                    && getPassword().equals("123456"))
            {
                return SUCCESS;
            }
            else
            {
                return ERROR;
            }
        }
    }
    

    由于这段示例代码没有调用业务逻辑组件,因此系统不会抛出异常,这里只是采用手动抛出异常的方式进行演示。

    接下来的struts.xml的配置代码才是重点。

    <package name="Lee" extends="struts-default" namespace="/Login" >
        <!--定义全局结果映射-->
        <global-results>
            <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="login" class="com.jellythink.practise.LoginAction">
            <exception-mapping exception="com.jellythink.practise.MyException" result="myException" />
            <result name="success">/success.jsp</result>
            <result name="error">/error.jsp</result>
            <result name="myException">/myexception.jsp</result>
            <result name="sqlException">/sqlexception.jsp</result>
        </action>
    </package>
    

    上面的配置代码,你琢磨琢磨,理解理解,然后你就会明白了如何在struts.xml中进行异常配置。当然了,我上面的配置有一个“奇葩”,java.sql.SQLException全局异常映射的result是局部结果。但是需要注意,通常异常映射的result属性不要使用局部结果(虽然不会出错),局部异常映射的result属性值既可以使用全局结果,也可以使用局部结果。

    输出异常信息

    有的时候,我们需要在前台页面上输出异常信息,一是为了用户体验,二是为了调试。在Struts2框架中,可以使用以下标签在页面上显示异常信息:

    • <s:property value="exception">:输出异常对象本身
    • <s:property value="exceptionStack">:输出异常堆栈信息

    总结

    至此,关于Struts2框架的异常处理表层的东西总结完毕了,对于深层次的东西,后续有时间继续分析、总结。伙计们,元宵节快乐。

    果冻想-一个原创技术文章分享网站。

    2016年2月22日 于呼和浩特。

    未经允许不得转载:果冻想 » Struts2学习之异常处理



沪ICP备19023445号-2号
友情链接