【Spring實(shí)戰(zhàn)——構(gòu)建Spring Web應(yīng)用程序】1.9接受請(qǐng)求的輸入

程序員小猿開(kāi)發(fā)交流微姊,希望一起共同進(jìn)步地沮。

  1. 有些Web應(yīng)用是只讀的炕柔。人們只能通過(guò)瀏覽器在站點(diǎn)上閑逛,閱讀服務(wù)器發(fā)送到瀏覽器中的內(nèi)容象缀。
  2. 這并不是一成不變。眾多的Web應(yīng)用允許用戶參與進(jìn)去爷速,將數(shù)據(jù)發(fā)送回服務(wù)器央星。如果沒(méi)有這項(xiàng)能力的話,那Web將完全是另一番景象惫东。
  3. Spring MVC允許以多種方式將客戶端中的數(shù)據(jù)傳送到控制器的處理器方法中莉给,包括:


    file
  4. 你將會(huì)看到如何編寫(xiě)控制器處理這些不同機(jī)制的輸入。
  5. 作為開(kāi)始廉沮,我 們先看一下如何處理帶有查詢參數(shù)的請(qǐng)求颓遏,這也是客戶端往服務(wù)器端 發(fā)送數(shù)據(jù)時(shí),最簡(jiǎn)單和最直接的方式滞时。</br>

5.3.1 處理查詢參數(shù)

分頁(yè)的Spittle列表

背景

file

現(xiàn)狀

目前的SpittleController只能展示最新的Spittle叁幢,無(wú)法向前翻頁(yè)查看之前的Spittle歷史記錄。
為了讓用戶能夠查看某一頁(yè)的Spittle歷史記錄坪稽,需要提供一種方式讓用戶傳遞參數(shù)曼玩,以確定要展示哪些Spittle集合。</br>
實(shí)現(xiàn)分頁(yè)功能的方法


file

為了實(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 列表的新方法


file

這個(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ù)情況
file

在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屬性葵硕。


file

如果沒(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)型常量介评。
file

盡管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ù):


file

處理器請(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要在路徑變量中 指定


file

測(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)行改造。

  1. 路徑變量的實(shí)現(xiàn):到目前為止乾颁,我們編寫(xiě)的控制器中的所有方法都映射到靜態(tài)定義好的路徑上(通過(guò)@RequestMapping)涂乌。但是艺栈,為了使測(cè)試通過(guò),我們需要在@RequestMapping路徑中包含變量部分骂倘,這部分代表了Spittle的ID眼滤。
  2. 占位符的使用:為了實(shí)現(xiàn)路徑變量,Spring MVC允許在@RequestMapping路徑中添加占位符历涝,占位符的名稱(chēng)要用大括號(hào)("{"和"}")括起來(lái)诅需。路徑中的其他部分要與所處理的請(qǐng)求完全匹配,但是占位符部分可以是任意的值荧库。


    file

    下面的處理器方法使用了占位符堰塌,將Spittle ID作為路徑的一部 分:


    file

    通過(guò)程序清單5.12中的路徑,可以看到控制器可以處理針對(duì)“/spittles/12345”的請(qǐng)求分衫。

方案三:使用@PathVariable注解

file

功能:添加@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屬性。


file
  1. @PathVariable注解的默認(rèn)行為:如果在@PathVariable注解中沒(méi)有指定value屬性壁畸,它會(huì)假設(shè)占位符的名稱(chēng)與方法的參數(shù)名相同贼急。這樣可以使代碼更簡(jiǎn)潔,因?yàn)椴恍枰貜?fù)寫(xiě)占位符的名稱(chēng)捏萍。
  2. 重命名參數(shù)的注意事項(xiàng):但需要注意的是太抓,如果想要重命名參數(shù),必須同時(shí)修改占位符的名稱(chēng)令杈,使它們匹配走敌。
  3. spittle()方法的功能:


    file

這個(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ā)布片迅!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市皆辽,隨后出現(xiàn)的幾起案子柑蛇,更是在濱河造成了極大的恐慌芥挣,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耻台,死亡現(xiàn)場(chǎng)離奇詭異空免,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)盆耽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)蹋砚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人摄杂,你說(shuō)我怎么就攤上這事坝咐。” “怎么了析恢?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵墨坚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我映挂,道長(zhǎng)泽篮,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任柑船,我火速辦了婚禮帽撑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘椎组。我一直安慰自己油狂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布寸癌。 她就那樣靜靜地躺著专筷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蒸苇。 梳的紋絲不亂的頭發(fā)上磷蛹,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音溪烤,去河邊找鬼味咳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛檬嘀,可吹牛的內(nèi)容都是我干的槽驶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鸳兽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼掂铐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤全陨,失蹤者是張志新(化名)和其女友劉穎爆班,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體辱姨,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡柿菩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雨涛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枢舶。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖镜悉,靈堂內(nèi)的尸體忽然破棺而出祟辟,到底是詐尸還是另有隱情,我是刑警寧澤侣肄,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布旧困,位于F島的核電站,受9級(jí)特大地震影響稼锅,放射性物質(zhì)發(fā)生泄漏吼具。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一矩距、第九天 我趴在偏房一處隱蔽的房頂上張望拗盒。 院中可真熱鬧,春花似錦锥债、人聲如沸陡蝇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)登夫。三九已至,卻和暖如春允趟,著一層夾襖步出監(jiān)牢的瞬間恼策,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工潮剪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涣楷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓抗碰,卻偏偏與公主長(zhǎng)得像狮斗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弧蝇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容