`
yueyan945
  • 浏览: 6024 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
社区版块
存档分类
最新评论

Struts2学习笔记2_转换器的使用

阅读更多
一、转换自定义类的基本方法

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方法
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics