一.转换类型时,需要写的类型转换程序
1.struts2的类型转换时依赖于ognl实现的
2.struts2的类型转换可实现接口ognl.TypeConverter,但是一般都是继承ognl.DefaultTypeConverter或者org.apache.struts2.util.StrutsTypeConverter来实现类型转换
3.其实看源代码就知道,三者的关系其实是ognl.DefaultTypeConverter实现了ognl.TypeConverter接口,而org.apache.struts2.util.StrutsTypeConverter却是继承了ognl.DefaultTypeConverter类.所以一般我们使用的都是已经封装好了的org.apache.struts2.util.StrutsTypeConverter类来实现类型转换
例1:
Code
import java.util.Map;
import ognl.DefaultTypeConverter;
import com.test.bean.Point;
/**
* 例:实现表单数据和Point类的类型转换,其中Point类是一个坐标的Bean类,只有2个属性x和y,另,表单数据必定是字符串
*
* @author *
*/
public class PointConverter extends DefaultTypeConverter {
/**
* 继承的方法
*
* @param context
* 上下文的内容
* @param value
* 需要类型转换的值,如果是从表单提交的值,则是String[]类型
* @param toType
* 转换后的类型
* @return 返回一个toType类型的对象
*/
@Override
public Object convertValue(Map context, Object value, Class toType) {
if (Point.class == toType) {
Point point = new Point(); // 这里假设Point是一个坐标类的Bean,只有2个属性x和y
String[] str = (String[]) value; // 因为已经判断Point.class == toType,则value必定是从表单提交的值
String[] paramValues = str[0].split(",");
int x = Integer.parseInt(paramValues[0]);
int y = Integer.parseInt(paramValues[1]);
point.setX(x);
point.setY(y);
return point;
}
if (String.class == toType) {
Point point = (Point) value; // 因为String.class == toType,则传入的参数必定是Point类型
int x = point.getX();
int y = point.getY();
String result = "[x=" + x + " , y=" + y + "]";
return result;
}
return null;
}
}
例2:没啥好注释的,看了例1就明白了,只不过把例1里面的2个判断拆开成2个函数了
Code
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
import com.test.bean.Point;
/**
* @author Administrator
*
*/
public class PointConverter2 extends StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
Point point = new Point();
String[] paramValues = values[0].split(",");
int x = Integer.parseInt(paramValues[0]);
int y = Integer.parseInt(paramValues[1]);
point.setX(x);
point.setY(y);
return point;
}
@Override
public String convertToString(Map context, Object o) {
Point point = (Point) o;
int x = point.getX();
int y = point.getY();
String result = "[ x = " + x + " , y = " + y + " ]";
return result;
}
}
例3:也没啥好说的,就是把例2里面的那个表单输入框改成多个了(于是value就变成真的数组了)
Code
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
import com.test.bean.Point;
public class PointConverter3 extends StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
List<Point> list = new ArrayList<Point>();
for (String value : values) {
Point point = new Point();
String[] paramValues = value.split(",");
int x = Integer.parseInt(paramValues[0]);
int y = Integer.parseInt(paramValues[1]);
point.setX(x);
point.setY(y);
list.add(point);
}
return list;
}
@Override
public String convertToString(Map context, Object o) {
List<Point> list = (List<Point>) o;
StringBuilder sb = new StringBuilder();
sb.append("[ ");
int number = 0;
for (Point point : list) {
++number;
int x = point.getX();
int y = point.getY();
sb.append(number).append(" x = ").append(x).append(" , y = ").append(y).append(" ");
}
sb.append("]");
return sb.toString();
}
}
二.类型转换需配置文件(.properties文件)
1.配置文件有两种,一种是单独对某个Action进行配置,另一种是全局配置
2.单独对某个Action进行配置,配置文件和Action放在同一目录下,而且配置文件的文件名固定为 Action文件名-conversion.properties
其中,properties文件内容格式为 属性名=类型转换的类名(即是类型转换程序)
3.全局的配置放在src根目录下,文件名固定为 xwork-conversion.properties
其中,properties文件内容格式为 需要全局转换的属性的类名=类型转换的类名(即是类型转换程序)
例1:单独对某个Action进行配置
PointAction-conversion.properties
point=com.test.converter.PointConverter
例2:对全局的类型转换进行配置
xwork-conversion.properties
com.test.bean.Point=com.test.converter.PointConverter2
注* 里面的例子来自浪 曦