處理器定義好了,那接下來咱們應該定義功能處理方法,接收用戶請求處理並選擇視圖進行渲染。首先咱們看一下圖6-1:html
http請求信息包含六部分信息:
①請求方法,如GET或POST,表示提交的方式;
②URL,請求的地址信息;
③協議及版本;
④請求頭信息(包括Cookie信息);
⑤回車換行(CRLF);
⑥請求內容區(即請求的內容或數據),如表單提交時的參數數據、URL請求參數(?abc=123 ?後邊的)等。
想要了解HTTP/1.1協議,請訪問http://tools.ietf.org/html/rfc2616。
那此處咱們能夠看到有①、②、④、⑥通常是可變的,所以咱們能夠這些信息進行請求處處理器的功能處理方法的映射,所以請求的映射分爲以下幾種:
URL路徑映射:使用URL映射請求處處理器的功能處理方法;java
請求方法映射限定:如限定功能處理方法只處理GET請求;web
請求參數映射限定:如限定只處理包含「abc」請求參數的請求;正則表達式
請求頭映射限定:如限定只處理「Accept=application/json」的請求。spring
接下來看看具體如何映射吧。chrome
6.5.一、URL路徑映射json
@RequestMapping(value={"/test1", "/user/create"}):多個URL路徑能夠映射到同一個處理器的功能處理方法。瀏覽器
@RequestMapping(value="/users/{userId}"):{×××}佔位符, 請求的URL能夠是 「/users/123456」或服務器
「/users/abcd」,經過6.6.5講的經過@PathVariable能夠提取URI模板模式中的{×××}中的×××變量。網絡
@RequestMapping(value="/users/{userId}/create"):這樣也是能夠的,請求的URL能夠是「/users/123/create」。
@RequestMapping(value="/users/{userId}/topics/{topicId}"):這樣也是能夠的,請求的URL能夠是「/users/123/topics/123」。
@RequestMapping(value="/users/**"):能夠匹配「/users/abc/abc」,但「/users/123」將會被【URI模板模式映射中的「/users/{userId}」模式優先映射到】【詳見4.14的最長匹配優先】。
@RequestMapping(value="/product?"):可匹配「/product1」或「/producta」,但不匹配「/product」或「/productaa」;
@RequestMapping(value="/product*"):可匹配「/productabc」或「/product」,但不匹配「/productabc/abc」;
@RequestMapping(value="/product/*"):可匹配「/product/abc」,但不匹配「/productabc」;
@RequestMapping(value="/products/**/{productId}"):可匹配「/products/abc/abc/123」或「/products/123」,也就是Ant風格和URI模板變量風格可混用;
此處須要注意的是【4.14中提到的最長匹配優先】,Ant風格的模式請參考4.14。
從Spring3.0開始支持正則表達式風格的URL路徑映射,格式爲{變量名:正則表達式},這樣咱們就能夠經過6.6.5講的經過@PathVariable提取模式中的{×××:正則表達式匹配的值}中的×××變量了。
@RequestMapping(value="/products/{categoryCode:\\d+}-{pageNumber:\\d+}"):能夠匹配「/products/123-1」,但不能匹配「/products/abc-1」,這樣能夠設計更加嚴格的規則。
正則表達式風格的URL路徑映射是一種特殊的URI模板模式映射:
URI模板模式映射是{userId},不能指定模板變量的數據類型,如是數字仍是字符串;
正則表達式風格的URL路徑映射,能夠指定模板變量的數據類型,能夠將規則寫的至關複雜。
如 @RequestMapping(value={"/test1", "/user/create"}) 組合使用是或的關係,即「/test1」或「/user/create」請求URL路徑均可以映射到@RequestMapping指定的功能處理方法。
以上URL映射的測試類爲:cn.javass.chapter6.web.controller.mapping.MappingController.java。
到此,咱們學習了Spring Web MVC提供的強大的URL路徑映射,並且能夠實現很是複雜的URL規則。Spring Web MVC不單單提供URL路徑映射,還提供了其餘強大的映射規則。接下來咱們看一下請求方法映射限定吧。
6.5.二、請求方法映射限定
通常咱們熟悉的表單通常分爲兩步:第一步展現,第二步提交,如4.九、SimpleFormController那樣,那如何經過@RequestMapping來實現呢?
咱們熟知的,展現表單通常爲GET請求方法;提交表單通常爲POST請求方法。但6.5.1節講的URL路徑映射方式對任意請求方法是全盤接受的,所以咱們須要某種方式來告訴相應的功能處理方法只處理如GET請求方法的請求或POST請求方法的請求。
接下來咱們使用@RequestMapping來實現SimpleFormController的功能吧。
①處理器的通用映射前綴(父路徑):表示該處理器只處理匹配「/customers/**」的請求;
②對類級別的@RequestMapping進行窄化,表示showForm可處理匹配「/customers/**/create」且請求方法爲「GET」的請求;
③對類級別的@RequestMapping進行窄化,表示submit可處理匹配「/customers/**/create」且請求方法爲「POST」的請求。
@RequestMapping(value="/methodOr", method = {RequestMethod.POST, RequestMethod.GET}):即請求方法能夠是 GET 或 POST。
提示:
一、通常瀏覽器只支持GET、POST請求方法,如想瀏覽器支持PUT、DELETE等請求方法只能模擬,稍候章節介紹。
二、除了GET、POST,還有HEAD、OPTIONS、PUT、DELETE、TRACE。
三、DispatcherServlet默認開啓對 GET、POST、PUT、DELETE、HEAD的支持;
四、若是須要支持OPTIONS、TRACE,請添加DispatcherServlet在web.xml的初始化參數:dispatchOptionsRequest 和 dispatchTraceRequest 爲true。
請求方法的詳細使用請參考RESTful架構風格一章。
以上請求方法映射限定測試類爲:cn.javass.chapter6.web.controller.method.RequestMethodController。
6.5.三、請求參數數據映射限定
②@RequestMapping(params="create", method=RequestMethod.GET) :表示請求中有「create」的參數名且請求方法爲「GET」便可匹配,如可匹配的請求URL「http://×××/parameter1?create」;
③@RequestMapping(params="create", method=RequestMethod.POST):表示請求中有「create」的參數名且請求方法爲「POST」便可匹配;
此處的create請求參數名表示你請求的動做,即你想要的功能的一個標識,常見的CRUD(增刪改查)咱們可使用以下請求參數名來表達:
◇(create請求參數名 且 GET請求方法) 新增頁面展現、(create請求參數名 且 POST請求方法)新增提交;
◇(update請求參數名 且 GET請求方法) 新增頁面展現、(update請求參數名 且 POST請求方法)新增提交;
◇(delete請求參數名 且 GET請求方法) 新增頁面展現、(delete請求參數名 且 POST請求方法)新增提交;
◇(query請求參數名 且 GET請求方法) 新增頁面展現、(query請求參數名 且 POST請求方法) 新增提交;
◇(list請求參數名 且 GET請求方法) 列表頁面展現;
◇(view請求參數名 且 GET請求方法) 查看單條記錄頁面展現。
@RequestMapping(params="!create", method=RequestMethod.GET):表示請求中沒有「create」參數名且請求方法爲「GET」便可匹配,如可匹配的請求URL「http://×××/parameter1?abc」。
②@RequestMapping(params="submitFlag=create", method=RequestMethod.GET):表示請求中有「submitFlag=create」請求參數且請求方法爲「GET」便可匹配,如請求URL爲http://×××/parameter2?submitFlag=create;
③@RequestMapping(params="submitFlag=create", method=RequestMethod.POST):表示請求中有「submitFlag=create」請求參數且請求方法爲「POST」便可匹配;
此處的submitFlag=create請求參數表示你請求的動做,即你想要的功能的一個標識,常見的CRUD(增刪改查)咱們可使用以下請求參數名來表達:
◇(submitFlag=create請求參數名 且 GET請求方法) 新增頁面展現、(submitFlag=create請求參數名 且 POST請求方法) 新增提交;
◇(submitFlag=update請求參數名 且 GET請求方法) 新增頁面展現、(submitFlag=update請求參數名 且 POST請求方法) 新增提交;
◇(submitFlag=delete請求參數名 且 GET請求方法) 新增頁面展現、(submitFlag=delete請求參數名 且 POST請求方法) 新增提交;
◇(submitFlag=query請求參數名 且 GET請求方法) 新增頁面展現、(submitFlag=query請求參數名 且 POST請求方法) 新增提交;
◇(submitFlag=list請求參數名 且 GET請求方法) 列表頁面展現;
◇(submitFlag=view請求參數名 且 GET請求方法) 查看單條記錄頁面展現。
@RequestMapping(params="submitFlag!=create", method=RequestMethod.GET):表示請求中的參數「submitFlag!=create」且請求方法爲「GET」便可匹配,如可匹配的請求URL「http://×××/parameter1?submitFlag=abc」。
@RequestMapping(params={"test1", "test2=create"}):表示請求中的有「test1」參數名 且 有「test2=create」參數便可匹配,如可匹配的請求URL「http://×××/parameter3?test1&test2=create。
以上請求參數數據映射限定測試類爲:cn.javass.chapter6.web.controller.method包下的RequestParameterController一、RequestParameterController二、RequestParameterController3。
6.5.四、請求頭數據映射限定
瀏覽器:建議chrome最新版本;
插件:ModHeader
安裝地址:https://chrome.google.com/webstore/detail/idgpnmonknjnojddfkpgkljpfnnfcklj
插件安裝步驟:
一、打開https://chrome.google.com/webstore/detail/idgpnmonknjnojddfkpgkljpfnnfcklj,如圖6-2
圖6-2
二、點擊「添加至chrome」後彈出「確認安裝」對話框,點擊「安裝」按鈕便可,如圖6-3:
圖6-3
三、安裝成功後,在瀏覽器右上角出現如圖6-4的圖標表示安裝成功:
圖6-4
四、鼠標右擊右上角的「Modify Header」圖標,選擇選項,打開如圖6-5:
圖6-5
七、修改完成後,輸入URL請求,你能夠在chrome的「開發人員工具的」網絡選項卡下,看到如圖6-7的信息表示添加請求頭成功了:
圖6-7
到此咱們的工具安裝完畢,接下來看看如何使用請求頭數據進行映射限定。
@RequestMapping(value="/header/test1", headers = "Accept"):表示請求的URL必須爲「/header/test1」
且 請求頭中必須有Accept參數才能匹配。
@RequestMapping(value="/header/test1", headers = "abc"):表示請求的URL必須爲「/header/test1」
且 請求頭中必須有abc參數才能匹配,如圖6-8時可匹配。
圖6-8
@RequestMapping(value="/header/test2", headers = "!abc"):表示請求的URL必須爲「/header/test2」
且 請求頭中必須沒有abc參數才能匹配。(將Modify Header的abc參數值刪除便可)。
@RequestMapping(value="/header/test3", headers = "Content-Type=application/json"):表示請求的URL必須爲「/header/test3」 且 請求頭中必須有「Content-Type=application/json」參數便可匹配。(將Modify Header的Content-Type參數值改成「application/json」便可);
當你請求的URL爲「/header/test3」 但 若是請求頭中沒有或不是「Content-Type=application/json」參數(如「text/html」其餘參數),將返回「HTTP Status 415」狀態碼【表示不支持的媒體類型(Media Type),也就是MIME類型】,即咱們的功能處理方法只能處理application/json的媒體類型。
@RequestMapping(value="/header/test4", headers = "Accept=application/json"):表示請求的URL必須爲「/header/test4」 且 請求頭中必須有「Accept =application/json」參數便可匹配。(將Modify Header的Accept參數值改成「application/json」便可);
當你請求的URL爲「/header/test4」 但 若是請求頭中沒有「Accept=application/json」參數(如「text/html」其餘參數),將返回「HTTP Status 406」狀態碼【不可接受,服務器沒法根據Accept頭的媒體類型爲客戶端生成響應】,即客戶只接受「application/json」媒體類型的數據,即咱們的功能處理方法的響應只能返回「application/json」媒體類型的數據。
@RequestMapping(value="/header/test5", headers = "Accept=text/*") :表示請求的URL必須爲「/header/test5」 且 請求頭中必須有如「Accept=text/plain」參數便可匹配。(將Modify Header的Accept參數值改成「text/plain」便可);
Accept=text/*:表示主類型爲text,子類型任意,如「text/plain」、「text/html」等均可以匹配。
@RequestMapping(value="/header/test6", headers = "Accept=*/*") :表示請求的URL必須爲「/header/test6」 且 請求頭中必須有任意Accept參數便可匹配。(將Modify Header的Accept參數值改成「text/html」或「application/xml」等均可以)。
Accept=*/*:表示主類型任意,子類型任意,如「text/plain」、「application/xml」等均可以匹配。
@RequestMapping(value="/header/test7", headers = "Accept!=text/vnd.wap.wml"):表示請求的URL必須爲「/header/test7」 且 請求頭中必須有「Accept」參數但值不等於「text/vnd.wap.wml」便可匹配。
@RequestMapping(value="/header/test8", headers = {"Accept!=text/vnd.wap.wml","abc=123"}):表示請求的URL必須爲「/header/test8」 且 請求頭中必須有「Accept」參數但值不等於「text/vnd.wap.wml」且 請求中必須有參數「abc=123」便可匹配。
注:Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
若是您的請求中含有Accept:「*/*」,則能夠匹配功能處理方法上的如「text/html」、「text/*」,「application/xml」等。