被@ModelAttribute注释的方法会在每个controller方法执行前被执行。
对于一个controller映射多个URL的类,要谨慎使用。
使用方式:
@ModelAttribute注释void返回值的方法
@Controllerpublic class HelloWorldController {@ModelAttributepublic 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。
- 当URL或者post中不包含参数时,会报错。
@ModelAttribute注释返回具体类的方法
@ModelAttributepublic Account addAccount(@RequestParam String number) {return accountManager.findAccount(number);}
- model属性的名称没有指定,它由返回类型隐含表示。
- 如这个方法返回Account类型,那么这个model属性的名称就是account。
- model属性对象的值就是方法的返回值。
@ModelAttribute(“attributeName”)注释返回具体类的方法
@Controllerpublic class HelloWorldController {@ModelAttribute("attributeName")public String addAccount(@RequestParam String abc) {return abc;}@RequestMapping(value = "/helloWorld")public String helloWorld() {return "helloWorld";}}
- 使用注解指定的attributeName属性来指定model属性的名称。
- model对象的值就是方法的返回值。
@ModelAttribute和@RequestMapping同时注释一个方法
@Controllerpublic class HelloWorldController {@RequestMapping(value = "/helloWorld.do")@ModelAttribute("attributeName")public String helloWorld() {return "hi";}}
- 这个方法的返回值并不是表示一个视图名称,而是model属性的值。
- 视图名称由RequestToViewNameTranslator根据请求”/helloWorld”转换为逻辑视图helloWorld。
@ModelAttribute注释一个方法的参数
@Controllerpublic 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”)方法注释参数,参数的值来源于addAccount()方法中的model属性。
- 如果方法体标注了@SessionAttributes(“user”),那么scope为session,没有标注,那么scope为request。
从form表单或URL参数中获取(脱裤子放屁)
@Controllerpublic class HelloWorldController {@RequestMapping(value = "/helloWorld")public String helloWorld(@ModelAttribute User user) {return "helloWorld";}}
- 这个时候这个User类一定要有无参的构造函数。
