对于页面提交的数据,对基本类型的数据,struts2提供了转换操作,但要是我们如果想将页面提交的数据转换为自定义的类对象,那么我们就需要创建自定义converter。
- extends StrutsTypeConverter
- extends DefaultTypeConverter
下面的实现第一种方法,即继承 StrutsTypeConverter 类,模拟情景是,前端提交的数据是点坐标,形如(x,y),后台要将其转化为点对象
1.编写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;
}
@Override
public String toString() {
return "Point{" +
"x=" + x +
", y=" + y +
'}';
}
}
2.编写PointAction处理类
public class PointAction {
private Point point;
public String execute(){
System.out.println("x = "+point.getX()+", y = "+point.getY());
return Action.SUCCESS;
}
public Point getPoint() {
return point;
}
public void setPoint(Point point) {
this.point = point;
}
}
4.编写获取点数据的JSP页面
<form action="point.action" method="post">
input point(x, y): <input type="text" name="point"/>
<input type="submit" value="submit"/>
</form>
5.配置struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="point" class="com.action.PointAction">
<result>/index.jsp</result>
</action>
</package>
</struts>
至此,如果point的类型是基本数据类型,如int,String等那么后台是能获取得到,但point是自定义的类型,所以我们要编写自定义的converter。
6.编写自定义converter
public class PointConverter extends StrutsTypeConverter {
/**
* @param map the action context
* @param strings the String values to be converted, such as those submitted from html
* @param aClass the class to convert to
* @return the converted object
*/
@Override
public Object convertFromString(Map map, String[] strings, Class aClass) {
String value = strings[0]; //(2, 3);
Point point = new Point();
point.setX(Integer.parseInt(value.substring(1,value.indexOf(','))));
point.setY(Integer.parseInt(value.substring(value.indexOf(',')+1, value.length()-1)));
return point;
}
/**
* @param map the action context
* @param o the object to be converted
* @return the converted String
*/
@Override
public String convertToString(Map map, Object o) {
return ((Point)o).toString();
}
}
继承StrutsTypeConverter,重写convertFromString( Map map, String[] strings, Class aClass ) 和 convertToString( Map map, Object o) 方法,具体参数信息已经在代码注释中说明。convertFromString 方法在处理前端提交的特定类型数据时会调用,而 convertToString 在前端页面要显示特定类型数据时会调用。
7.注册自定义converter
不写个配置文件告知系统你写了个自定义converter,系统为什么会知道呢。
配置文件命名为 xwork-conversion.properties ,与struts.xml文件一样,位于src目录下。
#be converted type = converter
com.pojo.Point = com.converter.PointConverter
即形如 要处理的类 = 对应的转换器