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

[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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值