[Struts]处理表单中值为空的日期类型字段

简介: 在示范中心项目中,我们把ActionForm中日期类型的字段指定为String类型,而在对应的JavaBean中指定为java.sql.Date类型。当用户提交表单的时候,在Action里使用BeanUtils.copyProperties()方法从ActionForm构造JavaBean对象(详见利用BeanUtils在对象间复制属性)。

在示范中心项目中,我们把ActionForm中日期类型的字段指定为String类型,而在对应的JavaBean中指定为java.sql.Date类型。当用户提交表单的时候,在Action里使用BeanUtils.copyProperties()方法从ActionForm构造JavaBean对象(详见利用BeanUtils在对象间复制属性)。这个方法在大部分时候都很好,但有一个问题,就是当用户没有填写日期类型字段时(而该字段并非必填),validator不会提出警告,而在copyProperties()时会报类型转换异常,原因是这时ActionForm中的该字段的值是空字符串(""),负责字符串向Date转换的SqlDateConverter类调用Date.valueOf("")方法,显然""是无法转换为日期的,所以会抛出异常。

通过查看代码和资料,我发现这个问题的解决方法其实非常简单。只要把带缺省值参数的SqlDateConverter重新注册一下,覆盖原有的注册信息就可以了,这个注册语句一般是写在系统初试化的地方,对于Struts应用程序,当然做在PlugIn里最方便。代码如下:

package etc;

import javax.servlet.ServletException;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.SqlDateConverter;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.PlugIn;
import org.apache.struts.config.ModuleConfig;

public class ConverterPlugIn implements PlugIn{

    public void init(ActionServlet servlet, ModuleConfig config) throws ServletException {
        ConvertUtils.register(new SqlDateConverter(null),java.sql.Date.class);
    }

    public void destroy() {
        ConvertUtils.deregister();
    }
}

注意SqlDateConverter的构造方法是带有参数null的,这表示遇到不能解析的字符串就返回空值。而deregister()方法的作用是恢复ConvertUtils的缺省注册表。为了使这个PlugIn起作用,要在struts-config.xml里增加一句话:

<plug-in className="etc.ConverterPlugIn" />

日期字段往往会给我们的开发带来麻烦,其实在Struts应用程序里,只要把这些转换类搞熟了,总可以找到很方便的办法。常见的问题还有如何指定日期输入格式,怎样处理java.util.Date的转换,等等,在这个链接里有解决这些问题的方法,道理都是一样的。

本文转自博客园八进制的博客,原文链接:[Struts]处理表单中值为空的日期类型字段,如需转载请自行联系原博主。

相关文章
|
7月前
|
网络安全 Python
这个错误是由于在将字符串类型的值转换为字典类型时出现了问题
【2月更文挑战第20天】这个错误是由于在将字符串类型的值转换为字典类型时出现了问题
33 1
|
JavaScript 前端开发 API
`toISOString()` 方法将日期对象转换为字符串
`toISOString()` 方法将日期对象转换为字符串
332 1
对象的属性和值转换
对象的属性和值转换
42 0
|
存储 JavaScript 前端开发
数值的扩展方法以及新增数据类型BigInt
数值的扩展方法以及新增数据类型BigInt
112 0
|
网络架构 索引
ES6新增扩展:字符串-数值-数组-函数-对象
ES6新增扩展:字符串-数值-数组-函数-对象
90 0
|
存储 关系型数据库 MySQL
列的类型定义——字符串类型
列的类型定义——字符串类型
枚举的三种类型--指数型&排列型&组合型
枚举的三种类型--指数型&排列型&组合型
109 0
|
PHP
thinkphp where两个字段相加值
thinkphp where两个字段相加值
178 0