SpringMVC 常用注解 詳解
SpringMVC 常用注解
1、@RequestMapping 路徑映射
2、@RequestParam 獲取請求參數
3、@PathVariable 綁定URL 模板變量值
4、@ModelAttribute 用在方法上 / 用在方法參數列表上
5、@SessionAttributes 將值放到session 域中
6、@ResponsBody 與 @RequestBody 傳輸json 格式數據
本文摘自 https://www.cnblogs.com/xiaoxi
未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
@RequestMapping
@RequestMapping 是一個用來處理請求地址(URL 路徑映射)映射的注解(將請求映射到對應的控制器方法中),可以用在類上或方法上,用在類上 設置請求前綴,用在方法上 設置請求后綴。
@RequestMapping 中的方法:
value 指定請求路徑
method 指定請求類型
params 指定request 中必須包含某些參數值,才能讓該方法執行
headers 指定request 中必須包含指定的header 才能讓該方法執行
consumes 指定請求的內容類型 例如:Application/json , text/html
Produces 指定返回的內容類型,僅當request 請求頭中的類型包含該指定類型才能返回
@RequestMapping 的方法
一、value指定請求路徑
1、指定多個路徑 中間使用逗號隔開
@RequestMapping(value={"/updateitem","/updateitems","/list"})
@RequestMapping(value={"/updateitem","/updateitems","/list"})
/**
* 可以多個請求訪問該類或者方法,
* 訪問路徑 : http://localhost:8080/updateitem 或者 http://localhost:8080/list
*/
2、@RequestMapping 作用在類上 // 只要符合請求路徑,都可以訪問該類

1 @RequestMapping(value = "/json/info/{itemId}") 2 @ResponseBody 3 public Items getItemById(@PathVariable("itemId") int id) { 4 Items items = itemService.getItemById(id); 5 return items; 6 } 7 /** 8 *訪問地址為:http://localhost:8080/item/queryItem 9 **/
3、同時作用在類上,方法上 // 請求時應符合前綴(類上的@RequestMapping)+后綴(方法上的@RequestMapping)

1 @Controller 2 @RequestMapping(value = "/item") 3 public class ItemController { 4 @RequestMapping(value = "/json/info-list") 5 public List<Items> getItemById() { 6 return itemService.getItemList(); 7 } 8 } 9 /** 10 *訪問地址 http://localhost:8080/item/json/info-list 11 *注意: 12 * 由於在類上加了 /item ,所以在訪問該類的每個方法時,都應該帶上前綴/item 13 **/
4、路徑中含某變量的值 // 獲取路徑中的參數,賦值給方法的形參

1 @RequestMapping("/json/info/{itemId}") 2 @ResponseBody 3 public Items getItemById(@PathVariable("itemId") int id) { 4 Items items = itemService.getItemById(id); 5 return items; 6 } 7 /** 8 * 獲取路徑中的參數 itemId 的值,賦值給 int id 9 **/
二、method 指定請求類型 {RequestMethod.GET(get 請求), RequestMethod.POST(post請求)}

1 @Controller 2 @RequestMapping(value = "/item" , method = RequestMetod.GET) 3 public class ItemController { 4 @RequestMapping(value = "/json/info-list") 5 public List<Items> getItemById() { 6 return itemService.getItemList(); 7 } 8 } 9 10 /** 11 * Method方法 用來設置請求類型 12 * 取值 : GET POST 13 */
三、params 指定request 中必須包含某些參數值,才能讓該方法執行

1 @RequestMapping(value = "/ info") 2 public class ItemController { 3 @RequestMapping(value = "/qwe",params="action=123") 4 public List<Items> getItemById(@PathVariable("itemId") int id) { 5 return itemService.getItemList(); 6 } 7 } 8 /** 9 * 訪問地址為:http://localhost:8080// info/qwe?action=123 10 * 路徑中必須包含 “action =123” 參數 該方法才能執行 11 **/
四、headers 指定request 中必須包含指定的header值 才能讓該方法執行

1 @RequestMapping(value = "/info") 2 public class ItemController { 3 @RequestMapping(value = "/header",headers="Accept=application/json") 4 public List<Items> getItemById() { 5 return itemService.getItemList(); 6 } 7 } 8 /** 9 * 訪問地址為:http://localhost:8080// info/header 10 * 且請求頭中必須有 "Accept=application/json" 參數 ,該方法才能執行 11 **/
五、consumes 指定請求的內容類型例如Application/json , text/html

1 @RequestMapping(value = "/info") 2 public class ItemController { 3 @RequestMapping(value = "/header", consumes ="application/json") 4 public List<Items> getItemById() { 5 return itemService.getItemList(); 6 } 7 } 8 /** 9 * 訪問地址為:http://localhost:8080// info/header 10 * 該方法僅處理request Content-Type 為application/json 類型的請求 11 **/
六、produces 指定返回的內容類型,僅當request 請求頭中的(Accept)類型包含該指定類型才能返回

