一、转换自定义类的基本方法
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方法
分享到:
相关推荐
struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换
struts2学习笔记总结
Struts2_学习笔记Struts2_学习笔记Struts2_学习笔记
Struts2学习笔记,介绍了struts2的基础部分
struts2学习笔记,非本人所写,但有学习的价值,总结的很好,分享一个!
NULL 博文链接:https://coderdream.iteye.com/blog/812871
这是学习struts2时记得重点笔记,包括了一些原理,ognl语句的编写,以及如何设置拦截器等等一些基本知识,起到复习和巩固的作用
NULL 博文链接:https://coderdream.iteye.com/blog/811139
struts2学习笔记struts2学习笔记struts2学习笔记
黑马程序员_struts2框架2016版视频_struts2_day01笔记
本人学习struts2的笔记,希望大家可以多多学习以后共同交流
NULL 博文链接:https://coderdream.iteye.com/blog/811262
NULL 博文链接:https://coderdream.iteye.com/blog/813784
1. struts2框架的引入 1)把struts2的相关jar包导入到项目中去 2)把struts2框架的配置文件struts.xml复制粘贴到项目中的src下面(同时也可以把log4j.properties放到src下) 在这里我们主要是要的这个struts.xml文件...
namespace :对应与项目名称后面的"/"(例如Struts2_0100_Introduction后面的"/") (http://localhost:8080/Struts2_0100_Introduction/) 四、 标签 是用来解决重名的问题,例如当系统的前台和后台都有一个action...
学习Struts2第三天笔记
Struts2_interceptor_和_filter区别