SpringMvc動態(tài)獲取http參數(shù)的注解詳解

SpringMVC中@RequestMapping(value="/page/{id}",method=RequestMethod.GET)中的value值可以指定處理請求的url挟鸠、method可以指定處理請求的方式锄弱,SpringMvc可以通過@RequestParam@PathVariable等注解動態(tài)獲取調(diào)用方傳來的參數(shù)庆捺。但SpringMvc獲取部分參數(shù)的注解是不相同的诬像,下面我們就來看一下SpringMvc獲取不同部分參數(shù)的注解脱篙。

1.接收Request uri部分中參數(shù)的注解:@PathVariable;

當(dāng)使用@RequestMapping URI templeate樣式映射時圃酵,即/{userId}/getById,這時的userId可通過@PathVariable注解泞莉,將它傳過來的值綁定到方法參數(shù)上。

@Controller  
@RequestMapping("/user/{userId}")  
public class RelativePathUriTemplateController {  
  
  @RequestMapping("/books/{bookId}")  
  public void findPet(@PathVariable String userId, @PathVariable String bookId) {      
  }  
}  

上面代碼將URI template中變量userId的值和bookId的值钾麸,綁定到方法的參數(shù)上更振。若方法的參數(shù)名稱和需要綁定的template中的變量名稱不一致,需要在@PathVariale("userId")指定uri template中的名稱饭尝。

2.接收request header部分的注解@RequestHeader,@CookieValue;

@RequestHeader注解肯腕,可以把Request請求中header部分的值綁定但方法參數(shù)上。

Host                    localhost:8080  
Accept                  text/html,application/xhtml+xml,application/xml;q=0.9  
Accept-Language         fr,en-gb;q=0.7,en;q=0.3  
Accept-Encoding         gzip,deflate  
Accept-Charset          ISO-8859-1,utf-8;q=0.7,*;q=0.7  
Keep-Alive              300  

Controller中使用@RequestHeader獲取header中的參數(shù):

@RequestMapping("/displayHeaderInfo.do")  
public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding,  
                              @RequestHeader("Keep-Alive") long keepAlive)  {  
  
  
}  

上面的代碼钥平,將request header部分的Accept-Encoding的值实撒,綁定到encoding上了,Keep-Alive header的值綁定到參數(shù)KeepAlive上涉瘾。

@CookieValue可以將Request header中關(guān)于cookie的值綁定到方法的參數(shù)上知态。

@RequestMapping("/displayHeaderInfo.do")  
public void displayHeaderInfo(@CookieValue("JSESSIONID") String cookie)  {  
  
  
}  

上面就是將JSESSIONID的值綁定到參數(shù)cookie上。

3.接收request body部分的注解:@RequestParam,@RequestBody;
@RequestParam使用場景:
A)常用來處理簡單類型的綁定立叛,通過Reqeust.getParameter()獲取的String可以直接轉(zhuǎn)化為簡單類型的情況负敏;因?yàn)槭褂?code>request.getParameter()方式獲取參數(shù),所以可以處理get方式中queryString的值秘蛇,也可以獲取Post方式中body data的值其做;
B)用來處理Content-Type:為application/x-www-form-urlencoded編碼的內(nèi)容,提交方式GET彤叉、POST庶柿;
C)該注解有兩個屬性:value、required;value用來指定要傳入值得id名稱秽浇,required用來指示參數(shù)是否必須綁定浮庐;

@Controller  
@RequestMapping("/pets")  
@SessionAttributes("pet")  
public class EditPetForm {  
  
  
    @RequestMapping(method = RequestMethod.GET)  
    public String setupForm(@RequestParam("petId") int petId, ModelMap model) {  
        Pet pet = this.clinic.loadPet(petId);  
        model.addAttribute("pet", pet);  
        return "petForm";  
    }  
}