1 @RequestMapping(value = "/info") 2 public class ItemController { 3 @RequestMapping(value = "/header", produces ="application/json") 4 public List<Items> getItemById() { 5 return itemService.getItemList(); 6 } 7 } 8 /** 9 * 訪問地址為:http://localhost:8080// info/header 10 * 該方法僅處理request請求頭中(Accept)包含了 “application/json”, 11 * 同時暗示了返回的內容類型為 “application/json” 12 **/
@RequestParam 獲取url 中的參數
@RequestParam 用於將url 中的的參數,映射到方法的參數上。

1 @RequestMapping(value = "/info") 2 public class ItemController { 3 @RequestMapping(value = "/body") 4 public String getItemByName(@RequestParam String username) { 5 return username(); 6 } 7 } 8 /** 9 * 訪問地址為:http://localhost:8080// info/body 10 * 將url 路徑中攜帶的名為username 的參數,賦值給方法username參數 11 * 即:http://localhost:8080// info/body?username=“張三” 則將張三賦值給username 12 **/
@RequestParam 注解有三個參數: value required defaultValue
1、value : 即url 路徑中參數的名字
2、required : 是否必須,默認為 true ,表示請求中一定要有相應的參數,否者會拋出異常。
即:若上面代碼中,url 路徑中沒有與方法同名的參數,將會拋出異常。
3、defaultValue : 默認值,表示若請求中沒有同名參數時的默認值,設置該參數時,自動將required設為false。
注意:1、若url請求參數中沒有對應的username 的參數,則會拋出異常
2、可以設置required 的值為false ,這樣若url 請求中沒有對應的參數,則會默認為null
如果請求中有多個同名的應該如何接收呢?如給用戶授權時,可能授予多個權限,首先看下如下代碼:
public String requestparam7(@RequestParam(value="role") String roleList)
如果請求參數類似於url?role=admin&rule=user,則實際roleList參數入參的數據為“admin,user”,即多個數據之間使用“,”分割;我們應該使用如下方式來接收多個請求參數:
public String requestparam7(@RequestParam(value="role") String[] roleList) 或者 public String requestparam8(@RequestParam(value="list") List<String> list)
@PathVariable 綁定URL 模板變量值
@PathVariable 可以將路徑(url)中的參數映射到方法的參數上,

1 // 在請求路徑中設置變量{itemId} 2 @RequestMapping("/json/info/{itemId}") 3 // 使用@PathVariable("itemId") 獲取路徑中的變量 itemId 的值 4 @ResponseBody 5 public Items getItemById(@PathVariable("itemId") int id) { 6 Items items = itemService.getItemById(id); 7 return items; 8 }
@ModelAttribute
ModelAttribute可以應用在方法參數上或方法上,他的作用主要是當注解在方法參數上時會將注解的參數對象添加到Model中;當注解在請求處理方法Action上時會將該方法變成一個非請求處理的方法,但其它Action被調用時會首先調用該方法。
@ModelAttribute注釋一個方法
被@ModelAttribute注釋的方法表示這個方法的目的是增加一個或多個模型(model)屬性。這個方法和被@RequestMapping注釋的方法一樣也支持@RequestParam參數,但是它不能直接被請求映射。實際上,控制器中的@ModelAttribute方法是在同一控制器中的@RequestMapping方法被調用之前調用的。
被@ModelAttribute注釋的方法用於填充model屬性,例如,為下拉菜單填充內容,或檢索一個command對象(如,Account),用它來表示一個HTML表單中的數據。
一個控制器可以有任意數量的@ModelAttribute方法。所有這些方法都在@RequestMapping方法被調用之前調用。
有兩種類型的@ModelAttribute方法。一種是:只加入一個屬性,用方法的返回類型隱含表示。另一種是:方法接受一個Model類型的參數,這個model可以加入任意多個model屬性。
@SessionAttributes 將值放到session 域中
在默認情況下,ModelMap中的屬性作用域是request級別,也就是說,當本次請求結束后,ModelMap 中的屬性將銷毀。如果希望在多個請求中共享ModelMap中的屬性,必須將其屬性轉存到session 中,這樣 ModelMap 的屬性才可以被跨請求訪問。
Spring 允許我們有選擇地指定 ModelMap 中的哪些屬性需要轉存到 session 中,以便下一個請求屬對應的 ModelMap 的屬性列表中還能訪問到這些屬性。這一功能是通過類定義處標注 @SessionAttributes 注解來實現的。

