struts2自定义类型转换器
有两种方法:
1、Struts2的类型转换器是基于OGNL实现的。在OGNL类库中有个TypeConvert类,是个接口,代码如下:
package ognl;
import java.lang.reflect.Member;
import java.util.Map;
public interface TypeConverter
{
public Object convertValue(Map context, Object target, Member member, String propertyName, Object value, Class toType);
}
此接口有一个实现类DefaultTypeConverter :
package ognl;
import java.lang.reflect.Member;
import java.util.Map;
/**
* Default type conversion. Converts among numeric types and also strings.
* @author Luke Blanshard (blanshlu@netscape.net)
* @author Drew Davidson (drew@ognl.org)
*/
public class DefaultTypeConverter implements TypeConverter
{
public DefaultTypeConverter()
{
super();
}
public Object convertValue(Map context, Object value, Class toType)
{
return OgnlOps.convertValue(value, toType);
}
public Object convertValue(Map context, Object target, Member member, String propertyName, Object value, Class toType)
{
return convertValue(context, value, toType);
}
}
要实现自定义类型转换器只要继承该类就可实现,下面以Point类为例进行说明:
public class Point {
private int x;
private int y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
---------以下是实现类------------
import java.util.Map;
import ognl.DefaultTypeConverter;
import com.sanqing.bean.Point;
public class PointConverter extends DefaultTypeConverter {
public Object convertValue(Map context, Object value, Class toType) {
if(Point.class == toType) {//首先判断如果要转换的类型是否为Point
String[] paramStrs = (String[])value;//将请求参数值转换成String数组
String[] pointArray = paramStrs[0].split(",");//通过逗号分隔字符串
Point point = new Point();//新建一个Point实例
point.setX(Integer.parseInt(pointArray[0]));//设置x坐标
point.setY(Integer.parseInt(pointArray[1]));//设置y坐标
return point;//返回转换后的Point实例
}
if(String.class == toType) {//如果要转换的类型为String
Point point = (Point)value;//通过强制转换把value转换成Point实例
int x = point.getX();//获得x坐标
int y = point.getY();//获得y坐标
StringBuilder sb = new StringBuilder();//实例化一个StringBuilder用来构造字符串
sb.append("x坐标为").append(x).append(",y坐标为").append("y");//构造字符串
return sb.toString();//返回StringBuilder的字符串形式
}
return null;
}
}
注意:在自定义类型转换器时必须对totype参数进行判断,从而决定是从字符串类型转换成其他类型还是从其他类型转换成字符串类型。
2、Struts 2提供了一个StrutsTypeConverter抽象类,开发时可以继承这个类,StrutsTypeConverter重写了DefaultTypeConverter。我们只需重写其中的converterFromString和converterToString这两个抽象方法即可。如下例:

建议:在开发时采用第二种方法,比较好用。
注册类型转换器:
1.局部类型转换器
在相应的action目录下新建一个资源文件,文件名格式如下:ActionName-conversion.properties,其中actionName表示需要转换的action的类名,-conversion.properties是固定格式 。内容是一个键值对,格式是:propertyName=ConverterName,propertyName用来指定需要 转换的属性,ConverterName用来指定自定义类型转换器名称。
举例说明:
业务控制器action:

添加一个名为PointAction-conversion.properties的资源文件,文件中写如下代码:point=converter.PointConverter2


jsp如下:

输出jsp:

2 、全局类型转换器
要实现全局类型转换器必须提供一个xwork-conversion.properties文件,该文件必须保存在classes目录下,文件名格式如下:
ClassName=ConverterName, className用来指定需要类型转换的类名,ConverterName 用来指定自定义类型转换器的类名。
以上的例子用全局类型的话文件代码如下:org.tarena.entity.Point=converter.PointConverter2
这样对于所有的Point类型属性都能起作用了。



浙公网安备 33010602011771号