4.2 Struts2内建的类型转换器

前面已经提到,对于 Web 应用而言,类型转换如此频繁,几乎所有的 MVC 框架都会提供内建的类型转换器,对于大部分的常用类型,开发者根本无须创建自己的类型转换器,因为Struts 2可以完成大多数常用的类型转换。

这些常用的类型转换都是通过Struts 2内建的类型转换器完成的,Struts 2已经内建了字符串类型和如下类型之间的类型转换器。

boolean和Boolean:完成字符串和布尔值之间的转换。

char和Character:完成字符串和字符之间的转换。

int和Integer:完成字符串和整型值之间的转换。

long和Long:完成字符串和长整型值之间的转换。

float和Float:完成字符串和单精度浮点值之间的转换。

double和Double:完成字符串和双精度浮点值之间的转换。

Date:完成字符串和日期类型之间的转换,日期格式使用用户请求所在 Locale 的SHORT格式。

数组:在默认情况下,数组元素是字符串,如果用户提供了自定义类型转换器,也可以是其他复合类型的数组。

集合:在默认情况下,假定集合元素类型为String,并创建一个新的ArrayList封装所有的字符串。

注意

对于数组的类型转换,将按照数组元素的类型来单独转换每一个元素;但对于其他的类型转换,如果转换无法完成,系统将出现类型转换错误。

对于上一个应用的注册页面,如果使用Struts 2来处理该注册请求,程序员将无须自己进行类型转换,直接使用Struts 2内建的类型转换器即可。下面是处理该注册请求的Action代码。

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

public class RegistAction extends ActionSupport
{
    // 值对象用于封装请求参数的4个属性
    private String name;
    private String pass;
    private int age;
    private Date birth;
    // 无参数的构造器
    public RegistAction()
    {
    }
    // 初始化全部属性的构造器
    public RegistAction(String name , String pass ,
          int age , Date birth)
    {
          this.name = name;
          this.pass = pass;
          this.age = age;
          this.birth = birth;
    }
    // 省略各属性的setter与getter方法
    ...
}

正如上面Action中的粗体字代码所示,该Action内包含age、birth属性,它们的数据类型分别是int和Date,所有请求参数的数据类型都是String类型,因此需要进行类型转换处理,但无须程序员操心,Struts 2框架会处理这一切——直接将该Action配置在struts.xml文件中,将注册请求提交给该Action处理即可。在struts.xml文件中配置该Action的代码片段如下。

程序清单:codes\04\4.2\simpleConvert\WEB-INF\src\struts.xml

<!-- 下面配置本系统的Action -->
<action name="regist" class="org.crazyit.struts2.action.RegistAction">
    <!-- 下面定义了一个结果映射 -->
    <result>/WEB-INF/content/welcome.jsp</result>
</action>

该Action处理注册请求后将直接转入welcome.jsp页面,转入welcome.jsp页面将看到如图4.4所示的结果:类型转换成功。

图4.4 Struts 2内建类型转换成功

注意

上面的 RegistAction 并未重写 execute()方法,这是由于该 Action 继承了ActionSupport类,ActionSupport类已经重写了execute()方法——该方法总是返回success字符串。