@RequestMapping

一、作用
  1. 将请求与处理该请求的控制器方法进行匹配,建立映射关系
二、注解位置
  1. 标识一个类:设置映射请求的请求路径的初始信息

  2. 标识一个方法:设置映射请求的请求路径的具体信息

    controller
    @Controller
    @RequestMapping("/hello")
    public class HellController {
        @RequestMapping("/testIndex")
        public String toIndex() {
            return "index";
        }
    }
    
    html
    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>首页</h1>
        <!-- 此处的请求路径就需要写成:初始路径+具体路径 -->
        <a th:href="@{/hello/testIndex}">测试@RequestMapping注解位置</a>
    </body>
    </html>
    
三、value属性
  1. value属性是一个String[ ],表示该请求映射可以匹配多个请求路径对应的请求

  2. @RequestMapping注解中的value属性必须设置,连接的第一步就是通过请求路径匹配请求方法

    html
    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>首页</h1>
        <a th:href="@{/test/testRequestMapping}">测试@RequestMapping注解</a><br/>
        <a th:href="@{/test}">测试@RequestMapping的value属性 - /test</a><br/>
        <a th:href="@{/testRequestMapping}">测试@RequestMapping的value属性 - /testRequestMapping</a><br/>
    
    </body>
    </html>
    
    controller
    @Controller
    public class RequestMappingController {
        @RequestMapping(
                value = {"/testRequestMapping","/test"}
        )
        public String toSuccess() {
            return "success";
        }
    }
    
  3. 如果value不匹配,就会报错400

    在这里插入图片描述

四、method属性
  1. 通过请求的请求方式匹配对应的请求方法
  2. 如果@RequestMapping注解中不设置method属性,则默认接收任意请求方式
  3. 请求方式
    get

    是通过“?name1=value1&name2=value2…”连接在请求路径后的,不安全,数据量有限

    post

    有请求体,安全,数据量无限制

  4. method属性匹配不成功,会报错405

    在这里插入图片描述

    html
    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>首页</h1>
        <a th:href="@{/test}">测试@RequestMapping的method属性</a><br/>
        <form th:action="@{/test}" method="post">
            <input type="submit" value="测试@RequestMapping的method属性" />
        </form><br/>
    </body>
    </html>
    
    controller
    @Controller
    public class RequestMappingController {
        @RequestMapping(
                value = {"/testRequestMapping","/test"},
                method = {RequestMethod.GET}
        )
        public String toSuccess() {
            return "success";
        }
    }
    
  5. 如果就是匹配指定的请求方法,可以使用@RequestMapping的派生注解

    @GetMapping:专门处理get请求的映射

    @PostMapping:专门处理post请求的映射

    @PutMapping:专门处理put请求的映射

    @DeleteMapping:专门处理Delete请求的映射

    @Controller
    public class RequestMappingController {
        @GetMapping(value = {"/testRequestMapping","/test"})
        public String toSuccess() {
            return "success";
        }
    }
    
  6. 请求方式说明

    目前,浏览器只支持get和post,在form表单中为method设置的put或delete请求方式,会被浏览器按照get请求来处理

    若要发送put和delete请求,需要通过sping提供的过滤器HiddenHttpMethodFilter,在RESTful中使用

五、params属性
  1. 通过请求的请求参数匹配控制方法
  2. params属性是一个字符串类型的数组,有四种表达式

    “param”:要求请求映射所匹配的请求必须携带param请求参数

    “!param”:要求请求映射所匹配的请求必须不能携带param请求参数

    “param=value”:要求请求映射所匹配的请求必须携带param请求参数,且param=value

    “param!=value”:要求请求映射所匹配的请求必须携带param请求参数,但是param!=value

  3. 如果不匹配就会报错400

    在这里插入图片描述

    html
    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>首页</h1>
        <a th:href="@{/test(name, pwd=123456)}">测试@RequestMapping的params属性</a>
    </body>
    </html>
    
    java
    @Controller
    public class RequestMappingController {
        @RequestMapping(
                value = {"/testRequestMapping","/test"},
                method = {RequestMethod.GET},
                params = {"username","pwd=123456"}
        )
        public String toSuccess() {
            return "success";
        }   
    }
    
六、headers属性
  1. 浏览器和服务器之间交互,必须使用HTTP协议进行,要求浏览器向服务器发送请求必须以请求报文的形式(Request Headers),服务器向浏览器响应数据必须以响应报文的形式(Response Headers)。报文形式为一系列键值对。

  2. 通过请求头的请求信息匹配请求映射
  3. headers属性是一个字符串类型的数组,有四种表达式

    “header”:要求请求映射所匹配的请求头必须携带header请求参数

    “!header”:要求请求映射所匹配的请求头必须不能携带header请求参数

    “header=value”:要求请求映射所匹配的请求头必须携带header请求参数,且header=value

    “header!=value”:要求请求映射所匹配的请求头必须携带header请求参数,但是header!=value

  4. 如果匹配不成功,报错404

    在这里插入图片描述

    html
    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>首页</h1>
        <a th:href="@{/test(name, pwd=123456)}">测试@RequestMapping的params属性</a>
    </body>
    </html>
    
    java
    @Controller
    public class RequestMappingController {
        @RequestMapping(
                value = {"/testRequestMapping","/test"},
                method = {RequestMethod.GET},
                params = {"username","pwd=123456"},
                headers = {"Host=localhost:8081"}
        )
        public String toSuccess() {
            return "success";
        }
    }
    
七、对于value属性,支持ant风格的路径
  1. ?:表示任意的一个字符

    但这个字符不能为空,不能为问号?或斜线/,因为在浏览器地址中,?和/有特殊的用途,?后拼接的是请求参数,/后表示的是目录层级

    @Controller
    public class RequestMappingController {
    
        @RequestMapping(
                value = {"/a?a/test"}
        )
        public String toSuccess() {
            return "success";
        }
    }
    
    <a th:href="@{/a1a/test}">测试value属性匹配ant风格的路径</a><br/>
    
  2. *:表示任意的0个或多个字符
    @Controller
    public class RequestMappingController {
    
        @RequestMapping(
                value = {"/a*a/test"}
        )
        public String toSuccess() {
            return "success";
        }
    }
    
    <a th:href="@{/aa/test}">测试value属性匹配ant风格的路径</a><br/>
    <a th:href="@{/a234a/test}">测试value属性匹配ant风格的路径</a><br/>
    
  3. **:表示任意的一层或多层目录,也可以是0层
    @Controller
    public class RequestMappingController {
    
        @RequestMapping(
                value = {"/**/test"}
        )
        public String toSuccess() {
            return "success";
        }
    }
    
    <a th:href="@{/a/ba/a/test}">测试value属性匹配ant风格的路径</a><br/>
    

    注:/**/中不能写其它任意字符

八、针对value属性,SpringMVC支持路径中的占位符
  1. 两种风格对比

    原始方式:/deleteUser?id=1

    RESTful方式:/deleteUser/1

  2. 当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的**@RequestMapping注解的value属性中通过占位符{xxx} 表示传输的数据**,再通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参,且只能通过@PathVariable获取

  3. 代码示例
    html
    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>首页</h1>
        <a th:href="@{/test/1}">测试value属性匹配ant风格的路径</a><br/>
    </body>
    </html>
    
    java
    @Controller
    public class RequestMappingController {
    
       @RequestMapping(value = {"/test/{id}"})
        public String toSuccess1(@PathVariable("id")Integer id) {
            System.out.println(id);
            return "success";
        }
    }
    
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