程序員小猿開(kāi)發(fā)交流微姊,希望一起共同進(jìn)步地沮。
- 有些Web應(yīng)用是只讀的炕柔。人們只能通過(guò)瀏覽器在站點(diǎn)上閑逛,閱讀服務(wù)器發(fā)送到瀏覽器中的內(nèi)容象缀。
- 這并不是一成不變。眾多的Web應(yīng)用允許用戶參與進(jìn)去爷速,將數(shù)據(jù)發(fā)送回服務(wù)器央星。如果沒(méi)有這項(xiàng)能力的話,那Web將完全是另一番景象惫东。
-
Spring MVC允許以多種方式將客戶端中的數(shù)據(jù)傳送到控制器的處理器方法中莉给,包括:
- 你將會(huì)看到如何編寫(xiě)控制器處理這些不同機(jī)制的輸入。
- 作為開(kāi)始廉沮,我 們先看一下如何處理帶有查詢參數(shù)的請(qǐng)求颓遏,這也是客戶端往服務(wù)器端 發(fā)送數(shù)據(jù)時(shí),最簡(jiǎn)單和最直接的方式滞时。</br>
5.3.1 處理查詢參數(shù)
分頁(yè)的Spittle列表
背景
現(xiàn)狀
目前的SpittleController只能展示最新的Spittle叁幢,無(wú)法向前翻頁(yè)查看之前的Spittle歷史記錄。
為了讓用戶能夠查看某一頁(yè)的Spittle歷史記錄坪稽,需要提供一種方式讓用戶傳遞參數(shù)曼玩,以確定要展示哪些Spittle集合。</br>
實(shí)現(xiàn)分頁(yè)功能的方法
為了實(shí)現(xiàn)這個(gè)功能窒百,我們將程序清單5. 10中的spittles ()方法替換 為使用before和count參數(shù)的新spittles ()方法黍判。
測(cè)試
我們首先添加 一個(gè)測(cè)試,這個(gè)測(cè)試反映了新spittles ()方法的功能篙梢。
第一個(gè)測(cè)試顷帖,傳入max和count</br>
程序清單5.11 用來(lái)測(cè)試分頁(yè)Spittle 列表的新方法
這個(gè)測(cè)試方法與程序清單5.9中的測(cè)試方法關(guān)鍵區(qū)別在于它針對(duì)“/spittles”發(fā)送GET請(qǐng)求,同時(shí)還傳入了max和count參數(shù)渤滞。它測(cè)試了這些參數(shù)存在時(shí)的處理器方法.</br>
而另一個(gè)測(cè)試方法則測(cè)試了沒(méi)有這些參數(shù)時(shí)的情景窟她。這兩個(gè)測(cè)試就緒后,我們就能確保不管控制器發(fā)生什么樣的變化蔼水,它都能夠處理這兩種類(lèi)型的請(qǐng)求。
第二個(gè)測(cè)試录肯,對(duì)無(wú)參數(shù)和沒(méi)有參數(shù)情況
在SpittleController中的處理器方法需要同時(shí)處理有參數(shù)和沒(méi)有參數(shù)的情況趴腋。因此,我們需要對(duì)其進(jìn)行修改论咏,使其能夠接受參數(shù)优炬。
第三個(gè)測(cè)試,請(qǐng)求參數(shù)不存在設(shè)置默認(rèn)值</br>
同時(shí)厅贪,如果這些參數(shù)在請(qǐng)求中不存在蠢护,我們將使用默認(rèn)值Long.MAX_VALUE和20。為了實(shí)現(xiàn)這一目標(biāo)养涮,我們可以使用@RequestParam注解的defaultValue屬性葵硕。
如果沒(méi)有指定max參數(shù)眉抬,它將默認(rèn)為L(zhǎng)ong類(lèi)型的最大值。由于查詢參數(shù)都是String類(lèi)型的懈凹,所以defaultValue屬性需要一個(gè)String類(lèi)型的值蜀变。
因此,我們可以將Long.MAX_VALUE轉(zhuǎn)換為一個(gè)名為MAX_LONG_AS_STRING的String類(lèi)型常量介评。
盡管defaultValue屬性給定的是String類(lèi)型的值库北,但是當(dāng)綁定到方法的max參數(shù)時(shí),它會(huì)轉(zhuǎn)換為L(zhǎng)ong類(lèi)型们陆。
如果請(qǐng)求中沒(méi)有count參數(shù)的話寒瓦,count參數(shù)的默認(rèn)值將會(huì)設(shè)置為20。
請(qǐng)求中的查詢參數(shù)是往控制器中傳遞信息的常用手段坪仇。另外一種方式也很流行杂腰,尤其是在構(gòu)建面向資源的控制器時(shí),這種方式就是將傳遞參數(shù)作為請(qǐng)求路徑的一部分烟很。
讓我們看一下如何將路徑變量作為請(qǐng)求路徑的一部分颈墅,從而實(shí)現(xiàn)信息的輸入。
5.3.2 通過(guò)路徑參數(shù)接受輸入
假設(shè)我們的應(yīng)用程序需要根據(jù)給定的ID來(lái)展現(xiàn)某一個(gè)Spittle記錄雾袱。
方案一:編寫(xiě)處理器方法恤筛,使用@RequestParam注解
讓它接受ID作為查詢參數(shù):
處理器請(qǐng)求方式: 如"/spittles/show?spittle_id=12345"</br>
優(yōu)點(diǎn):雖然這種方式可以正常工作,但從面向資源的角度來(lái)看芹橡,并不理想毒坛。</br>
面向資源的理想情況:理想情況,要識(shí)別的資源(Spittle)應(yīng)該通過(guò)URL路徑進(jìn)行進(jìn)行標(biāo)識(shí)林说,而不是通過(guò)查詢參數(shù)煎殷。</br>
URL路徑:"/spittles/12345" 或"/spittles/show?spittle_id=12345"</br>
URL路徑標(biāo)識(shí)資源的優(yōu)勢(shì):通過(guò)URL路徑來(lái)標(biāo)識(shí)資源能更好地識(shí)別要查詢的資源。</br>
查詢參數(shù)的方式:帶有參數(shù)的操作腿箩,本質(zhì)是通過(guò)HTTP發(fā)起的RPC豪直。</br>
將需求轉(zhuǎn)換為測(cè)試:既然已經(jīng)以面向資源的控制器作為目標(biāo),我們可以將這個(gè)需求轉(zhuǎn)換為一個(gè)測(cè)試珠移。 </br>
程序清單5.12展示了一個(gè)新的測(cè)試方法弓乙,它會(huì)斷言SpittleController中對(duì)面向資源請(qǐng)求的處理。
程序清單5.12 測(cè)試對(duì)某個(gè)Spittle 的請(qǐng)求钧惧,其中ID要在路徑變量中 指定
測(cè)試結(jié)果:因?yàn)闆](méi)有為這個(gè)請(qǐng)求實(shí)現(xiàn)處理器方法暇韧,所以請(qǐng)求會(huì)失敗。
方案二:使用@RequestMapping占位符
但是浓瞪,我們可以通過(guò)為SpittleController添加新的方法來(lái)修正這個(gè)失敗的測(cè)試懈玻。 對(duì)代碼進(jìn)行改造。
- 路徑變量的實(shí)現(xiàn):到目前為止乾颁,我們編寫(xiě)的控制器中的所有方法都映射到靜態(tài)定義好的路徑上(通過(guò)@RequestMapping)涂乌。但是艺栈,為了使測(cè)試通過(guò),我們需要在@RequestMapping路徑中包含變量部分骂倘,這部分代表了Spittle的ID眼滤。
-
占位符的使用:為了實(shí)現(xiàn)路徑變量,Spring MVC允許在@RequestMapping路徑中添加占位符历涝,占位符的名稱(chēng)要用大括號(hào)("{"和"}")括起來(lái)诅需。路徑中的其他部分要與所處理的請(qǐng)求完全匹配,但是占位符部分可以是任意的值荧库。
下面的處理器方法使用了占位符堰塌,將Spittle ID作為路徑的一部 分:
通過(guò)程序清單5.12中的路徑,可以看到控制器可以處理針對(duì)“/spittles/12345”的請(qǐng)求分衫。
方案三:使用@PathVariable注解
功能:添加@PathVariable注解场刑,無(wú)論占位符是什么,都會(huì)傳遞到處理器方法中的spittleId參數(shù)中蚪战。
示例說(shuō)明:例如牵现,如果向"/spittles/54321"發(fā)送GET請(qǐng)求,將把"54321"作為spittleId的值傳遞進(jìn)來(lái)邀桑。
參數(shù)名與占位符的對(duì)應(yīng):由于方法的參數(shù)名與占位符的名稱(chēng)相同瞎疼,因此可以省略@PathVariable中的value屬性。
- @PathVariable注解的默認(rèn)行為:如果在@PathVariable注解中沒(méi)有指定value屬性壁畸,它會(huì)假設(shè)占位符的名稱(chēng)與方法的參數(shù)名相同贼急。這樣可以使代碼更簡(jiǎn)潔,因?yàn)椴恍枰貜?fù)寫(xiě)占位符的名稱(chēng)捏萍。
- 重命名參數(shù)的注意事項(xiàng):但需要注意的是太抓,如果想要重命名參數(shù),必須同時(shí)修改占位符的名稱(chēng)令杈,使它們匹配走敌。
-
spittle()方法的功能:
這個(gè)視圖并沒(méi)有什么特別之處,它的屏幕截圖如圖5.4所示逗噩。
圖5 .4 在瀏覽器中展現(xiàn)一個(gè)spittle
如果傳遞請(qǐng)求中少量的數(shù)據(jù)悔常,那查詢參數(shù)和路徑變量是很合適的。但 通常我們還需要傳遞很多的數(shù)據(jù) (也許是表單提交的數(shù)據(jù)) 给赞,那查詢 參數(shù)顯得有些笨拙和受限了。下面讓我們來(lái)看一下如何編寫(xiě)控制器方 法來(lái)處理表單提交矫户。
本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布片迅!