4.6.2 处理类型转换错误

下面将以前面最简单的局部类型转换器为例,介绍如何处理类型转换错误。

我们重新改写系统的Action类,让系统的Action类继承Struts 2的ActionSupport类。修改后的Action类代码片段如下。

程序清单:codes\05\5.6\SimpleErrorHandle\WEB-INF\src\org\crazyit\struts2\action\LoginAction.java

// 为了正常使用系统的类型转换错误处理机制,让Action类继承ActionSupport类
public class LoginAction extends ActionSupport
{
    // 该类包含一个User类型属性,该属性用于封装名为user的请求参数
    private User user;
    private String tip;
    // 省略该类的其他成分
    ...
}

前面已经提到,当类型转换出现异常时,conversionError拦截器会处理该异常,然后转入名为 input 的逻辑视图,因此应该为该 Action 增加名为 input 的逻辑视图定义。修改后的struts.xml文件代码如下。

程序清单:codes\04\4.6\SimpleErrorHandle\WEB-INF\src\struts.xml

<?xml version="1.0" encoding="GBK" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <!-- 配置了一个包元素 -->
    <package name="lee" extends="struts-default">
          <!-- 下面配置本系统的Action -->
          <action name="regist" class="org.crazyit.struts2.action.LoginAction">
                <!-- 定义类型转换失败后跳转到loginForm.jsp -->
                <result name="input">/WEB-INF/content/loginForm.jsp</result>
                <result>/WEB-INF/content/welcome.jsp</result>
          </action>
          <action name="*">
                <result>/WEB-INF/content/{1}.jsp</result>
          </action>
    </package>
</struts>

经过上面的改变,如果用户的输入不能成功转换成用户实例,系统将转入input.jsp页面,等待用户再次输入。