[SpringMVC]@ModelAttribute 2種用法與解釋( @ModelAttribute — Used on Method and Parameter )
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為變數名稱