描述:假设用户请求地址:http://xxx.action?date=2015-01-01. 假设action中已经存在了date属性,且类型为Date。当用户请求的参数格式为xxxx-xx-xx或者xxxx-x-x的时候,action可以正常的接收到日期类型,即string字符串可以自动转换为Date类型。但是当用户的请求为xxxxxxxx(20150101)的时候,action不能够转换为日期类型,且报错。这时候就需要自定义类型转换器来实现日期的转换。
问题解决:自定义类型转换器
- 新建立一个类,DateTypeConverter.java,并继承系统类DefaultTypeConverter,重写convertValue(Map<String, Object> context, Object value, Class toType)方法。参数介绍,value表示客户端地址请求的值,toType表示需要转换的类型。该方法支持双向转换,即客户端请求----->action------>jsp页面回显值。该类的具体代码如下所示:
package cn.itcast.type.converter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter; public class DateTypeConverter extends DefaultTypeConverter { @Override public Object convertValue(Map<String, Object> context, Object value, Class toType) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); try { if(toType == Date.class){//当字符串向Date类型转换时 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 (ParseException e) {} return null; } }
- action中的代码如下:HelloWorldAction.java
package cn.itcast.action; import java.util.Date; public class HelloWorldAction {//?birthday=2008-10-10 private Date birthday; public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { System.out.println(birthday); this.birthday = birthday; } public String addUI(){ return "success"; } public String execute() throws Exception{ return "success"; } }
- 注册局部类型转换器,局部类型转换器只对某个action中的的属性起作用,因为不是全局转换器。规则:Action的简单类名-conversion.properties,这个文件要跟Action放在同一个包中。在该文件中,采用的事键值对的配置方式:属性名=自定义类型转换器的完整类名。具体配置如下:birthday=cn.itcast.type.converter.DateTypeConverter。cn.itcast.type.converter代表包名。