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的异常机制。