@ModelAttribute
用于将事物填充到 MVC 模型中,以供视图中的后续使用。这不是将事物放入模型中的唯一方法(这也可以直接通过代码完成),但它是添加@RequestMapping
方法参数或方法返回值等的便捷方法。
在同一个控制器类中调用的@ModelAttribute
每个方法之前,都会调用带有注释的方法。@RequestMapping
这通常用于填充表单的只读组件 - 例如选择列表的值。(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
实例(因为它也使用模型属性名称“before”) - 但现在它将填充来自请求的值,其中请求参数名称映射到 Before 属性名称。(旁白:这可能不是你想要的。如果这真的是你想要的,你应该考虑BindingResult
在索引方法中添加一个作为第二个参数来捕获任何绑定错误(http://static.springsource.org/spring/docs /3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-ann-arguments要点 17))。
在此之后,@ModelAttribute
注释index(...)
也将导致该Before
实例显示名称为“之前”的模型,以便在下一个视图中使用:“/home/index”。
(值得注意的是:如果您根本没有该before()
方法,您的index()
方法将收到一个Before
created 及其无参数构造函数的实例,然后用传入的请求值填充。它仍会随后将其放入模型中并命名为“之前”供下一个视图使用。)
您的第二个代码段...
@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";
}
高温高压