复习struts2之自定义类型转换器

例1:

在action中定义一个参数birth并生成相应的set和get方法
在struts.xml文件中配置出来
在jsp页面中打印出来
当在浏览器中输入的地址为:
http://localhost:8080/struts2/test/person.do?birth=2001-02-21
浏览器输出的内容是
Wed Feb 21 00:00:00 CST 2001
当浏览器中输入的地址为:
http://localhost:8080/struts2/test/person.do?birth=20011020
浏览器输出的内容为:
20011020
控制台中输出的内容为:
ognl.MethodFailedException: Method "setBirth" failed for object cn.itcast.action.PersonAction@6d670a [java.lang.NoSuchMethodException: cn.itcast.action.PersonAction.setBirth([Ljava.lang.String;)]
… …
Caused by: java.lang.NoSuchMethodException: cn.itcast.action.PersonAction.setBirth([Ljava.lang.String;)
	at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1233)
	... 63 more
java.lang.NoSuchMethodException: cn.itcast.action.PersonAction.setBirth([Ljava.lang.String;)
控制台报错而浏览器中输出内容的原因:
传过去的是string 类型的,所以会报类型不匹配的错误
Struts2中的拦截器一旦发现类型不配置,并且还要在jsp页面中打印出参数时,会获取在输入路径时输出的参数,直接打印出来

如果一定要传20011020这种类型的参数并且一定要以date类型接收该怎么办呢?
需要定义类型转换器
在struts2中定义了两种类型转换器:
一种是局部类型转换器-----对某个action起作用
一种是全局类型转换器-----对所有action都起作用
局部转换器:
步骤一:
定义类型转换器(继承类   实现方法)
public class dateTypeConverter extends DefaultTypeConverter {
	@Override
	public Object convertValue(Map<String, Object> context, Object value,
			Class toType) {
		/*
		 * 类型转换器能实现双向转换    
		 * 由请求参数的值转换成属性的值
		 * 在使用struts2的标签时   把属性值转换成字符串进行数字回显
		 */
		// value就是路径中传的参数值       toType就是要转换成的类型
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
		try { 
			if(toType == Date.class){//当字符串向Date类型转换时
				/*
				 * 为什么要把接收的字符串转换成数组
				 * struts2是一个框架,它会考虑接收很多不同类型的值
				 */
				String[] params = (String[]) value;// Request.getParameterValues() 
				return dateFormat.parse(params[0]);
			}else if(toType == String.class){//当Date转换成字符串时
				Date date = (Date) value;
				return dateFormat.format(date);
			}
		} catch (Exception e) {}
		return null;
	}
}
步骤二:
注册自定义类型转换器
PersonAction-conversion.properties
birth=cn.csdn.tc.dateTypeConverter
birth为属性名
这个文件的名字必须是“action 名字-conversion.properties”,且这个文件必须与action文件放在同级目录下
访问路径:
http://localhost:8080/struts2/test/person.do?birth=20120123
浏览器显示结果;
Mon Jan 23 00:00:00 CST 2012
全局转换器:
步骤与上面相同,只不过注册时改变了一下。
注册时的配置文件名必须是xwork-conversion.properties,并且放在src路径下,里面的内容为:
java.util.Date=cn.csdn.tc.dateTypeConverter
上面的代码意思为:对应应用中的java.util.Date类型的属性,都可以用cn.csdn.tc.dateTypeConverter  来进行转换
注意:使用全局变量转换器,传递数据时的格式必须全部都是	20120123这种类型的,如果所传递的数据中有20120123这种类型的又有2010-02-11这种类型的那么最好使用局部类型转换器




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值