Struts2---->类型转换
类型转换
一、基本类型的转换器
struts2中已经实现,不需要实现
l预定义类型,例如int、boolean、double等;
l日期类型,使用当前区域(Locale)的短格式转换,即DateFormat.getInstance(DateFormat.SHORT);
l集合(Collection)类型,将request.getParameterValues(String arg)返回的字符串数据与java.util.Collection转换;
l集合(Set)类型,与List的转换相似,去掉相同的值;
l数组(Array)类型,将字符串数组的每一个元素转换成特定的类型,并组成一个数组。
date=1989-09-11
array[0]=1&array[1]=2
list=learn&interests=swim
map['key']=value&map['key2']=value2
二、自定义转换器
方法1、继承至struts2中的StrutsTypeConverter
这个类是struts2提供的一个DefaultTypeConverter的子类,与DefaultTypeConverter不同的是,他们把字符串到对象和对象到字符串的转换分开了,形成了2个方法,另外提供了一个叫performFallbackConversion的方法,用于处理转换异常时的情况。
public abstract Object convertFromString(Map context,String[] values,Class toClass)
context转换的action上下文对象集
values要装换的数据,是一个数组,一般取第一个元素就行了
toClass目标类型
这个方法完成字符串到对象的转换,在调用Action的setter方法之前调用
public abstract String convertToString(Map context,Object o)
o,待转换的对象
返回转换完成的对象
这个方法完成对象到String的转换
方法2:实现ognl. TypeConverter接口,或者继承ognl.DefaultTypeConverter
实现的方法:
Object convertValue(Map context, Object value, Class toType)
context是发生转换的Action上下文对象集
value是待转换的数据,其实是一个字符串数组(由request.getParameterValues()传递过来),所以在使用之前一定要线转换成String[]
toType 转换目标类型,是一个Class对象
Return:Object返回值,就是转换完成后的对象。
三、注册自定义转换器
全局转换器的注册:在项目的classpath下新建一个xwork-conversion.properties文件,然后在文件中使用转换的类型=转换器的形式进行注册,如:java.Util.Date=com.res.DateConverter,表示,凡是遇到java.Util.Date类型的属性都使用DateConverter来进行转换,该文件可以注册多个转换器,全部都是全局转换器,1行1个。
局部转换器的注册:如果注册局部转换器的话,需要新建一个actionName-conversion.properties,同时注意,要放到跟Action相同的目录下。然后文件内容也不一样了。这个文件里是指定Action中的某个属性使用某个转换器,格式是属性名=转换器名,如date= com.res.DateConverter,可以由很多,也就是每一个属性都可以设置一个转换器
四、例子
1、要转换的类
package com.test.bean;
/**
* 三维点(x,y,z)
*/
public class Point {
private Integer x;
private Integer y;
private Integer z;
// setter和getter
}
2、转换类实现方法1,继承ognl.DefaultTypeConverter
package com.test.converter; public class PointConverter extends DefaultTypeConverter { @Override public Object convertValue(Map context, Object value, Class toType) { if(Point.class==toType){ //目标类型为Point类型 Point point = new Point(); String[] strs = (String[])value; //页面上传过来的是String数字 String[] params = strs[0].split(","); //假设规定以,分隔坐标 Integer x = Integer.valueOf(params[0]); Integer y = Integer.valueOf(params[1]); Integer z = Integer.valueOf(params[2]); point.setX(x); point.setY(y); point.setZ(z); return point; } if(String.class==toType){ //目标类型为String类型 Point point = (Point)value; //将对象以字符串返回 StringBuilder sb = new StringBuilder() .append("[x=").append(point.getX()) .append(",y=").append(point.getY()) .append(",z=").append(point.getZ()).append("]"); return sb.toString(); } return null; } }
实现方法2:继承至struts2中的StrutsTypeConverter
package com.test.converter; public class PointConverter extends StrutsTypeConverter { public Object convertFromString(Map map, String[] strs, Class toType) { Point point = null; List<Point> list = new ArrayList<Point>(); for (int i = 0; i < strs.length; i++) { point = new Point(); String[] params = strs[i].split(","); Integer x = Integer.valueOf(params[0]); Integer y = Integer.valueOf(params[1]); Integer z = Integer.valueOf(params[2]); point.setX(x); point.setY(y); point.setZ(z); list.add(point); } return list; } public String convertToString(Map map, Object obj) { List<Point> list = (List<Point>)obj; Point point = null; StringBuilder sb = new StringBuilder().append("["); for (int i = 0; i < list.size(); i++) { point = list.get(i); sb.append(i+1).append(" x=").append(point.getX()) .append(",y=").append(point.getY()) .append(",z=").append(point.getZ()); } sb.append(" ]").toString(); //System.out.println(sb); return sb.toString(); } }
3、注册
注册方法1 TestAction-conversion.properties:
point=com.test.converter.PointConverter
如果Action中有多个point属性和rectangle属性,则在properties中添加:
point2=com.test.converter.PointConverter
point3=com.test.converter.PointConverter
注册方法2:在src目录下建立 xwork-conversion.properties:
com.test.bean.Point=com.test.converter.PointConverter