4.4.4 全局类型转换器

假设应用中有多个Action都包含了User类型的属性,如果多次重复注册局部类型转换器,则将是很烦琐的事情。因此,Struts 2还提供了全局类型转换器,它对指定类型的所有属性起作用。

看如图4.8所示的输入页面,包含三个请求参数,其中用户信息和客人信息都需要转换成User类型,而生日参数则需要转换成Date类型。

图4.8 包含多个User类型的输入页面

下面是该请求对应Action的代码片段。

程序清单:codes\04\4.4\GlobalConverter\WEB-INF\src\org\crayzit\struts2\action\LoginAction.java

public class LoginAction implements Action
{
    // 使用类型转换器将字符串请求参数直接转换成一个User实例
    private User user;
    // 封装customer请求参数的属性
    private User customer;
    // 封装birth请求参数的属性
    private Date birth;
    // 封装Action处理结果的tip属性
    private String tip;
    // 无参数的构造器
    public LoginAction()
    {
    }
    // user属性的setter和getter方法
    public void setUser(User user)
    {
          this.user = user;
    }
    public User getUser()
    {
          return this.user;
    }
    // 省略其他属性的setter和getter方法
    ...
    // 处理用户请求的execute方法
    public String execute() throws Exception
    {
          // 调用user属性的name属性和pass属性进行判断
          if (getUser().getName().equals("crazyit")
                && getUser().getPass().equals("leegang") )
          {
                setTip("转换成功");
                return SUCCESS;
          }
          else
          {
                setTip("转换失败");
                return ERROR;
          }
    }
}

在上面的 Action 中我们看到了 user 和 customer 两个属性,这两个属性的类型都是 User类型——对于一个Action里包含两个User类型属性的情形,还可以使用局部类型转换器注册文件完成注册;但如果系统中的多个Action都包含User类型的属性,则应该考虑使用全局类型转换器。

注册全局类型转换器需要一个名为 xwork-conversion.properties 的文件,该文件也是Properties文件,其内容由多个“复合类型=对应的类型转换器”项组成,其中“复合类型”指定需要完成类型转换的复合类,“对应类型转换器”指定所指定类型转换的转换器。

下面是本应用中注册全局类型转换器的注册文件代码。

# 指定org.crazyit.struts2.domain.User类的类型转换器
# 为org.crazyit.struts2.action.UserConverter
org.crazyit.struts2.domain.User=org.crazyit.struts2.action.UserConverter

一旦注册了上面的全局类型转换器,该全局类型转换器就会对所有的User类型属性起作用。

如果在图4.8所示页面的用户信息输入框中输入“crazyit,leegang”,在客人信息输入框中输入“abc,xyz”,在生日输入框中输入“2003-02-12”,然后提交请求,将看到如图4.9所示的页面。

图4.9 全局类型转换器转换成功

可能读者已经注意到了,我们输入了 2003-02-12 字符串,Struts 2 可以将其转换成 Date类型,这就是Struts 2内建的类型转换器在起作用。