概说
许多时候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的细节透露给表示层。