一、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

Spring MVC 使用介绍(七)—— 注解式控制器(三):生产者与消费者模型的更多相关文章

  1. Spring MVC (二)注解式开发使用详解

    MVC注解式开发即处理器基于注解的类开发, 对于每一个定义的处理器, 无需在xml中注册. 只需在代码中通过对类与方法的注解, 即可完成注册. 定义处理器 @Controller: 当前类为处理器 @ ...

  2. Spring MVC 使用介绍(五)—— 注解式控制器(一):基本介绍

    一.hello world 相对于基于Controller接口的方式,基于注解方式的配置步骤如下: HandlerMapping 与HandlerAdapter 分别配置为RequestMapping ...

  3. Spring MVC 使用介绍(六)—— 注解式控制器(二):请求映射与参数绑定

    一.概述 注解式控制器支持: 请求的映射和限定 参数的自动绑定 参数的注解绑定 二.请求的映射和限定 http请求信息包含六部分信息: ①请求方法: ②URL: ③协议及版本: ④请求头信息(包括Co ...

  4. spring(6)--注解式控制器

    6.1.注解式控制器简介 一.Spring2.5之前,我们都是通过实现Controller接口或其实现来定义我们的处理器类.已经@Deprecated.   二.Spring2.5引入注解式处理器支持 ...

  5. spring(7)--注解式控制器的数据验证、类型转换及格式化

    7.1.简介 在编写可视化界面项目时,我们通常需要对数据进行类型转换.验证及格式化. 一.在Spring3之前,我们使用如下架构进行类型转换.验证及格式化: 流程: ①:类型转换:首先调用Proper ...

  6. 2017.3.31 spring mvc教程(七)多视图控制器

    学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...

  7. Spring MVC 使用介绍(十三)数据验证 (一)基本介绍

    一.消息处理功能 Spring提供MessageSource接口用于提供消息处理功能: public interface MessageSource { String getMessage(Strin ...

  8. 03springMVC注解式控制器开发

    注解式控制器开发简介 注解式控制器开发HelloWorld HelloWorld的运行流程 处理器定义 REST简介 URL路径映射 数据绑定 不同的Model有相同的属性的处理 静态资源的处理 1  ...

  9. SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解

    SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解 博客分类: 跟开涛学SpringMVC   6.6.2.@RequestParam绑定单个请求参数值 @RequestParam用于 ...

  10. Spring MVC 使用介绍(十四)文件上传下载

    一.概述 文件上传时,http请求头Content-Type须为multipart/form-data,有两种实现方式: 1.基于FormData对象,该方式简单灵活 2.基于<form> ...

随机推荐

  1. html初步学习

    ①:<meta name="viewport" content="initial-scale=1.0,maximum-scale=1.0,minimum-scale ...

  2. TDBGridEh 标头排序

    数据源为adoQuery 1.首先设置dbGridEh里需要排序的字段的Title->Titlebutton属性为true 2.设置dgGridEh的optionsEh->dbhautoS ...

  3. C#事件与委托详解【精华 多看看】

    Delegate delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与 ...

  4. python优雅编程之旅

    偶然的机会坐上了python的贼船,无奈只能一步步踏上王者之巅..... 参考博客地址:https://mp.weixin.qq.com/s/OZVT3iFrpFReqdYqVhUf6g 1.交换赋值 ...

  5. 【原】Java学习笔记007 - 流程控制

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // for循环 // ...

  6. C# -- 使用委托 delegate 执行异步操作

    C# -- 使用委托 delegate 执行异步操作 委托是一种安全地封装方法的类型,它与 C 和 C++ 中的函数指针类似. 与 C 中的函数指针不同,委托是面向对象的.类型安全的和保险的. 委托的 ...

  7. 如何设置非管理员用户配置特定的IIS站点

    如何设置非管理员用     户配置特定的IIS站点 一.           添加IIS管理服务 二.           启动管理服务 勾选启用远程连接后.点右边的应用 三.           设 ...

  8. LeetCode算法题-Kth Largest Element in a Stream(Java实现)

    这是悦乐书的第296次更新,第315篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第164题(顺位题号是703).设计一个类来查找流中第k个最大元素.请注意,它是排序顺序 ...

  9. LivePhoto开发,你要知道的知识点

    前言 Apple从iPhone6s开始支持Live Photo.Live Photo 会录下拍照前后 1.5 秒所发生的一切,因此用户获得的不仅仅是一张精美照片,还有拍照前后时刻的动作和声音.具体的操 ...

  10. CSS--字体|垂直居中|background

    一,字体的设置 二,垂直居中 2.1,单行文本垂直居中 2.2,多行文本垂直居中 2.3,绝对定位元素垂直居中 三.颜色的表示法 四.background ---------------------- ...