前面发表了关于Struts2的基本数据类型转换以及对于简单的自定义抽象数据类型的转换。从文章发表至今,文章的阅读量为零。不禁感到心寒,自己辛辛苦苦整理的文章,充满着热情发表到博客,可换来的就是阅读及评论为零。但转念想想,记录也是为了让自己得到提高,如果能帮助到别人那是最好,即使帮助不了别人,自己回过来看看也是受益匪浅。这么想心态也就平静了很多,也使我打算继续发表后续文章。
上一章中最后提到了自定义的抽象数据类型Point到String的转换,大家可能会有疑问,我门的项目中可能会涉及到多个表单,表单中可能会引用多个Point,那么我们每次都需要在配置文件中来配置这个类的实例吗?答案当然是不用。那么我们该如何去做的,这就是我们今天的第一个知识点:
一、配置全局类型转换器:
回顾上一章的知识,我们提到,在action的包下建立一个名为action名+conversion的properties的配置文件,在配置文件中指定我们的action中引用的抽象数据类型。这种配置方式呢成为局部转换器。
配置全局转换器很简单,只需要在src下建立一个名为xwork-conversion.properties 的文件,在配置文件中指定要转的抽象数据类型的完整路径,后面同样指定转换器的完整路径。我们要为Point类注册全局转换器代码如下:
com.guanhua.domain.Point=com.guanhua.converter.PointConverter
配置全局转换器就这么简单,其它的代码不需要改变,仅仅需要在src下建立xwork-conversion的properties文件,写下要转换的类以及类的转换器即可。配置完全局的转换器之后解决了多个action中有多个Point的情况,那么大家再思考,如果一个action中有多个Point我们该如何处理呢?配置全局类型转换器当然可以处理,那样是不是会显得我们的代码过于臃肿呢,我们可以把多个Point放到一个List集合中,那样我们的代码就会变得简洁,下面我们就来看一下如何从字符串到List之间进行转换:
二、实现String与List之间的数据转换:
1、我们有一个input.jsp作为用户的输入,这里大家要注意一点,因为在Action中定义的是一个List,那么我们在form表单中定义的name属性就要与Action中对应。
<pre name="code" class="html"><s:form action="pointConverter">
<s:textfield name="points" label="point1"></s:textfield>
<s:textfield name="points" label="point2"></s:textfield>
<s:textfield name="points" label="point3"></s:textfield>
<s:submit label="submit"></s:submit>
</s:form>
2、实现一个PointAction来处理
private List<Point> points;
public List<Point> getPoints() {
return points;
}
public void setPoints(List<Point> points) {
this.points = points;
}
public String execute(){
return "success";
}
3、实现一个转换器PointConversion继承StrutsTypeConverter,实现convertFromString(把字符串转成对象)和convertToString(把对象转成字符串)两个抽象方法。这里的values就是表单中提交的name属性为point的值,这是一个数组。Object o就是我们要转换为String的那个对象。
public class PointConverter extends StrutsTypeConverter{
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
// TODO Auto-generated method stub
List<Point> list = new ArrayList<Point>();
for(String value:values){
String[] ss = value.split(",");
Point p = new Point();
p.setX(Integer.parseInt(ss[0]));
p.setY(Integer.parseInt(ss[1]));
list.add(p);
}
return list;
}
@Override
public String convertToString(Map context, Object o) {
// TODO Auto-generated method stub
List<Point> list= (List<Point>) o;
StringBuilder buff = new StringBuilder();
for(Point point:list){
buff.append(point.getX()+":"+point.getY());
}
return buff.toString();
}
}
4、在PointAction类所在的包下建立一个PointAction-conversion.properties文件
points=com.guanhua.converter.PointConverter
5、写一个Out.jsp文件,将我们的输入输出到浏览器中
<body>
<!--取出表单中输入的值 -->
points:<s:property value="points"/>
</body>
这样一个从List到String以及从String到List的转换我们就做好了。至于其它的数据类型的转换就不在这里演示了。下面再告诉大家一个简单的数据类型的转换,但是这种数据类型的转换我们在开发中是不推荐使用的。这种转换也是针对自定义的抽象数据类型,它的简便之处就在于不需要自己实现Convertor。
三、简便的方式实现自定义抽象数据类型的转换
1、我们首先仍然新建一个用来接收用户输入的input.jsp文件。但这个JSP中from表单要做一些稍微的修改,到底该如何做呢,我们来看下面的例子:
<s:form action="pointConverter">
<s:textfield name="point.x" label="x"></s:textfield>
<s:textfield name="point.y" label="y"></s:textfield>
</s:form>
2、实现一个PointAction对页面提交的数据进行处理
private Point point;
public Point getPoint() {
return point;
}
public void setPoint(Point point) {
this.point = point;
}
3、写一个out.jsp用来输出我们的输入
<body>
<!--取出表单中输入的值 -->
point:<s:property value="point"/>
</body>
这种方式是不是很简单呢,不过我们需要在bean中重写toString方法,否则输出的就是我们的对象本身哦。这种方式在我们真正的项目中是不推荐的哦!
这样就算大功告成了,快启动Tomcat来测试我们的代码吧!