1 package demo.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.ui.ModelMap; 5 import org.springframework.web.bind.annotation.RequestMapping; 6 import org.springframework.web.bind.annotation.SessionAttributes; 7 8 import demo.model.User; 9 10 @Controller 11 @RequestMapping(value="/demo1") 12 //(1)將ModelMap中屬性名為currUser的屬性放到Session屬性列表中,以便這個屬性可以跨請求訪問 13 @SessionAttributes("currUser") 14 public class Demo1Controller { 15 16 @RequestMapping(value="/getUser") 17 public String getUser(ModelMap model){ 18 User user=new User(); 19 user.setUser_name("zhangsan"); 20 user.setUser_age(25); 21 user.setUser_email("zhangsan@sina.com"); 22 //(2)向ModelMap中添加一個屬性 23 model.addAttribute("currUser",user); 24 return "/demo/user"; 25 } 26 27 @RequestMapping(value="/getUser1") 28 public String getUser1(ModelMap model){ 29 User user=(User)model.get("currUser"); 30 System.out.println(user.getUser_name()); 31 System.out.println(user.getUser_age()); 32 System.out.println(user.getUser_email()); 33 return "demo/user1"; 34 } 35 }

1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <%@ page import="demo.model.User" %> 3 <% 4 String path = request.getContextPath(); 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 6 %> 7 8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 9 <html> 10 <head> 11 <base href="<%=basePath%>"> 12 <title>My JSP 'index.jsp' starting page</title> 13 </head> 14 <body><br> 15 <%User user=(User)session.getAttribute("currUser");%> 16 用戶名:<%=user.getUser_name() %><br/> 17 年齡:<%=user.getUser_age() %><br/> 18 郵箱:<%=user.getUser_email() %><br/><br/> 19 <a href="<%=path %>/demo1/getUser1">跳轉</a> 20 </body> 21 </html>
如上例代碼中,我們在getUser 方法上使用了@SessionAttributes 注解,所以在getUser方法中通過@SessionAttributes 注解將 ModelMap 中名為 currUser 的屬性放置到 Session 中,所以我們不但可以在 getUser() 請求所對應的 JSP 視圖頁面中通過 request.getAttribute(“currUser”) 和 session.getAttribute(“currUser”) 獲取 user 對象,還可以在下一個請求(getUser1())所對應的 JSP 視圖頁面中通過 session.getAttribute(“currUser”) 或 session.getAttribute(“currUser”)訪問到這個屬性。
這里我們僅將一個 ModelMap 的屬性放入 Session 中,其實 @SessionAttributes 允許指定多個屬性。你可以通過字符串數組的方式指定多個屬性,如 @SessionAttributes({“attr1”,"attr2”})。此外,@SessionAttributes 還可以通過屬性類型指定要 session 化的 ModelMap 屬性,如 @SessionAttributes(types = User.class),當然也可以指定多個類,如 @SessionAttributes(types = {User.class,Dept.class}),還可以聯合使用屬性名和屬性類型指定:@SessionAttributes(types = {User.class,Dept.class},value={“attr1”,"attr2”})。
@Controller @SessionAttributes("currentUser") public class GreetingController{ @RequestMapping public void hello(@ModelAttribute("currentUser") User user){ //user.sayHello() } }
通過@ModelAttribute綁定
@SessionAttributes 是用來在 controller 內部共享 model 屬性的。
我們可以在需要訪問 Session 屬性的 controller 上加上 @SessionAttributes,然后在 action 需要的 User 參數上加上 @ModelAttribute,並保證兩者的屬性名稱一致。SpringMVC 就會自動將 @SessionAttributes 定義的屬性注入到 ModelMap 對象,在 setup action 的參數列表時,去 ModelMap 中取到這樣的對象,再添加到參數列表。只要我們不去調用 SessionStatus 的 setComplete() 方法,這個對象就會一直保留在 Session 中,從而實現 Session 信息的共享。
@SessionAttributes清除
@SessionAttributes需要清除時,使用SessionStatus.setComplete();來清除。注意,它只清除@SessionAttributes的session,不會清除HttpSession的數據。故如用戶身份驗證對象的session一般不用它來實現,還是用session.setAttribute等傳統的方式實現。
@ResponseBody 與 @RequestBody
@ResponseBody 是作用在方法上,表示將該方法的返回結果直接寫入到HTTP response body 中,
我們在使用@RequestMapping 注解后,需要將返回值解析,然后將解析結果為跳轉路徑,加上@ResponseBody 注解后,返回結果不會被解析,而是直接寫入HTTP response body 中。
比如:返回json 數據,加上@ResponseBody 后,會直接返回json 格式數據
示例:

1 @RequestMapping("/json/info/{itemId}") 2 @ResponseBody 3 public Items getItemById(@PathVariable("itemId") int id) { 4 Items items = itemService.getItemById(id); 5 return items; 6 }
@RequestBody 是作用在形參列表上,表示將HTTP 請求正文出入到方法中,使用適合HTTPMessageConverter 將請求體寫入某個對象
比如 : 用來傳輸 json 格式數據時,使用@RequestBody

1 // 接收json 格式數據,並返回json 格式數據 2 @RequestMapping("/json/rec") 3 @ResponseBody // 返回json 格式數據 4 public Items getJsonItem(@RequestBody Items items) { // 接收json 格式數據 5 return items; 6 }