spring参数绑定过程
概念:从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法形参上。
springmvc中,接受页面提交的数据是通过方法形参来接收,而不是在controller类定义成员变量来接收
第一步: 客户端请求:key/value请求
第二步:处理器适配器调用springmvc 提供参数绑定组件将key/value数据转成controller方法的形参
参数绑定组件:在springmvc早期版本使用PropertyEditor(只能讲字符串转成java对象)
后期使用converter(进行任意类型的转换)
springmvc提供了许多converter(转换器)
在特殊情况下需要自定义converter,对日期数据类型需要自定义converter。
第三步:controller方法(形参)
默认支持的类型
直接在controller方法形参上定义下边类型的对象,就可以使用这些对象。
在参数绑定过程中如果遇到下边的类型直接进行绑定
1、HttpServletRequest
通过request对象获取请求信息
2、HttpServletResponse
通过response处理响应信息
3、HttpSession
通过session对象得到session中存放的对象
4、Model/ModelMap
model是一个接口 modelMap是一个接口实现
作用:将model数据填充到request域
除了以上还支持简单类型
简单类型
通过@RequestParam来对简单类型的参数进行绑定。
如果不使用@RequestParam,要求request传入的参数名称和controller方法的形参名称一致方可绑定成功。
如果使用@RequestParam,不用限制request传入的参数名称和controller方法的形参名称一致。
@RequestParam(value="id",required = true,defaultValue ="2" )Integer items_id
其中value里面指定request传入参数名称和形参绑定
通过required属性指定参数是否必须传入
通过defaultValue可以设置默认值。如果id参数没有传入,则将默认值和形参绑定
简单类型包括
整型(Integer) 字符串(String) 单精度/双精度(float/double) 布尔型(boolean)
pojo绑定
1、简单对象绑定
页面中input的name和controller的pojo形参中的属性名称一致,将页面中数据绑定到pojo 。
2、包装类型绑定
需求:当单独实体类满足不了需求 或者 需要传入不同的pojo其中有相同名字的参数
实现方法:
第一种方法:在形参中,通过HttpServletRequest接收查询参数
第二种方法:用包装类接收查询参数
分析:
页面 传参特点:复杂,多样性。
如果将用户账号、商品编号、订单信息放在简单pojo中,pojo类属性比较多而复杂,
建议使用包装类型的pojo,pojo属性是pojo。
controller方法形参:
public ModelAndView queryItems(HttpServletRequest request,QueryVo,vo){}
此种方法要求在页面中传参使用以下形式:
<input name="itemCustom.name"/>
包装类型定义为:
public class QueryVo{
private Item items;
private ItemsCustom itemCustom;
}
自定义参数绑定实现日期类型绑定
对于controller形参中有pojo对象,如果属性中有日期类型,需要自定义参数绑定。
将请求日期数据串转成日期类型,要转换的日期类型和pojo中日期属性的类型保持一致。
这里讲述自定义参数绑定将日期字符串转成java.util.Date类型
需要向处理器适配器中注入参数绑定组件
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<!--日期类型转换-->
<bean class="com.evergrande.hdtms.web.converter"></bean>
</list>
</property>
</bean>
定义converter类实现转换功能
public class converter implements Converter<String, Date> {
@Override
public Date convert(String s) {
//实现将日期串类型转换成日期类型(格式是yyyy-MM-dd HH:mm:ss)
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return simpleDateFormat.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
//如果参数绑定失败返回null
return null;
}
}
集合绑定
集合绑定通常包括数组,List,以及map 一般与包装类型的实现相似,不过多介绍。