SpringMVC二:匹配请求路径(@RequestMapping)

  • Post author:
  • Post category:其他




@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的派生注解

    @

    Get

    Mapping:专门处理get请求的映射

    @

    Post

    Mapping:专门处理post请求的映射

    @

    Put

    Mapping:专门处理put请求的映射

    @

    Delete

    Mapping:专门处理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";
        }
    }
    



版权声明:本文为N_ZSX原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。