Spring MVC – 绑定date字段

对于表示string,数字和布尔值的请求参数,Spring MVC容器可以将它们绑定到开箱即用的types属性上。

你如何使Spring MVC容器绑定一个表示date的请求参数?

说到这个,Spring MVC如何确定给定请求参数的types?

谢谢!

Spring MVC如何确定给定请求参数的types?

Spring使用ServletRequestDataBinder来绑定它的值。 该过程可以描述如下

/** * Bundled Mock request */ MockHttpServletRequest request = new MockHttpServletRequest(); request.addParameter("name", "Tom"); request.addParameter("age", "25"); /** * Spring create a new command object before processing the request * * By calling <COMMAND_CLASS>.class.newInstance(); */ Person person = new Person(); 

 /** * And Then with a ServletRequestDataBinder, it bind the submitted values * * It makes use of Java reflection To bind its values */ ServletRequestDataBinder binder = ServletRequestDataBinder(person); binder.bind(request); 

在幕后, DataBinder实例在内部使用一个BeanWrapperImpl实例,负责设置命令对象的值。 使用getPropertyType方法,它将检索属性types

如果你看到上面提交的请求(当然,通过使用模拟),Spring将会调用

 BeanWrapperImpl beanWrapper = new BeanWrapperImpl(person); Clazz requiredType = beanWrapper.getPropertyType("name"); 

接着

 beanWrapper.convertIfNecessary("Tom", requiredType, methodParam) 

Spring MVC容器如何绑定一个表示date的请求参数?

如果你有需要特殊转换的数据的人性化表示,你必须注册一个PropertyEditor 。例如,java.util.Date不知道什么是13/09/2010,所以你告诉Spring

spring,通过使用下面的PropertyEditor转换这个人性化的date

 binder.registerCustomEditor(Date.class, new PropertyEditorSupport() { public void setAsText(String value) { try { setValue(new SimpleDateFormat("dd/MM/yyyy").parse(value)); } catch(ParseException e) { setValue(null); } } public String getAsText() { return new SimpleDateFormat("dd/MM/yyyy").format((Date) getValue()); } }); 

当调用convertIfNecessary方法时,Spring会查找任何已注册的PropertyEditor,它负责转换提交的值。 要注册你的PropertyEditor,你也可以

Spring 3.0

 @InitBinder public void binder(WebDataBinder binder) { // as shown above } 

旧式的Spring 2.x

 @Override public void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) { // as shown above } 

作为Arthur非常完整的答案的补充:在简单的Date字段的情况下,您不必实现整个PropertyEditor。 你可以使用一个CustomDateEditor来简单地传递date格式来使用它:

 //put this in your Controller //(if you have a superclass for your controllers //and want to use the same date format throughout the app, put it there) @InitBinder private void dateBinder(WebDataBinder binder) { //The date format to parse or output your dates SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); //Create a new CustomDateEditor CustomDateEditor editor = new CustomDateEditor(dateFormat, true); //Register it as custom editor for the Date type binder.registerCustomEditor(Date.class, editor); }