Spring: @ModelAttribute註解用法
最近在看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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SpringBoot @ModelAttribute 用法Spring Boot
- @Query註解的用法(Spring Data JPA)Spring
- Spring 快取註解@Cacheable的用法Spring快取
- Spring註解Spring
- 【Spring註解】事務註解@TransactionalSpring
- SPRING-spring註解整理Spring
- Spring boot註解Spring Boot
- Spring : @SessionAttributes註解SpringSession
- Spring新註解Spring
- Spring註解大全Spring
- Spring常用註解Spring
- @ModelAttribute作用
- Java反射和註解基本用法Java反射
- Spring Boot系列十八 Spring AOP + 註解實現統一註解Spring Boot
- Spring系列之新註解配置+Spring整合junit+註解注入Spring
- Spring 註解程式設計之模式註解Spring程式設計模式
- Spring(使用註解配置)Spring
- Spring-註解注入Spring
- spring註解開發Spring
- spring boot 註解@ComponentSpring Boot
- Spring註解之@ConditionalSpring
- Spring註解?啥玩意?Spring
- Spring 註解開發Spring
- Spring註解之@ImportSpringImport
- Spring註解簡析Spring
- spring 框架常用註解Spring框架
- Spring註解系列——@PropertySourceSpring
- @ModelAttribute 的使用
- Spring IoC 公共註解詳解Spring
- Spring AOP的AspectJ註解Spring
- 【Spring 註解】@Configuration和@BeanSpringBean
- Spring Boot註解 之 @RequestXSpring Boot
- Spring條件註解@ConditionalSpring
- Spring Cache快取註解Spring快取
- Spring中重要的註解Spring
- Spring @Transactional註解淺談Spring
- Spring 框架快取註解Spring框架快取
- Spring的註解開發Spring