[SpringMVC]@ModelAttribute 2種用法與解釋( @ModelAttribute — Used on Method and Parameter )

KouWei.Lee
6 min readNov 26, 2020

--

@modelAttribute 提供實例化物件的註解

介紹常用的兩種用法@modelAttribute

說明前制作業

建立一個類別為Product

public class Product{    private String productName;    private Integer productPrice;    //get && set 略}

簡單的Service提供所有的產品物件 並回傳

@Service
public class ProductServiceImp(){
@Autowired
ProductDAOImp productDAOImp;
public List<Product> getAll(){ productDAOImp.getAll();//取得所有產品訊息

}

}

1 .寫在方法當參數數用(@ModelAttribute ) { }

當參數使用時效果類似於 model.addAttribute(“product”, new Product());

@GetMapping(value = "/showModelAttribute")public String modelAttributeTest(@ModelAttribute Product product) {      //等同於=model.addAttribute("product", new Product());      return "CampPage/user/user.camp.camplist";}

當中的 attributeName 為 @ModelAttribute 的變數 ‘product’

attributeValue 則為 spring new出的Product()實例

類似於以下程式碼

@GetMapping(value = "/showModelAttribute")public String modelAttributeTest(Model model) {     model.addAttribute("product", new Product());     return "CampPage/user/user.camp.camplist";}

使用@ModelAttribute 指定name

public String modelAttributeTest(@ModelAttribute("myProduct") Product product) {//等同於=model.addAttribute("myProduct", new Product());return "CampPage/user/user.camp.camplist";}

2 .寫在方法上@ModelAttribute

@ModelAttribute("productList")public List<Product> getProducts(){  //相當於model.addAttribute("productList",productService.getAll());  return productService.getAll();}

代表著在這個類別中 所有的 @GetMapping Method 都會加入這一行

model.addAttribute("productList",productService.getAll());

類別中 所有的 ! 所有的! 並且是在方法執行之前就 放入

執行順序

執行時順序為 讀到@ModelAttribute(“productList”) 註解

@ModelAttribute("productList")
public List<Product> getProducts(){}

將所有類別中的 Mapping Method 先放入

model.addAttribute(“productList”,productService.getAll());

@Controllerpublic class UserCampController {@GetMapping("/xxx")
public String xxxx(Model model){
//雖然沒寫出來但是因為@ModelAttribute("productList")寫在方法上會直接加載
//model.addAttribute("productList",productService.getAll());
}@GetMapping("/xxx2")
public String xxxx2(Model model){
//雖然沒寫出來但是因為@ModelAttribute("productList")寫在方法上會直接加載
//model.addAttribute("productList",productService.getAll());
}@ModelAttribute("productList")
//Step1:讀到這個@ModelAttribute並且是寫在方法上
將類別中的所有method都加入model.addAttribute("name",value)
public List<Product> getProducts(){//相當於model.addAttribute("productList",productService.getAll());return productService.getAll();}
}

所以在使用上要注意@ModelAttribute()寫在方法上 先執行到@ModelAttribute()註解的方法並注入到每個類別中的方法

總結

寫在方法上將會優先執行到@ModelAttribute()註解的方法並回傳注入

寫在方法內當參數(無指定名稱) new出該物件 且 attributeName為變數名稱

--

--