零基础学Struts
上QQ阅读APP看书,第一时间看更新

3.5 局部类型转换器和全局类型转换器

Struts 2注册类型转换器有两种方式,一种是注册局部类型转换器,另一种是注册全局类型转换器。下面将分别介绍如何注册局部类型转换器和全局类型转换器,以及两种注册方式的区别。

3.5.1 局部类型转换器

假设现在项目需要增加需求,需要在用户输入页中增加一个文本框用来输入othername值。这时只要在Action中添加一个Name类型的属性,然后再注册自定义类型转换器就可以了。下面针对该需求编写项目步骤。

步骤如下。

(1)新建一个用户输入页,在前面输入页的基础上添加一个name属性值为othername的文本框,代码如下所示。

        <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
        <%@ taglib prefix="s" uri="/struts-tags" %>
        <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        <html>
          <head>
            <title>input</title>
          </head>
          <body>
            <! -- 输入表单 -->
            <s:form action="input">
                    <! -- 单行文本框,用来输入name -->
                    <s:textfield name="name" label="name"></s:textfield>
                    <! -- 单行文本框,用来输入othername -->
                    <s:textfield name="othername" label="othername"></s:textfield>
                    <! -- 单行文本框,用来输入age -->
                    <s:textfield name="age" label="age"></s:textfield>
                    <! -- 单行文本框,用来输入birth -->
                    <s:textfield name="birth" label="birth"></s:textfield>
                    <s:submit value="input"></s:submit>
            </s:form>
          </body>
        </html>

(2)新建业务逻辑组件Action,在前面创建的Action基础上添加一个属性othername,该属性类型为Name。并添加othername属性的setter和getter方法,代码如下所示。

        package net.hncu.action;
        import java.util.Date;
        import net.hncu.bean.Name;
        import com.opensymphony.xwork2.ActionSupport;
        public class InputAction extends ActionSupport {
              // name属性类型为自定义的Name类型
              private Name name;
              // othername属性类型同样为自定义的Name类型
              private Name othername;
              // age属性类型为int
              private int age;
              // birth属性类型为Date
              private Date birth;
              // name属性的settergetter方法
              public Name getName() {
                    return name;
              }
              public void setName(Name name) {
                    this.name = name;
              }
              // age属性的settergetter方法
              public int getAge() {
                    return age;
              }
              public void setAge(int age) {
                    this.age = age;
              }
              // birth属性的settergetter方法
              public Date getBirth() {
                    return birth;
              }
              public void setBirth(Date birth) {
                    this.birth = birth;
              }
              // othername属性的settergetter方法
              public Name getOthername() {
                    return othername;
              }
              public void setOthername(Name othername) {
                    this.othername = othername;
              }
              // execute方法
              public String execute() throws Exception {
                    return SUCCESS;
              }
        }

(3)因为在前面已经实现了Name类型到字符串类型的转换器,所以只需导入该类型转换器到项目中即可。

(4)注册该自定义类型转换器。新建InputAction-conversion.properties文件,在该文件中指定需要进行类型转换的属性,分别为name和othername。指定其类型转换类为net.hncu.convert.NameConvert,代码如下所示。

        name=net.hncu.convert.NameConvert
        othername = net.hncu.convert.NameConvert

(5)新建显示页。在该页面中通过<s:property>标签输出指定的属性值,代码如下所示。

        <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
        <%@ taglib prefix="s" uri="/struts-tags" %>
        <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        <html>
          <head>
            <title>output</title>
          </head>
          <body>
            <! -- 输出name属性的值 -->
            <s:property value="name"/><br>
            <! -- 输出othername属性的值 -->
            <s:property value="othername"/><br>
            <! -- 输出age属性的值 -->
            age:<s:property value="age"/><br>
            <! -- 输出birth属性的值 -->
            birth:<s:property value="birth"/>
          </body>
        </html>

(6)在打开的输入页中输入用户信息,如图3.28所示。

(7)单击“input”按钮,页面跳转到显示页,页面如图3.29所示。

图3.28 输入用户信息

图3.29 显示用户信息

3.5.2 全局类型转换器

在输入页面中,name参数值和othername参数值都需要转换为Name类型。在LoginAction中添加name和othername两个属性,两个属性的类型都为Name类型。这时在注册类型转换器时,就必须配置这两个属性对应的类型转换器。

如果在输入页面再添加一个文本框,其参数值也是要转换成Name类型,这样的话就必须再在资源文件中注册吗?这样会不会很麻烦?这样确实很麻烦,这种注册方式注册的是局部类型转换器。不过不用担心,Sturts 2提供了注册全局类型转换器的方式,这样就不用这么麻烦了。

Sturts 2中提供了注册全局类型转换器的方式。通过这种方式就不必重复指定Action中的属性以及对应的转换器类。即使系统中多个Action都包含了Name类型的属性,也可以通过定义全局类型器来一次实现,而无需多次注册。

要实现全局类型转换器,必须提供一个xwork-conversion.properties文件,该文件必须保存在classes目录下。该资源文件名格式如下。

        要进行转换的类=对应的类型转换器

可以通过注册全局类型转换器来完成上一个实例,注册文件代码如下。

        net.hncu.bean.Name=net.hncu.convert.NameConvert

如果注册了全局类型转换器,那么对于所有的Name类型属性都能起作用。