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等
参考: