一、转换自定义类的基本方法
1.1 新建2个自定义的类
1.2 新建Action,添加属性
1.3 输入输出页面(JSP)
input.jsp:
output.jsp:
省略标签的导入
1.4 web.xml中配置filter,struts.xml配置action 省略........
2.1 新建转换器,继承ognl.DefaultTypeConverter
2.2 struts2如何调用我们的转换器?
在Action的同目录下建立对应的XxxxAction-conversion.properties XxxxAction的名字对应Action类的名字 ,比如这里为 TestAction-conversion.properties:
#对属性进行转换注册(其实是setter和getter方法)
point =com.test.converter.PointConverter
rectangle =com.test.converter.RectangleConverter
2.3 测试
eg:如果Action中有多个point属性和rectangle属性,则在properties中
添加:
point2 =com.test.converter.PointConverter
point3 =com.test.converter.PointConverter
...
问题:如果有很多Action,这些Action中又有很多需要进行转换的类,岂不是要写很多properties?
二、使用全局的properties
在src目录下建立 xwork-conversion.properties :
com.test.bean.Point =com.test.converter.PointConverter
com.test.bean.Rectangle =com.test.converter.RectangleConverter
注释掉TestAction-conversion.properties (使用 #),运行效果一样
三、转换器继承StrutsTypeConverter
3.1 放弃convertValue方法
3.2 实现方法:
四、集合类型的转换
4.1 Action中:
4.2 转换器中:
4.3 input.jsp页面:
4.4 使用局部的properties,TestAction-conversion.properties
point =com.test.converter.PointConverter
五、不使用转换器进行转换
5.1 使用对象类型的属性:
5.2 修改input.jsp页面,output页面不变
5.3 在Point类中重写toString方法
eg: struts2会通过反射去创建Point类(必须有空的构造方法),然后通过反射调用setter方法赋值;输出页面上会调用实例的toString方法
1.1 新建2个自定义的类
package com.test.bean; /** * 三维点(x,y,z) */ public class Point { private Integer x; private Integer y; private Integer z; // setter和getter }
package com.test.bean; /** * 矩形(height,width) */ public class Rectangle { private Integer height; private Integer width; // setter和getter }
1.2 新建Action,添加属性
public class TestAction extends ActionSupport { private Integer intNumber; //整数 private Float floatNumber; //小数 private Date date; //时间 private Point point; //自定义的点 private Rectangle rectangle; //自定义的矩形 // setter和getter @Override public String execute() throws Exception { return SUCCESS; } }
1.3 输入输出页面(JSP)
input.jsp:
<h3>转换器的使用</h3> <s:form action="test" method="post"> <s:textfield name="intNumber" label="整数" /> <s:textfield name="floatNumber" label="浮点数" /> <s:textfield name="date" label="时间" /> <s:textfield name="point" label="三维坐标(x,y,z)" /> <s:textfield name="rectangle" label="矩形(h,w)" /> <s:submit value="提交" /> </s:form>
output.jsp:
<h3>转换后的结果</h3> 整数:<s:property value="intNumber" /><br> 浮点数:<s:property value="floatNumber" /><br> 时间:<s:property value="date" /><br> 三维点:<s:property value="point" /><br> 矩形:<s:property value="rectangle" />
省略标签的导入
1.4 web.xml中配置filter,struts.xml配置action 省略........
2.1 新建转换器,继承ognl.DefaultTypeConverter
package com.test.converter; public class PointConverter extends DefaultTypeConverter { @Override public Object convertValue(Map context, Object value, Class toType) { if(Point.class==toType){ //目标类型为Point类型 Point point = new Point(); String[] strs = (String[])value; //页面上传过来的是String数字 String[] params = strs[0].split(","); //假设规定以,分隔坐标 Integer x = Integer.valueOf(params[0]); Integer y = Integer.valueOf(params[1]); Integer z = Integer.valueOf(params[2]); point.setX(x); point.setY(y); point.setZ(z); return point; } if(String.class==toType){ //目标类型为String类型 Point point = (Point)value; //将对象以字符串返回 StringBuilder sb = new StringBuilder() .append("[x=").append(point.getX()) .append(",y=").append(point.getY()) .append(",z=").append(point.getZ()).append("]"); return sb.toString(); } return null; } }
package com.test.converter; public class RectangleConverter extends DefaultTypeConverter { @Override public Object convertValue(Map context, Object value, Class toType) { if(Rectangle.class==toType){ //目标类型为Rectangle类型 Rectangle rectangle = new Rectangle(); String[] strs = (String[])value; //页面上传过来的是String数组 String[] params = strs[0].split(","); //假设规定以,分隔高和宽 Integer height = Integer.valueOf(params[0]); Integer width = Integer.valueOf(params[1]); rectangle.setHeight(height); rectangle.setWidth(width); return rectangle; } if(String.class==toType){ Rectangle rectangle = (Rectangle)value; //将对象以字符串返回 StringBuilder sb = new StringBuilder() .append("[heigh=").append(rectangle.getHeight()) .append(",width=").append(rectangle.getWidth()).append("]"); return sb.toString(); } return null; } }
2.2 struts2如何调用我们的转换器?
在Action的同目录下建立对应的XxxxAction-conversion.properties XxxxAction的名字对应Action类的名字 ,比如这里为 TestAction-conversion.properties:
#对属性进行转换注册(其实是setter和getter方法)
point =com.test.converter.PointConverter
rectangle =com.test.converter.RectangleConverter
2.3 测试
eg:如果Action中有多个point属性和rectangle属性,则在properties中
添加:
point2 =com.test.converter.PointConverter
point3 =com.test.converter.PointConverter
...
问题:如果有很多Action,这些Action中又有很多需要进行转换的类,岂不是要写很多properties?
二、使用全局的properties
在src目录下建立 xwork-conversion.properties :
com.test.bean.Point =com.test.converter.PointConverter
com.test.bean.Rectangle =com.test.converter.RectangleConverter
注释掉TestAction-conversion.properties (使用 #),运行效果一样
三、转换器继承StrutsTypeConverter
3.1 放弃convertValue方法
3.2 实现方法:
public Object convertFromString(Map map, String[] strs, Class toType) { // 直接把String数组 转换成 toType类型 } public String convertToString(Map map, Object obj) { // 直接把 obj 转换成 String类型 }
四、集合类型的转换
4.1 Action中:
package com.test.action; public class TestAction extends ActionSupport { private Integer intNumber; //整数 private Float floatNumber; //小数 private Date date; //时间 private List<Point> point; //自定义的点集合 private Rectangle rectangle; //自定义的矩形 // setter和getter @Override public String execute() throws Exception { return SUCCESS; } }
4.2 转换器中:
package com.test.converter; public class PointConverter extends StrutsTypeConverter { public Object convertFromString(Map map, String[] strs, Class toType) { Point point = null; List<Point> list = new ArrayList<Point>(); for (int i = 0; i < strs.length; i++) { point = new Point(); String[] params = strs[i].split(","); Integer x = Integer.valueOf(params[0]); Integer y = Integer.valueOf(params[1]); Integer z = Integer.valueOf(params[2]); point.setX(x); point.setY(y); point.setZ(z); list.add(point); } return list; } public String convertToString(Map map, Object obj) { List<Point> list = (List<Point>)obj; Point point = null; StringBuilder sb = new StringBuilder().append("["); for (int i = 0; i < list.size(); i++) { point = list.get(i); sb.append(i+1).append(" x=").append(point.getX()) .append(",y=").append(point.getY()) .append(",z=").append(point.getZ()); } sb.append(" ]").toString(); //System.out.println(sb); return sb.toString(); } }
4.3 input.jsp页面:
<s:textfield name="point" label="三维坐标(x,y,z)" /> <s:textfield name="point" label="三维坐标(x,y,z)" /> <s:textfield name="point" label="三维坐标(x,y,z)" />
4.4 使用局部的properties,TestAction-conversion.properties
point =com.test.converter.PointConverter
五、不使用转换器进行转换
5.1 使用对象类型的属性:
private Point point;
5.2 修改input.jsp页面,output页面不变
<s:textfield name="point.x" label="x" /> <s:textfield name="point.y" label="y" /> <s:textfield name="point.z" label="z" />
5.3 在Point类中重写toString方法
public String toString(){ StringBuilder sb = new StringBuilder() .append("[x=").append(x).append(",y=").append(y).append(",z=").append(z).append("]"); return sb.toString(); }
eg: struts2会通过反射去创建Point类(必须有空的构造方法),然后通过反射调用setter方法赋值;输出页面上会调用实例的toString方法