问题:
在jsp也面上用 <html:text property=’startdate’ size=19>
在actionForm 里定义 private Date startdate ; getstartdate();setstartdate();
但是在页面提交的时候处理这个日期就出错了。请问你们是怎么收集日期形数据的。
回答一========================
我是这样搜集日期的:
1、在JSP页面里把年月日分别按int类型收集上来(利用的ActionForm是DynaActionForm)。
2、在ActionServlet里面用以下代码获取日期,我的日期是用长整型存在数据库里的
//将年月日转换成日期
int year = new Integer((String)dynaForm.get(‘year’)).intValue();
int month = new Integer((String) dynaForm.get(‘month’)).intValue();
int day = new Integer((String) dynaForm.get(‘day’)).intValue();
GregorianCalendar now = new GregorianCalendar();
GregorianCalendar calendar = new GregorianCalendar(year,month,day);
//获得日期到1970/01/01的毫秒数(长整型)
long date = calendar.getTime().getTime();
回答二=============================
刚才研究了一下,正确的方法如下:
创建如下类:
package com.ted.common.util;
import java.util.*;
import org.apache.commons.beanutils.*;
import java.text.SimpleDateFormat;
public class DateConvert implements Converter{
static SimpleDateFormat df = new SimpleDateFormat(‘yyyy/MM/dd’);
public DateConvert() { }
public Object convert(Class type, Object value) {
System.out.println(‘ok:’+value);
if(value instanceof String)
{
try
{
return df.parse((String)value);
}
catch (Exception ex)
{
throw new ConversionException(‘输入的日期类型不合乎yyyy/MM/dd’+value.getClass());
}
}
else
{
throw new ConversionException(‘输入的不是字符类型’+value.getClass());
}
}
}
然后,将此类的一个实例注册到beanutil中
onvertUtils.register(new DateConvert(),java.util.Date.class);
java.util.Date.class参数用于表示此类负责处理date类型的转化
然后一切ok了
回答三=====================
研究了一下 commons-beanUtils 这个库。
其实 struts 对 html form 到 ActionForm 的处理(如数字)就是用的 beanUtils 来处理的。
里面有个 convertUtils 类来具体负责转换 String (html form中都是 Stirng) 到其它的 Java 类型。对象是实现了 convert 接口的类。
beanUtils 已经内奸了大多数常用到的转换类。如日期处理方面有 sqlDateConverter
所以,在 ActionForm 中日期型数据是 java.sql.Date 类型,struts 会调用 converUtils 来直接做转化了。 如 java.util.Date 就需要像楼上那样自己实现 convert 接口,并需要注册。(没有明白需要在什么地方注册,在整个 init 中?)
但我还是遇到问题就是,如果 html form 中提交过去的如果是空的,没有填写,则会出现错误。 有了数据才会正确,如: 2003-11-21
但我想一般既然用到日期,就不会让它空着,问题倒不大。 比如默认日期为今天,则初始化为今天。 html:text 这个框设成 readonly ,然后用一个 javascript 日期组件来选择日期,使用起来方便,也保证了日期的格式。 总之基本上解决了我的需求!
回答四===========================
其实可以写一个类继承ActionServlet,在init()方法中重新注册一些解析方法就可以了。
public class ActiveServlet extends ActionServlet {
/**
* 重载init()方法
* 为struts解析重新注册一些改造过的表单元素数据解析方法
*/
public void init() throws ServletException {
super.init();
ConvertUtils.register(new BigDecimalConverter(null), BigDecimal.class);
ConvertUtils.register(new BigIntegerConverter(null), BigInteger.class);
ConvertUtils.register(new FloatConverter(null), Float.class);
ConvertUtils.register(new IntegerConverter(null), Integer.class);
ConvertUtils.register(new LongConverter(null), Long.class);
ConvertUtils.register(new ShortConverter(null), Short.class);
ConvertUtils.register(new SqlDateConverter(null), Date.class);
ConvertUtils.register(new SqlTimeConverter(null), Time.class);
ConvertUtils.register(new SqlTimestampConverter(null), Timestamp.class);
}
}
记住web.xml要修改:
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>com.xx.ActiveServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml, /WEB-INF/struts-config-registration.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
actionForm 里定义 private Date startdate;
getter、setter方法必须为:
getStartdate();
setStartdate();