Spring注解之@RequestMapping(含参数详解)和@RequestParam、@RequestBody
前言
- 回顾ssm开发中,用到的注解,回顾ssm用到的技术点。
- @RequestMapping(含参数详解)和@RequestParam、@RequestBody的简单说明:https://blog.csdn.net/weixin_45433031/article/details/118229262
一、@RequestParam详解
@RequestParam主要用于将请求参数区域的数据映射到控制层方法的参数上
首先我们需要知道@RequestParam注解主要有哪些参数
1、value
请求中传入参数的名称,如果不设置后台接口的value值,则会默认为该变量名。比如上图中第一个参数如果不设置value="page",则前端传入的参数名必须为pageNum,否则在后台接口中pageNum将接收不到对应的数据
2、required
该参数是否为必传项。默认是true,表示请求中一定要传入对应的参数,否则会报404错误,如果设置为false时,当请求中没有此参数,将会默认为null,而对于基本数据类型的变量,则必须有值,这时会抛出空指针异常。如果允许空值,则接口中变量需要使用包装类来声明。
3、defaultValue
参数的默认值,如果请求中没有同名的参数时,该变量默认为此值。注意默认值可以使用SpEL表达式,如"#{systemProperties['java.vm.version']}"
如果在请求中传入多个同名参数,比如:url?userName=zhl&userName=holley时怎么办?
其实此时传入的数据格式是:"zhl,holley",即多个数据之间使用逗号分隔开,在后台接口中可以使用数组或者list类型的变量来接收:
public String requestparam8(@RequestParam(value="userName") String [] userNames) 或者 public String requestparam8(@RequestParam(value="list") List<String> list)
4、@PathVariable
绑定uri模板变量值:通过@PathVariable可以绑定占位符参数到方法参数中,例如:如果请求为"url/info/16",则spring会自动将16绑定到通过@PathVariable注解的同名变量uid上
5、@CookieValue绑定Cookie数据值
public String test(@CookieValue(value="SESSIONID", defaultValue="") String sessionId)
自动将SESSIONID的值绑定到字符串sessionId上,如果Cookie中没有sessionId时则默认为空
传入数据类型也可以是javax.servlet.http.Cookie类型
public String test2(@CookieValue(value="SESSIONID", defaultValue="") Cookie sessionId)
6、@RequestHeader绑定请求头数据
@RequestMapping(value="/header") public String test( @RequestHeader("User-Agent") String userAgent, @RequestHeader(value="Accept") String[] accepts)
如上配置将自动将请求头中的“User-Agent"值绑定到userAgent上,将"Accept"的值绑定到accepts上
7、@ModelAttribute绑定请求参数到命令对象
@ModelAttribute具有三个作用
1.绑定请求到命令对象:放在后台接口方法(控制层)的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用
2.暴露表单引用对象为模型数据:放在处理器的一般方法(非后台接口方法)上时,是为表单准备要展示的表单引用对象,如注册时需要选择所在的城市等,而且在执行后台接口方法之前,自动添加到模型对象中,用于视图页面展示时使用
3.暴露@RequestMapping方法返回值为模型数据:放在后台接口方法的返回值上时,世保禄处理方法的返回值为模型数据,用于视图页面的展示时使用
绑定请求参数到命令对象
如用户登录,我们需要捕获用户登录的请求参数(用户名、密码)并封装为用户对象,此时我们可以使用@ModelAttribute绑定多个请求参数到我们的命令对象。
public String test1(@ModelAttribute("user") UserModel user)
注解@ModelAttribute("user"),它的作用是将该绑定的命令对象以“user”为名称添加到模型对象中供视图页面展示使用。我们此时可以在视图页面使用${user.username}来获取绑定的命令对象的属性。
绑定请求参数到命令对象支持对象图导航式的绑定,如请求参数包含“?username=zhang&password=123&workInfo.city=bj”自动绑定到user中的workInfo属性的city属性中。
参看链接:https://www.cnblogs.com/zhlblogs/p/9553491.html
二、@RequestBody和@RequestParam区别
2.1区别简述
1、@RequestParam
用来处理 Content-Type
为 application/x-www-form-urlencoded
编码的内容,Content-Type
默认为该属性。也可以处理orm-data。
2、@RequestBody
接收的参数是来自requestBody中,即请求体。一般用于处理非 Content-Type: application/x-www-form-urlencoded编码格式的数据,比如:application/json、application/xml等类型的数据。就application/json类型的数据而言,使用注解@RequestBody可以将body里面所有的json数据传到后端,后端再进行解析。
GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。
POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用。
HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。
2.2post请求使用场景简单汇总
2.2.1 当后台用@RequestBody接收时
(@RequestBody Map map) (@RequestBody Object object) application/json时候可用 form-data、x-www-form-urlencoded时候不可用
2.2.2当后台用@RequestParam接收时
1、
(@RequestParam Map map)
application/json时候,json字符串部分不可用,url中的?后面添加参数即可用,form-data、x-www-form-urlencoded时候可用,但是要将Headers里的Content-Type删掉
2、
(@RequestParam String waterEleId,@RequestParam String enterpriseName) application/json时候,json字符串部分不可用,url中的?后面添加参数即可用 form-data、x-www-form-urlencoded时候可用,且参数可以没有顺序(即前端传过来的参数或者url中的参数顺序不必和后台接口中的参数顺序一致,只要字段名相同就可以),但是要将Headers里的Content-Type删掉
3、
(@RequestParam Object object)
不管application/json、form-data、x-www-form-urlencoded都不可用
2.2.3当后台未使用注解时
(Map map) (Object object) application/json时候:json字符串部分不可用,url中的?后面添加参数不可用。 因为没有指定,它也不知道到底是用json字符串部分还是?后面添加参数部分,所以干脆都不可以用 form-data、x-www-form-urlencoded时都不可用,见图二 (HttpServletRequest request) application/json不可用 form-data、x-www-form-urlencoded时可用
2.2.4使用postman的简单图示
2.3get请求
get请求只能使用@RequestParam。
参看链接:https://blog.csdn.net/weixin_38004638/article/details/99655322
三、开发中的使用
//Controller添加默认值 @RequestMapping(value="/roleDelete",method=RequestMethod.POST) public String roleDelete( @RequestParam(value = "number",defaultValue = PAGE_NUM) int number){}
四、其他
在所有的矛盾中,要优先解决主要矛盾,其他矛盾也就迎刃而解。
不要做个笨蛋,为失去的郁郁寡欢,聪明的人,已经找到了解决问题的办法,或正在寻找。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通