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