zoukankan      html  css  js  c++  java
  • Spring MVC 使用介绍(七)—— 注解式控制器(三):生产者与消费者模型

    一、MIME类型

    MIME类型格式:type/subtype(;parameter)?

    • type:主类型,任意的字符串,如text,如果是*号代表所有
    • subtype:子类型,任意的字符串,如html,如果是*号代表所有
    • parameter:可选参数,如Accept请求头的q参数, Content-Type的 charset参数

    几个常见的MIME类型如:

    • HTML:text/html
    • 表单数据:application/x-www-form-urlencoded
    • JSON数据:application/json
    • GIF图片:image/gif

    tomcat主目录下conf/web.xml中指定了服务器支持的所有MIME类型

    二、生产者与消费者模型

    1、Content-Type与Accept

    i)Content-Type:内容类型,即请求/响应的内容区数据的MIME类型,如:

    Content-Type: application/x-www-form-urlencoded  
    Content-Type: application/json;charset=UTF-8

    ii)Accept:用来指定浏览器可接受的MIME类型,服务器应该根据Accept请求头生产指定MIME类型的数据,多个类型以逗号分隔,如:

    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

    2、生产者与消费者

    请求阶段:客户端是生产者(生产Content-Type媒体类型的请求内容区数据),服务器是消费者(消费客户端生产的Content-Type媒体类型的请求内容区数据)

    响应阶段:服务器是生产者(生产客户端请求头参数Accept指定的响应体数据),客户端是消费者(消费服务器根据Accept请求头生产的响应体数据)

    从服务端的视角,功能处理方法是请求的消费者(请求包的Content-Type头指定),是响应的生产者(请求包的Accept头指定),由此抽象出生产者和消费者模型

    @RequestMapping提供consumes、produces这两个属性,用于实现该模型,使用示例如下:

    // 等价于:headers = {"Content-Type=application/x-www-form-urlencoded"}
    @RequestMapping(value = "/head2", consumes = {"application/x-www-form-urlencoded"})
    @ResponseBody
    public String testHeader2() {
        return "testHeader2";
    }
    
    // 等价于:headers = {"Accept=application/json;charset=UTF-8"}
    @RequestMapping(value = "/head3", produces = {"application/json;charset=UTF-8"})
    @ResponseBody
    public String testHeader3() {
        return "testHeader3";
    }

    3、生产者与消费者窄化时是覆盖而非继承

    @Controller
    @RequestMapping(consumes = "text/html")
    public class TestController4 {
    
        @RequestMapping(value = "/narrow", consumes = "application/x-www-form-urlencoded")
        @ResponseBody
        public String testNarrow() {
            return "narrow";
        }
    }

    请求时,Content-Type为"text/html"报404,为"application/x-www-form-urlencoded"可正常响应

    @RequestMapping的其他属性为继承关系,如headers、params等

    参考:

    生产者、消费者请求限定 —— 跟着开涛学SpringMVC

  • 相关阅读:
    vue-slot插槽
    js中filter函数
    js异步处理
    js变量提升
    js中的4种函数调用模式
    js方法
    Javascript中的闭包 O__O "…
    js实现瀑布流以及加载效果
    2D转换下的zoom和transform:scale的区别
    [转]JavaScript与元素间的抛物线轨迹运动
  • 原文地址:https://www.cnblogs.com/MattCheng/p/9182101.html
Copyright © 2011-2022 走看看