剖析Struts2的类型转换

一、概述

           在B/S应用中,服务器接收到的用户数据只能是字符串或字符数组,但在服务器端的Java程序中,数据是有各种类型的,如整形、浮点型、日期类型等,以及各种自定义的数据类型。因此,在接收到客户端传过来的字符串数据后,我们还需要将这些数据转换为正确的类型。将字符串请求参数转换为相应的数据类型,是MVC框架提供的功能,而Struts2是很好的MVC框架实现者,理所当然,它也提供了类型转换机制。


        Struts2的类型转换是基于OGNL表达式的,只要我们把HTML输入项(表单元素和其他GET/POET的参数)命名为合法的OGNL表达式,就可以充分利用Struts2的类型转换机制。Struts2本身对基本数据类型带有转换器,同时也提供对java.util.Date类型的转换。日期类型只需在文本输入框中输入类似2010-05-01(注意浏览器的默认语言应该是中文)这样格式的数据,提交后在action中会自动转成java.util.Date类型。


        除此之外,Struts2提供了很好的扩展性,开发者可以非常简单的开发自己的类型转换器,完成字符串和自定义复合类型之间的转换。


        总之,Struts2的类型转换器提供了非常强大的表现层数据处理机制,可以利用其类型转换机制来完成任意的类型转换。



二、实现自定义类型转换器


        需要实现ognl.TypeConverter接口或者继承ognl.DefaultTypeConverter类(该类实现了TypeCoverter接口)

重写convertValue(Map context, Object value, Class toType)方法构建自己的类型转换器,参数context是表示OGNL上下文的Map对象,value是需要类型转换的对象,toType是要转换的目标类型。

       为了简化类型转换器的实现,Struts2提供了org.apache.struts2.util.StrutsTypeConverter抽象类,这个抽象类是DefaultTypeConverter的子类,并提供了两个不同转换方向的方法:

       Object convertFromString(Map context, String[] values, Class toClass);
       参数context是表示action上下文的Map对象,values是需要转换的字符串值,toClass是要转换的目标类型。

       String convertToString(Map context, Object o);
       参数context是表示action上下文的Map对象,o是要转换的对象。



三、注册自定义类型转换器(这一步很重要,通过属性文件,让要被转换的属性和转换器关联起来,才能起到转换作用)


       编写完自定义类型转换器类之后,需要将该类型转换器注册在Web应用中,Struts2框架才可以正常使用该类型转换器。
类型转换器的注册方式,主要有3种:


1、注册局部类型转换器:仅仅对某个Action中的属性生效。(常用


 需提供如下格式的文件
 文件名称:ClassName-conversion.properties【ClassName是需要进行类型转换的Action名称】
 文件内容:多个“propertyName(Action中需要转换的属性名称)= 对应的类型转换器类名(含包名)”项组成
 存放位置:和Action类在同一路径下面。


2、注册全局类型转换器:对所有Action的特定类型的属性都会生效。

 需提供如下格式的文件
 文件名称:xwork-conversion.properties【名称固定,不可改变】
 文件内容:多个“propertyClassName(Action中需要转换的属性的类的全名)= 对应的类型转换器类名(含包名)”项组成
 存放位置:WEB-INF\classes\   也就是src目录下。
 
3、使用注解注册类型转换器:通过注解方式生成类型转换器。
 注解共有6个:TypeConversion、Conversion、Element、Key、KeyProperty、CreateIfNull
 TypeConversion:应用于属性和方法级别。
 Conversion:应用于类型(TYPE)级别,即类、接口或者枚举。
 Element:用于指定Collection或Map中的元素类型,应用于属性和方法级别。
 Key:用于指定Map中的key类型,应用于属性和方法级别。
 KeyProperty:用于索引集合元素的属性名,应用于属性和方法级别。
 CreateIfNull:在指定的集合元素为null时,是否让框架创建它,应用于属性和方法级别。















  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值