Spring MVC 常用註解的使用

獨特潤許多人發表於2019-02-19
  • @Controller

     註解一個類表示控制器,控制器Controller 負責處理由DispatcherServlet 分發的請求,它把使用者請求的資料經過業務處理層處理之後封裝成一個Model ,然後再把該Model 返回給對應的View,Spring MVC會自動掃描標註了這個註解的類

@Controller
class Demo{...}

 

  • @RequestMapping

     請求路徑對映,有六個屬性,下面我們把她分成三類進行說明,滿足請求條件才執行方法

      1、 value, method;

        value:     指定請求的實際地址,指定的地址可以是URI Template 模式

             用於類上,表示類中的所有響應請求的方法都是以該地址作為父路徑  http://localhost:8080/專案名/hello/方法的mapping

             用於方法上,表示響應請求方法的路徑對映  http://localhost:8080/專案名/方法的mapping

@Controller
@RequestMapping(value = "/hello")  // @RequestMapping("/hello")
class Demo{}

        method:  指定請求的method型別, GET、POST、PUT、DELETE等

@RequestMapping("/hello" , method=RequestMethod.GET) //指定請求方式

      2、 consumes,produces;

        consumes: 指定處理請求的提交內容型別(Content-Type),例如application/json, text/html

@RequestMapping(value="/test",consumes="application/json")

        produces:    指定返回的內容型別,僅當request請求頭中的(Accept)型別中包含該指定型別才返回

@RequestMapping(value="/test",produces="application/json")    //同時暗示了返回的內容型別為application/json

      3、 params,headers;

        params: 指定request中必須包含某些引數值是,才讓該方法處理

@RequestMapping(value="/test",params="name=tom")

        headers: 指定request中必須包含某些指定的header值,才能讓該方法處理請求

@RequestMapping(value="/test",headers="Referer=http://www.clockin.com/")

 

  • @RequestParam

     放在引數前面,只能接收引數 a=b 格式的資料,即Content-Type 為 application/x-www-form-urlencoded型別的內容

      此時必須輸入 localhost:8080/login?id=?  帶引數才會呼叫該方法

 

public String login(@RequestParam int id){}

      當設定 @RequestParam(required=false) 裡面的required為false(預設為true 代表必須帶引數) ,就可以不帶引數

      當設定 @RequestParam(defaultValue=”0″) ,這樣在地址裡面也可以不帶引數,如果帶了引數會接收,不帶引數會預設為0

      當設定 @RequestParam(value=”sid”)  int id ,sid會代替id,id賦值給sid,URL為 sid = ? 

  • @RequestBody

     常用來處理content-type不是預設的application/x-www-form-urlcoded編碼的內容,比如說:application/json或者是application/xml

@requestMapping("/login")
public void login(@requestBody String userName,@requestBody String pwd){
    System.out.println(userName+" :"+pwd);
}

       

{"userName":"admin","pwd","admin123"}

     將JSON字串中的兩個變數的值分別賦予User類中的:String userName , String pwd 屬性

     就將上述引數可以改為 @requestBody User user  這種形式會將JSON字串中的值賦予user中對應的屬性上

     需要注意的是,JSON字串中的key必須對應user中的屬性名

  • @ResponseBody

     此方法返回的資料放在request body裡面,而不是跳轉頁面,通常用來返回JSON資料或者是XML

     在使用此註解之後不會再走試圖處理器,而是直接將資料寫入到輸入流中,他的效果等同於通過response物件輸出指定格式的資料

@RequestMapping("/login")
@ResponseBody
public User login(User user){
      return user;
}

     User的屬性: userName,pwd

     前臺接收到的資料: `{“userName”:”xxx”,”pwd”:”xxx”}`

  • @RestController

       @RestController = @Controller + @ResponseBody  返回引數都在request body中,return “”無法返回指定頁面

  • @PathVariable

     用於繫結restful路徑上的變數,對映 URL 繫結的佔位符

     將 URL 中佔位符引數繫結到控制器處理方法的入參中:URL 中的 {xxx} 佔位符可以通過@PathVariable(“xxx“) 繫結到操作方法的入參中

