文档章节

Struts2---->类型转换

小强斋太
 小强斋太
发布于 2016/11/09 20:06
字数 1062
阅读 0
收藏 0
点赞 0
评论 0

类型转换

 一、基本类型的转换器

struts2中已经实现,不需要实现

l预定义类型,例如intbooleandouble等;

l日期类型,使用当前区域(Locale)的短格式转换,即DateFormat.getInstance(DateFormat.SHORT)

l集合(Collection)类型,request.getParameterValues(String arg)返回的字符串数据与java.util.Collection转换;

l集合(Set)类型,List的转换相似,去掉相同的值;

l数组(Array)类型,将字符串数组的每一个元素转换成特定的类型,并组成一个数组。

            date=1989-09-11

            array[0]=1&array[1]=2

            list=learn&interests=swim

            map['key']=value&map['key2']=value2

http://localhost:8080/struts2_type_conversion/test?name=2&age=18&d=1989-09-11&interests=learn&interests=swim&use['key']=value&users['key2']=value2

二、自定义转换器

方法1、继承至struts2中的StrutsTypeConverter

这个类是struts2提供的一个DefaultTypeConverter的子类,与DefaultTypeConverter不同的是,他们把字符串到对象和对象到字符串的转换分开了,形成了2个方法,另外提供了一个叫performFallbackConversion的方法,用于处理转换异常时的情况。

public abstract Object convertFromString(Map context,String[] values,Class toClass)

context转换的action上下文对象集

values要装换的数据,是一个数组,一般取第一个元素就行了

toClass目标类型

这个方法完成字符串到对象的转换,在调用Actionsetter方法之前调用

public abstract String convertToString(Map context,Object o)

o,待转换的对象

返回转换完成的对象

这个方法完成对象到String的转换

方法2:实现ognl. TypeConverter接口,或者继承ognl.DefaultTypeConverter

实现的方法:

Object convertValue(Map context, Object value, Class toType)

context是发生转换的Action上下文对象集
value是待转换的数据,其实是一个字符串数组(由request.getParameterValues()传递过来),所以在使用之前一定要线转换成String[]
toType 转换目标类型,是一个Class对象
Return:Object返回值,就是转换完成后的对象。

三、注册自定义转换器

全局转换器的注册:在项目的classpath下新建一个xwork-conversion.properties文件,然后在文件中使用转换的类型=转换器的形式进行注册,如:java.Util.Date=com.res.DateConverter,表示,凡是遇到java.Util.Date类型的属性都使用DateConverter来进行转换,该文件可以注册多个转换器,全部都是全局转换器,11个。

局部转换器的注册:如果注册局部转换器的话,需要新建一个actionName-conversion.properties,同时注意,要放到跟Action相同的目录下。然后文件内容也不一样了。这个文件里是指定Action中的某个属性使用某个转换器,格式是属性名=转换器名,如date= com.res.DateConverter,可以由很多,也就是每一个属性都可以设置一个转换器

四、例子

1、要转换的类

package com.test.bean;
/**
* 三维点(x,y,z)
*/
public class Point {	
	private Integer x;
	private Integer y;
	private Integer z;	
	//  setter和getter
}

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;
	}
}

实现方法2:继承至struts2中的StrutsTypeConverter

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();	
	}	
}

3、注册

注册方法1 TestAction-conversion.properties:
point=com.test.converter.PointConverter

如果Action中有多个point属性和rectangle属性,则在properties中添加:
point2=com.test.converter.PointConverter
point3=com.test.converter.PointConverter

注册方法2:在src目录下建立 xwork-conversion.properties:
com.test.bean.Point=com.test.converter.PointConverter

 

参考:http://yueyan945.iteye.com/blog/401197

 

本文转载自:http://www.cnblogs.com/xqzt/archive/2012/09/02/5637202.html

共有 人打赏支持
小强斋太
粉丝 0
博文 181
码字总数 0
作品 0
广州
struts2的学习笔记

在这个苦逼的日子,谁都想牛逼一番。眼看大学四年稍纵即逝,自己也总算开始紧张起来,回忆起那荒废的大学两年,我真想为它树一个碑,上面写着:哀吊无知的青春! 觉悟的早,还不如行动的快!...

larch ⋅ 2012/03/16 ⋅ 0

Struts2核心技术 (二)

struts2中的参数封装 静态参数封装 什么是静态参数? 静态参数就是硬编码的,不可随意改变。 例子:

architect刘源源 ⋅ 04/24 ⋅ 0

struts笔记 类型转换

struts2的类型转换,对于8个原生数据类型以及Date,String 等常见类型,struts2可以使用内建的类型转换器实现自动的转换,对于自定义的对象类型转换来说,就需要我们制定转换类型以满足需要。...

脑丨残 ⋅ 2014/06/15 ⋅ 0

