Struts2的类型转换(二)集合类型的转换

        前面发表了关于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来测试我们的代码吧!











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值