SpringMVC 常用注解 詳解


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 **/
@RequestMapping 作用在類上

 

    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 **/
@RequestMapping 同時作用在類上與方法上

 

    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 **/
params 方法的示例

 

  四、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 **/
headers 方法

 

  五、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 **/
consumes 方法

 

  六、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 **/
produces 方法

 

@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 注解

  @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     }
@PathVariable 示例

 

@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 }
@SessionAttributes 注解
 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>
JSP 頁面

  如上例代碼中,我們在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     }
@ResponseBody

  

  @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     }
@RequestBody

 


免責聲明!

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



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