Struts2的其它知识

4、Struts2的其它知识 4.1、ModelDriven 如果希望传递对象信息到action,但对象信息较多时,需要传递大量的参数并且要设置这些参数,工作量 很大,所以建议的方式是在action中直接创建相应的...

pmos ⋅ 2016/11/02 ⋅ 0

Struts2体系结构

.Struts2体系结构 Struts2的体系与Struts1体系的差别非常大,因为Struts2使用了WebWork的设计核心,而不是Struts1的设计核心。Struts2中大量使用拦截器来处理用户的请求,从而允许用户的业务...

风一样 ⋅ 2011/08/06 ⋅ 0

Struts2 日期类型转换

Struts2 日期类型转换 import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Map;import com.opensymphony.xwork2.conversion.impl.Defa......

惠风康桥 ⋅ 2012/12/16 ⋅ 0

Java程序员从笨鸟到菜鸟之(四十四)细谈struts2(七)数据类型转换详解

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 Web应用程序的交互都是建立在HTTP之上的,互相传递的都是字符串。也就是说服务器接收到的来自用户的数据只能...

长平狐 ⋅ 2012/11/12 ⋅ 0

Struts1和Struts2的区别和对比

Action 类: • Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。 • Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的...

钱佳庆 ⋅ 2011/10/04 ⋅ 0

STRUTS1 ,2 比较

Action 类: ◆Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口 ◆Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务...

ddatsh ⋅ 2012/02/20 ⋅ 0

Struts2与Struts1的对比

Action 类: • Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。 • Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的...

磊神Ray ⋅ 2011/08/26 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

istio 文档

https://istio.io/docs/concepts/ https://istio.io/docs/concepts/traffic-management/handling-failures/ https://istio.io/docs/concepts/traffic-management/rules-configuration/......

xiaomin0322 ⋅ 12分钟前 ⋅ 0

编程语言的作用及与操作系统和硬件的关系

一、编程语言的作用及与操作系统和硬件的关系 作用:编程语言是计算机语言,是一种程序员与计算机之间沟通的介质,通过编程语言可以使得计算机能够根据人的指令一步一步去工作,完成某种特定...

slagga ⋅ 23分钟前 ⋅ 0

runtime实现按钮点击事件

也不能说是实现吧,,,就是有点类似于RAC里边的写法,不用给btn添加另外的点击事件,就那个add...select...这样子很不友好,来看下代码: [self.btn handleControlEvent:UIControlEventTou...

RainOrz ⋅ 23分钟前 ⋅ 0

Windows系统运维转linux系统运维的经历

开篇之前,首先介绍一下我的背景把:我是一个三线城市的甲方运维。最近,在《Linux就该这么学》书籍的影响下和朋友小A(Linux运维已经三年了,工资也比我的高很多)的影响下,决定转行。最近...

linux-tao ⋅ 24分钟前 ⋅ 0

zip压缩工具,tar打包工具

zip压缩工具 zip打包工具跟前面说到的gzip,bz2,xz 工具最大的不一样是zip可以压缩目录。如果没有安装,需要使用yum install -y zip 来安装。安装完之后就可以直接使用了,跟之前提到的压缩...

李超小牛子 ⋅ 32分钟前 ⋅ 0

使用npm发布自己的npm组件包

一、注册npm账号 官网:https://www.npmjs.com/signup 注册之后需要进行邮箱验证,否则后面进行组件包发布时候会提示403错误,让进行邮箱核准。 二、本地新建一个文件夹,cd进入后使用npm i...

灰白发 ⋅ 33分钟前 ⋅ 0

010. 深入JVM学习—垃圾收集策略概览

1. 新生代可用GC策略 1. 串行GC(Serial Copying) 算法:复制(Copying)清理算法; 操作步骤: 扫描年轻代中所有存活的对象; 使用Minor GC进行垃圾回收,同时将存活对象保存到“S0”或“S...

影狼 ⋅ 34分钟前 ⋅ 0

JVM性能调优实践——JVM篇

在遇到实际性能问题时,除了关注系统性能指标。还要结合应用程序的系统的日志、堆栈信息、GClog、threaddump等数据进行问题分析和定位。关于性能指标分析可以参考前一篇JVM性能调优实践——性...

Java小铺 ⋅ 35分钟前 ⋅ 0

误关了gitlab sign-in 功能的恢复记录

本想关sign-up的,误点了sign-in 退出后登录界面提示: No authentication methods configured 一脸懵逼.. 百度后众多方案说修改application_settings 的 signin_enabled字段; 实际上新版本字段...

铂金蛋蛋 ⋅ 36分钟前 ⋅ 0

登录后,后续请求接口没有带登录cookie可能原因

1.XMLHttpRequest.withCredentials没设置好,参考https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/withCredentials...

LM_Mike ⋅ 36分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部