一、数据绑定介绍
将请求数据与后台方法参数建立连接的过程叫做SpringMVC的数据绑定。
主要分为简单数据绑定和复杂数据绑定。
关于图中的描述:
(1)Spirng MVC将ServletRequest 对象传递给数据绑定组件(DataBinder)。
(2)将处理方法的入参对象传递给DataBinder。
(3)DataBinder调用ConversionService组件进行数据类型转换/格式化等工作,并将对象值填充到参数对象中。
(4)调用Validator组件,对参数对象今夕数据校验。
(5)生成数据绑定结果BindingResult对象,赋值给方法的响应参数。
二、简单数据绑定
1、绑定默认数据类型
常用的默认参数类型
- HttpServletRequest:通过request对象获取请求。
- HttpServletResponse:通过response处理响应信息。
- HttpSession:通过Session对象得到session中的对象。
- Model/ModelMap:Mdoel是一个接口,ModelMap是一个接口实现,将model数据填充到request域。
以HttpServletRequest为例:
输入路径:http://localhost:8080/firstController?id=3
2、绑定简单数据类型
八种基本数据类型及对应的封装类型的绑定
@RequestMapping(value ="/firstController")
public String handleRequest(int id) {
System.err.println("id=" + id);
return "first";
}
注:前端请求的参数名可能与后台参数不一致,所有提供了@RequestParam注解
请求路径: http://localhost:8080/firstController?user_id=3
@RequestMapping(value ="/firstController")
public String handleRequest(@RequestParam(value = "user_id") int id) {
System.err.println("id=" + id);
return "first";
}
3、绑定POJO类型
POJO类型的绑定就是将所有关联的请求参数封装在一个POJO中,然后在方法中直接使用该POJO作为形参来完成数据绑定。
@RequestMapping(value ="/registerUser")
public String handleRequest(UserEntity userEntity) {
System.err.println(userEntity.getName());
System.err.println(userEntity.getPwd());
return "first";
}
public class UserEntity{
private Integer id;
private String name;
private String pwd;
...
...set get方法
}
4、绑定保证POJO类型
所谓的包装POJO,就是在一个POJO中包含另一个简单的POJO。例如订单对象中包含用户信息。
5、绑定自定义数据类型
日期数据需要自定义转换器(Converter)或格式化(Formatter)来进行绑定
(1)converter
//实现Converter 第一个是源类型, 第二个是目标类型(从String类型转成Date类型)
public class DateConverter implements Converter<String, Date> {
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public Date convert(String source) {
Date date = null;
try {
date = sdf.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
在springmvc-config.xml文件进行配置
<mvc:annotation-driven conversion-service="conversionService" />
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="converter.DateConverter" />
</set>
</property>
</bean>
@RequestMapping("/converterDate")
public String converterDate(Date date){
System.err.println(date);
return "first";
}
访问:http://localhost:8080/converterDate?date=2017-04-12 15:55:55
(2)formatter
//实现Formatter 目标类型
public class DateFormatter implements Formatter<Date> {
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public Date parse(String source, Locale locale) throws ParseException {
return sdf.parse(source);
}
@Override
public String print(Date date, Locale locale) {
return sdf.format(date);
}
}
在springmvc-config.xml文件进行配置
<mvc:annotation-driven conversion-service="conversionService" />
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="formatters">
<set>
<bean class="formatter.DateFormatter" />
</set>
</property>
</bean>
@RequestMapping("/converterDate")
public String converterDate(Date date){
System.err.println(date);
return "first";
}
访问:http://localhost:8080/converterDate?date=2017-04-12 15:55:55