跳至主要內容

4. @RequestMapping 注解详解

安图新大约 6 分钟

4. @RequestMapping 注解详解

@RequestMapping 注解

@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指定处理请求之后返回数据类型,例如application/json,text/html等。
produces指定返回的内容类型,当且仅当request请求头中的(Accept)类型中包含该指定类型才返回;

@RequestMapping 注解的使用

1. @RequestMapping 加到类上(给模块命名地址)

访问该类下的所有方法都需要有一个地址前缀 /test+具体方法的 path/value 才能访问

@Controller
@RequestMapping("test")
public class RequestMappingController {

     }

2. @RequestMapping 写在方法上
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 属性

consumes指定处理请求之后返回数据类型,例如application/jsontext/html

//设置处理请求之后返回值为json数据类型
@RequestMapping(value = "testConsumes",consumes="application/json")
public String testConsumes(@RequestBody User user, Model model) {

     }

2.6 produces 属性

produces用于指定返回的内容类型,当且仅当 request 请求头中的(Accept)类型中包含该指定类型才返回

//设置请求之后返回数据是json数据类型,且request的请求头中的要有(包含)该类型,才能返回
@RequestMapping(value = "testProduces ",consumes="application/json")
public String testProduces(@RequestBody User user, Model model) {

     }

2.7 配合使用@RequestParam 设置请求参数【***】

使用@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);
 }

2.8 配合使用@PathVariable,实现处理动态 URL【***】

@RequestParam@PathVariable区别:
  @RequestMapping是一个用来处理请求 URL 地址到处理器 controller 功能方法映射规则的请求参数的值
  @PathVariable是请求 URI 中的模版变量部分到处理器功能处理方法的方法参数上的绑定,用来匹配 URL 路径的规则和模式。

	//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 = strivedayurlValue = study

上次编辑于:
贡献者: Andy