例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这种类型的那么最好使用局部类型转换器