Spring MVC 使用介紹(七)—— 註解式控制器(三)
阿新 • • 發佈:2018-06-14
處理 分隔 arr color ref 內容 例如 生產者 value
一、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 使用介紹(七)—— 註解式控制器(三)