您好我想知道使用@ModelAttribute
的目的是什么
为什么要用
@RequestMapping(value="")
public String index(@ModelAttribute("before") Before b) {
System.out.println(b.getBeforeString());
return "home/index";
}
@ModelAttribute("before")
public Before before() {
return new Before();
}
当我可以使用
@RequestMapping(value="")
public String index() {
Before b = new Before();
System.out.println(b.getBeforeString());
return "home/index";
}
答案 0 :(得分:3)
@ModelAttribute
用于将内容填充到MVC模型中以供后续在View中使用。它不是将事物放入模型的唯一方法(这可以通过代码直接完成),但它是添加@RequestMapping
方法args或方法返回值等的便捷方式。 / p>
在同一控制器类中调用的每个@ModelAttribute
方法之前调用使用@RequestMapping
注释的方法。这通常用于popuplating表单的只读组件 - 例如选择列表的值。 (http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-ann-modelattrib-methods) - 或者在绑定传入请求值之前准备bean(例如从数据存储区加载)。
所以,在你的第一个例子......
@ModelAttribute("before")
public Before before() {
return new Before();
}
@RequestMapping(value="")
public String index(@ModelAttribute("before") Before b) {
System.out.println(b.getBeforeString());
return "home/index";
}
...首先调用before()
方法,并在名为“before”的模型中放置Before
实例。接下来将调用index(...)
方法并接收完全相同的Before
实例(因为它还在“之前”使用模型属性名称) - 但现在将使用请求中的值填充它,其中请求param名称映射到属性名称之前。 (旁白:这可能不是你想要的。如果这真的是你想要的,你应该考虑在索引方法中添加BindingResult
作为第二个arg以捕获任何绑定错误(http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-ann-arguments项目符号17 ))。
在此之后,@ModelAttribute
中的index(...)
anntotation也会导致Before
实例出现名称为“之前”的模型,以便在下一个视图中使用:“/ home /索引”。
(值得注意的是:如果您根本没有before()
方法,那么您的index()
方法将接收使用其无参数构造函数创建的Before
实例,然后进行popuplated传入的请求值。它随后会将其放在模型中,名称为“之前”,供下一个视图使用。)
您的第二个代码段......
@RequestMapping(value="")
public String index() {
Before b = new Before();
System.out.println(b.getBeforeString());
return "home/index";
}
...实际上并没有将Before
添加到模型中,因此它在视图中不可用。如果你想在模型中使用之前,请使用:
@RequestMapping(value="")
public String index(Model uiModel) {
Before b = new Before();
System.out.println(b.getBeforeString());
uiModel.addAttribute("beforeName", b); // will add to model with name "beforeName"
uiModel.addAttribute(b) // will add to model with a default name (lower-cased simple type name by convention), ie: "before"
return "home/index";
}
HTH