URL 請求映射注解大全


  • @Controller  

負責注冊一個bean 到 spring 上下文中,用於標識是處理器類

  • @RequestMapping

注解為控制器制定可以處理哪些URL請求,可用於類或者方法上。

用於類上:表示類中的所有方法請求都是以該參數value值中的內容作為父路徑請求

用於方法:表示映射到具體的URI參數

我就把RequestMapping的主要六個注解來分別看看:

value: 指定請求的實際地址,也就是想http uri 中的請求參數是什么內容,才能跳入調用這個方法

method:指定http請求的method類型(get、post、put、delete等)

consumes:指定處理http請求的提交內容類型(也就是http中的Content-Type參數)

produces:指定該方法處理后返回的內容類型,僅當request請求頭中的Accept類型中包含該指定類型才返回。這句話意思就是,若是客戶端可以接收text/html;application/json等類型的數據類型,那么我服務器端才在該函數處理完數據后,以這些格式將數據封裝返回瀏覽器。

params:指定request請求中必須包含的某些參數,才讓該方法處理

headers:指定request中必須包含的某些指定的header指定

  • @PathVariable

當使用@RequestMapping URI的template樣式映射參數時候,如http:{uri}/user/{uid},這時候可以通過@PathVariable注解將uri中的uid參數綁定到方法的參數上。(方法上的uri中的{sid}參數將會映射傳遞到方法的sid參數上。若是方法參數名稱和uri中傳遞的{param}名稱不一致,需要在方法參數旁顯式指定名稱。)

