Struts2的类型转换是基于XWork的,实际上是基于OGNL的,它是一种强大的表达式语言
Struts2主要是通过实现OGNL类中的TypeConverter接口的方式,来完成类型转换
而该接口比较复杂,它只是描述了最通用的一种情况,所以通常都不会直接实现该接口
OGNL本身又提供了一个实现了TypeConverter接口的类,即DefaultTypeConverter类
我们的类直接继承DefaultTypeConverter类,然后重写它的convertValue()方法即可
DefaultTypeConverter类提供了两个convertValue()方法
convertValue(Map context, Object target, Member member,String propertyName, Object value, Class toType)
convertValue(Map context, Object value, Class toType)
其中第二个方法是对第一个方法的一种简化,我们只需要重写第二个比较简便的方法就可以了
而Struts2本身也是通过对convertValue()方法的重写,来实现数据的类型转换的
参数Map类型的context代表应用的上下文。这个参数暂时还用不上
参数Object类型的value代表需要进行类型转换的值
参数Class类型的toType代表所要转换成的目标类型
通常有两种情况的类型转换。第一种情况是从客户端的字符串到自定义类型的转换
第二种情况是在页面中输出内容的时候,从自定义类型到String的一个转换
故toType决定了到底是从String到自定义类型的转换,还是从自定义类型到String的转换
所以这里的toType分为两种情况,也就需要在convertValue()方法中对toType进行判断
Struts2也内置了一个简化的类型转换,即org.apache.struts2.util.StrutsTypeConverter类
它是一个抽象类,它继承了ognl.DefaultTypeConverter类
它有一个converFromString(Map context, String[] values, Class toClass)方法
用来将字符串类型转换为一个对象类型,所以它的返回值为Object类型
还有一个converToString(Map context,Object o)方法,用来将对象类型转换为String类型
而实际项目开发中的自定义数据类型转换,也是通过继承StrutsTypeConverter类实现的
定义PointAction-conversion.properties属性文件
该文件用于指定对PointAction的属性进行类型转换的属性文件,它应与Action位于同包中
在定义该属性文件时, -conversion.properties 是固定的,然后在其前面指定具体的Action
然后在PointAction-conversion.properties指定对PointAction中的哪个属性进行类型转换
比如在该属性文件中增加该行代码point=com.jadyer.converter.PointConverter
这样Struts2就知道,我们是要使用PointConverter类对PointAction中的point属性进行转换
若需要对PointAction的多个属性进行转换,那么就在该属性文件中添加多行类似代码即可
Struts2的全局类型转换的属性文件
Struts2的全局类型转换的属性文件的文件名是固定的,即xwork-conversion.properties
该文件在整个应用中只能出现一个,并且它必须与struts.xml位于相同的目录下
它配置的内容例如com.jadyer.bean.Point = com.jadyer.converter.PointConverter
即指明整个应用的所有的Point类型的变量都使用PointConverter转换器进行转换
类型转换的具体流程
客户端提交表单之后,首先会到struts.xml中查找是否存在名为pointConverter的<action/>
找到了之后,就知道是由PointAction类的一个对象来处理我们的请求< br /> 此时流程就转到了PointAction中了,生成了PointAction的一个实例
当这个实例生成之后,它首先会根据提交过来的表单中的name属性来得到个输入域的值
然后把这些值一一的调用setter()方法赋给PointAction中的每一个属性
若它检查到没有定义自定义类型转换的属性文件时,便按照自己的默认行为进行类型转换
对于int、String、Date等,Struts2都会自动完成类型转换,但对象类型,则须手工转换
即如果它发现存在一个PointAction-conversion.properties文件的话
它就会到该文件中查找,是对PointAction中的哪个属性进行转换,以及对应的转换类
然后流程便切换到转换类中,按照转换类中的代码进行自定义的转换
最后将返回的值赋给PointAction中的该属性
当为PointAction的所有属性赋好值后,便执行execute()方法,于是转到了output.jsp中
接着就会调用<s:property/>中的value值所对应的getter()方法获取参数值
但是当进行point属性输出的时候,它又会去检查有没有对应point的自定义类型转换
结果发现有,则流程转到PointConverter中,最后将其返回值输出到<s:property/>的位置