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属性的setter和getter方法 public Name getName() { return name; } public void setName(Name name) { this.name = name; } // age属性的setter和getter方法 public int getAge() { return age; } public void setAge(int age) { this.age = age; } // birth属性的setter和getter方法 public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } // othername属性的setter和getter方法 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类型属性都能起作用。