在servlet中,如果表单提交非字符串数据时,需要进行类型转化,如:提交age
String strAge=req.getparameter("age");
int age=0;
if(strAge!=null){
age=Integer.parseInt(strAge);
}
在Struts2中,常见的数据类型struts2已经自动进行了类型转化。无需程序员手动转化。
在某些情况下,有自定义的类型时候,struts2不能完成自动类型转化,那么需要手动转化,如果该自定义类型使用的频率较高,手动转化重复代码就会增多——使用Struts2提供的类型转换器来进行类型转化。
案例 比如坐标点(x,y)
原来的处理方式
jsp页面
<body>
<form action="point.action" method="post">
x:<input type="text" name="point.x"/><br>
y:<input type="text" name="point.y"/><br>
<input type="submit" value="提交">
</form>
</body>
Action代码
package cn.sxt.action;
import com.opensymphony.xwork2.Action;
import cn.sxt.entity.Point;
public class PointAction {
private Point point;
public String execute(){
System.out.println(point.getX()+"-----------"+point.getY());
return Action.SUCCESS;
}
public Point getPoint() {
return point;
}
public void setPoint(Point point) {
this.point = point;
}
}
struts.xml
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="point" class="cn.sxt.action.PointAction">
<result>/index.jsp</result>
</action>
</package>
</struts>
返回页面
<body>
x:<s:property value="point.x"/><br>
y:<s:property value="point.y"/><br>
</body>
这种方式虽然可以,但是不符合数学的表示形式,所以采用类型转化的处理
使用类型转化的步骤:
(1)编写类型转化器——继承StrutsTypeConverter类
(2)编写xwork-conversion.properties的配置文件,放于src下,内容为
要转化的类型=类型转化器
改进后的坐标案例(直接在前台输入坐标的数学表示形式)
jsp表单页面
<body>
<form action="point.action" method="post">
点:<input type="text" name="point"/><br>
<input type="submit" value="提交">
</form>
</body>
编写类型转化器
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
import cn.sxt.entity.Point;
public class PointConverter extends StrutsTypeConverter{
//将表单提交的字符串数据转化为指定的自定义类型
//context是ActionContext
//values是要进行类型转化的数组
//toclass被转化的类型
@Override
public Object convertFromString(Map context, String[] values, Class toclass) {
String value=values[0];
Point point=new Point();
String x=value.substring(1, value.indexOf(","));
String y=value.substring(value.indexOf(",")+1,value.length()-1);
point.setX(Integer.parseInt(x));
point.setY(Integer.parseInt(y));
return point;
}
//将自定义类型转化为字符串在前台页面显示————通过OGNL表达式将会使用该方法进行转化
//context是ActionContext
//o是要转化的对象
@Override
public String convertToString(Map context, Object o) {
Point point=(Point)o;
return "("+point.getX()+","+point.getY()+")";
}
}
xwork-conversion.properties配置文件(在src下)
要转化的类型=类型转化器
cn.sxt.entity.Point=cn.sxt.converter.PointConverter
显示页面
<body>
x:<s:property value="point.x"/><br>
y:<s:property value="point.y"/><br>
点:<s:property value="point"/>
</body>
测试