自定义类型转换器--局部和全局

J2EE开发各类资源下载清单,  史上最全IT资源,个人收藏总结!


 在Struts2框架中使用自定义类型转换器需要注册,这样在处理用户请求的时候系统才知道使用哪个类型转换器进行转换。

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

   自定义类型转换器--局部和全局_第1张图片

   Product.java

   自定义类型转换器--局部和全局_第2张图片

   属性文件目录结构:

  自定义类型转换器--局部和全局_第3张图片

    edu/action/RegistProductAction-conversion.properties


 edu/action/Product-conversion.properties

自定义类型转换器--局部和全局_第4张图片

   从上面可以看出,对于复合类型接收请求参数的类型转换,有两种方式:

   (1)RegistProductAction-conversion.properties 中 product.productId=....

   (2)Product-conversion.properties 中 productId=...


DateTypeConverter.java

自定义类型转换器--局部和全局_第5张图片

IntegerTypeConverter.java

自定义类型转换器--局部和全局_第6张图片

StrutsTypeConverter.java

自定义类型转换器--局部和全局_第7张图片

全局类型转换器:xwork-conversion.properties

注意:最好不要使用全局类型转换器,因为这样定义后,意味着Action中所有java.util.Date类型的属性,都将按照DateTypeConverter.java中定义的类型转换。

浏览器上输入:

自定义类型转换器--局部和全局_第8张图片

点击reigst按钮:

自定义类型转换器--局部和全局_第9张图片

控制台输出:

自定义类型转换器--局部和全局_第10张图片

控制台并没有输出返回类型转换语句,不知道为什么,并没有调用回调方法?????????

如果没有DateTypeConverter.java的话,那么,createDate="20121208",则控制台将输出:

自定义类型转换器--局部和全局_第11张图片

浏览器:

自定义类型转换器--局部和全局_第12张图片


你可能感兴趣的:(框架,struts,object,Class,action)