旅行的意义

 

struts2类型转换

概说
许多时候struts能很好的将页面上field中的字符输入和POJO类中的属性对应起来并自动转换(比如整型、日期等等),但如果遇到一些自定义复杂业务类型,就需要我们显式的提供转换处理。

struts2中实现类型转换的接口为

 

interface com.opensymphony.xwork2.conversion.TypeConverter

 

其中定义的方法为

 

Object convertValue(Map<String,Object> context, Object target, Member member, String propertyName, Object value, Class toType)

 

 

为了方便使用,struts2提供了两个实现

(1) com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter

我们只需要override其中的

Object convertValue(Map<String,Object> context, Object value, Class toType) 方法即可。

toType为将要转换为的类型

 

(2)更方便的解决办法是继承抽象类

org.apache.struts2.util.StrutsTypeConverter

它继承了上面的类,并提供了两个抽象函数

 

abstract  Object convertFromString(Map context, String[] values, Class toClass)

abstract
  String convertToString(Map context, Object o)

 

因为平时最常用的就是特定类型与String类的互转,所以在一般情况下实现这两个方法已经足够了。

 

 下面简单说一下转换原理。在JSP中的s:textfield提交后到Action的同时也将调用Action的set方法赋值,如果此时Action中定义了POJO类,则struts2会自动试图寻找该类和String[]之间的转换方法。他回到如下两个地方寻找:

(1)WEB-INF下的 xwork-conversion.properties

某个字段=转换该字段的类

如:point1=PointConverter

(2)与XXXAction所在同一级目录下的XXXAction-conversion.properties

某个要转换的类=转换该类的类

如:Point=PointConverter

如果同时配置的话,(2)具有更高的优先级。

几个需要记住的几个地方再写一下:
class DefaultTypeConverter                     struts2中类型转换的基类 

class StrutsTypeConverter                        struts2提供的一个更方便的实现

xwork-conversion.properties                    全局转换属性文件名

XXXAction-conversion.properties            基于特定Action的转换属性文件名

 



集合及部分自动转换

集合的话,最好用范型指定转换类的类型,否则Struts会找不到

List<ClassA>

 

部分自动转换是指页面上可以直接写类似于ClassA.A,ClassA.B 这样的field,

程序会自动寻找Action中的setClassA方法,同时寻找ClassA中的setA和setB方法从而赋值。
但是好像实际使用的时候用的并不多,因为这样事实上直接将POJO的细节透露给表示层。

posted on 2009-01-25 17:20 bacon 阅读(2711) 评论(0)  编辑  收藏 所属分类: J2EE


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

文章分类

搜索

最新评论

阅读排行榜

评论排行榜