什么是请求参数绑定

请求参数格式

  默认是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简单类型的参数,推荐的参数绑定方式有两种:

  1. 直接绑定
  2. 注解绑定

直接绑定

要求

  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";
}

HttpServletRequest

    @RequestMapping("findUserById2")
public String findUserById2(Integer id, String name,Model model,HttpServletRequest request) {
System.out.println(MessageFormat.format("id:{0},name:{1}", request.getParameter("id"),request.getParameter("name")));
model.addAttribute("msg",MessageFormat.format("id:{0},name:{1}", request.getParameter("id"),request.getParameter("name")));
return "success";
}

除了HttpServletRequest,还支持HttpServletResponse、HttpSession、Model等。

注解绑定

要求

  请求参数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;
}
public class ItemQueryVO {
//商品信息
private Item item;
//商品信息集合,方式一
private List<Item> itemList;
//商品信息集合,方式二
//private Item[] itemList; public Item getItem() {
return item;
} public void setItem(Item item) {
this.item = item;
} public List<Item> getItemList() {
return itemList;
} public void setItemList(List<Item> itemList) {
this.itemList = itemList;
}
}

请求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>



SpringMVC 请求参数绑定的更多相关文章

  1. SpringMVC 完美解决PUT请求参数绑定问题(普通表单和文件表单)

    一 解决方案 修改web.xml配置文件 将下面配置拷贝进去(在原有的web-app节点里面配置 其它配置不变) <!-- 处理PUT提交参数(只对基础表单生效) --> <filt ...

  2. springmvc:请求参数绑定集合类型

    一.请求参数绑定实体类 domain: private String username; private String password; private Double money; private ...

  3. springmvc(2)--参数绑定

    一.以实例来看springmvc各种参数绑定方式   先定义个dto类: public class RestInDto implements Serializable { private static ...

  4. SpringMVC请求参数接收总结

    前提 在日常使用SpringMVC进行开发的时候,有可能遇到前端各种类型的请求参数,这里做一次相对全面的总结.SpringMVC中处理控制器参数的接口是HandlerMethodArgumentRes ...

  5. (转)SpringMVC学习(六)——SpringMVC高级参数绑定与@RequestMapping注解

    http://blog.csdn.net/yerenyuan_pku/article/details/72511749 高级参数绑定 现在进入SpringMVC高级参数绑定的学习,本文所有案例代码的编 ...

  6. SpringMVC请求参数接收总结(一)

    前提 在日常使用SpringMVC进行开发的时候,有可能遇到前端各种类型的请求参数,这里做一次相对全面的总结.SpringMVC中处理控制器参数的接口是HandlerMethodArgumentRes ...

  7. SpringMVC请求参数总结

    前提 在日常使用SpringMVC进行开发的时候,有可能遇到前端各种类型的请求参数,这里做一次相对全面的总结.SpringMVC中处理控制器参数的接口是HandlerMethodArgumentRes ...

  8. 2.5万字长文简单总结SpringMVC请求参数接收

    这是公众号<Throwable文摘>发布的第22篇原创文章,暂时收录于专辑<架构与实战>.暂定下一篇发布的长文是<图文分析JUC同步器框架>,下一篇发布的短文是&l ...

  9. springmvc请求参数异常统一处理

    1.ExceptionHandlerController package com.oy.controller; import java.text.MessageFormat; import org.s ...

随机推荐

  1. Python调试工具

    1. 日志 通过日志或者print来打印变量.必要时可以打印locals()和globals() 建议使用logging.debug()来代替print,这样到了正式环境,就可以统一删除这些日志. 2 ...

  2. Spring Boot2 系列教程(十九)Spring Boot 整合 JdbcTemplate

    在 Java 领域,数据持久化有几个常见的方案,有 Spring 自带的 JdbcTemplate .有 MyBatis,还有 JPA,在这些方案中,最简单的就是 Spring 自带的 JdbcTem ...

  3. Apache Solr Velocity模板注入RCE漏洞复现

    Apache Solr Velocity模板注入RCE漏洞复现 一.Apache Solr介绍 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于web-service的API接口,用户可以通 ...

  4. 如何使用git上传代码

    首先在github 上创建好远程仓库,并拷贝仓库地址,接下来按照以下步骤:   1.打开命令行进入要上传的文件目录,初始化 git init  2. 建立远程仓库,git remote add ori ...

  5. vue页面首次加载缓慢原因及解决方案

    第一次打包vue的项目部署到服务器下时,发现初次加载特别的缓慢,将近20s页面才加载出来,完全没有开发环境上的那么流畅.主要原因是页面在打包后如果不进行相关配置会导致资源文件特别的大,一次想要全部加载 ...

  6. phpStorm //todo 的用途

    用phpstorm看到别人的代码使用了注释//todo,且todo是彩色的 我想这个应该是有点用的吧,于是百度了下,大概是可能由于某些原因,导致部分代码没有写.但又怕忘了, 用//todo就可以做提示 ...

  7. Android原生PDF功能实现:PDF阅读、PDF页面跳转、PDF手势伸缩、PDF目录树、PDF预览缩略图

    1.背景 近期,公司希望实现安卓原生端的PDF功能,要求:高效.实用. 经过两天的调研.编码,实现了一个简单Demo,如上图所示. 关于安卓原生端的PDF功能实现,技术点还是很多的,为了咱们安卓开发的 ...

  8. Mysql常用数据类型归纳总结1

    一直在用Mysql数据库,Mysql的数据类型也最常打交道的.但关于Mysql的一些常用数据类型了解程度仅限于一知半解,仅仅能满足满足于平时一些最简单的操作.而Mysql常用数据类型的定义以及规范理解 ...

  9. 2019.11.11 洛谷月赛t3

    题目背景 由于Y校的老师非常毒瘤,要求\(zhouwc\)在\(csp\)考前最后\(3\)天参加期中考,\(zhouwc\)非常生气,决定消极考试,以涂完卡但全错为目标.现在\(retcarizy\ ...

  10. 工具类 ,无需再存localstorage

    /** * 工具类 */var Utils = { /** * 获得查询参数 */ getQueryString: function(name) { var search = location.sea ...