我的应用中存在数据流问题..
在控制器中我从DB获取一些模型,然后我将其传递给视图 - 这里显示了一些字段(不是全部),用户可以修改它们。 然后,当他提交表单时,控制器应该在db中更新模型。
问题在于流程,因为并非所有字段都在标记中,因此在提交表单后它们不会通过。 我找到的唯一解决方案是创建包含所有字段的附加标记,这些字段不用于向前传递它们。
但是如果我有很多字段,例如 - 30,我将不得不创建很多隐藏的字段......
您认为哪种解决方案最好?
问候, 微米。
答案 0 :(得分:0)
您有2个选项
@ModelAttribute
带注释的方法,以便从数据库中为每个请求获取模型对象@SessionAttributes
将其放入会话中。 @ModelAttribute
带注释的方法您可以使用@ModelAttribute
annotated method代替GET方法填充模型。将在控制器中的每个请求处理方法之前调用此方法。要注意的一件事是在每个请求中传递id。
@ModelAttribute
public YourObject modelObject(@RequestParam long id) {
return yourObjectDao.findOne(id);
}
现在,您只需从GET方法中删除模型的填充,并在POST方法中添加@ModelAttribute
带注释的方法参数。然后将使用新获得的对象。
这种方法的缺点是,当使用乐观锁定时,它不再适用,因为每次获得最新版本。
@SessionAttributes
使用@SessionAttributes
注释您的控制器,这指示Web处理将匹配的模型对象存储在会话中,并在绑定之前从那里检索它们。
@SessionAttributes("yourObject")
@Controller
public class YourController { ... }
现在在你的POST方法中添加一个SessionStatus
类型的参数,当一切都很好时,调用该对象上的isComplete
方法。这将清除此控制器在会话中放置的任何会话属性。
public String handlePost(@ModelAttribute YourObject model, BindingResult result, SessionStatus status) {
if (result.hasErrors) {
return "yourView";
} else {
status.isComplete();
yourObjectDao.save(model);
return "redirect:your-new-view";
}
}