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

本文详细介绍了在Struts2中如何注册和使用自定义类型转换器,包括局部类型转换器、全局类型转换器以及基于OGNL和Struts2的类型转换器的工作原理。同时给出了具体的配置文件示例和实现类示例。
摘要由CSDN通过智能技术生成

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

  

   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",则控制台将输出:


浏览器:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值