1、 注册局部类型转换器
局部类型转换器的作用范围为Action范围。注册局部类型转换器需要建立一个命名规则为ActionName-conversion.properties的属性文件,该属性文件保存在与Action类文件相同的目录下。ActionName就是使用类型转换器的Action实现类的类名,而后面的“-conversion.properties”是固定的格式。该文件是一个标准的属性文件,内容为标准的Key-Value格式,该键值对定义如下:
propertyName=类型转换器
例如:RegistProductAction-conversion.properties属性文件的内容如下:
userAge=edu.converter.IntegerTypeConverter
product.productId=edu.converter.StrutsTypeConverter
product.createDate=edu.converter.DateTypeConverter
2、 注册全局类型转换器
注册一个全局类型转换器,需要建立一个xwork-conversion.properties属性文件,该文件需要保存在class路径的根目录下,如WEB-INF/classes。该文件同样由多个标准的Key-Value键值对组成,其内容定义为“复合类型-对应的类型转换器”,其中复合类型就是Action中需要类型转换的类型属性,对应的类型转换器就是转换该复合类型的对应转换器。
示例:xwork-conversion.properties文件内容如下:
java.util.Date=edu.converter.DateTypeConverter
3. 基于OGNL的类型转换器
Struts2的类型转换器都需要实现一个TypeConverter接口,该接口位于ognl.jar包内,也是就Struts2框架的转换器使用了OGNL技术。该接口定义了一个convertValue()方法,实现该接口的类型转换器实现类都需要重写该方法来进行类型转换。OGNL还提供了一个实现TypeConverter接口的类DefaultTypeConverter,开发者只要继承该类,就可以开发类型转换器的实现类。
DefaultTypeConverter类的子类需要重写convertValue()方法,来实现字符串类型与复合类型之间的双向转换。convertValue()方法有三个参数:Map context:该参数为类型转换环境的上下文内容;Object value:该参数为需要转换的参数;Class toType:该参数指的是转换目标的类型。
public Object convertValue(Map<String, Object> context, Object value,Class toType);注意这里的value是一个数组类型的,因为struts2为了兼容checkbox类型的参数。
注意:可以看到,convertValue()方法是通过toType的类型判断来实现双向转换的。
4.基于Struts2的类型转换器
Struts2框架提供了一个类型转换器的StrutsTypeConverter抽象类,开发者可以继承该类来开发自定义的类型转换器实现类。 该抽象类实际上继承了DefaultTypeConverter类,在该类的基础上进行了简化。StrutsTypeConverter抽象类是Struts2框架中类型转换器的基础,该类中提供了两个抽象方法,这两个抽象方法分别实现“form字符串参数-Struts复合类型”之间的双向转换。
public Object convertFromString(Map context, String[] values, Class toClass) ;public String convertToString(Map context, Object obj);
5.例子:
RegistProductAction.java
Product.java属性文件目录结构:
edu/action/RegistProductAction-conversion.properties
edu/action/Product-conversion.properties
从上面可以看出,对于复合类型接收请求参数的类型转换,有两种方式:
(1)RegistProductAction-conversion.properties 中 product.productId=....
(2)Product-conversion.properties 中 productId=...
DateTypeConverter.java
IntegerTypeConverter.java
StrutsTypeConverter.java
全局类型转换器:xwork-conversion.properties
注意:最好不要使用全局类型转换器,因为这样定义后,意味着Action中所有java.util.Date类型的属性,都将按照DateTypeConverter.java中定义的类型转换。
浏览器上输入:
点击reigst按钮:
控制台输出:
控制台并没有输出返回类型转换语句,不知道为什么,并没有调用回调方法?????????
如果没有DateTypeConverter.java的话,那么,createDate="20121208",则控制台将输出:
浏览器: