最近好忙,几乎没有时间阅读和记录,主要是由于公司把项目由php开始转到java阵营了。这让从php起步的我来说,多少伴随着重新使用一门语言的陌生感。
不过,伴随着陌生感的,还有久违的新鲜感,我个人非常喜欢这种赶脚,仿佛重新找到了一片净土~~
废话不多说,忙里抽闲,记录一下这几天学习到的新姿势:@ModelAttribute注解
这个注解来自Spring,主要用于MVC中的Model对象(用于保存数据模型),从这个解释来看并不觉得有什么复杂的,但是貌似它的用法比较多,下面转载几个看到的例子~
@Controller public class HelloWorldController { @ModelAttribute public void populateModel(@RequestParam String name, Model model) { model.addAttribute("who", name); } @RequestMapping(value = "/helloWorld") public String helloWorld() { return "helloWorld"; } }
上面的代码,在获取请求/helloWorld后,populateModel方法会在helloWorld方法之前被调用,它把请求参数kazaff(/helloWorld?name=kazaff)赋值到model的名为who的键中,在它执行后,helloWorld方法才会被调用,返回的Model就是由@ModelAttribute注解的方法创建的。
这个例子纯粹用于演示@ModelAttribute,实际中我想没人会这么用~~
@ModelAttribute public Account addAccount(@RequestParam String name) { return accountManager.findAccount(name); }
这种用于主要用于和例子1进行比较,它直接返回的Account类型的对象会隐式的赋值给model对象的account键中,我个人感觉这一点其实并不那么实用。
@Controller public class HelloWorldController { @ModelAttribute("who") public String addAccount(@RequestParam String name) { return name; } @RequestMapping(value = "/helloWorld") public String helloWorld() { return "helloWorld"; } }
这个例子应该没什么好说的了,大家推测也能得到结果!
上面的三个例子对@ModelAttribute的用法我个人觉得比较另类,被@ModelAttribute注解的方法会在此Controller中每个映射URL的方法执行之前被执行,可见灵活度太差。
@Controller public class HelloWorldController { @RequestMapping(value = "/helloWorld") @ModelAttribute("who") public String helloWorld() { return "kazaff"; } }
注意,这么写的话,helloWorld方法的返回值并不表示一个视图名称,而是表示model的一个键值,视图名称由RequestToViewNameTranslator根据请求的URL转换为逻辑视图名称,上例中为helloWorld。
@Controller public class HelloWorldController { @ModelAttribute("user") public User addAccount() { return new User("kazaff","kazaff.me"); } @RequestMapping(value = "/helloWorld") public String helloWorld(@ModelAttribute("user") User user) { return "helloWorld"; } }
上例中,参数user的值来源于addAccount方法的返回值。
@Controller public class HelloWorldController { @RequestMapping(value = "/helloWorld") public String helloWorld(@ModelAttribute User user) { return "helloWorld"; } }
这种用法是我最开始看到的,其实这种写法的话,完全可以省略掉这个注解!Spring可以直接把请求中携带的数据转换成User类型的对象。