@RequestBody作用:
該注解常用來處理Content-Type:不是 application/x-www-form-urlencoded編碼的內(nèi)容,例如application/json,application/xml等柬焕; 它是通過HandlerAdapter配置的HttpMessageConverters來解析post data body审残,然后綁定到相應(yīng)的bean上。 因?yàn)榕渲糜?code>FormHttpMessageConverter,所以也可以用來處理Application/x-www-form-urlencoded的內(nèi)容斑举,處理完的結(jié)果放在一個MultiValueMap<String,String>里搅轿,這種情況特殊需求下使用,詳情查看FormHttpMessageConverter api;

@RequestMapping(value = "/something", method = RequestMethod.PUT)  
public void handle(@RequestBody String body, Writer writer) throws IOException {  
 writer.write(body);  
}  

4.接收attribute類型的注解:@SessionAttributes,@ModelAttribute;
@SessionAttributes:
該注解用來綁定HttpSession中的attribute對象的值富玷,便于在方法中的參數(shù)中使用璧坟。
該注解有value既穆、types兩個屬性,可以通過名字和類型指定要使用的attribute對象雀鹃;

@Controller  
@RequestMapping("/editPet.do")  
@SessionAttributes("pet")  
public class EditPetForm {  
    // ...  
}  

@ModelAttribute
該注解有兩個用法:通常用來處理@RequestMapping之前幻工,為請求綁定需要從后臺查詢的model;
用于參數(shù)上時:用來通過名稱對應(yīng)黎茎,將相應(yīng)名稱的值綁定到注解的參數(shù)bean上囊颅;要綁定的值來源于:
A)@SessionAttribute啟用的attribute對象上;
B)@ModelAttribute用于方法上時指定的model對象傅瞻;
C)上述兩種情況都沒有時踢代,new一個需要綁定的bean對象,然后將request中按名稱對應(yīng)的方式把值綁定到bean中

@ModelAttribute  
public Account addAccount(@RequestParam String number) {  
    return accountManager.findAccount(number);  
}  

這種方式實(shí)際的效果就是在調(diào)用@RequestMapping的方法之前嗅骄,為request對象的model里put("account",Account);

用在參數(shù)上的@ModelAttribute示例代碼:

@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)  
public String processSubmit(@ModelAttribute Pet pet) {  
     
} 

首先查詢@SessionAttributes有無綁定的Pet對象胳挎,若沒有則查詢@ModelAttribute方法層面上是否綁定了Pet對象,若沒有則URI template中的值按對應(yīng)的名稱綁定到Pet對象的各屬性上溺森。

參考文獻(xiàn):http://blog.csdn.net/walkerjong/article/details/7946109

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末串远,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子儿惫,更是在濱河造成了極大的恐慌,老刑警劉巖伸但,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肾请,死亡現(xiàn)場離奇詭異,居然都是意外死亡更胖,警方通過查閱死者的電腦和手機(jī)铛铁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來却妨,“玉大人饵逐,你說我怎么就攤上這事”氡辏” “怎么了倍权?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捞烟。 經(jīng)常有香客問我薄声,道長,這世上最難降的妖魔是什么题画? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任默辨,我火速辦了婚禮,結(jié)果婚禮上苍息,老公的妹妹穿的比我還像新娘缩幸。我一直安慰自己壹置,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布表谊。 她就那樣靜靜地躺著钞护,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铃肯。 梳的紋絲不亂的頭發(fā)上患亿,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音押逼,去河邊找鬼步藕。 笑死,一個胖子當(dāng)著我的面吹牛挑格,可吹牛的內(nèi)容都是我干的咙冗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼漂彤,長吁一口氣:“原來是場噩夢啊……” “哼雾消!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起挫望,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤立润,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后媳板,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桑腮,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年蛉幸,在試婚紗的時候發(fā)現(xiàn)自己被綠了破讨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡奕纫,死狀恐怖提陶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情匹层,我是刑警寧澤隙笆,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站又固,受9級特大地震影響仲器,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仰冠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一乏冀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洋只,春花似錦辆沦、人聲如沸昼捍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妒茬。三九已至,卻和暖如春蔚晨,著一層夾襖步出監(jiān)牢的瞬間乍钻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工铭腕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留银择,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓累舷,卻偏偏與公主長得像浩考,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子被盈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

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