参数绑定
1、springmvc参数绑定过程
从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到Controller的形参上
springmvc中,接收页面提交的数据是通过方法的形参来接收,而不是在Controller类定义成员变量接收!
2、默认支持的类型
直接在Controller方法的形参上定义下面类型的对象,就可以使用它们。在参数绑定的过程中,如果遇到下面的类型,就直接进行绑定
HttpServletRequest
通过request对象获取请求信息
HttpServletResponse
通过response处理响应信息
HttpSession
通过session对象得到session中存放的对象
Model/ModelMap
model是一个接口,modelMap是一个接口实现
作用:将model数据,填充到request域
3、简单类型
如:
@RequestMapping(value = "/editItems",method = {RequestMethod.POST,RequestMethod.GET})
public String editItems(Model model,Integer id) throws Exception{
//调用service 根据商品ID查询商品信息
ItemsCustom itemsCustom = itemsService.findItemsById(id);
//通过形参中的model将model的数据传到页面
//相当于modelandview的addObject
model.addAttribute("itemsCustom",itemsCustom);
return "items/editItems";
}
可以直接在接收参数的括号里添加变量(形参变量),接收简单类型的数据,在这里,
request传入的参数名要和Controller形参定义的变量名一致
我们可以通过@RequestParam 对简单类型的参数进行绑定,可以不用限制request传入的参数名要和Controller形参定义的变量名一致
用法:
@RequestMapping(value = "/editItems",method = {RequestMethod.POST,RequestMethod.GET})
//@RequestParam 指定request传入的参数名,即可和形参进行绑定
public String editItems(Model model, @RequestParam(value = "id")Integer items_id) throws Exception{
//调用service 根据商品ID查询商品信息
ItemsCustom itemsCustom = itemsService.findItemsById(items_id);
//通过形参中的model将model的数据传到页面
//相当于modelandview的addObject
model.addAttribute("itemsCustom",itemsCustom);
return "items/editItems";
}
还可以通过@RequestParam里的required属性指定参数是否必须要传入:
// 通过required属性指定参数是否必须要传入
public String editItems(Model model, @RequestParam(value = "id",required = true)Integer items_id) throws Exception{
defaultValue还可以设定默认值
4、绑定pojo
页面中input标签的name属性Controller的pojo形参中的属性名一致,可将页面中的数据,直接绑定至pojo内
页面定义:
<tr>
<td>商品名称</td>
<td><input type="text" name="name" value="${itemsCustom.name }"/></td>
</tr>
<tr>
<td>商品价格</td>
<td><input type="text" name="price" value="${itemsCustom.price }"/></td>
</tr>
pojo类形参定义:
private String name;
private Float price;
才可成功绑定
5、自定义参数绑定
对于Controller形参中的pojo对象,如果属性中有日期类型,就需要自定义参数绑定。
将请求的日期数据串转换成日期的类型。要转换的日期类型要和pojo中日期属性的类型保持一致。
pojo:
private Date createtime;
自定义参数绑定要将日期串转成java.util.date类型
需要向处理器适配器中注入自定义的参数帮固定组件
自定义的日期转换器:
public class CustomDateConverter 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();
}
//若参数绑定失败,则返回空值
return null;
}
}
配置方式
在springmvc.xml的适配器映射器扫描器中配置:
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
定义converter:
<!-- 自定义参数绑定 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 转换器 -->
<property name="converters">
<list>
<!-- 日期类型转换 -->
<bean class="com.alex.ssm.controller.converter.CustomDateConverter"/>
</list>
</property>
</bean>
”
即可实现自定义的参数绑定
问题
1、post乱码
在web.xml中添加post乱码过滤器
<!-- post乱码过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>