1. 程式人生 > >Spring MVC 使用介紹(七)—— 註解式控制器(三)

Spring MVC 使用介紹(七)—— 註解式控制器(三)

處理 分隔 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 使用介紹(七)—— 註解式控制器(三)