@RequestMapping(value = "/sid/{sid}",method=RequestMethod.DELETE) public ModelAndView DeleteUserById(@PathVariable String sid){ //sid參數對應方法上的路徑參數{sid} ModelAndView mv = new ModelAndView("stulist"); //跳轉到stulist.jsp int ret = userService.DeleteUserById(sid); mv.addObject("ret",ret); return mv; } //uri/{param}中param名稱與方法變量名字不同,需要@PathVariable()顯示指定 @RequestMapping(value="/sid/{userId}",method=RequesetMethod.DELETE) public ModelAndView DeleteUserById(@PathVariable("userId") String sid){...}

2.@RequestHeader,@CookieValue:
@RequestHeader注解,可以把Request請求header部分的值綁定到方法的參數上。
例如假設我們的一個request請求頭為以下內容:

Host: www.cnblogs.com Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Referer: https://www.baidu.com/link?url=vMwqr_1CInBYSsvCXnoPrwOFxPvxdChHmN9XWPp7C1Do5MjbnJN8e8WP6VCPjsW5w-edqnKJaCNJPN2sR20eNOb6d73O0ZaFM9Kwe-GRVtK&wd=&eqid=8a738c1d00002ce20000000658c8c3ca Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-CN,zh;q=0.8 Cookie: CNZZDATA1260386081=1660805767-1486222861-https%253A%252F%252Fwww.baidu.com%252F%7C1486222861; __utma=226521935.140421385.1488358381.1488899945.1488899945.1; __utmz=226521935.1488899945.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; CNZZDATA1259029673=860036098-1489063915-%7C1489063915;

那如果服務器端代碼要使用request請求頭中某些內容,那么我們就可以使用@RequestHeader參數來映射參數:
下面的方法參數,分別獲取請求頭中,客戶端接收的編碼(Accept-Encoding)綁定到encoding參數上,和接收的內容格式(Accept)綁定到accept參數上。

@RequesetMapping(value="..") public void getRequestHeaderInfo(@RequestHeader("Accept-Encoding") String encoding, @RequestHeader("Accept") String accept){ //... }

@CookieValue注解,顧名思義,就是將客戶端發送的request請求中cookie拿到,綁定到方法參數上。
我們還是根據上面那個request請求頭,我們可以看到最后一行請求頭中有:Cookie:..的內容,若是想直接拿到該字段內容,那么可以使用@CookieValue注解來實現數據綁定。

@RequesetMapping(value="..") public void getRequestCookieInfo(@CookieValue("Cookie") String cookie){ //綁定cookie內容到cookie參數 //... }

3.@RequestParam,@RequestBody:
上面我們在獲取request請求資源uri路徑,請求頭內容后,還有一個重要的request格式中區域就是請求體body了。那么這兩個參數就是用於處理這部分內容的。

@RequestParam注解,通過以下幾點來說明:
(1) 常常用來處理簡單類型的數據綁定。什么是簡單類型,簡單的說,就是在服務器端可以通過request.getParameter(“key”)方法獲取的參數的類型。通常這類的參數在Get請求中是以uri?key=value樣式體現的,也就是queryString的值。也能獲取POST請求中請求體body data中的值。也就是將一些key=value參數放置在request請求體中。
(2) 用來處理Content-Type: 為application/x-www-form-urlencoded表單提交的編碼內容。
(3) 該注解有兩個屬性:value,required。value用來指定傳入值的名稱,required用於指示參數是否必須存在並綁定。

//url: http://.../getUser?uid=1 @RequestMapping(method = RequestMethod.GET) public String doSomething(@RequestParam("uid") int uid, ModelMap model) {//url中queryString參數uid綁定到方法參數uid中。 //... }

@RequestBody注解:通常用來處理非表單提交(Content-Type={application/json;application/xml})中的post data body內容

4.@SessionAttributes,@ModelAttribute:
@SessionAttributes注解是用來綁定httpSession的attribute對象的值,方便在方法中參數映射並使用。該注解有value,types兩個屬性,可以通過名字和類型來指定要使用的attribute對象。

那么為什么要使用這個注解呢?能解決什么問題?這個與spring中的ModelMap有關。因為modelMap中的屬性作用域是request級別,也就是說,當本次request結束后,modelMap中的所有屬性都會被銷毀,那么就造成一個問題?若想在多個request中共享該對象,如何實現?那就可以把對象放置到session域級別中。就是通過@SessionAttributes來完成這個需求的。

eg:通過@SessionAttributes注解將該request請求域中的ModelMap中的user對象屬性放置到session中。在后面jsp視圖中我們可以使用常規session操作得到user屬性(session.getAttriute(“user”)):

@Controller @RequestMapping("/editUser.do") @SessionAttributes(value="user",types={user.class}) public class EditUserForm { // ... } 

關於該屬性的使用形式還有以下幾種:
(1)字符串數組指定多個屬性。@SessionAttributes({“attr1”,”attr2”})
(2)也能通過types指定每個value的屬性:
@SessionAttributes(types={User.class})
@SessionAttributes(types={User.class,Deptment.class},value={“atrr1”,”attr2”})

@ModelAttribute注解有兩個用法,一個是用於方法上,一個是用於參數上:
方法上: 通常是用來處理@RequestMapping之前,為請求綁定需要從后台查詢的model。
參數上: 用來通過名稱對應,把相應的名稱的值綁定到注解的參數bean上,該bean的來源有:
A. @SessionAttributes配置中的attribute對象。
B. @ModelAttribute用於方法上時候指定的model對象。
C. 若是上述情況都沒有,new一個需要綁定的bean對象,然后把request中按照同名方式把值綁定到bean。

在參數上使用該注解的例子:可以看到@ModelAttribute(“user”)中有user參數與@SessionAttribute(“user”)中的對象名稱一致,那么就會自動將user屬性對象注入到ModelMap對象,就可以直接使用該user對象了

@RequestMapping(value="/users/{uid}/edit", method = RequestMethod.POST) public String processSubmit(@ModelAttribute("user") User user) { //... } 

關於@ModelAttribute屬性中對象如何查找,按照如下順序:先查詢@SessionAttribute上有無綁定的同名對象,若是沒有則在查詢定義在方法上的@ModelAttribute是否綁定有同名對象,最后則是在uri按照屬性名稱映射查找。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM