类型转换我们在之前的开发中多多少少已经用到了。前台页面中传递到后台的信息是以字符串的形式,而在后台中Java是强类型的语言,因此需要进行类型转换。
Struts2是MVC框架的良好实现,故其内部提供了这种类型的转换机制。当参数传入框架,通过param拦截器将传进来的值映射成属性并完成数据类型转换,同时把值放在ValueStack中,最后在页面中可以通过<s:property />取得值栈中的值。
一般来说,int、float、double、date、list、set、map往往都可以通过其内建的转换器完成类型转换。
Struts2提供了简单的方法使得我们可以自建转换器。
首先是自己的转换器:(举例)
public class RectangleConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Object value, Class toType) {
// TODO Auto-generated method stub
if (toType == Point.class) {
Point r = new Point();
String[] tmp2 = (String[]) value;
String[] tmp = tmp2[0].split(","); //只提取第一个提交的值
r.x = Integer.parseInt(tmp[0]);
r.y = Integer.parseInt(tmp[1]);
return r;
}
if (toType == String.class) {
return value.toString();
}
return super.convertValue(value, toType);
}
}
当需要转换为Point类时,且此时的传入参数格式不符合Struts2自身的转换规则的话(比如在此处用“r=3,2”),会进入这个转换器。
首先将value转换为一个字符串数组(debug发现,一传入value就是一个字符串数组),之后读取传入的字符串“3,2”并利用split分割为两部分,分别赋值给x,y创建一个新的point对象并返回。
需要注意的是,这里仅仅需要convertValue方法的覆写,具体的转换规则完全是自己写的,不必拘泥于此例。
之后注册转换器:
①注册局部转换器:
在用到该转换器的action的同包下创建“action名-conversion.properties”文件
对象名 = 转换器类全名
user.r=cn.wqy.converter.RectangleConverter
需要注意的时,在这里的“user.r”一定不能掉!因为在工程中我已经将user包装成了一个类,在action中只有user对象的getter、setter方法,jsp页面中也是赋值给“user.r”,因此这里一定要注意!
②创建全局转换器:
在src文件夹下创建“xwork-conversion.properties”文件
对象所属类全名 = 转换器类全名
java.awt.Point=cn.wqy.converter.RectangleConverter