💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # `@ModelAttribute` 被@ModelAttribute注释的方法会在此controller每个方法执行前被执行,因此对于一个controller映射多个URL的用法来说,要谨慎使用 ## 注解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类型的参数。 也可以这样 ~~~ @ModelAttribute public void testModeelAttribute(Model model){ model.addAttribute("username", "lzj"); } ~~~ ## 注解方法返回对象 ~~~ @Controller public class MyModelAttribute { @ModelAttribute /*1.把请求链接中的name属性的值赋给username变量,请求链接中的age属性赋给age变量; 2.返回类型为对象,相当于把返回的对象放到了请求模型中,返回的对象相当于模型中的值,键相当于@ModelAttribute注解标注的方法的首字母小写,即testModeelAttribute; 即model.addAttribute("testModeelAttribute", user); */ public User testModeelAttribute(@RequestParam("name") String username, @RequestParam("age") Integer age){ User user = new User(); user.setUsername(username); user.setAge(age); return user; } @RequestMapping("/user") /*模型中已经放入属性和值,model.addAttribute("testModeelAttribute", user);然后通过@ModelAttribute("testModeelAttribute")标注在属性上,表示把模型中的testModeelAttribute键对应的value值赋给了usr。*/ public String User(@ModelAttribute("testModeelAttribute") User usr, Model model){ model.addAttribute("user", usr); return "user"; } } ~~~ User类 ~~~ public class User { private String username; private int age; ~~~ --- **指定存的名字** 如果 **@ModelAttribute标注方法时,指定放在模型中的键值** `@ModelAttribute`标注的testModeelAttribute()方法默认把键为testModeelAttribute,value值为user的键值对放在了model模型中。但是我们可以显示指定放在模型中的键的名字。 **当@ModelAttribute属性标识在方法的参数上时,表示从请求域的模型中读取属性。** ~~~ /*相当于把model.addAttribute("userAttribute", user)放在了请求模型中*/ @ModelAttribute("userAttribute") public User testModeelAttribute(@RequestParam("name") String username, @RequestParam("age") Integer age){ User user = new User(); user.setUsername(username); user.setAge(age); return user; } @RequestMapping("/user") /*把请求模型中userAttribute键对应的值赋给usr变量中*/ public String User(@ModelAttribute("userAttribute") User usr, Model model){ usr.setAge(25); model.addAttribute("user", usr); return "user"; } ~~~ ## @ModelAttribute和@RequestMapping同时标注在同一个方法上 **当两个注解同时标注在一个方法上时,该方法返回的内容不再被视图解析器解析为视图了,而是把放回的内容放到模型的属性中,视图还是继续返回@RequestMapping映射的那个视图** ~~~ @Controller public class MyModelAttribute { @RequestMapping("/login") @ModelAttribute("name") public String login(@RequestParam(value="username", required=false) String username){ System.out.println("--username-- : " + username); return username; } } ~~~ 当login()方法响应请求后,执行方法,然后把方法的返回值username放到请求模型的name属性中,相当于`model.addAttribute("name", username)` 当请求方法执行完后,会返回@RequestMapping映射的那个视图 # @InitBinder和WebBindingInitializer @InitBinder用于在@Controller中标注于方法,表示为当前控制器注册一个属性编辑器或者其他,只对当前的Controller有效 WebBindingInitializer:实现WebBindingInitializer,重写initBinder注册的属性编辑器是全局的属性编辑器,对所有的Controller都有效 由 @InitBinder 标识的方法,可以对 WebDataBinder 对象进行初始化。WebDataBinder 是 DataBinder 的子类,用于完成由表单字段到 JavaBean 属性的绑定。 * @InitBinder方法不能有返回值,它必须声明为void。 * @InitBinder方法的参数通常是是 WebDataBinder。