Struts2类型转换 Seangao
Struts2中会默认可以直接转化已有的数据类型,如int,String,Date等类型,但对于自定义的类型需要人工进行处理转化。以简单的自定义Point类为例,在页面中输入并进行相应的转化后输出。
<s:form action ="pointCon">
<s:textfield name="point" label="point"></s:textfield>
<s:textfield name="age" label="age"></s:textfield>
<s:textfield name="username" label="username"></s:textfield>
<s:textfield name="date" label="birthday"></s:textfield>
<s:submit label="submit"></s:submit>
</s:form>
Struts表单中提交point类型的数据,需要为其指定相应的转化方法
自定义一个转化类,从ognl中默认的类型转化类继承而来
public class PointConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map context, Object value, Class toType) {
//一个表单中,可以有多个同名的field,value为字符串数组,可接收所有的参数
//当客户端向服务器端进行提交,需要转化为point类型
if(Point.class==toType)
{
String[] str=(String[])value;
String[] params=str[0].split(",");
int x=Integer.parseInt(params[0]);
int y=Integer.parseInt(params[1]);
Point point=new Point();
point.setX(x);
point.setY(y);
return point;
}
//服务器端需要向客户端返回结果,转化为string类型
if(String.class==toType)
{ Point point =(Point)value;
int x=point.getX();
int y=point.getY();
String result="x= "+x+" ;y= "+y;
return result;
}
return null;
}
并在处理此form表单的Action文件下新建文件 【[Action文件名]-Conversion.properties】文件,写入配置信息point=com.test.converter.PointConverter,此时就将等号前的类型按照等号后的转化文件中的方法进行处理与转化。
以上所述为局部配置的转化方法,struts2提供了另外一种全局的转化方法,在src文件目录下新建【xwork-conversion.properties】文件,此文件名固定,同样也写入相应的配置信息,但需注意一点,需指出该类的所在位置,一个示例的配置信息如下:
com.test.bean.Point=com.test.converter.PointConverter2
同样的,可以得到一样的效果
另外,可以不用自己构造类型转化的方法而直接由struts默认提供的类继承而来,范例如下:
public class PointConverter2 extends StrutsTypeConverter {
@Override
public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
Point point=new Point();
String[] params=arg1[0].split(",");
int x=Integer.parseInt(params[0]);
int y=Integer.parseInt(params[1]);
point.setX(x);
point.setY(y);
return point;
}
@Override
public String convertToString(Map arg0, Object arg1) {
Point point=(Point)arg1;
int x=point.getX();
int y=point.getY();
String result="[x= "+x+" ,y= "+y+" ]";
return result;
}
}
从StrutsTypeConverter类中继承,只需实现上述两个抽象方法,从字符串转化为相应类型或者从相应类型转化为字符串。
引入泛型支持后,可通过范围接收标签一样的输入,
<s:textfield name="point" label="point"></s:textfield>
<s:textfield name="point" label="point2"></s:textfield>
<s:textfield name="point" label="point3"></s:textfield>
接收到的point将成为String数组,将其读取后存进List当中
List<Point> list=new ArrayList<Point>();
for(String value:arg1)
{
Point point=new Point();
String[] params=value.split(",");
int x=Integer.parseInt(params[0]);
int y=Integer.parseInt(params[1]);
point.setX(x);
point.setY(y);
list.add(point);
}
return list;
显示方法也是相同。
另外,struts支持另外一种对类的直接赋值,
<s:textfield name="point.x" label="point"></s:textfield>
<s:textfield name="point.y" label="point"></s:textfield>
此时不用配置任何文件,struts会默认地将x,y的值传到point当中构造出相应的Point类,但是此方法对类有一要求,即该类要有默认的构造函数,否则将会失败。在输出显示的时候,要重写该类的toString()方法,否则输出的是实例,而不是按自己要求的输出。