Struts2异常处理的使用例子

最通俗的做法

比如,现在让你来为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框架的异常处理表层的东西总结完毕了,对于深层次的东西,后续有时间继续分析、总结。伙计们,元宵节快乐。

时间: 2024-10-09 19:20:39

Struts2异常处理的使用例子的相关文章

16.如何自学Struts2之Struts2异常处理[视频]

16.如何自学Struts2之Struts2异常处理[视频]   之前写了一篇"打算做一个视频教程探讨如何自学计算机相关的技术",优酷上传不了,只好传到百度云上:   http://pan.baidu.com/s/1kTDsa95 有问题可以直接回复这篇文章.

Struts2异常处理机制

任何成熟的MVC框架都应该提供成就的异常处理机制,Strut2也不例外.Struts2提供了一种声明式的异常处理方式,Struts2也是通过配置的拦截器来实现异常处理机制的. 一.  异常处理机制1. 配置 Struts2的异常处理机制是:通过在struts.xml文件中配置﹤exception-mapping -﹥元素完成的,配置该元素时,需要指定两个属性: exception:此属性指定该异常映射所设置的异常类型. result:此属性指定Action出现该异常时,系统转入result属性所

Struts2 自带的例子Struts2-blank 学习三问

问题描述 我的Struts版本是:Struts2.2.3.1. 把它自身带的例子都导入到了Eclipse中.  在其自带的例子Struts2-blank中,Package.properties 文件中包含:  requiredstring = ${getText(fieldName)} is required.我的理解如下:${getText(fieldName)}是一个OGNL表达式.getText是ActionSupport的方法. 问题一:请问 fieldName是什么,怎么理解?可以向上

struts2 异常处理3板斧

板斧1:找不到action的错误 在struts.xml中参考如下配置 1 <struts> 2 3 ... 4 <package name="default" namespace="/" extends="struts-default"> 5 6 ... 7 8 <default-action-ref name="index" /> 9 10 ... 11 12 <action na

struts2 异常处理 404错误

struts.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"     "http://struts.apache.org/dtds/struts-2.0.dtd"> <st

Struts2 异常处理页面 exceptionStack的值取不到

问题描述 如题Struts2搭建的框架,在Windows上进行开发,采用异常统一处理,出异常后返回到一个error.jsp页面用<s:propertyvalue="exceptionStack"/>显示异常信息开发测试时都是好用的,就是说代码是没有错误的但是系统移植到Linux后,就取不到exceptionStack的值了请问有大神遇到过类似情况么,求助~ 解决方案 解决方案二:先看看全部的代码吧解决方案三:引用1楼ciazzp_java的回复: 先看看全部的代码吧 我的工

ztree+Struts2异步检索数据例子

今天分享一个ztree+Struts2异步检索数据demo. 首先效果图: 客户端html和js代码:  代码如下 复制代码 <script type="text/javascript"> var quickMsg = "输入关键字按回车键检索"; $(function(){             $("#quickQuery").focus(                 function(){                 

struts2+flexigrid的小例子,但数据显示不出来,不知道哪里错了

问题描述 新手刚接触flexigrid,数据显示不出来,求各位解答!谢谢.页面js代码:JScript code $("#showData").flexigrid({ url: 'flexi/flexi!getData.action', //链接 dataType:'json', colModel : [ {display: '编号', name : 'id', width : 50, sortable : true, align: 'center'}, {display: '姓名',

Struts2、Spring MVC4 框架下的ajax统一异常处理

本文算是struts2 异常处理3板斧.spring mvc4:异常处理 后续篇章,普通页面出错后可以跳到统一的错误处理页面,但是ajax就不行了,ajax的本意就是不让当前页面发生跳转,仅局部刷新,从而改善用户体验,基本思路是:把异常转换成json数据返回,这样ajax的回调函数,就能解析出错误原因.   一.如何区分ajax请求与普通请求 打开firefox的调试工具观察一下: 普通的页面请求 jquery发起的ajax请求 对比一下,可以发现jquery发生的ajax请求,Request