二、SpringMVC常用註解@RequestMapping
@Controller
標註在類上,作用同@service等。將一個類宣告為處理器。
@RequestMapping
請求URL到處理器功能處理方法的對映
此註解可以放在類上也可以放在方法上
value根據請求地址限定
value: 指定請求的實際地址,指定的地址可以是URI Template 模式,可以為陣列
普通URL路徑對映
用法如下
@Controller
@RequestMapping(value = "/hello")
public class UserManageController {
@RequestMapping(value = "/word")
public String hello() {
return "hello";
}
@RequestMapping(value = {"/word1","/word2"})
public String hellos() {
return "hello";
}
}
URI模板模式對映
@RequestMapping(value=”/users/{userId}”):{×××}佔位符, 請求的URL可以是 “/users/123456”或“/users/abcd”,通過6通過@PathVariable可以提取URI模板模式中的{×××}中的×××變數。
@RequestMapping(value=”/users/{userId}/create”):這樣也是可以的,請求的URL可以是“/users/123/create”。
- @RequestMapping(value=”/users/{userId}/topics/{topicId}”):這樣也是可以的,請求的URL可以是“/users/123/topics/123”。
Ant風格的URL路徑對映
@RequestMapping(value=”/users/**”):可以配“/users/abc/abc”,但“/users/123”將會被【URI模板模式對映中的“/users/{userId}”模式優先對映到】【最長匹配優先】。
@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模板變數風格可混用;
正則表示式風格的URL路徑對映
從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指定的功能處理方法。
method: 根據請求方法限定
普通的方法限定
指定請求的method型別, GET、POST、PUT、DELETE等;
“`
@RequestMapping(value = "/word",method = RequestMethod.POST)
public String helloMethod() {
return "hello";
}
“`
組合使用是“或”的關係
@RequestMapping(value="/methodOr", method = {RequestMethod.POST, RequestMethod.GET}):即請求方法可以是 GET 或 POST。
提示:
1、一般瀏覽器只支援GET、POST請求方法,如想瀏覽器支援PUT、DELETE等請求方法只能模擬。
2、除了GET、POST,還有HEAD、OPTIONS、PUT、DELETE、TRACE。
3、DispatcherServlet預設開啟對 GET、POST、PUT、DELETE、HEAD的支援;
4、如果需要支援OPTIONS、TRACE,請新增DispatcherServlet在web.xml的初始化引數:dispatchOptionsRequest 和 dispatchTraceRequest 為true。
請求引數資料對映限定
params: 指定request中必須包含某些引數值是,才讓該方法處理。為請求引數的陣列 支援一些簡單的表示式 。如 params={“!id”,”name!=James”} 表示不能帶名稱為id的引數 而且name的值不能為James 等等表示式 。
請求資料中有指定引數名
- @RequestMapping(params=”create”, method=RequestMethod.GET) :表示請求中有“create”的引數名且請求方法為“GET”即可匹配, 2.
請求資料中沒有指定引數名
- @RequestMapping(params=”!create”, method=RequestMethod.GET):表示請求中沒有“create”引數名且請求方法為“GET”即可匹配
請求資料中指定引數名=值
@RequestMapping(params=”submitFlag=create”, method=RequestMethod.GET):表示請求中有“submitFlag=create”請求引數且請求方法為“GET”即可匹配
請求資料中指定引數名!=值
@RequestMapping(params=”submitFlag!=create”, method=RequestMethod.GET):表示請求中的引數“submitFlag!=create”且請求方法為“GET”即可匹配
組合使用是“且”的關係
@RequestMapping(params={“test1”, “test2=create”}):表示請求中的有“test1”引數名 且 有“test2=create”引數即可匹配
請求頭資料對映限定
headers: 指定request中必須包含某些指定的header值,才能讓該方法處理請求。
請求頭資料中有指定引數名
@RequestMapping(value=”/header/test1”, headers = “Accept”):表示請求的URL必須為“/header/test1”
且 請求頭中必須有Accept引數才能匹配。
@RequestMapping(value=”/header/test1”, headers = “abc”):表示請求的URL必須為“/header/test1”
且 請求頭中必須有abc引數才能匹配,
請求頭資料中沒有指定引數名
@RequestMapping(value=”/header/test2”, headers = “!abc”):表示請求的URL必須為“/header/test2”
且 請求頭中必須沒有abc引數才能匹配。
請求頭資料中指定引數名=值
@RequestMapping(value=”/header/test3”, headers = “Content-Type=application/json”):表示請求的URL必須為“/header/test3” 且 請求頭中必須有“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”引數即可匹配。
當你請求的URL為“/header/test4” 但 如果請求頭中沒有“Accept=application/json”引數(如“text/html”其他引數),將返回“HTTP Status 406”狀態碼【不可接受,伺服器無法根據Accept頭的媒體型別為客戶端生成響應】,即客戶只接受“application/json”媒體型別的資料,即我們的功能處理方法的響應只能返回“application/json”媒體型別的資料。
Accept=text/*:表示主型別為text,子型別任意,如“text/plain”、“text/html”等都可以匹配。
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”等。
生產者、消費者限定
基本概念
Media Type:
網際網路媒體型別,一般就是我們所說的MIME型別,用來確定請求的內容型別或響應的內容型別。
媒體型別格式:type/subtype(;parameter)?
type主型別,任意的字串,如text,如果是*號代表所有;
subtype 子型別,任意的字串,如html,如果是*號代表所有;
parameter 可選,一些引數,如Accept請求頭的q引數, Content-Type的 charset引數。詳見http://tools.ietf.org/html/rfc2616#section-3.7
常見媒體型別:
text/html : HTML格式 text/plain :純文字格式 text/xml :XML格式
image/gif :gif圖片格式 image/jpeg :jpg圖片格式 image/png:png圖片格式
application/x-www-form-urlencoded : 中預設的encType,form表單資料被編碼為key/value格式傳送到伺服器(表單預設的提交資料的格式)。
multipart/form-data : 當你需要在表單中進行檔案上傳時,就需要使用該格式;
application/xhtml+xml :XHTML格式 application/xml : XML資料格式
application/atom+xml :Atom XML聚合格式 application/json : JSON資料格式
application/pdf :pdf格式 application/msword : Word文件格式
application/octet-stream : 二進位制流資料(如常見的檔案下載)。
在如tomcat伺服器的 “conf/web.xml”中指定了副檔名到媒體型別的對映,在此我們可以看到伺服器支援的媒體型別。
功能處理方法是消費者
請求頭的內容型別Content-Type:內容型別,即請求/響應的內容區資料的媒體型別,表示傳送到伺服器的內容資料的媒體型別.
即只消費Content-Type指定的請求內容體資料;
consumes: 指定處理請求的提交內容型別(Content-Type),例如application/json, text/html;
@RequestMapping(value = "/consumes", consumes = {"application/json"}):此處使用consumes來指定功能處理方法能消費的媒體型別,其通過請求頭的“Content-Type”來判斷
只對請求頭為“Content-Type:application/x-www-form-urlencoded”的請求進行處理(即消費請求內容區資料);
功能處理方法是生產者
響應頭的內容型別表示傳送到客戶端的內容資料型別,和請求頭的內容型別類似,只是方向相反.
Accept:用來指定什麼媒體型別的響應是可接受的,即告訴伺服器我需要什麼媒體型別的資料,此時伺服器應該根據Accept請求頭生產指定媒體型別的資料。
produces: 指定返回的內容型別,僅當request請求頭中的(Accept)型別中包含該指定型別才返回;
@RequestMapping(value = "/produces", produces = "application/json"):表示將功能處理方法將生產json格式的資料,此時根據請求頭中的Accept進行匹配,如請求頭“Accept:application/json”時即可匹配;
@RequestMapping(value = "/produces", produces = "application/xml"):表示將功能處理方法將生產xml格式的資料,此時根據請求頭中的Accept進行匹配,如請求頭“Accept:application/xml”時即可匹配。
此種方式相對使用@RequestMapping的“headers = “Accept=application/json””更能表明你的目的。
組合使用是“或”的關係
@RequestMapping(produces={“text/html”, “application/json”}) :將匹配“Accept:text/html”或“Accept:application/json”。