Java Spring @ModelAttribute方法模型名称

时间:2013-01-06 05:17:00

标签: spring model-view-controller modelattribute

我一直在阅读这个论坛很长一段时间,发现它非常有用,感谢贡献者。我有一个问题困扰了我几个星期。它就在这里。

     @RequestMapping(value="updateNote.htm",method=RequestMethod.POST)
     public String updateNote(@ModelAttribute("note")NoteBean nb, BindingResult res,Model model){
        daoobj.updateNote(nb.getName(),nb.getPath(), nb.getNote());

        model.addAttribute("note",daoobj.getByName(nb.getName()));
        return("success");
}

    @RequestMapping(value="updateNote.htm",method=RequestMethod.GET)
    public String updateNote(@ModelAttribute("note")NoteBean nb,Model model){  
        populateNoteBean();
        model.addAttribute("note",daoobj.getByName(nb.getName()));
        return("editNote");
}

@ModelAttribute("WHAT")
  public NoteBean populateNoteBean() {
    NoteBean nnb = new NoteBean();
    return nnb;
  }

使用方法populateNoteBean(),模型属性为“WHAT”。但是,我使用的名称是“注意”。因此,当我运行代码时,NoteBean会正确保存到数据库中。我的问题是如何?看起来名称“WHAT”应该是“note”或者模型属性将其保存为无名称。

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

使用当前代码,您将在模型中有两个notebean实例!

第一个spring调用控制器中的所有modelattribute注释方法,并将结果放在模型中。其次,它会根据您的requestmapping方法评估那些。

modelattribute注释方法的要点是你可以选择如何创建你的bean。例如从数据库中加载它。

我们使用这种方法:

  • modelattr method(name =“note”)

从db

加载bean
  • 使用modelattr param的请求映射方法(name =“note”)

将第一个方法创建的note bean与来自提交的请求参数合并,例如,您可以直接访问修改后的那个。

一个很好的效果: 我们不希望为表单中的所有属性放置隐藏的输入字段,只是为了能够将实体与entitymanager合并。这样你就可以得到一个只有一个属性的表单(加上一个用于获取实体的id)

或另一个: 如果你的note bean是一个抽象类,spring就不可能实例化bean,因为它不知道要实现什么。例如,您可以在modelattr注释方法中添加requestparam参数,并决定自己做什么。

这在文档中有很好的描述。无论是参考还是在控制器的api中,我都相信reqestmapping或modelattribute。