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