一 参数绑定过程
从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上 。
在springmvc中,接受页面提交的数据是通过方法形参来接收的。而不是在controller类定义成员变量接收。
默认支持的类型
直接在controller方法形参上定义下边类型的对象,就可以使用这些对象。在参数绑定过程中,如果遇到下边类型直接进行绑定。
- HttpServletRequest
通过request 对象获取请求信息 - HttpServletResponse
通过response处理响应信息 - HttpSession
通过session对象得到session中存放的对象 - Model/ModelMap
model是一个接口,modelmap是 一个接口实现
将model数据填充到request域。
二 简单类型绑定
简单类型:整型,字符串,单/双精度,布尔型
@RequestParam
常用于处理简单类型绑定
value:参数名字,即入参的请求参数名字,如value="id"表示请求的参数区中名字为id的参数的值将被传入
required:是否必须传入,默认是true,表示请求中一定要有相应参数,否则将报错
defaultValue:设置默认值,如果没有参数传入,将默认值和形参绑定
@RequestMapping("/editItems")
public String editItems(Model model,@RequestParam(value = "id",required = true,defaultValue = "1") Integer items_id) throws Exception {
ItemsCustom itemsCustom = itemsService.findItemsById(items_id);
model.addAttribute("itemsCustom", itemsCustom);
return "editItems";
}
三 pojo绑定
页面中input的name和controller的pojo形参中的属性名称一致,将页面数据绑定到pojo
@RequestMapping(value = "/editItemsSubmit")
public String editItemsSubmit(Integer id,ItemsCustom itemsCustom) throws Exception {
itemsService.updateItems(id,itemsCustom);
return "success";
}
1 POST请求乱码解决
注意 在配置web.xml文件时,一定要注意配置顺序
<!-- 解决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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2 GET请求乱码解决
修改Tomcat安装目录下conf子目录下的server.xml文件(解决get方式) 【注:记得先停掉服务器】
找到文件中类似这样的段落:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
在里面加上这样一段:URIEncoding="UTF-8" 即变成下面这段
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" />
最后重启Tomcat即可。
3 mybatis 传入多个参数(使用注解)
void updateItems(@Param("id") Integer id,@Param("itemsCustom") ItemsCustom itemsCustom) throws Exception;
xml
<update id="updateItems">
update items set
name=#{itemsCustom.name},
price=#{itemsCustom.price},
detail=#{itemsCustom.detail},
pic=#{itemsCustom.pic}
where
id = #{id};
</update>
四 自定义参数绑定
对于controller形参中pojo对象,如果属性中有日期类型,需要自定义参数绑定。将请求日期数据转成 日期类型,要转换的日期类型和pojo中日期属性的类型保持一致。
需要向处理器适配器中注入自定义的参数绑定组件
<!--代替配置映射器和适配器
向处理器适配器中注入自定义的参数绑定组件
-->
<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.controller.converter.CustomDateConverter"></bean>
</list>
</property>
</bean>
日期转换器
package com.controller.converter;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 日期转换器
* @author:Yang
* @date:2018/5/24
*/
public class CustomDateConverter implements Converter<String,Date> {
@Override
public Date convert(String s) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
try {
return simpleDateFormat.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
五 包装类型绑定
在形参中让包装类型的pojo接收查询条件参数
分析:页面传参的特点:复杂,多样性。条件包括:用户账号,商品编号,订单信息。。。如果将用户账号,商品编号,订单信息等等都放在简单pojo(属性是简单类型)中,pojo类属性多,混乱。
建议使用包装类型的pojo,pojo中的属性是pojo。
包装类型的pojo
package com.entity;
/**
* 商品包装对象
* @author: Y
* @date: 2018/4/23
*/
public class ItemsQueryVo{
/**
* 商品信息
*/
private Items items;
/**
* 为了系统可扩展性,对原始生成的po进行扩展
*/
private ItemsCustom itemsCustom;
public Items getItems() {
return items;
}
public void setItems(Items items) {
this.items = items;
}
public ItemsCustom getItemsCustom() {
return itemsCustom;
}
public void setItemsCustom(ItemsCustom itemsCustom) {
this.itemsCustom = itemsCustom;
}
}
页面name属性为包装类型pojo中的属性.具体属性
<form action="${pageContext.request.contextPath}/items/queryItems.action" method="post">
查询条件:
<table width="100%" border=1>
<tr>
<td>商品名称:<input type="text" name="itemsCustom.name" /></td>
<td><input type="submit" value="查询"/></td>
</tr>
</table>
</form>
六 数组类型绑定
需求 商品批量删除,用户选择多个商品,批量删除。
关键:将页面选择的多个商品id,传到controller方法的形参中
页面name
<td><input type="checkbox" value="${item.id}" name="items_id"/></td>
controller形参
@RequestMapping(value = "/deleteItems")
public String deleteItems(Integer[] items_id) throws Exception{
return "success";
}
七 list类型绑定
通常在需要批量提交数据时,将提交的数据绑定到list<pojo>中
页面定义
controller定义
1 进入批量商品修改页面
2 批量商品提交
使用list接收页面提交的批量数据,通过包装pojo接收,在包装pojo中定义list<pojo>属性
/**
* 批量修改商品提交
* 通过ItemsQueryVo接收批量提交的商品信息,将商品信息储存到itemsQueryVo中itemsList属性中
* @param itemsQueryVo
* @return
* @throws Exception
*/
@RequestMapping(value = "/editItemsAllSubmit")
public String editItemsAllSubmit(ItemsQueryVo itemsQueryVo) throws Exception{
return "success";
}