@RequestMapping("/test/{id}")
public String test(@PathVariable("id") String id){
    System.out.println("test:"+id);
    return null;
}

 

  • @RequestHeader

     放在方法引數前,可以把Request請求header部分的值繫結到方法的引數上

1 Host                    localhost:8080  
2 Accept                  text/html,application/xhtml+xml,application/xml;q=0.9  
3 Accept-Language         fr,en-gb;q=0.7,en;q=0.3  
4 Accept-Encoding         gzip,deflate  
5 Accept-Charset          ISO-8859-1,utf-8;q=0.7,*;q=0.7  
6 Keep-Alive              300
@RequestMapping(“/header”)  
public void header(@RequestHeader(“Accept-Encoding”) String encoding,@RequestHeader(“Keep-Alive”) long keepAlive)  {  
  
}  

     request header部分的 Accept-Encoding的值,繫結到引數encoding, Keep-Alive header的值繫結到引數keepAlive

  • @CookieValue

    放在方法引數前,把Request header中關於cookie的值繫結到方法的引數上

JSESSIONID=415A4AC178C59DACE0B2C9CA727CDD84
@RequestMapping(“/cookie”)  
public void cookie(@CookieValue(“JSESSIONID”) String cookie)  {  
  
}  

    JSESSIONID的值繫結到引數cookie

  • @ModelAttribute

    可標記在引數前

       當 hello1 重定向到 hello2 時,hello2 的@ModelAttribute(“…”) 會根據”…”找到重定向中對應的鍵賦值給引數temp上

@RequestMapping("hello1")
public String test(RedirectAttributes ra) {
    ra.addFlashAttribute("temps", "abcdef");
    return "redirect:/hello2"; 
}
    
@RequestMapping("helle2")
public String test1(RedirectAttributes ra,@ModelAttribute("temps") String temp) {
        System.out.println(temp);
        return null;
}

 

    可標記在方法前

      標有該註解的方法,會在目標方法前執行,用來封裝請求引數,告訴Spring MVC 封裝時不會再new User

      Map 和 Model 同是:BindingAwareModelMap 物件,資料都儲存在該物件中,既是“隱含模型

@ModelAttribute
public void work(Map<String,Object> map) {      //在功能test方法前執行
    User user = new User(1,"tom",20); //模擬從資料庫查詢出的資料
    map.put("user", user);                //map儲存物件資料
}


@RequestMapping("/test")
public String test(@ModelAttribute("user") User user) {
    System.out.println(user.toString());
    return null;
}

      

      標有該註解的方法,可以直接在前端頁面使用這個list物件

      隱含模型是幽靈,無處不在

/**
*   jsp使用JSTL, ${list} 得到集合
*/
@ModelAttribute("list")  
public List<String> hobbiesList(){  
    List<String> hobbise = new LinkedList<String>();  
    hobbise.add("basketball");  
    hobbise.add("football");  
    hobbise.add("tennis");  
    return hobbise;  
} 

 

  • @SessionAttribute

      只能作用在類上,將Model中的屬性同步到session當中

@Controller
@SessionAttributes("name")
public class SessionController {
    @RequestMapping("/hello")
    public String test(Model model){
        model.addAttribute("name", "tom");
        return null;
}

      上面的程式碼將Model中的name引數儲存到了session中(如果Model中沒有name引數,而session中存在一個name引數,那麼SessionAttribute會講這個引數塞進Model中)

      SessionAttribute有兩個引數:

        String[] value:要儲存到session中的引數名稱

        Class[] typtes:要儲存的引數的型別,和value中順序要對應上

      所以可以這樣寫:@SessionAttributes(types = {User.class,Dept.class},value={“attr1”,”attr2”})

      如果想刪除session中共享的引數,可以通過SessionStatus.setComplete(),這句只會刪除通過@SessionAttribute儲存到session中的引數

@RequestMapping("/hello")
  public ModelAndView test(SessionStatus status) {
  ModelAndView model = new ModelAndView("success.jsp");
  status.setComplete();
  return model;
}

 

相關文章