• 04【@RequestMapping注解详解】



    四、@RequestMapping注解

    对类中标记了@ResquestMapping的方法进行映射。根据请求的url匹配@ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器。HandlerMethod对象中封装url对应的方法Method。

    4.1 命名空间

    按照我们传统的url写法不能很好的规定请求路径,即不能按照业务来区分请求

    例如现在user需要定义一个findById,goods也需要定义一个findById,此时就会有冲突,针对这种现象我们可以在类上定义一个命名空间,即在类上使用@RequestMapping注解,类似于一级目录,以后访问此类下的任意资源都需要加上此目录

    例如:

    • user模块:
      • /user/register
      • /user/update
      • /user/findById
    • goods模块:
      • /goods/add
      • /goods/update
      • /goods/findById

    4.2 @RequestMapping属性

    4.2.1 查看源码

    @Target({ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Mapping
    public @interface RequestMapping {
        String name() default "";
    
        @AliasFor("path")
        String[] value() default {};
    
        @AliasFor("value")
        String[] path() default {};
    
        RequestMethod[] method() default {};
    
        String[] params() default {};
    
        String[] headers() default {};
    
        String[] consumes() default {};
    
        String[] produces() default {};
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    4.2.2 value

    用于指定请求的 URL。 它和 path 属性的作用是一样的。

    4.2.3 method

    用于指定请求的方式。

    • 创建Demo02Controller:
    package com.dfbz.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * @author lscl
     * @version 1.0
     * @intro:
     */
    @Controller
    @RequestMapping("/demo")
    public class DemoController {
        // 只接收POST类型的请求
        @RequestMapping(value = "/demo01",method = RequestMethod.POST)
        public void demo01(HttpServletResponse response) throws IOException {
            response.getWriter().write("hello");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    访问:http://localhost:8080/demo/demo01.form

    在这里插入图片描述

    4.2.4 params

    用于指定限制请求参数的条件。 它支持简单的表达式。 要求请求参数的 key 和 value 必须和配置的一模一样,如果不一样则代表参数映射错误(400)。

    例如:

    • params = {"id"}:表示请求中必须携带id参数,区分大小写

    • params = {"sex!='man'"}:请求中sex参数值必须为’man’(可以不携带sex参数

    • ``params = {“deptId=3”}`:请求中必须携带deptId参数,并且参数值必须为3

    示例:

    /**
     * 测试params参数
     *
     * @param request
     * @param response
     * @throws IOException 1)传递的参数中必须包含id
     *                     2)传递的参数sex必须不等于man(可以不携带sex参数)
     *                     3)携带的参数deptId必须为3(必须携带deptId)
     */
    @RequestMapping(value = "/demo02", params = {"id", "sex!=man", "deptId=3"})
    public void demo02(HttpServletRequest request, HttpServletResponse response) throws IOException {
    
        String id = request.getParameter("id");
        String sex = request.getParameter("sex");
        String deptId = request.getParameter("deptId");
    
        response.getWriter().write("id: " + id + "---sex: " + sex + "---deptId: " + deptId);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    分别请求:

    访问

    http://localhost:8080/demo/demo02.form
    
    • 1

    在这里插入图片描述

    必须携带id和deptId参数,且参数值必须为3

    访问:

    http://localhost:8080/demo/demo02.form?id=1
    
    • 1

    在这里插入图片描述

    必须携带deptId参数,且参数值必须为3

    访问:

    http://localhost:8080/demo/demo02.form?id=1&sex=man&deptId=3
    
    • 1

    在这里插入图片描述

    sex值不能为man

    访问:

    http://localhost:8080/demo/demo02.form?id=1&sex=girl&deptId=3
    
    • 1

    在这里插入图片描述

    正确请求:

    http://localhost:8080/demo02/demo02.form?id=1&sex=girl&deptId=3
    
    http://localhost:8080/demo02/demo02.form?id=1&deptId=3
    
    • 1
    • 2
    • 3

    4.2.5 headers

    params是规定请求参数中必须携带的参数,headers是规定请求头中必须携带的请求头,用法和params一致,如果请求中没有携带headers规定的请求头,则出现404错误;

    /**
     * 测试headers参数
     * @param request
     * @param response
     * @throws IOException
     *      请求头中必须携带Host,且值必须为localhost:8080
     */
    @RequestMapping(value = "/demo03", headers = {"Host=localhost:8080"})
    public void demo03(HttpServletRequest request, HttpServletResponse response) throws IOException {
    
        String host = request.getHeader("Host");
    
        response.getWriter().write("Host: " + host);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    访问:

    http://localhost:8080/demo/demp03.form
    
    • 1

    4.2.6 produces

    produces属性用于指定请求头中的Accept的类型,根据Accept的类型来决定执行的方法;

    例如Accept头:

    • 1)Accept:text/html,application/xml,application/json

      将按照如下顺序进行produces的匹配 ①text/html ②application/xml ③application/json

    • 2)Accept:application/xml;q=0.5,application/json;q=0.9,text/html

      将按照如下顺序进行produces的匹配 ①text/html ②application/json ③application/xml

    q参数为媒体类型的质量因子(默认为1),越大则优先权越高(从0到1)

    • 3)Accept:*/*;application/*;application/json

      将按照如下顺序进行produces的匹配 ①application/json②application/* ③*/*
      如果Accept中指定的类型与produces属性指定的类型不符,则出现406错误;

    406:服务器无法根据客户端请求的内容特性完成请求

    /**
     * produces = {"application/json"} : 表示接收Accept为application/json的请求
     * @param response
     * @throws IOException
     */
    @RequestMapping(value = "/demo04", produces = {"application/json"})
    public void producesJson( HttpServletResponse response) throws IOException {
        response.getWriter().write("producesJson!");
    }
    
    /**
     * produces = {"application/xml"} : 表示接收Accept为application/xml的请求
     * @param response
     * @throws IOException
     */
    @RequestMapping(value = "/demo04", produces = {"application/xml"})
    public void producesText(HttpServletResponse response) throws IOException {
        response.getWriter().write("producesXml!");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    发送请求:

    在这里插入图片描述

    最终被produces = {"application/xml"}的方法接收请求;(当负载因子一样时,根据从前到后的顺序匹配请求)

    在这里插入图片描述

    最终被produces = {"application/xml"}的方法接收请求;application/json的负载因子为1.0;

    当请求的Accept设置为:application/xml;q=0.3,application/json;q=0.1,请求将又会被produces = {"application/xml"}处理

    4.2.7 consumes

    consumes属性用于指定请求头中的Content-Type的类型,根据Content-Type的类型来决定执行的方法;如果ContentType指定的类型与consumes属性不符则出现415错误;

    415:服务器无法处理请求附带的媒体格式;

    /**
     * consumes = {"application/json"} : 表示接收Content-Type为application/json的请求
     *
     * @param response
     * @throws IOException
     */
    @RequestMapping(value = "/demo05", consumes = {"application/json"})
    public void consumesJson(HttpServletResponse response) throws IOException {
        response.getWriter().write("application/json");
    }
    
    /**
     * consumes = {"text/plain;charset=utf8"} : 表示接收Content-Type为text/plain的请求
     *
     * @param response
     * @throws IOException
     */
    @RequestMapping(value = "/demo05", consumes = {"text/plain"})
    public void consumesText(HttpServletResponse response) throws IOException {
        response.getWriter().write("text/plain");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    导入Embassy库进行爬虫
    前端工作小结82-当前函数造成
    短视频矩阵系统源码/源头搭建技术交付
    1.Android逆向协议-环境搭建
    11月15日,每日信息差
    布隆过滤器Moudule安装
    Java — 内部类
    JAVAEE框架技术之15SSM综合案例 订单管理查询
    最近面试 Java 开发的感受:就以平时项目经验面试,通过估计很难
    【前端学习】—JS判断数据类型的方式有哪些(八)
  • 原文地址:https://blog.csdn.net/Bb15070047748/article/details/128105282