4.4.1 系统需求

假设本系统有一个如图4.5所示的输入页面。

图4.5 输入字符串的页面

上面的JSP页面可以输入一个abc,xyz模式的字符串,其中abc将作为用户的用户名,而xyz 将作为用户的密码。当单击“转换”按钮时,系统希望可以将上面的字符串转换成一个User实例。

虽然可以在Action中分别接收name参数和pass参数,然后将这两个参数设置成User实例的属性。但这种处理方式是手动进行类型转换的,显然编程会复杂,我们希望使用一个类型转换器来自动实现类型转换。

如果可以让类型转换器来实现自动类型转换,我们就可以在Action中直接使用User类型的属性。看下面的Action类代码。

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

public class LoginAction implements Action
{
    // 封装请求参数的Map对象
    private User user;
    private String tip;
    // user属性的setter和getter方法
    public void setUser(User user)
    {
          this.user = user;
    }
    public User getUser()
    {
          return this.user;
    }
    // 省略tip的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类型的属性,User类是一个用户自定义的类,该类包含两个字符串属性。下面是User类的代码。

程序清单:codes\04\4.4\LocalConverter\WEB-INF\src\org\crazyit\struts2\domain\User.java

// 用户自定义类
public class User
{
    // User类包含的两个字符串属性
    private String name;
    private String pass;
    // 下面是User类的两个基本属性的setter和getter方法
    public void setName(String name)
    {
          this.name = name;
    }
    public void setPass(String pass)
    {
          this.pass = pass;
    }
    public String getName()
    {
          return (this.name);
    }
    public String getPass()
    {
          return (this.pass);
    }
}

很显然,用户不可能直接输入一个User实例,如果定义一个自定义类型转换器,由自定义类型转换器负责将字符串参数转换成User实例,这个例子就可以正常运行起来。