Struts 2.x权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.8.1 Struts2的异常处理哲学

对于MVC框架而言,我们希望有如图3.29所示的异常处理流程。

图3.29 MVC框架的异常处理流程

图3.29所显示的处理流程是,当Action处理用户请求时,如果出现了异常1,则系统转入视图资源1,在该视图资源上输出服务器提示;如果出现异常2,则系统转入视图资源2,并在该资源上输出服务器提示。

为了满足图3.29所示的处理流程,我们可以采用如下的处理方法。

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

我们在Action的execute方法中使用try...catch块来捕捉异常,当捕捉到指定异常时,系统返回对应的逻辑视图名——这种处理方式完全是手动处理异常,非常烦琐,而且可维护性不好。如果我们需要改变异常处理方式,则必须修改Action代码。

提示:

通过上面代码中的粗体字代码可以看出,如果手动catch异常,然后return一个字符串作为逻辑视图名,其实质就是完成异常类型和逻辑视图名之间的对应关系。既然如此,完全可以把这种对应关系推迟到struts.xml文件中进行管理。

类似于Struts 1提供的声明式异常管理,Struts 2允许通过struts.xml文件来配置异常的处理。关于Struts 2的处理哲学,我们可以查看Action接口里的execute方法声明。

// 处理用户请求的execute方法,该方法抛出所有异常
public String execute() throws Exception

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

通过Struts 2的异常处理机制,我们可以无须在execute方法中进行任何异常捕捉,仅需在struts.xml文件中配置异常处理,就可以实现如图3.29所示的异常处理流程。

为了使用Struts 2的异常处理机制,我们必须打开Struts 2的异常映射功能,开启异常映射功能需要一个拦截器。下面的代码片段来自 struts-default.xml,在该配置文件中已经开启了Struts 2的异常映射功能。

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

正是通过上面配置的拦截器,实现了Struts 2的异常机制。