webwork自定义日期类型转换

         鉴于webwork与struts类似,webwork的内容就记在这个模块吧。
         前一阵子开发一个webwork的应用发现一个问题,就是前台的日期用datePicker的一个js组件,但是后台的model中的属性Date类型却接收不到值,这种情况只有在ie下出现,火狐是可以传递的。当时着急就用String类型接收,然后在存的时候直接转化一下,或者直接存在库里字符串。这样解决了问题,但是不是从根本解决,只是绕过了问题。
         当然以上的方法是一个解决办法,但是还有另一种就是能接收到的,也就是我想说的自定义日期类型转换。
         webwork 类型转换器派生WebworkTypeConverter实现Date的类型转换,根据javaeye论坛某高手的建议用正则表达式来判断form传过来的日期字符串是"%Y-%m-%d"还是"%Y-%m-%d %H:%M",再用相应的SimpleDateFormat来parse分析字符串生成Date对象, 代码如下:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import org.apache.log4j.Logger;

import com.opensymphony.webwork.util.WebWorkTypeConverter;

public class DateConverter extends WebWorkTypeConverter {
	private static final Logger log = Logger.getLogger(DateConverter.class);

	private final static String regex_time = "[0-9]{2,4}-[0-9]{1,2}-[0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}";

	private final static SimpleDateFormat sdf_time = new SimpleDateFormat(
			"yyyy-MM-dd HH:mm");

	private final static String regex_date = "[0-9]{2,4}-[0-9]{1,2}-[0-9]{1,2}";

	private final static SimpleDateFormat sdf_date = new SimpleDateFormat(
			"yyyy-MM-dd");

	@Override
	public Object convertFromString(Map context, String[] values, Class toClass) {
		if (values.length == 1) {
			Date date = null;
			try {
				date = convertToDate(values[0]);
			} catch (ParseException e) {
				log.warn(e.getMessage());
			}
			return date;
		}

		Date[] results = new Date[values.length];

		for (int i = 0; i < values.length; i++) {
			String value = values[i];
			try {
				results[i] = convertToDate(value);
			} catch (ParseException e) {
				log.warn(e.getMessage());
			}
		}

		return results;
	}

	private Date convertToDate(String value) throws ParseException {
		if (value.matches(regex_time))
			return sdf_time.parse(value);
		else if (value.matches(regex_date))
			return sdf_date.parse(value);

		return null;
	}

	@Override
	public String convertToString(Map context, Object o) {
		if (o instanceof Date) {
			Date date = (Date) o;
			return sdf_time.format(date);
		}

		return o.toString();
	}

	public static void main(String[] args) {
		System.out.println("2006-07-11".matches(regex_date));
		System.out.println("2006-07-11 00:21".matches(regex_time));
	}
}

以上参考了百度空间的网友名字丐帮是大帮的百度日志。
自己写了一个自己可以用的。

package com.test.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import com.opensymphony.webwork.util.WebWorkTypeConverter;

public class DateConverter extends WebWorkTypeConverter {

	@Override
	public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
		try {
			SimpleDateFormat sdft = new SimpleDateFormat("yyyy-MM-dd");
			long times = sdft.parse(arg1[0].toString()).getTime();
			Date date=new Date(times);
			return date;
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
		
	}
	@Override
	public String convertToString(Map arg0, Object arg1) {
		SimpleDateFormat sdft = new SimpleDateFormat("yyyy年MM月dd日");
        Date date = (Date)arg1;
        return sdft.format(date);
	}
}

要让这个类来代替webwork默认的转换你还需要在classpath目录, 一般就是classes目录放置配置文件
xwork-conversion.properties:
java.util.Date=DateConverter
这种方法是对整个application起作用,.
如果要只对单个action起作用, 在action同一个package写一个ActionClassName-conversion.properties:
startDate=DateConverter
分享让更多人受益!

你可能感兴趣的:(Webwork)