SpringMVC學(xué)習(xí)(一)

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)求路徑映射的多種方式

  1. 根據(jù)請(qǐng)求路徑URL,對(duì)應(yīng)注解屬性value。
  2. 根據(jù)請(qǐng)求方法,對(duì)應(yīng)注解屬性method。
  3. 根據(jù)請(qǐng)求參數(shù),對(duì)應(yīng)注解屬性params。
  4. 根據(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=?&&param2=?”這樣的請(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有一樣的屬性,使用方法一樣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容