天天看點

spring的@ModelAttribute作用

spring的@ModelAttribute作用

最近好忙,幾乎沒有時間閱讀和記錄,主要是由于公司把項目由php開始轉到java陣營了。這讓從php起步的我來說,多少伴随着重新使用一門語言的陌生感。

不過,伴随着陌生感的,還有久違的新鮮感,我個人非常喜歡這種趕腳,仿佛重新找到了一片淨土~~

廢話不多說,忙裡抽閑,記錄一下這幾天學習到的新姿勢:@ModelAttribute注解

這個注解來自Spring,主要用于MVC中的Model對象(用于儲存資料模型),從這個解釋來看并不覺得有什麼複雜的,但是貌似它的用法比較多,下面轉載幾個看到的例子~

例子1:注解傳回類型為void的方法

@Controller  


public class HelloWorldController {   




   @ModelAttribute  

   
   public void populateModel(@RequestParam String name, Model model) {  


       model.addAttribute("who", name);  

    
    }  



   
    @RequestMapping(value = "/helloWorld")  

   
    public String helloWorld() {  

      
         return "helloWorld";  

   
    }  

 }
  
 
      

上面的代碼,在擷取請求/helloWorld後,populateModel方法會在helloWorld方法之前被調用,它把請求參數kazaff(/helloWorld?name=kazaff)指派到model的名為who的鍵中,在它執行後,helloWorld方法才會被調用,傳回的Model就是由@ModelAttribute注解的方法建立的。

這個例子純粹用于示範@ModelAttribute,實際中我想沒人會這麼用~~

例子2:注解傳回具體對象的方法

 @ModelAttribute  

 public Account addAccount(@RequestParam String name) {  

  
     return accountManager.findAccount(name);  
 }
  
 
      

這種用于主要用于和例子1進行比較,它直接傳回的Account類型的對象會隐式的指派給model對象的account鍵中,我個人感覺這一點其實并不那麼實用。

例子3:帶Value參數的注解傳回具體對象的方法

@Controller  
public class HelloWorldController {  



   
  @ModelAttribute("who")  

   
  public String addAccount(@RequestParam String name) {  

  
       return name;  

   
  }  



    
  @RequestMapping(value = "/helloWorld")   


  public String helloWorld() {  

    
      return "helloWorld";   


   }  


}
  
 
      

這個例子應該沒什麼好說的了,大家推測也能得到結果!

上面的三個例子對@ModelAttribute的用法我個人覺得比較另類,被@ModelAttribute注解的方法會在此Controller中每個映射URL的方法執行之前被執行,可見靈活度太差。

例子4:@ModelAttribute和@RequestMapping同時注釋一個方法

@Controller  
public class HelloWorldController {  



   
    @RequestMapping(value = "/helloWorld")  

    
    @ModelAttribute("who")  

   
    public String helloWorld() {  

     
       return "kazaff";  

  
    } 
}
  
 
      

注意,這麼寫的話,helloWorld方法的傳回值并不表示一個視圖名稱,而是表示model的一個鍵值,視圖名稱由RequestToViewNameTranslator根據請求的URL轉換為邏輯視圖名稱,上例中為helloWorld。

例子5:注解方法的參數

@Controller  


public class HelloWorldController {   




   @ModelAttribute("user")  

   
   public User addAccount() {  

     
        return new User("kazaff","kazaff.me");  

  
   }  



    
   @RequestMapping(value = "/helloWorld")  
   public String helloWorld(@ModelAttribute("user") User user) {    
        return "helloWorld";  

   
   }  


}
  
 
      

上例中,參數user的值來源于addAccount方法的傳回值。

例子6:抽風用法

@Controller 
 

public class HelloWorldController {  



   
  @RequestMapping(value = "/helloWorld")  

  public String helloWorld(@ModelAttribute User user) {  


       return "helloWorld";  

  
  }  
}
  
 
      

這種用法是我最開始看到的,其實這種寫法的話,完全可以省略掉這個注解!Spring可以直接把請求中攜帶的資料轉換成User類型的對象。

繼續閱讀