4.6.1 类型转换的错误处理流程

Struts 2提供了一个名为conversionError的拦截器,这个拦截器被注册在默认的拦截器栈中。我们查看Struts 2框架的默认配置文件:struts-default.xml文件,该文件中有如下配置片段。

<interceptor-stack name="defaultStack">
    <!-- 省略其他拦截器引用 -->
    ...
    <!-- 处理类型转换错误的拦截器 -->
    <interceptor-ref name="conversionError"/>
    <!-- 处理数据校验的拦截器 -->
    <interceptor-ref name="validation">
          <param name="excludeMethods">input,back,cancel,browse</param>
    </interceptor-ref>
    <!-- 省略其他拦截器 -->
    ...
</interceptor-stack>

在上面的默认拦截器栈中包含了conversionError拦截器的引用,如果Struts 2的类型转换器执行类型转换时出现错误,该拦截器负责将对应错误封装成表单域错误(fieldError),并将这些错误信息放入ActionContext中。

显然,conversionError拦截器实际上是一个Throws处理(关于各种处理类型的定义和深入介绍,请参阅疯狂Java体系的《轻量级Java EE企业应用实战》一书)。当系统抛出异常时启动,Throws处理负责进行处理。通过这种方式,Struts 2允许类型转换器中只完成类型转换逻辑,而无须关心异常处理逻辑——因此,我们看到上面的类型转换器无须进行任何异常处理逻辑。

图4.15显示了Struts 2类型转换中的错误处理流程。

图4.15 Struts 2类型转换中的错误处理流程

图4.15只显示了类型转换器、conversionError拦截器和控制器之间的顺序,并未完全刻画出系统中的其他成员。当 conversionError 拦截器对转换异常进行处理后,系统会跳转到名为input的逻辑视图。

必须指出的是,为了让Struts 2框架处理类型转换错误,以及使用后面的数据校验机制,系统的 Action 类都应该通过继承 ActionSupport 类来实现。ActionSupport类为完成类型转换错误处理、数据校验实现了许多基础工作。

注意