SpringMVC 请求参数绑定
什么是请求参数绑定
请求参数格式
默认是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";
}
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 请求参数绑定的更多相关文章
- SpringMVC 完美解决PUT请求参数绑定问题(普通表单和文件表单)
一 解决方案 修改web.xml配置文件 将下面配置拷贝进去(在原有的web-app节点里面配置 其它配置不变) <!-- 处理PUT提交参数(只对基础表单生效) --> <filt ...
- springmvc:请求参数绑定集合类型
一.请求参数绑定实体类 domain: private String username; private String password; private Double money; private ...
- springmvc(2)--参数绑定
一.以实例来看springmvc各种参数绑定方式 先定义个dto类: public class RestInDto implements Serializable { private static ...
- SpringMVC请求参数接收总结
前提 在日常使用SpringMVC进行开发的时候,有可能遇到前端各种类型的请求参数,这里做一次相对全面的总结.SpringMVC中处理控制器参数的接口是HandlerMethodArgumentRes ...
- (转)SpringMVC学习(六)——SpringMVC高级参数绑定与@RequestMapping注解
http://blog.csdn.net/yerenyuan_pku/article/details/72511749 高级参数绑定 现在进入SpringMVC高级参数绑定的学习,本文所有案例代码的编 ...
- SpringMVC请求参数接收总结(一)
前提 在日常使用SpringMVC进行开发的时候,有可能遇到前端各种类型的请求参数,这里做一次相对全面的总结.SpringMVC中处理控制器参数的接口是HandlerMethodArgumentRes ...
- SpringMVC请求参数总结
前提 在日常使用SpringMVC进行开发的时候,有可能遇到前端各种类型的请求参数,这里做一次相对全面的总结.SpringMVC中处理控制器参数的接口是HandlerMethodArgumentRes ...
- 2.5万字长文简单总结SpringMVC请求参数接收
这是公众号<Throwable文摘>发布的第22篇原创文章,暂时收录于专辑<架构与实战>.暂定下一篇发布的长文是<图文分析JUC同步器框架>,下一篇发布的短文是&l ...
- springmvc请求参数异常统一处理
1.ExceptionHandlerController package com.oy.controller; import java.text.MessageFormat; import org.s ...
随机推荐
- Linux 操作点滴
1. 查找文件内容 find -type f -name '*' | xargs grep '' 2. 查看所有环境变量 env 3. so动态库文件查找路径:/lib /usr/lib / ...
- Linux nfs服务介绍
nfs服务介绍 nfs(Network File System) 网络文件系统,能使用户访问服务器的文件系统,就像访问自己的本机的文件系统一样,并且多个 客户端共享访问该文件系统. 目前nfs服务,较 ...
- 提高首屏页面加载速度,解决vue-cli打包后单个文件过大的问题
本教程是针对vue-cli3以上的版本,其实原理都大同小异,这个demo为vue-cli直接创建的项目,并在main.js中引入了echart.element-ui.lodash 首先看demo打包后 ...
- 你遇到了吗?Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.fs.FileAlreadyExistsException)
我在使用 Structured Streaming 的 ForeachWriter,写 HDFS 文件时,出现了这个异常 这个异常出现的原因是HDFS作为一个分布式文件系统,支持多线程读,但是不支持多 ...
- 对比讲解lambda表达式与传统接口函数实现方式
在本号之前写过的一些文章中,笔者使用了lambda表达式语法,一些读者反映说代码看不懂.本以为java 13都已经出了,java 8中最重要特性lambda表达式大家应该都掌握了,实际上还是存在大量的 ...
- 建议收藏:.net core 使用导入导出Excel详细案例,精心整理源码已更新至开源模板
还记得刚曾经因为导入导出不会做而发愁的自己吗?我见过自己前同事因为一个导出改了好几天,然后我们发现虽然有开源的库但是用起来却不得心应手,主要是因为百度使用方案的时候很多方案并不能解决问题. 尤其是尝试 ...
- 学习笔记48_Memcache跟用户登录模块结合
public interface ICacheWriter { void AddCache(string key,object value, DateTime expDate); void Add ...
- 搞清楚 Python 的迭代器、可迭代对象、生成器
很多伙伴对 Python 的迭代器.可迭代对象.生成器这几个概念有点搞不清楚,我来说说我的理解,希望对需要的朋友有所帮助. 1 迭代器协议 迭代器协议是核心,搞懂了这个,上面的几个概念也就很好理解了. ...
- 最新JetBrainsPyCharm自动部署Python(Django,tornado等)项目至远程服务器
每次开发Python项目时,对于所有Python开发人员来说,最枯燥的不是修改代码,而是实时将自己的代码上传至远程服务器,进行测试或者部署,本人最初开发也是这样,通过使用Xshell 5,WinSCP ...
- 如何提高web应用的吞吐量
这篇博文所列举的优化手段是针对比较传统项目,但是想提高系统的吞吐量现在时髦的技术还是那些前后端未分离, 使用nginx当成静态资源服务器去代理我们的静态资源 是谁限制了Throughput? 当我们对 ...