springmvc参数绑定
1.spring参数绑定过程
从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上。
springmvc中,接收页面提交的数据是通过方法形参来接收。而不是在controller类定义成员变量接收!!!!
2.默认支持的类型
直接在controller方法形参上定义下边类型的对象,就可以使用这些对象。
在参数绑定过程中,如果遇到下边类型直接进行绑定。
1).HttpServletRequest
通过request对象获取请求信息
2).HttpServletResponse
通过response处理响应信息
3).HttpSession
通过session对象得到session中存放的对象
4).Model/ModelMap
model是一个接口,modelMap是一个接口实现 。
作用:将model数据填充到request域。
3.简单类型
通过**@RequestParam**对简单类型的参数进行绑定。
如果不使用@RequestParam,要求request传入参数名称和controller方法的形参名称一致,方可绑定成功。
如果使用@RequestParam,不用限制request传入参数名称和controller方法的形参名称一致。
通过required属性指定参数是否必须要传入,如果设置为true,没有传入参数,报下边错误:
1).pojo绑定
页面中input的name和controller的pojo形参中的属性名称一致,将页面中数据绑定到pojo。
页面定义:
controller的pojo形参的定义:
2).自定义参数绑定实现日期类型绑定
对于controller形参中pojo对象,如果属性中有日期类型,需要自定义参数绑定。
将请求日期数据串转成日期类型,要转换的日期类型和pojo中日期属性的类型保持一致。
所以自定义参数绑定将日期串转成java.util.Date类型。
需要向处理器适配器中注入自定义的参数绑定组件。
第一步:自定义日期类型绑定
public class CustomDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return sdf.parse(source); //直接转成返回
} catch (ParseException e) {
e.printStackTrace();
}
return null; //如果参数绑定失败返回null
}
}
第二步:配置方式
XML版本 - 在dispatcher-servlet.xml中配置自定义参数绑定器
<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.etc.ssm.controller.converter.CustomDateConverter">
</bean>
</list>
</property>
</bean>
JavaConfig配置类版本 - 在SpringMVCConfig中配置自定义参数绑定器
//自定义参数绑定器
@Override
public void addFormatters(FormatterRegistry registry) {
//将String -> Date的转换器,添加至参数绑定器
registry.addConverter(customStringDateConverter());
//....其它参数绑定器
}
//自定义的转换器
@Bean
public CustomStringDateConverter customStringDateConverter(){
return new CustomStringDateConverter();
}
第三步:其它方式
在Items类中,将Date类型的属性加上注解
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date createtime;
4.包装类型pojo参数绑定
1).需求
商品模糊查询:controller方法中实现商品查询条件传入。
2).实现方法
第一种方法:在形参中 添加HttpServletRequest request参数,通过request接收查询条件参数。
第二种方法:在形参中 让包装类型的pojo接收查询条件参数。
分析:
页面传参数的特点:复杂,多样性。条件包括 :用户账号、商品编号、订单信息。。。
如果将用户账号、商品编号、订单信息等放在简单pojo(属性是简单类型)中,pojo类属性比较多,比较乱。
建议使用包装类型的pojo,pojo中属性是pojo。
3).页面参数和controller方法形参定义
ItemsCustomMapper.xml
页面参数:
商品名称:<input name=“itemsCustom.name” />
注意:itemsCustom和包装pojo中的属性一致即可。
controller方法形参:
5.集合类型绑定
1).数组绑定
1.1 需求
商品批量删除,用户在页面选择多个商品,批量删除。
1.2 表现层实现
关键:将页面选择(多选)的商品id,传到controller方法的形参,方法形参使用数组接收页面请求的多个商品id。
Controller方法定义:
Service中:
JSP页面定义:
2).list绑定
2.1 需求
通常在需要批量提交数据时,将提交的数据绑定到list<pojo>中,比如:成绩录入(录入多门课成绩,批量提交)
本例子需求:批量商品修改,在页面输入多个商品信息,将多个商品信息提交到controller方法中。
2.2 表现层实现
controller方法定义:
1、显示:进入批量商品修改页面(页面样式参考商品列表实现)
2、修改:批量修改商品提交
Service方法中:
ItemsQueryVo类:
使用List接收页面提交的批量数据,通过包装pojo接收,在包装pojo中定义list属性
JSP页面定义:
<c:forEach items="${itemsList}" var="item" varStatus=”status”></c:forEach>
c:forEach 中的varStatus属性 该绑定值也就是status封装了当前遍历的状态
current 当前这次迭代的(集合中的)项 ;
index当前这次迭代从 0 开始的迭代索引;
count 当前这次迭代从 1 开始的迭代计数
first用来表明当前这轮迭代是否为第一次迭代的标志;
last用来表明当前这轮迭代是否为最后一次迭代的标志;
3).map绑定
也通过在包装pojo中定义map类型属性。
在包装类中定义Map对象,并添加get/set方法。
包装类中定义Map对象如下:
ItemsQueryVo类:
Contrller方法定义如下:
Service类:
JSP页面定义如下: