-
在实际操作中经常会碰到表单中的日期 字符串和Javabean中的日期类型的属性自动转换, 而springMVC默认不支持这个格式的转换,所以必须要手动配置, 自定义数据类型的绑定才能实现这个功能。
比较简单的可以直接应用springMVC的注解@initbinder和spring自带的WebDataBinder类和操作
- ps:字符串是2017-10-31 15:01:31这种格式 才能自动封装成Date 类型
-
- @Controller
- @RequestMapping("/initbind")
- public class UserController{
- @InitBinder
- public void initBinder(WebDataBinder binder) {
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- //页面的日期字符串 2017-10-31 15:01:31 --->yyyy-MM-dd ok
- //页面的日期字符串 2017-10-31 ------------>yyyy-MM-dd HH:mm:ss 400报错
- // 设置lenient为false
// 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01 - dateFormat.setLenient(false);
- binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));//true:允许输入空值,false:不能为空值
- }
- // ...
- }
-
@InitBinder public void initBinder(WebDataBinder binder){ binder.registerCustomEditor(Date.class, new DateEditor()); }
public class DateEditor extends PropertyEditorSupport { @Override public void setAsText(String text) throws IllegalArgumentException { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = null; try { date = format.parse(text); } catch (ParseException e) { format = new SimpleDateFormat("yyyy-MM-dd"); try { date = format.parse(text); } catch (ParseException e1) { e1.printStackTrace(); } } setValue(date); }
@Override
public String getAsText() {
return getValue().toString();
}
}
这里我们将DateEditor提出来封装成一个类方便重用。
另外这里有个try...catch的小妙用,就是首先以"yyyy-MM-dd HH:mm:ss"的形式来解析用户输入的参数,若解析失败则转以"yyyy-MM-dd"的形式来解析。这样的逻辑就可以同时处理"yyyy-MM-dd HH:mm:ss"和"yyyy-MM-dd"形式的日期数据,我想在一般的中文系统中,这两种形式应该是最常用的了吧。
添加如上代码之后,@InitBinder所在的Controller就可以自动绑定日期类型的数据了,不过这仅仅是在该Controller中生效,若想在全局范围内生效的话,可以将@InitBinder注解所在的Controller定义为一个BaseController,其余Controller都继承这个Controller。当然还有另外的方法,若你有兴趣的话,请看2。
2、自定义WebBindingInitializer
public class MyWebBindingInitializer implements WebBindingInitializer { @Override public void initBinder(WebDataBinder binder, WebRequest request) { binder.registerCustomEditor(Date.class, new DateEditor()); } }
还是前面写的DateEditor,这么快又见面了,只不过注册的位置改变了,在WebBindingInitializer中注册的PropertyEditor是在全局范围内共享的。
不过光这样还不够,还要将WebBindingInitializer注入到AnnotationMethodHandlerAdapter中。
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="webBindingInitializer"> <bean class="com.**.**.**.MyWebBindingInitializer" /> </property> </bean>
完美解决问题提
测试代码
@Controller @RequestMapping(value="/") public class BaseController { @RequestMapping(value="index") public String indexJsp(String username,Date date,Date ddate){ System.out.println(username); System.out.println(date); System.out.println(ddate); return "index"; } }
测试参数
index?username=fasdf&date=2012-12-03&ddate=2013-03-06
输出结果:
fasdf Mon Dec 03 00:00:00 CST 2012 Wed Mar 06 00:00:00 CST 2013
参考文档:http://blog.csdn.net/u012345283/article/details/43268081
第二种方式使用Converter
代码如下
public class MyConverter implements Converter<String, Date> { @Override public Date convert(String source) { // TODO Auto-generated method stub SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); try { // 转成直接返回 return simpleDateFormat.parse(source); } catch (ParseException e) { simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); try { return simpleDateFormat.parse(source); } catch (ParseException e1) { System.out.println("日期转换失败->" + this.getClass().getName()); } } // 如果参数绑定失败返回null return null; } }
XML配置如下
<!-- 日期时间数据绑定 需要放在mvc:annotation-driven 之前 防止未扫描注入容器总- --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="****.MyConverter" /> </list> </property> </bean>
很轻松的解决问题,
3,当然Spring是非常强大的还可以使用Formatter,Formatter比Converter更适合Converter是处理任意两类型间的转换,而Formatter是处理字符串和另一类型之间的转换的。
public class MyDateFormatter implements Formatter<Date> { @Override public String print(Date object, Locale locale) { // TODO Auto-generated method stub return null; } @Override public Date parse(String text, Locale locale) throws ParseException { // TODO Auto-generated method stub SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = null; try { date = format.parse(text); } catch (Exception e) { format = new SimpleDateFormat("yyyy-MM-dd"); date = format.parse(text); } return date; } }
XML配置如下:
<mvc:annotation-driven conversion-service="conversionService"/> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="formatters"> <set> <bean class="com.ivlo.crm.extend.MyDateFormatter"></bean> </set> </property> </bean>
原文转至: https://www.cnblogs.com/JNUX/p/6848311.html