Lecture03-请求-实验02-请求映射

文章目录

    [toc]

    单词词性音标含义
    ambiguousadj./æmˈbɪɡjuəs/模糊的;歧义的(指请求映射或依赖注入时存在多个匹配项,导致无法确定唯一目标,如Spring MVC中多个方法匹配同一请求路径)
    invalidadj./ɪnˈvælɪd/无效的(指不符合规则或规范,如无效的请求参数、无效的Bean定义等)
    GETn. / v./ɡet/获取(HTTP方法之一,用于请求获取资源,参数暴露在URL中,具有幂等性和安全性)
    POSTn. / v./pəʊst/提交(HTTP方法之一,用于向服务器提交数据,请求体携带数据,常用于创建资源)
    HEADn. / v./hed/头部(HTTP方法之一,类似GET但仅返回响应头,用于获取资源元信息)
    PUTn. / v./pʊt/放置(HTTP方法之一,用于更新资源,具有幂等性,通常替换整个资源)
    DELETEn. / v./dɪˈliːt/删除(HTTP方法之一,用于请求删除指定资源,具有幂等性)
    TRACEn. / v./treɪs/追踪(HTTP方法之一,用于回显服务器收到的请求,用于诊断)
    PATCHn. / v./pætʃ/补丁(HTTP方法之一,用于部分更新资源,非幂等,仅修改资源的部分属性)
    OPTIONSn./ˈɒpʃnz/选项(HTTP方法之一,用于获取服务器支持的HTTP方法等信息)
    consumesv./kənˈsjuːmz/消费(Spring MVC中@RequestMapping的属性,指定请求可接受的媒体类型,如consumes = "application/json")
    rawadj./rɔː/原始的(指未经处理的数据格式,如HTTP请求体中的原始文本、二进制数据等)
    unsupportedadj./ˌʌnsəˈpɔːtɪd/不支持的(指服务器不支持的操作或格式,如不支持的HTTP方法、媒体类型等)
    median./ˈmiːdiə/媒体(media type指互联网媒体类型,如application/json、text/html,用于标识数据格式)
    producesv./prəˈdjuːsɪz/生成(Spring MVC中@RequestMapping的属性,指定响应的媒体类型,如produces = "application/json")

    Lecture03-请求-实验02-请求映射

    一、请求路径匹配

    1、精确匹配

    明确指定整个路径,不使用任何通配符,在当前整个 IoC 容器范围内,同一个路径不能映射到多个不同方法,哪怕这些方法在不同 Controller 类中——SpringMVC要求在整个 Web 应用范围内,同一个路径不能映射到不同方法上

        @ResponseBody
        @RequestMapping("/aaa/bbb/ccc")
        public String test01() {
            return "ok";
        }
    
        @ResponseBody
        @RequestMapping("/aaa/bbb/ccc")
        public String test02() {
            return "ok";
        }
    

    image-20250527205153514


    往往实际开发时出现上述问题,是因为不同Controller中不同方法映射了同一个地址,所以为了避免这种情况,可以让每一个映射路径都带有当前Controller的特征:

    @Controller
    public class UserController {
        @RequestMapping("/user/login")
        public String login() {}
        @RequestMapping("/user/register")
        public String register() {}
    }
    
    @Controller
    public class OrderController {
        @RequestMapping("/order/submit")
        public String submit() {}
        @RequestMapping("/order/save")
        public String save() {}
    }
    

    然后每个方法上 @RequestMapping 中开头重复的部分可以提取到类上:

    @Controller
    @RequestMapping("/user")
    public class UserController {
        @RequestMapping("/login")
        public String login() {}
        @RequestMapping("/register")
        public String register() {}
    }
    
    @Controller
    @RequestMapping("/order")
    public class OrderController {
        @RequestMapping("/submit")
        public String submit() {}
        @RequestMapping("/save")
        public String save() {}
    }
    

    2、模糊匹配

    友情提示:实际开发时,处理请求的具体方法,通常不会使用模糊匹配

    这里我们介绍模糊匹配的规则,是因为后面 SpringMVC 拦截器会用到

    ①路径的层级

    路径可以由多个斜杠组成,每一个斜杠代表路径的一层

    image-20250527210054179

    路径后面可以有后缀:

    image-20250527210822616


    ②常用通配符

    通配符作用
    ?匹配“/”之外的任意一个字符
    *在一层路径范围内,匹配任意数量的字符,同样不包括“/”
    **匹配多层路径,但/**只能作为路径的最后一部分,不能在开头或中间
    *.xxx匹配指定后缀(扩展名)
    {xxx}匹配路径变量

    ③匹配举例

    [1]问号通配符

    • 路径模式:/user/?.html

    • 匹配路径:/user/a.html、/user/1.html

    • 不匹配路径:/user/ab.html、/user/.html


    [2]单个星号

    • 路径模式:/user/*/info
    • 匹配路径:/user/admin/info、/user/123/info
    • 不匹配路径:/user/test/sub/info

    [3]两个星号

    • 路径模式:/user/**
    • 匹配路径:/user、/user/info、/user/test/sub
    • 无效模式:/user/**/info

    image-20250528103907893


    [4]后缀匹配

    • 路径模式:/user/*.json
    • 匹配路径:/user/data.json、/user/info.json
    • 不匹配路径:/user/data.xml

    [5]路径变量

    相对于使用一个星号匹配的情况,路径变量不只能够实现路径匹配,而且还能把和指定变量名匹配的数据获取到

    • 路径模式:/user/{id}
    • 匹配路径:/user/123、/user/admin

    ④优先级规则

    当多个路径模式都能匹配同一个 URL 时,SpringMVC 会按照以下规则确定优先级:

    1. 精确路径匹配的优先级最高,例如/user/info。
    2. 其次是带有路径变量的匹配,如/user/{id}。
    3. 然后是带有单路径通配符的匹配,像/user/*。
    4. 最后是带有多层路径通配符的匹配,例如/user/**。

    二、请求方式匹配

    1、复习:请求方式

    HTTP是在TCP/IP协议上层(应用层)的协议,定义了前端和后端之间数据传递、请求、响应的格式和规范

    HTTP的规范全部体现在HTTP报文中

    HTTP报文:

    • 请求报文
    • 响应报文

    image-20250528111154707

    image-20250528111224327


    2、单个

    ①method属性

    method属性是数组类型,所以可以设置一个值或多个值

    image-20250528111840149


    ②代码

    注意:value指定的请求路径和method指定的请求方式,两个条件必须都满足才能映射成功,二者是“且”的关系

    @ResponseBody
    // 效果:对于请求路径 /demo02/method/get 必须是 GET 请求才能够映射
    @RequestMapping(value = "/demo02/method/get", method = RequestMethod.GET)
    public String test06() {
        return "ok get";
    }
    
    @ResponseBody
    // 效果:对于请求路径 /demo02/method/post 必须是 POST 请求才能够映射
    @RequestMapping(value = "/demo02/method/post", method = RequestMethod.POST)
    public String test07() {
        return "ok post";
    }
    

    3、多个

    给 method 属性设置的数组中多个请求方式之间是“或”的关系

    例如:下面代码中 test08() 匹配的请求:

    • 路径:必须是 /demo02/method/get/or/post
    • 请求方式:GET 或 POST
    @ResponseBody
    @RequestMapping(value = "/demo02/method/get/or/post", method = {RequestMethod.GET, RequestMethod.POST})
    public String test08() {
        return "ok get or post";
    }
    

    4、405响应状态码

    当 SpringMVC 检测到对应的路径映射,但是不满足请求方式映射要求,会返回405

    image-20250528112813865


    5、进阶注解

    ①列表

    • @GetMapping("路径")

      @RequestMapping(value = "路径", method = RequestMethod.GET)


    • @PostMapping("路径")

      @RequestMapping(value = "路径", method = RequestMethod.POST)


    • @PutMapping("路径")

      @RequestMapping(value = "路径", method = RequestMethod.PUT)


    • @DeleteMapping("路径")

      @RequestMapping(value = "路径", method = RequestMethod.DELETE)


    ②代码举例

    @ResponseBody
    @GetMapping("/demo02/method/get/annotation")
    public String test09() {
        return "ok @GetMapping";
    }
    
    end