SpringMVC 學(xué)習(xí)筆記
@RequestMapping
@RequestMapping注解用于為控制器指定可以處理哪些URL請(qǐng)求,在類和方法定義上都可以標(biāo)注,
- 在類上定義:提供初步的映射信息,相對(duì)于web應(yīng)用的根目錄。
- 在類方法上定義:提供進(jìn)一步的細(xì)分映射信息,在類映射路徑的基礎(chǔ)上進(jìn)行映射定義。如果類上沒(méi)有定義映射,則方法上定義的映射路徑相對(duì)于web應(yīng)用的根目錄。
DispatcherServlet在截獲HTTP請(qǐng)求后,就通過(guò)控制器上@RequestMapping信息確定該請(qǐng)求的具體映射路徑,從而確定該請(qǐng)求對(duì)應(yīng)的處理方法。
@ResquestMapping請(qǐng)求路徑映射的多種方式
- 根據(jù)請(qǐng)求路徑URL,對(duì)應(yīng)注解屬性value。
- 根據(jù)請(qǐng)求方法,對(duì)應(yīng)注解屬性method。
- 根據(jù)請(qǐng)求參數(shù),對(duì)應(yīng)注解屬性params。
- 根據(jù)請(qǐng)求頭參數(shù),對(duì)應(yīng)注解屬性headers。
上述四種映射方式可以同時(shí)使用,這樣能夠使請(qǐng)求路徑的映射更加精確。
- params、headers屬性的幾種用法
- params={"param1"}:表示請(qǐng)求必須包含param1參數(shù)。
- params={"!param1"}:表示請(qǐng)求必須不包含param1參數(shù)。
- params={"param1=value1","param2=value2"}:表示請(qǐng)求必須包含param1和param2參數(shù),但是param1的值不能是value1,param2的值必須是value2。
headers屬性的用法和params屬性的用法一樣。
- @ResquestMapping的映射屬性value支持Ant風(fēng)格的通配符注解
- ?:匹配路徑中的一個(gè)字符。
- :匹配路徑中的任意多個(gè)字符。
- ** :匹配任意多層路徑。
@PathVariable
@PathVariable映射URL綁定的占位符。通過(guò)@PathVariable可以將URL請(qǐng)求路徑中的占位符參數(shù)綁定到對(duì)應(yīng)的處理器方法的形式參數(shù)中。主要是處理“/path/{param}“這樣的請(qǐng)求,用來(lái)將請(qǐng)求中的路徑參數(shù)param對(duì)應(yīng)到處理方法的形式參數(shù)上。
@RequestMapping(value="/path/{xxx}")
@PathVariable("xxx")
使用上述的注解方式,即可將URL中xxx綁定到處理器方法的形式參數(shù)中。
- 如果處理器方法的形式參數(shù)名稱和請(qǐng)求URL的占位符參數(shù)一樣,則@PathVariable中可以為空。如果兩者的名稱不一樣,則必須在@PathVariable中指定占位符參數(shù)的名稱,這樣才能正確綁定到方法的形式參數(shù)上。
- 正是因?yàn)锧PathVariable的特性,才使得SpringMVC支持REST風(fēng)格的URL。
REST
REST:Representational State Transfer。(資源)表現(xiàn)層狀態(tài)轉(zhuǎn)化。
-
REST主要具有四種特性:
- 資源:網(wǎng)絡(luò)上的每一個(gè)實(shí)體,每一個(gè)URL請(qǐng)求的具體信息,諸如一段文字、圖片、視頻、音頻等都可以作為一種資源,在系統(tǒng)中,是一種具體的存在。對(duì)于每一種資源,使用一個(gè)唯一的URI(統(tǒng)一資源定位符)標(biāo)識(shí)。因此,對(duì)于特定資源的訪問(wèn)就是對(duì)特定URI的訪問(wèn)。
- 表現(xiàn)層:把資源以何種的形式展現(xiàn)出來(lái)(這里的展現(xiàn),是指資源在后端取出后,如何呈現(xiàn)給前端)。常用的可以采用JSON、XML、二進(jìn)制、HTML、文本等。
- 狀態(tài)轉(zhuǎn)化:狀態(tài)轉(zhuǎn)化指的是服務(wù)器端的狀態(tài)轉(zhuǎn)化。每發(fā)送一個(gè)請(qǐng)求,就表示客戶端和服務(wù)器端的一次交互過(guò)程。HTTP協(xié)議是無(wú)狀態(tài)的,即所有的狀態(tài)都是保存在服務(wù)器端,HTTP請(qǐng)求本身并不會(huì)攜帶任何有關(guān)客戶端和服務(wù)器端的狀態(tài)。因此如果想控制服務(wù)器資源的狀態(tài),則客戶端必須使用特定的方法,因?yàn)镽EST基于HTTP協(xié)議,因此,針對(duì)資源的狀態(tài)轉(zhuǎn)化對(duì)應(yīng)于HTTP請(qǐng)求的四種方法:GET(獲?。?、PUT(更新)、POST(新建0和DELETE(刪除)
HiddenHttpMethodFilter:可以將POST請(qǐng)求轉(zhuǎn)化為PUT和DELETE請(qǐng)求。(form表單只支持GET和POST請(qǐng)求)使用HiddenHttpMethodFilter需要在web.xml中配置filter參數(shù)。
瀏覽器form表單只支持GET與POST請(qǐng)求,而DELETE、PUT等method并不支持,spring3.0添加了一個(gè)過(guò)濾器,可以將這些請(qǐng)求轉(zhuǎn)換為標(biāo)準(zhǔn)的http方法,使得支持GET、POST、PUT與DELETE請(qǐng)求,該過(guò)濾器為HiddenHttpMethodFilter。
<!--配置HiddenHttpMethodFilter,作用是可以把POST請(qǐng)求轉(zhuǎn)化為PUT和DELETE請(qǐng)求-->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
HiddenHttpMethodFilter的filter配置在web.xml中必須置于dispatcherservlet配置之前。
HiddenHttpMethodFilter的父類是OncePerRequestFilter,它繼承了父類的doFilterInternal方法,工作原理是將jsp頁(yè)面的form表單的method屬性值在doFilterInternal方法中轉(zhuǎn)化為標(biāo)準(zhǔn)的Http方法,即GET,、POST、 HEAD、OPTIONS、PUT、DELETE、TRACE,然后到Controller中找到對(duì)應(yīng)的方法。
需要注意的是,由于doFilterInternal方法只對(duì)method為post的表單進(jìn)行過(guò)濾。配置HiddenHTTPMethodFilter之后,在發(fā)送諸如PUT、DELETE請(qǐng)求時(shí),應(yīng)該通過(guò)form表單的形式。
<form action="..." method="post">
<input type="hidden" name="_method" value="put" />
......
</form>
而不是
<form action="..." method="put">
......
</form>
@RequestParam
在處理方法的形式參數(shù)上使用@RequestParam可以將請(qǐng)求參數(shù)傳遞給請(qǐng)求方法。主要是用來(lái)處理“/path?param1=?&¶m2=?”這樣的請(qǐng)求,提取其中的param1和param2并對(duì)應(yīng)到處理方法的形式參數(shù)上。
它有兩個(gè)主要屬性:
- value:參數(shù)名。
- required:是否必須。是一個(gè)boolean值,默認(rèn)為true。表示請(qǐng)求參數(shù)中必須包含對(duì)應(yīng)的參數(shù),如果不存在,則會(huì)拋出異常。
@PathVariable和@RequestParam區(qū)別(類似于@PathParamhe和@QueryParam?)
@RequestHeader
請(qǐng)求頭會(huì)包含若干個(gè)請(qǐng)求的屬性信息,使用@RequestHeader可以將請(qǐng)求頭中的屬性值綁定到對(duì)應(yīng)處理方法的形式參數(shù)上。
它與@RequestParam有一樣的屬性,使用方法一樣。
@CookieValue
@CookieValue可以將請(qǐng)求中的cookie值綁定到處理方法的對(duì)應(yīng)形式參數(shù)上。
它與@RequestParam有一樣的屬性,使用方法一樣。