什么是请求参数绑定
请求参数格式
默认是 key/value 格式, 比如: http:xxxx?id=1&type=2
请求参数值的数据类型
都是字符串类型的各种值
请求参数值要绑定的目标类型
Controller 类中的方法参数, 比如简单类型, POJO 类型, 集合类型等.
SpringMVC 内置的参数解析组件
默认内置了 24 种参数解析组件 (ArgumentResolver)
什么是参数绑定?
就是将请求参数串中的 value 值获取到之后, 在进行类型转换, 然后将转换后的值赋值给 Controller 类中方法的形参, 这个过程就是参数绑定
默认支持的参数类型 (Servlet API 支持)
Controller 方法形参中可以随时添加如下类型的参数, 处理适配器会自动识别并进行赋值.
HttpServletRequest
通过 request 对象获取请求信息
HttpServletResponse
通过 response 处理响应信息
HttpSession
通过 session 对象获取 session 中存放的对象
- InputStream,OutputStream
- Reader,Writer
- Model/ModelMap
ModelMap 继承自 LinkedHashMap,Model 是一个接口, 它们的底层实现都是同一个类 (BindingAwareModelMap), 作用就是向页面传递数据, 相当于 Request 的作用, 如下
绑定简单数据类型
简单类型参数绑定方式
简单类型指的就是 8 种基本类型数据以及它们的包装类, 还有 String 类型.
在 SpringMVC 中, 对于 java 简单类型的参数, 推荐的参数绑定方式有两种:
直接绑定
注解绑定
直接绑定
要求
http 请求参数的 key 和 controller 方法的形参名称一致
请求 URL
http://localhose:8080/xxx/findItem?id=1
请求参数的 key 为 id
Controller 方法
Controller 的形参为 Interger id, 它和请求参数的 key 一致, 所以直接绑定成功
- @RequestMapping(value = "/findItem")
- public String findItem(Integer id) {
- System.out.println("接收到的请求参数是:"+ id);
- return "success";
- }
注解绑定
要求
请求参数 key 和 controller 方法的形参名称不一致时, 需要使用 @RequestParam 注解才能将请求参数绑定成功.
请求 URL
http://localhost:8080/xxx/findItem?itemId=1
请求参数的 key 为 itemId
Controller 方法
Controller 的形参为 Integer id, 它和请求的参数不一致, 需要使用 @RequestParam 注解才能绑定成功
- @RequestMapping(value = "/findItem")
- // 通过 @RequestParam 注解绑定简单类型
- public String findItem(@RequestParam("itemId") Integer id) {
- System.out.println("接收到的请求参数是:"+ id);
- return "success";
- }
RequestParam 注解介绍
value: 参数名字, 即入参的请求参数名字, 如 value="itemId" 表示请求的参数中的名字为 itemId 的参数的值将传入
required: 是否必须, 默认是 true, 表示请求中一定要有响应的参数, 否则将报;
http Status 400 - Required Integer parameter 'xxx' is not present
defaultValue: 默认值, 表示如果请求中没有同名参数时的默认值
- @RequestMapping(value = "/findItem")
- // 通过 @RequestParam 注解绑定简单类型
- // 学习 @RequestParam 注解中的 value,required,defaultValue 属性
- public String findItem (
- @RequestParam(value = "itemId", required = true, defaultValue = "2") Integer id) {
- System.out.println("接收到的请求参数是:"+ id);
- return "success";
- }
绑定 POJO 类型
要求
控制器方法的参数类型是 POJO 类型.
要求表单中参数名称和 POJO 类的属性名称保持一致.
请求 URL
http://localhost:8080/xxx/updateItem?id=!&name=iPhone&price=1000
Controller 方法
POJO 定义:
Controller 方法
- @RequestMapping("/updateItem")
- public String updateItem(Integer id,Items item) {
- System.out.println("接收到的请求参数是:"+ id);
- System.out.println("接收到的请求参数是:"+ item);
- return "success";
- }
绑定包装 POJO
包装 POJO 类, 依然是一个 POJO, 只是说为了方便沟通, 将 POJO 中包含另一个 POJO 的这种类, 称之为包装 POJO.
包装对象
- public class ItemQueryVO {
- // 商品信息
- private Items item;
- }
页面定义 (item-list.jsp)
查询条件:
- <table width="100%" border=1>
- <tr>
- <td > 商品名称:<input type="text" name="items.name" /></td>
- <td><input type="submit" value="查询" /></td>
- </tr>
- </table>
Controller 方法
测试方法: 断点跟踪, 查看 vo 中的 item 对象是否有值
使用简单类型数组接收参数
要求
通过 HTTP 请求批量传递简单类型数据的情况, Controller 方法中可以用 String[] 或者 POJO 的 String[] 属性接收 (二选一), 但是不能使用集合接收.
请求 URL
http://localhost:8080/xxx/deleteItem?id=1&id=2&id=3
Controller 方法
- @RequestMapping("/deleteItem")
- public String deleteitem(Integer[] itemId){
- return "success";
- }
使用 POJO 类型集合或数组接收参数
要求
批量传递的请求参数, 最终要使用 List<POJO > 来接收, 那么这个 List<POJO > 必须放在另一个 POJO 类中.
接收商品列表的 POJO
- public class ItemQueryVO {
- // 商品信息
- private Item item;
- // 其他信息
- // 商品信息集合
- private List<Items> itemsList;
- }
请求 URL
- http://localhost:8080/xxx/batchUpdateItem?itemsList[0].id=1&itemsList[0].name=iPhone&itemsList[0].price=1000&itemsList[1].id=2&itemsList[1].name = 华为 & items[1].price=5000
- Controller
- @RequestMapping("/batchUpdateItem")
- public String batchUpdateItem(ItemQueryVO vo) {
- return "success";
- }
自定义参数绑定
请求 URL
http://localhost:8080/xxx/saveItem?date=2019-12-4
Controller 方法
- @RequestMapping("/saveItem")
- public String saveItem(String date){
- System.out.println("接收到的请求参数是:"+ date);
- return "success";
- }
但是如何将 date 参数的类型有 String 改为 Date, 则报错
自定义 Converter
- public class DateConverter implements Converter<String, Date> {
- @Override
- public Date convert(String source) {
- SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
- try {
- return simpleDateFormat.parse(source);
- } catch (ParseException e) {
- e.printStackTrace();
- }
- return null;
- }
- }
配置 Converter
在 springmvc.xml 中, 进行以下配置
- <!-- 加载注解驱动 -->
- <mvc:annotation-driven conversion-service="conversionService"/>
- <!-- 转换器配置 -->
- <bean id="conversionService"
- class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
- <property name="converters">
- <set>
- <bean class="com.cyb.ssm.controller.converter.DateConverter"/>
- </set>
- </property>
- </bean>
来源: https://www.cnblogs.com/chenyanbin/p/11980465.html