4.6.3 输出类型转换错误

当类型转换器处理失败后,系统将进入名为input的逻辑视图,但在该页面没有任何提示,这对于用户而言,并不是特别友好。

前面已经讲述过,conversionError 会负责将转换错误封装成 fieldError,并将其放在ActionContext 中。为了在 input 视图对应的页面中输出转换错误,只需要在页面中使用<s:fielderror/>标签即可输出该类型转换错误信息。

图4.16显示了系统提示转换出错信息的页面。

图4.16 类型转换失败的默认提示

正如图4.16所显示的,当某个Field类型转换失败后,将出现Invalid field value for field xxx错误信息,其中xxx是Action中的属性名,也是该属性对应的请求参数名。

提示:

如果使用Struts 2的表单标签来生成表单,并使用xhtml主题,Struts 2的表单标签将会自动输出错误提示。关于Struts 2标签库的内容,在本书后面会有详细介绍。

对于中文环境而言,我们通常希望看到中文的提示信息,因此应该在应用中改变该提示信息。Struts 2允许改变类型转换失败后的提示信息,在该应用的全局国际化资源文件中增加如下一行代码:

# 改变默认的类型转换失败后的提示信息
xwork.default.invalid.fieldvalue={0}字段类型转换失败!

提示:

因为上面的资源文件中包含了非西欧字符,因此必须使用 native2ascii 命令来处理该文件。

上面资源项中的 xwork.default.invalid.fieldvalue 是改变提示信息的 key,而后面的信息则是用户希望在页面中显示的提示信息。

由于该应用使用了国际化资源文件,因此需要让Struts 2加载该资源文件,本示例程序使用struts.xml文件中配置加载的国际化资源文件。本应用的struts.xml文件代码片段如下。

程序清单:codes\04\4.6\ChangeTip\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>
    <!-- 指定加载国际化资源文件 -->
    <constant name="struts.custom.i18n.resources"
          value="globalMessages"/>
    <!-- 配置了一个包元素 -->
    <package name="lee" extends="struts-default">
          ...
    </package>
</struts>

改变默认提示信息后,如果再次提交包含不能合理转换的请求参数,将看到如图4.17所示的页面。

图4.17 改变类型转换错误提示

在某些时候,可能还需要对特定字段指定特别的提示信息,此时可以提供该 Action 的局部资源文件,局部资源文件的文件名为ActionName.properties,在文件中增加如下一项:

#为某个Action的特定属性指定特定的校验失败提示信息
invalid.fieldvalue.属性名=提示信息

上面国际化资源中的invalid.fieldvalue.部分是固定的,而属性名是Action中的属性名,也就是请求参数的参数名;该项的value就是指定的校验失败提示信息。

看如图4.18所示的请求页面,其中包含了用户姓名、用户年龄和用户生日三个表单域,它们代表三个请求参数,这三个请求参数由Struts 2采用字符串、整数型和日期类型属性封装,因此必须涉及类型转换!只是这种类型转换的转换器是Struts 2内建的,无须开发者自己提供。

图4.18 输入用户信息的输入页面

处理上面请求的Action类代码如下。

程序清单:codes\04\4.6 \ChangeLocalTip\WEB-INF\src\org\crazyit\struts2\action\RegistAction.java

public class RegistAction extends ActionSupport
{
    //下面提供了三个属性,分别用于封装name、age和birth三个请求参数
    private String name;
    private Integer age;
    private Date birth;
    //此处省略了三个请求参数的setter和getter方法
    ...
}

因为希望改变特定属性的校验失败提示信息,所以为该Action提供Action范围的国际化资源文件,该文件内只包含如下一行代码:

# 改变上面Action中的birth属性类型转换后的提示信息
invalid.fieldvalue.birth=生日信息必须满足yyyy-MM-dd格式

该文件的文件名为LoginAction.properties,将该文件放在与LoginAction.class相同的位置(例如WEB-INF/classes/lee路径下)。如果我们在图4.18所示的输入页面中输入了不能成功进行类型转换的字符串,将看到如图4.19所示的页面。

图4.19 改变特定属性的类型转换失败提示

在图4.19中看到,输入的年龄参数无法正常转换,生日参数也无法正常转换,其中“age字段类型转换失败”是全局的错误提示,通过修改xwork.default.invalid.fieldvalue资源来改变;后面的生日字段的转换错误提示则是单独指定的。

提示:

上面的转换错误信息是红色的,而不是黑色的,仅仅是因为笔者增加了一个简单的CSS样式,与Struts 2框架没有任何关系。