Struts2学习笔记2

xiaoxiao2026-08-31  22

[size=large][b]一、转换自定义类的基本方法[/b][/size] [b]1.1 新建2个自定义的类[/b] 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} [b]1.2 新建Action,添加属性[/b] 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) [b][i]input.jsp:[/i][/b] <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> [b][i]output.jsp:[/i][/b] <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" /> 省略标签的导入 [b]1.4 web.xml中配置filter,struts.xml配置action 省略........[/b] [b]2.1 新建转换器,继承ognl.DefaultTypeConverter[/b] 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; } } [b]2.2 struts2如何调用我们的转换器?[/b] [b][color=darkred]在Action的同目录下建立对应的XxxxAction-conversion.properties XxxxAction的名字对应Action类的名字[/color][/b],比如这里为 TestAction-conversion.properties: #对属性进行转换注册(其实是setter和getter方法) [color=blue]point[/color]=com.test.converter.PointConverter [color=blue]rectangle[/color]=com.test.converter.RectangleConverter 2.3 测试 [img]http://i.namipan.com/files/60d955c7a9e59a705dbf8f5b785f6373cd9bf26c7d3e00000a45/0/1.jpg[/img] [img]http://i.namipan.com/files/199fa48010d5d5c6f0c252fba2965b28a59c37bc463300003d33/0/2.jpg[/img] eg:如果Action中有多个point属性和rectangle属性,则在properties中 添加: [color=blue]point2[/color]=com.test.converter.PointConverter [color=blue]point3[/color]=com.test.converter.PointConverter ... [color=brown]问题:如果有很多Action,这些Action中又有很多需要进行转换的类,岂不是要写很多properties?[/color] [size=large][b]二、使用全局的properties[/b][/size] 在src目录下建立 [b]xwork-conversion.properties [/b]: [color=blue]com.test.bean.Point[/color]=com.test.converter.PointConverter [color=blue]com.test.bean.Rectangle[/color]=com.test.converter.RectangleConverter 注释掉TestAction-conversion.properties (使用 #),运行效果一样 [size=large][b]三、转换器继承StrutsTypeConverter[/b][/size] [b]3.1 放弃convertValue方法[/b] [b]3.2 实现方法:[/b] public Object convertFromString(Map map, String[] strs, Class toType) { // 直接把String数组 转换成 toType类型}public String convertToString(Map map, Object obj) { // 直接把 obj 转换成 String类型} [size=large][b]四、集合类型的转换[/b][/size] [b]4.1 Action中:[/b] 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; }} [b]4.2 转换器中:[/b] 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(); } } [b]4.3 input.jsp页面:[/b] <s:textfield name="point" label="三维坐标(x,y,z)" /><s:textfield name="point" label="三维坐标(x,y,z)" /><s:textfield name="point" label="三维坐标(x,y,z)" /> [b]4.4 使用局部的properties,TestAction-conversion.properties[/b] [color=blue]point[/color]=com.test.converter.PointConverter [img]http://i.namipan.com/files/e8b869bbc7af45098f59d3f6542b2e4cd889f8a1085d000055d0/0/3.jpg[/img] [img]http://i.namipan.com/files/5c5cc13117ecc4f60d097ac456614c3763fb625fe63800005cc5/0/4.jpg[/img] [size=large][b]五、不使用转换器进行转换[/b][/size] [b]5.1 使用对象类型的属性:[/b] private Point point; [b]5.2 修改input.jsp页面,output页面不变[/b] <s:textfield name="point.x" label="x" /><s:textfield name="point.y" label="y" /><s:textfield name="point.z" label="z" /> [b]5.3 在Point类中重写toString方法[/b] public String toString(){ StringBuilder sb = new StringBuilder() .append("[x=").append(x).append(",y=").append(y).append(",z=").append(z).append("]"); return sb.toString(); } [size=small] [b]eg: struts2会通过反射去创建Point类(必须有空的构造方法),然后通过反射调用setter方法赋值;输出页面上会调用实例的toString方法[/b][/size]
转载请注明原文地址: https://www.6miu.com/read-5052164.html

最新回复(0)