对于自定义类型转换类,可以利用struts框架提供的“org.apache.struts2.util.StrutsTypeConverter ”抽象类,它是“ognl.DefaultTypeConverter ”的抽象子类,有两个方法,一个是表单参数转换成属性对应数据类类型的方法,另一个是属性数据类型转换成表单字符串类型。相比于直接继承“ognl.DefaultTypeConverter ”类进行自定义类型转换类,继承StrutsTypeConverter类更加直观,因为它把两个不同转换过程封装成两个不同的方法,而在DefaultTypeConverter 类中,是通过if~~~else~~~进行分类转换,容易出错。
以下是两种不同方式的对比代码,以转换成point(坐标)类型为例:
①通过继承StrutsTypeConverter 类设计自定义的类型转换类
package com.hzp.converter;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
import com.hzp.bean.Point;
public class ConvertPoint2 extends StrutsTypeConverter {
public Object convertFromString(Map map, String[] value, Class toType) {
// 从表单转换成对应属性类型
String[] str = (String[]) value;
String p = str[0];
String[] strPoint = p.split(",");
Point point = new Point();
point.setX(Integer.parseInt(strPoint[0]));
point.setY(Integer.parseInt(strPoint[1]));
return point;
}
public String convertToString(Map map, Object o) {
//从属性对象转化成表单string类型
Point point = (Point) o;
String x = Integer.toString(point.getX());
String y = Integer.toString(point.getY());
String result = "(" + x + "," + y + ")";
return result;
}
}
②直接继承DefaultTypeConverter 类设计自定义类型转化类
package com.hzp.converter;
import java.util.Map;
import com.hzp.bean.Point;
import ognl.DefaultTypeConverter;
public class ConvertPoint extends DefaultTypeConverter {
public Object convertValue(Map context, Object value, Class toType) {
//从表单转换成对应属性类型
if (Point.class == toType) {
String[] str = (String[]) value;
String p = str[0];
String[] strPoint = p.split(",");
Point point = new Point();
point.setX(Integer.parseInt(strPoint[0]));
point.setY(Integer.parseInt(strPoint[1]));
return point;
}
//从对应属性类型转换成字符串给显示页面
else if(String.class == toType) {
Point point = (Point) value;
String x = Integer.toString(point.getX());
String y = Integer.toString(point.getY());
String result = "(" + x + "," + y + ")";
return result;
} else {
return null;
}
}
}