九月 03, 2012 4:57:02 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet cfj threw exception
org.apache.commons.beanutils.ConversionException: DateConverter does not support default String to 'Date' conversion.
at org.apache.commons.beanutils.converters.DateTimeConverter.toDate(DateTimeConverter.java:468)
at org.apache.commons.beanutils.converters.DateTimeConverter.convertToType(DateTimeConverter.java:343)
at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:156)
at org.apache.commons.beanutils.converters.ConverterFacade.convert(ConverterFacade.java:60)
at org.apache.commons.beanutils.ConvertUtilsBean.convert(ConvertUtilsBean.java:470)
at org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1004)
at org.apache.commons.beanutils.BeanUtils.setProperty(BeanUtils.java:456)
at com.lxf.mu.FormUtil.fillform(FormUtil.java:22)
at com.lxf.mu.AcionServlet.doPost(AcionServlet.java:26)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)
在Struts中我们经常要处理用户录入的日期字符串,将其转换为java.util.Date类型。在这里我们提供两种方式来实现这样的转换。
1 在ActionForm子类中,创建两个变量来处理日期,一个为Date类型,一个为String类型(临时变量),我们使用String类型的变量来接受用户的录入,再编码将其转换为Date类型,在页面输出时,在根据Date类型生成自定义的文本格式。这种方式灵活性大,不过需要你多付出点劳动。
2 编写一个plugin实现自动转换。Struts下各种对象类型的转换是通过BeanUtils的Converter实现,所以我们只需向 BeanUtils注册一个日期字符转换的Converter即可,这种方式不需要你编写代码进行转换,不过在页面呈现的时候,你可能需要进行格式化,从 Date对象之间生产的字符串(toString())往往不是你需要的,使用JSTL就可以的。
首先编写一个日期转换的Converter类:
- import java.text.SimpleDateFormat;
- import org.apache.commons.beanutils.Converter;
- import java.util.Set;
- import java.util.HashSet;
- import java.util.Iterator;
- import java.text.ParseException;
- /**
- *
- * 日期转换对象,使用该转换器,在BaseForm当中做一下注册,系统自动地帮助字符的日期表示转换为java.util.Date对象.
- * @author zizz.
- * Create Time:2006-9-11 19:11:47.
- */
- public class DateConverter implements Converter {
- /**
- * 日期格式化对象.
- */
- private static SimpleDateFormat df = new SimpleDateFormat();
- /**
- * 模式集合.
- */
- private static Set<String> patterns = new HashSet<String>();
- //注册一下日期的转换格式
- static {
- DateConverter.patterns.add("yyyy-MM-dd" );
- DateConverter.patterns.add("yyyy-MM-dd HH:mm" );
- DateConverter.patterns.add("yyyy-MM-dd HH:mm:ss" );
- DateConverter.patterns.add("yyyy/MM/dd HH:mm:ss" );
- }
- /**
- * 日期转换器.
- * @param type Class
- * @param value Object
- * return Date Object.
- */
- public Object convert(Class type,Object value){
- if (value == null ){
- return null ;
- }else if (value instanceof String){
- Object dateObj = null ;
- Iterator it = patterns.iterator();
- while (it.hasNext()){
- try {
- String pattern = (String)it.next();
- df.applyPattern(pattern);
- dateObj = df.parse((String)value);
- break ;
- }catch (ParseException ex){
- //do iterator continue
- }
- }
- return dateObj;
- }else {
- return null ;
- }
- }
- }
- import java.text.SimpleDateFormat;
- import org.apache.commons.beanutils.Converter;
- import java.util.Set;
- import java.util.HashSet;
- import java.util.Iterator;
- import java.text.ParseException;
- /**
- *
- * 日期转换对象,使用该转换器,在BaseForm当中做一下注册,系统自动地帮助字符的日期表示转换为java.util.Date对象.
- * @author zizz.
- * Create Time:2006-9-11 19:11:47.
- */
- public class DateConverter implements Converter {
- /**
- * 日期格式化对象.
- */
- private static SimpleDateFormat df = new SimpleDateFormat();
- /**
- * 模式集合.
- */
- private static Set<String> patterns = new HashSet<String>();
- //注册一下日期的转换格式
- static{
- DateConverter.patterns.add("yyyy-MM-dd");
- DateConverter.patterns.add("yyyy-MM-dd HH:mm");
- DateConverter.patterns.add("yyyy-MM-dd HH:mm:ss");
- DateConverter.patterns.add("yyyy/MM/dd HH:mm:ss");
- }
- /**
- * 日期转换器.
- * @param type Class
- * @param value Object
- * return Date Object.
- */
- public Object convert(Class type,Object value){
- if(value == null){
- return null;
- }else if(value instanceof String){
- Object dateObj = null;
- Iterator it = patterns.iterator();
- while(it.hasNext()){
- try{
- String pattern = (String)it.next();
- df.applyPattern(pattern);
- dateObj = df.parse((String)value);
- break;
- }catch(ParseException ex){
- //do iterator continue
- }
- }
- return dateObj;
- }else{
- return null;
- }
- }
- }
import java.text.SimpleDateFormat;
import org.apache.commons.beanutils.Converter;
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
import java.text.ParseException;
/**
*
* 日期转换对象,使用该转换器,在BaseForm当中做一下注册,系统自动地帮助字符的日期表示转换为java.util.Date对象.
* @author zizz.
* Create Time:2006-9-11 19:11:47.
*/
public class DateConverter implements Converter {
/**
* 日期格式化对象.
*/
private static SimpleDateFormat df = new SimpleDateFormat();
/**
* 模式集合.
*/
private static Set<String> patterns = new HashSet<String>();
//注册一下日期的转换格式
static{
DateConverter.patterns.add("yyyy-MM-dd");
DateConverter.patterns.add("yyyy-MM-dd HH:mm");
DateConverter.patterns.add("yyyy-MM-dd HH:mm:ss");
DateConverter.patterns.add("yyyy/MM/dd HH:mm:ss");
}
/**
* 日期转换器.
* @param type Class
* @param value Object
* return Date Object.
*/
public Object convert(Class type,Object value){
if(value == null){
return null;
}else if(value instanceof String){
Object dateObj = null;
Iterator it = patterns.iterator();
while(it.hasNext()){
try{
String pattern = (String)it.next();
df.applyPattern(pattern);
dateObj = df.parse((String)value);
break;
}catch(ParseException ex){
//do iterator continue
}
}
return dateObj;
}else{
return null;
}
}
}
然后编写一个Struts的plugin,执行Converter注册:
- public class ConvertPlugIn implements PlugIn {
- public void destroy() {
- ConvertUtils.deregister();
- }
- public void init(ActionServlet arg0, ModuleConfig arg1)
- throws ServletException {
- ConvertUtils.register(new DateConverter(), Date. class );
- }
- }
- public class ConvertPlugIn implements PlugIn {
- public void destroy() {
- ConvertUtils.deregister();
- }
- public void init(ActionServlet arg0, ModuleConfig arg1)
- throws ServletException {
- ConvertUtils.register(new DateConverter(), Date.class);
- }
- }
public class ConvertPlugIn implements PlugIn {
public void destroy() {
ConvertUtils.deregister();
}
public void init(ActionServlet arg0, ModuleConfig arg1)
throws ServletException {
ConvertUtils.register(new DateConverter(), Date.class);
}
}
最后在struts-config.xml进行plugin声明:
<plug-in className="DateConverter" />
进行日期转换,这对Struts来说是非常有益的。Struts的ActionForm一直被认为是设计的缺陷,但是通过BeanUtils可以快速实现 ActionForm、VO、PO对象之间的转换,这就要求ActionForm设计比较合理,当然在ActionForm中实现从采集字符串到日期的转换会节省很多时间,我们只需关注域对象间的转换就可以啦。