03.springMVC请求控制

139 阅读4分钟

RequestMapping

1. 注解的功能

@RequestMapping注解为控制器指定可以处理哪些 URL 请求。在类和方法上均可以标注 ① 标记在类上:提供初步的请求映射信息。 ② 标记在方法上:提供进一步的细分映射信息。

@Controller
@RequestMapping("/laoma")
public class MyController {
    @RequestMapping("/first")
    public String first() {
        System.out.println("hello world");
        return "first";
    }
}

如这里的注解:拼在一起就是:/laoma/first

@RequestMapping作用

DispatcherServlet 截获请求后,就是通过 @RequestMapping 提供的映射信息确定请求所对应的处理方法。

特别说明:

理论上不管是类上还是方法上映射路径的第一个”/“是可以省略的。但是为了规范,建议第一个反斜线都保留

2. 参数说明

参数值参数说明
value或path定义处理方法的请求 URL 地址。这可以是字符串或字符串数组。 @RequestMapping("/hello") 将请求映射到/hello到注解方法上。
method映射到处理程序方法的 HTTP 方法。这可以是RequestMethod枚举值或枚举值数组。 method=RequestMethod.GET,仅将GET方式的请求映射到注解方法上。
params要映射到处理程序方法的请求参数。这可以是形式为 "param=value" 的字符串或字符串数组 params="name=laoma",仅将等于"laoma"的name参数的请求映射到注解方法上。
headers要映射到处理程序方法的请求头。这可以是形式为 "header=value" 的字符串或字符串数组。 headers = "X-MyHeader=MyValue",仅将表头中X-MyHeader=MyValue映射到注解方法上
consumes可以接受请求请求媒体类型。这可以是字符串或字符串数组。 consumes="application/json",仅将Content-Type为application/json映射到注解方法上。
produces响应报文的媒体类型。可以是字符串或字符串数组。 produces="application/json",返回类型为json数据

RequestMapping示例

1. 不加首反斜线

@Controller
@RequestMapping("test")
public class MyController2 {
​
    @RequestMapping("hello")
    public String hello() {
        System.out.println("hello world");
        return "first";
    }
}

postman测试请求:

image-20230323131520031

注意:

虽然也是可以的。但为了编码规范,我们均加首个反斜线

2. 请求映射value或path

@RequestMapping(value = {"hello", "hello2.json"})
public String hello() {
    System.out.println("hello world");
    return "first";
}

这样不管是请求:

都会和1例中返回的结果一样的。

3. 控制请求方式method

// 这里控制方法仅仅用GET方式才能请求
@RequestMapping(value = "hello2", method = RequestMethod.GET)
public String hello2() {
    System.out.println("hello world");
    return "first";
}

postman发送请求时采用POST方式,报错如下:

image-20230323133642417

4. 控制请求参数params

参数格式描述
param表示请求中必须包含名为param的参数
!param表示请求中不能包含名为param的参数
param = value示请求中包含名为param的参数,但是值必须是value
param != value表示请求中包含名为param的参数,但是值不能是value
{"param1","param2=value"}可以将对于多个参数的要求写入数组,他们之间是与的关系
@RequestMapping(value = "hello3", params = {"username","password!=123456"})
public String hello3() {
    System.out.println("hello world");
    return "first";
}

什么参数都不传的情况:

image-20230323135725310

传了username=root,password=123456的情况:

image-20230323135931749

5. 控制请求头headers

它的控制语法和上面的params一样的。这里我们举个比较常见的请求头控制的例子,比如:头中必须有token

@RequestMapping(value = "hello4", headers = "token")
public String hello4() {
    System.out.println("hello world4");
    return "first";
}

请求头中没有传token的情况:

image-20230323145159122

6. 控制请求媒体类型consumes

// 控制请求的媒体类型为json
@RequestMapping(value = "hello5", consumes = "application/json")
public String hello5() {
    System.out.println("hello world4");
    return "first";
}

请求媒体为text/plain的情况:

image-20230323155647400

后台报警信息:

23-Mar-2023 15:05:48.716 警告 [http-nio-8080-exec-12] org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.logException Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'text/plain' not supported]

7.控制返回的媒体类型produces

仅当request请求头中的(Accept)类型中包含该指定类型才返回;

@RequestMapping(value = "hello6", produces = "application/json")
@ResponseBody
public String hello6(HttpServletResponse response) throws IOException {
    String retJson = "{"username":"laoma","userid":123456}";
    System.out.println("hello world6");
    return retJson;
}

当Accept接收text/plain时:

image-20230323160209362

当Accept接收包含application/json时:

image-20230323160338244

8. 代码地址

gitee.com/mayuanfei/s…下的springmvc02

记忆印记

  • @RequestMapping注解在类上表示所有请求都要加这个前缀,注解到方法上就是类+方法的注解叠加
  • @RequestMapping参数中的value和path作用是一样的,都是用于把请求的url映射到方法上的。
  • 知道consumes和produces是做什么用的