赞
踩
@RequestMapping是一个用来处理请求地址到处理器controller功能方法映射规则的注解,这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法controller上,可用于类或方法上。注解在类上,表示类中的所有响应请求的方法都是以该地址作为父路径(模块路径)。
属性名: 描述:
value(path) 指定请求的实际访问地址,默认@RequestMapping("url")的值url即为value的值。指定的地址可以是 URI Template 模式。
method 指定请求的method类型,主要有 GET、POST、DELETE、PUT等;
params 指定request中必须包含某些参数值,包含才让该方法处理请求。
headers 指定request中必须包含某些指定的header值,包含才能让该方法处理请求。
consumes 指定处理请求的提交内容类型(Content-Type),例如:application/json, text/html;
produces 指定返回的内容类型,当且仅当request请求头中的(Accept)类型中包含该指定类型才返回;
访问该类下的所有方法都需要有一个地址前缀 /test+具体方法的path/value才能访问
- @Controller
- @RequestMapping("test")
- public class RequestMappingController {}
2.1 直接写字符串值/value/path,调用当前项目地址/模块/testMapping访问,
- @RequestMapping("testMapping")
- public String testMapping(){
- return "requestmappingsuccess";//视图解析器前后缀拼接返回页面地址
- }
- //或者下面方法都行
- @RequestMapping(value = "testMapping")
- @RequestMapping(path = "testMapping")
-
2.2 配置多个链接映射
- //通过 /test1 /test2 /test3 和/testurl/下的所有子模块 都能访问
- @RequestMapping({"/test1","/test2","/test3","testurl/*"})
- @RequestMapping(value = {"/test1","/test2","/test3",,"testurl/*"})
- @RequestMapping(path = {"/test1","/test2","/test3",,"testurl/*"})
2.2 method属性的使用
method如果不设置,任何属性都可以访问到,如果设置了,只能访问到设置的提交方式的请求方式。
4种取值:
RequestMethod.GET
RequestMethod.POST
RequestMethod.PUT
RequestMethod.DELETE
如果设置了method的值,就只能支持设置值的请求方式,其它请求方式不支持,就会报405错误 – Method Not Allowed
- //设置只支持post请求
- @RequestMapping(path="testMethod",method = {RequestMethod.POST})
- //设置只接收get请求
- @RequestMapping(path="testMethod",method = {RequestMethod.GET})
2.3 param属性
指定request中必须包含某些参数值,包含才让该方法处理请求。
- //请求中必须要有参数username(页面中的name值),且参数值要为striveday才执行该方法
- @RequestMapping(value="/testParam", params="username = strivedaay")
- //请求中必须要有参数username(页面中的name值),且参数值不为striveday才执行该方法
- @RequestMapping(value="/testParam", params="username != strivedaay")
2.4 headers属性
指定request请求作用域中必须包含某些指定的header值,包含才能让该方法处理请求。
- @RequestMapping(value="testHeaders",headers={"context-type=text/plain","context-type=text/html"})
- public String testHeaders(){}
上述访问,如果请求头中不包含context-type=text/plain,context-type=text/html这两个属性,那么就不能访问到该方法,报404错误。
2.5 consumes属性
cousumes的样例:
- @Controller
- @RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")
- public void addPet(@RequestBody Pet pet, Model model) {
- // implementation omitted
- }
方法仅处理request Content-Type为“application/json”类型的请求。
2.6 produces属性
produces的样例:
- @Controller
- @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")
- @ResponseBody
- public Pet getPet(@PathVariable String petId, Model model) {
- // implementation omitted
- }
方法仅处理request请求中Accept头中包含了"application/json"的请求,同时暗示了返回的内容类型为application/json;
------------------------------------------------------------------------------------------
2.7 配合使用@RequestParam设置请求参数【url中的?后面参数可以用@RequestParam】
@RequestParam用来处理 Content-Type 为 application/x-www-form-urlencoded 编码的内容,Content-Type默认为该属性。@RequestParam也可用于除GET外其它类型的请求,例如:POST、DELETE等请求。
使用@RequestParam可以将HTTP请求参数绑定到controller中方法的参数上,实现页面传入参数(name的值)和方法接收参数列表的形式参数名不一致也能进行参数绑定(赋值)
- @RequestParam注解有三个属性
-
- value:注解中value值要和页面传入的参数名一致。
- required : 默认值为true,表示该参数必须给值 ,如果没有给这个值,则出现400页面。
- defaultValue = “striveday” :如果给了参数,就获取,如果没有给参数,则默认为striveday。
-
- 【小技巧1】@RequestParam默认情况下必须指定参数,可以通过设置required = false,来实现指定参数可选,这样请求不带@RequestParam指定的value参数也可以访问该方法。
- 【小技巧2】可以设置defaultValue的值,这样就算请求的value参数不带值,就会被defaultValue设置一个默认值,也可以访问该方法。
- 【小知识1】所有从页面传到后台的数据都是String类型,通过request.getParameter()获取的也是String数据类型,但是Spring会自动的进行String和八大基本数据类型转换。
- 【小知识2】400错误(HTTP Status 400):是指错误的请求,url提供的参数和方法指定接收的参数不一致,数类型、个数不一致,参数name名称不一致等等
比如页面传入一个参数username = striveday,可以通过注解@RequestParam()来指定,实现方法参数名和页面传过来的请求参数名不一致也能赋值。
- //通过@RequestParam让页面传入的参数username赋值给方法参数列表的name
- @RequestMapping("testRequestParam")
- public String getUsername(@RequestParam("username") String name){
- System.out.println("username = " + name);
- }
@RequestParam注解详解
1、作用:
@RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)可以接受简单类型的属性,也可以接受对象类型。
2、语法:
语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)
value:参数名
required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。
defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
3、业务处理Controller
- @Controller
- @RequestMapping("hello")
- public class HelloController2 {
-
- /**
- * 接收普通请求参数
- * http://localhost:8080/hello/show16?name=linuxsir
- * url参数中的name必须要和@RequestParam("name")一致
- * @return
- */
- @RequestMapping("show16")
- public ModelAndView test16(@RequestParam("name")String name){
- ModelAndView mv = new ModelAndView();
- mv.setViewName("hello2");
- mv.addObject("msg", "接收普通的请求参数:" + name);
- return mv;
- }
-
- /**
- * 接收普通请求参数
- * http://localhost:8080/hello/show17
- * url中没有name参数不会报错、有就显示出来
- * @return
- */
- @RequestMapping("show17")
- public ModelAndView test17(@RequestParam(value="name",required=false)String name){
- ModelAndView mv = new ModelAndView();
- mv.setViewName("hello2");
- mv.addObject("msg", "接收普通请求参数:" + name);
- return mv;
- }
-
- /**
- * 接收普通请求参数
- * http://localhost:8080/hello/show18?name=998 显示为998
- * http://localhost:8080/hello/show18?name 显示为hello
- * @return
- */
- @RequestMapping("show18")
- public ModelAndView test18(@RequestParam(value="name",required=true,defaultValue="hello")String name){
- ModelAndView mv = new ModelAndView();
- mv.setViewName("hello2");
- mv.addObject("msg", "接收普通请求参数:" + name);
- return mv;
- }
- }
4、测试:
参考地址:@RequestParam注解使用_一叶知秋-CSDN博客_@requestparam
-------------------------------------------------------------------------------
2.8 配合使用@RequestBody设置请求参数
@RequestBody
该注解常用来处理Content-Type: 不是application/x-www-form-urlencoded
编码的内容,处理application/json的入参的
@RequestBody接收的参数是来自RequestBody中,即请求体中,就application/json类型的数据而言,使用注解@RequestBody可以将body里面所有的json数据传到后端,由后端用jackson或者fastjson来解析。
-----------------------------------------------------------------------------------
2.7和2.8小结: @RequestParam与@RequestBody使用对比 - 香吧香 - 博客园
- 1. @RequestBody和@RequestParam都是用来处理请求参数映射的,只是涉及场景不同
- 2. form-data、x-www-form-urlencoded:不可以用@RequestBody;
- 3. application/json:json字符串部分可以用@RequestBody;url中的?后面参数可以用@RequestParam
区别 | @RequestParam | @RequestBody |
---|---|---|
content-type | 仅支持x-www-form-urlencoded | json(常用), xml |
请求类型 | 所有 | 除了GET(实测支持) |
注解个数 | 可多个 | 只能有一个 |
多条件查询实现:
1、使用get请求用万能map或实体接收url中条件数据
2、使用post请求用实体接收条件数据
备注:Post请求可以同时在url中传递参数并接收body体!
--------------------------------------------------------------------------------------
2.9 配合使用@PathVariable,实现处理动态URL【***】
@RequestParam和@PathVariable区别:
@RequestParam是一个用来处理请求URL地址到处理器controller功能方法映射规则的请求参数的值
@PathVariable是请求 URI 中的模版变量部分到处理器功能处理方法的方法参数上的绑定,用来匹配URL路径的规则和模式。
举例1:@PathVariable("urlValue") String username
- //testPathVariable/{urlValue} 其中urlValue是占位符
- //以前的url是 /testPathVariable?urlvalue=值 现在变成了/testPathVariable/值
- @RequestMapping(value = "/testPathVariable/{urlValue}", method = RequestMethod.GET)
- public String getUrlValue (@PathVariable("urlValue") String username){
- System.out.println("urlValue = " + username);
- return username;
- }
上面这个方法访问localhost:8080/testPathVariable/参数值,不管参数值是什么,都会访问该方法,但是不同的参数值,都会赋值给方法的形式仓鼠username这个。比如你访问localhost:8080/testPathVariable/striveday和访问localhost:8080/testPathVariable/study都会访问该方法getUrlValue,但是他们的赋值给username不同,输出结果分为urlValue = striveday和urlValue = study
举例2:@PathVariable String ownerId
- @Controller
- @RequestMapping("/owners/{ownerId}")
- public class RelativePathUriTemplateController {
-
- @RequestMapping("/pets/{petId}")
- public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
- // implementation omitted
- }
- }
上面代码把URI template 中变量 ownerId的值和petId的值,绑定到方法的参数上。若方法参数名称和需要绑定的uri template中变量名称不一致,需要在@PathVariable("name")指定uri template中的名称。
-----------------------------------------------------------------------------------
3.0 @RequestHeader 注解
@RequestHeader 注解,可以把Request请求header部分的值绑定到方法的参数上。
示例代码:
这是一个Request 的header部分:
- Host localhost:8080
- Accept text/html,application/xhtml+xml,application/xml;q=0.9
- Accept-Language fr,en-gb;q=0.7,en;q=0.3
- Accept-Encoding gzip,deflate
- Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
- Keep-Alive 300
- @RequestMapping("/displayHeaderInfo.do")
- public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding,
- @RequestHeader("Keep-Alive") long keepAlive) {
-
- //...
-
- }
上面的代码,把request header部分的 Accept-Encoding的值,绑定到参数encoding上了, Keep-Alive header的值绑定到参数keepAlive上。取自优秀博客:Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解 - IT·达人 - 博客园
@RequestPart使用:
@RequestPart注解用于处理文件上传请求,可以直接将文件封装成Java对象。
在处理文件上传时,需要使用multipart/form-data编码方式,并且表单中的name值需要和@RequestPart注解中的value值一致。注意:使用@RequestPart
注解时,必须同时指定Content-Type
为multipart/form-data
,否则会抛出异常。
- @Controller
- @RequestMapping("/user")
- public class UserController {
- @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
- public ResponseEntity<String> uploadFile(@RequestPart MultipartFile file, @RequestParam String description) {
- // 处理文件和参数
- }
- }
@RequestParam、@RequestBody、@RequestAttribute、@RequestPart和@PathVariable详解和具体示例-CSDN博客
@RequestAttribute使用:
使用场景:从request中取对应的属性值。 注意:属性和参数是不同的。
很多小伙伴可能对 参数(parameter)和属性(Attribute)的区别不是很了解。简单一句话,参数是需要用户或者浏览器传,属性是我们拦截请求写入或者修改的。比如:httpServletRequest.setAttribute(name, value))
如果我们想在controller层中获取绑定属性值到一个参数,此时就可以使用@RequestAttribute
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。