多年来我一直在使用@ModelAttribute来创建和初始化我的命令对象,如下所示:
@RequestMapping()
public String someHandler(@ModelAttribute("formBean") FormBean formBean) {
// Do something
}
@ModelAttribute("formBean")
public FormBean createFormBean() {
FormBean formBean = new FormBean();
// Do some sort of initialization
return formBean;
}
在这个例子中,我在Controller中有一个需要FormBean的处理程序,以及一个“create”方法,如果一个人不在模型中(或者如果使用@SessionAttributes,则为会话)。因此,当我运行someHandler()方法时,FormBean已经存在并填充,因为我的createFormBean()已经运行了。
然而,我的同事声称,虽然这很好用,但是我误用了@ModelAttribute用于它不打算用于的目的,即创建Command对象。在他对the JavaDoc的解释中,你应该只使用@ModelAttribute来创建静态数据,比如用于填充下拉列表等的项目。
我知道这可以很好地创建和初始化我的Command对象,但是我是否将它用于最初不打算用于的目的?我在这里打破了一些基本规则吗?
答案 0 :(得分:1)
@ModelAttribute("formBean")
public FormBean createFormBean() {
FormBean formBean = new FormBean();
// Do some sort of initialization
return formBean;
}
如果您需要在从视图绑定表单值之前初始化模型属性,这将非常有用。例如,您可以从数据库中查询对象(以便在当前会话中使用它)。
在其他情况下,我更喜欢使用此方法:
@RequestMapping
public String someHandler(final Model model) {
FormBean formBean = new FormBean();
// Do some sort of initialization
model.addAttribute("formBean", formBean);
}
我认为理解更清楚。但我不认为你“在这里打破一些基本规则”。