一、Spring请求参数绑定流程:
1、请求参数绑定流程:
我们在开发的时候,经常会从html,jsp中将请求参数通过request对象传递到后台,可是经常会遇到这么一种情况,那就是传过来的数据到后台后,还要再组装成一种对象的格式。
2、Spring中请求参数绑定:
Spring可以自动将request中的请求参数数据绑定到对象的每个property上,但是只会绑定一些简单数据类型(比如Strings,int,float)到对应的对象中。可是如果面对复杂的对象,那就要借助PropertyEditor接口来帮助我们完成复杂对象的绑定。
PropertyEditor这个接口提供了两个方法,一个方法是将String类型的值转成property对应的数据类型,另一个方法是将property转成String。
3、CustomDateEditor继承关系:
4、示例代码:
@InitBinder
public void InitBinder(WebDataBinder binder) {//前端传入的时间格式必须是"yyyy-MM-dd"效果!DateFormat df = new SimpleDateFormat("yyyy-MM-dd");CustomDateEditor dateEditor = new CustomDateEditor(df, true);binder.registerCustomEditor(Date.class, dateEditor);
}
二、@InitBinder详解:
1、@InitBinder注解简介:
@InitBinder作用于@Controller中的方法,表示为当前控制器注册一个属性编辑器,对WebDataBinder进行初始化,且只对当前的Controller有效,一般用做BaseController对数据进行预处理操作。
2、@InitBinder执行时机:
@InitBinder注解被解析的时机,是其所标注的方法,在该方法被请求执行之前。同时@InitBinder标注的方法是可以多次执行的,也就是说来一次请求就执行一次@InitBinder解析。
3、@InitBinder执行原理:
当某个Controller上的第一次请求,由于SptingMVC前端控制器匹配到该Controller之后,根据Controller的class类型来查找所有标注了@InitBinder注解的方法,并且存入RequestMappingHandlerAdapter里的initBinderCache缓存中。等下一次请求执行对应业务方法之前,会先走initBinderCache缓存,而不再去解析@InitBinder。
4、@InitBinder的使用:
@InitBinder注解的方法可以对WebDataBinder初始化;WebDataBinder是用于表单到方法的数据绑定的,WebDataBinder中有很多方法可以对数据绑定进行具体的设置:
1)比如我们设置name属性为非绑定属性(也可以设置绑定值setAllowedFields):
@InitBinder
public void initBinder(WebDataBinder binder) {binder.setDisallowedFields("name");
该字段在表单提交时就不会提交上去。
2)对页面数据进行解析绑定:
以时间为例,在Controller中接收的是Date类型,而请求的参数为String类型时,如果没有加@InitBinder的效果:
@Controller
public class MyController {@RequestMapping("baseTest")@ResponseBodypublic String baseTest(Date date){return String.valueOf(date);}
}
页面结果:由于语法格式有误,服务器无法理解此请求
有两种实现方式:
- 使用Spring提供的实现类CustomDateEditor
public class BaseController {@InitBinderprotected void initBinder(WebDataBinder binder){SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");binder.registerCustomEditor(Date.class,new CustomDateEditor(dateFormat, true));}
- 自定义实现类MyDateEditor
public class BaseController {@InitBinderprotected void initBinder(WebDataBinder binder){binder.registerCustomEditor(Date.class,new MyDateEditor());}private class MyDateEditor extends PropertyEditorSupport{@Overridepublic 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) {}}setValue(date);}}
}
运行结果:
更多例子可以参考:springMVC之@InitBinder的用法
参考文章:SpringMVC中@InitBinder注解介绍与使用
参考文章:SpringBoot2教程29整合SpringMVC之@InitBinder处理请求参数的绑定