Spring: @ModelAttribute註解用法

hky87發表於2018-08-20

最近在看Spring和Thymeleaf時看到@ModelAttribute註解,瞭解了下,記錄下來

@ModelAttribute是在此controller沒有方法執行前執行。

@ModelAttribute使用大致有有兩種,一種是是直接標記在方法上,一種是標記在方法的引數中


1.@ModelAttribute註釋方法  
  例子(1),(2),(3)類似,被@ModelAttribute註釋的方法會在此controller每個方法執行前被執行,因此對於一個controller對映多個URL的用法來說,要謹慎使用。
(1)@ModelAttribute註釋void返回值的方法 

@Controller 
public class HelloWorldController { 
    @ModelAttribute 
    public void populateModel(@RequestParam String abc, Model model) { 
         model.addAttribute("attributeName", abc); 
      } 
    @RequestMapping(value = "/helloWorld") 
    public String helloWorld() { 
       return "helloWorld"; 
        } 
 }


這個例子,在獲得請求/helloWorld 後,populateModel方法在helloWorld方法之前先被呼叫,它把請求引數(/helloWorld?abc=text)加入到一個名為attributeName的model屬性中,在它執行後 helloWorld被呼叫,返回檢視名helloWorld和model已由@ModelAttribute方法生產好了。
  這個例子中model屬性名稱和model屬性物件有model.addAttribute()實現,不過前提是要在方法中加入一個Model型別的引數。
  當URL或者post中不包含次引數時,會報錯,其實不需要這個方法,完全可以把請求的方法寫成,這樣缺少此引數也不會出錯

@RequestMapping(value = "/helloWorld") 
public String helloWorld(String abc) { 
     return "helloWorld"; 
 }


2)@ModelAttribute註釋返回具體類的方法

 @ModelAttribute 
 public Account addAccount(@RequestParam String number) { 
     return accountManager.findAccount(number); 
 }


這種情況,model屬性的名稱沒有指定,它由返回型別隱含表示,如這個方法返回Account型別,那麼這個model屬性的名稱是account。
  這個例子中model屬性名稱有返回物件型別隱含表示,model屬性物件就是方法的返回值。它無須要特定的引數。


(3)@ModelAttribute(value="")註釋返回具體類的方法

@Controller 
public class HelloWorldController { 
    @ModelAttribute("attributeName") 
    public String addAccount(@RequestParam String abc) { 
        return abc; 
      } 
    @RequestMapping(value = "/helloWorld") 
    public String helloWorld() { 
        return "helloWorld"; 
          } 
   }


這個例子中使用@ModelAttribute註釋的value屬性,來指定model屬性的名稱。model屬性物件就是方法的返回值。它無須要特定的引數。


(4)@ModelAttribute和@RequestMapping同時註釋一個方法

@Controller 
public class HelloWorldController { 
    @RequestMapping(value = "/helloWorld.do") 
    @ModelAttribute("attributeName") 
    public String helloWorld() { 
         return "hi"; 
      } 
  }


這時這個方法的返回值並不是表示一個檢視名稱,而是model屬性的值,檢視名稱由RequestToViewNameTranslator根據請求"/helloWorld.do"轉換為邏輯檢視helloWorld。
Model屬性名稱有@ModelAttribute(value=””)指定,相當於在request中封裝了key=attributeName,value=hi。


2.@ModelAttribute註釋一個方法的引數  

(1)從model中獲取


@Controller 
public class HelloWorldController { 
    @ModelAttribute("user") 
    public User addAccount() { 
        return new User("jz","123"); 
     } 
    @RequestMapping(value = "/helloWorld") 
    public String helloWorld(@ModelAttribute("user") User user) { 
           user.setUserName("jizhou"); 
           return "helloWorld"; 
        } 
  }


在這個例子裡,@ModelAttribute("user") User user註釋方法引數,引數user的值來源於addAccount()方法中的model屬性。
  此時如果方法體沒有標註@SessionAttributes("user"),那麼scope為request,如果標註了,那麼scope為session


(2)從Form表單或URL引數中獲取(實際上,不做此註釋也能拿到user物件)

@ModelAttribute具有如下三個作用:

 ①繫結請求引數到命令物件:放在功能處理方法的入參上時,用於將多個請求引數繫結到一個命令物件,從而簡化繫結流程,而且自動暴露為模型資料用於檢視頁面展示時使用。

  其實   @ModelAttribute  此處對於供檢視頁面展示來說與  model.addAttribute("attributeName", abc);   功能類似。

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


此處多了一個註解@ModelAttribute("user"),它的作用是將該繫結的命令物件以“user”為名稱新增到模型物件中供檢視頁面展示使用。我們此時可以在檢視頁面使用${user.username}來獲取繫結的命令物件的屬性。  


e("user2") UserModel test3(@ModelAttribute("user2") UserModel user)

  大家可以看到返回值型別是命令物件型別,而且通過  @ModelAttribute("user2")  註解,此時會暴露返回值到模型資料( 名字為user2 ) 中供檢視展示使用

    @ModelAttribute   註解的返回值會覆蓋  @RequestMapping   註解方法中的  @ModelAttribute   註解的同名命令物件

 

 

  ③暴露表單引用物件為模型資料:放在處理器的一般方法(非功能處理方法)上時,是為表單準備要展示的表單引用物件,如註冊時需要選擇的所在城市等,而且在執行功能處理方法(  @RequestMapping   註解的方法)之前,自動新增到模型物件中,用於檢視頁面展示時使用;

 

  注意這時候這個User類一定要有沒有引數的建構函式。

轉自: https://www.cnblogs.com/jin-zhe/p/8241368.html  

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10314474/viewspace-2212411/,如需轉載,請註明出處,否則將追究法律責任。

相關文章