0

@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";
}
4

1 回答 1

3

@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()方法将收到一个Beforecreated 及其无参数构造函数的实例,然后用传入的请求值填充。它仍会随后将其放入模型中并命名为“之前”供下一个视图使用。)

您的第二个代码段...

@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";
}

高温高压

于 2013-03-05T13:42:21.810 回答