我在spring mvc应用程序中遇到控制器问题。
我从数据库获取所有实体并将它们放在我的jsp页面中的表中。
我正在添加一个实体,该功能运行良好,它添加了一个实体并刷新页面。但是当我尝试刷新页面时出现问题...同样的实体再次添加,通常在每次刷新后添加实体后再次执行post方法,最后我有许多相同的实体。
这是添加新实体的post方法:
@RequestMapping(value = "/adminpanel", method = RequestMethod.POST)
public ModelAndView addNewSoftware(@ModelAttribute VersionInformation versionInformation)
{
ModelAndView model = new ModelAndView("panel");
persistanceDAO.insertVersionInformation(versionInformation);
systemVersionsList.clear();
systemVersionsList.addAll(persistanceDAO.getSystemVersions());
model.addObject("systemVersionsList",systemVersionsList);
model.addObject("versionInformation", new VersionInformation());
return model;
}
这是我的GET方法:
@RequestMapping(value = "/adminpanel/add", method = RequestMethod.POST)
public ModelAndView addNewSoftware(@ModelAttribute VersionInformation versionInformation)
{
ModelAndView model = new ModelAndView("panel");
persistanceDAO.insertVersionInformation(versionInformation);
systemVersionsList.clear();
systemVersionsList.addAll(persistanceDAO.getSystemVersions());
model.addObject("systemVersionsList",systemVersionsList);
model.addObject("versionInformation", new VersionInformation());
return model;
}
另一个问题是,当我删除实体时,该实体将被删除,但该网站不会刷新。这是我负责删除实体的帖子方法:
@RequestMapping(value = "/adminpanel/delete", method = RequestMethod.POST)
public ModelAndView deleteSoft(@ModelAttribute(value="currentId") int currentId, @ModelAttribute VersionInformation versionInformation)
{
ModelAndView model = new ModelAndView("panel");
persistanceDAO.deleteSystemVersion(currentId);
systemVersionsList.clear();
systemVersionsList.addAll(persistanceDAO.getSystemVersions());
model.addObject("systemVersionsList",systemVersionsList);
model.addObject("versionInformation", new VersionInformation());
return model;
}
答案 0 :(得分:1)
如何在更新数据后使用重定向。
“在显示结果之前执行重定向的另一个原因是消除用户多次提交表单数据的可能性。在这种情况下,浏览器将首先发送初始POST;然后它将收到重定向的响应到另一个URL;最后,浏览器将对重定向响应中指定的URL执行后续GET。“quoted from Spring mvc doc
答案 1 :(得分:1)
您可能正在关注Post/Redirect/Get pattern。如果您使用的是Spring 3.1及更高版本,那么使用flash attribute即可轻松实现此目的。
使用发布/重定向/获取模式修改代码
@RequestMapping(value = "/adminpanel/add", method = RequestMethod.POST)
public String addNewSoftware(@ModelAttribute VersionInformation versionInformation,
final RedirectAttributes redirectAttributes){
ModelAndView model = new ModelAndView("panel");
persistanceDAO.insertVersionInformation(versionInformation);
systemVersionsList.clear();
systemVersionsList.addAll(persistanceDAO.getSystemVersions());
redirectAttributes.addFlashAttribute("systemVersionsList",systemVersionsList);
redirectAttributes.addFlashAttribute("versionInformation", new VersionInformation());
return "redirect:/adminpanel/show-panel";
}
@RequestMapping(value = "/adminpanel/show-panel", method = RequestMethod.GET)
public ModelAndView showSoftwarePanel(@ModelAttribute("systemVersionsList") List<YouDidNotShowTheTypeOFSystemVersionList> systemVersionsList,
@ModelAttribute("versionInformation") VersionInformation versionInformation){
ModelAndView model = new ModelAndView("panel");
model.addObject("systemVersionsList", systemVersionsList);
model.addObject("versionInformation", versionInformation);
return model;
}
执行此操作后,您的页面现在可以避免多个表单提交问题。
答案 2 :(得分:0)
GET
方法只能用于idempotent operations。对于删除和插入,您必须使用POST
。 And after successful non-idempotent operation you must send a redirect to user,所以如果他点击刷新没有小猫受到伤害。
答案 3 :(得分:0)
我认为问题在于,当您刷新页面时,您正在重新发送数据。如果是这样,您需要使用POST后重定向模式。
试试这个
@RequestMapping(value = "/adminpanel/add", method = RequestMethod.POST)
public ModelAndView addNewSoftware(@ModelAttribute VersionInformation versionInformation)
{
ModelAndView model = new ModelAndView("redirect:/admin/panel");
// move these lines
persistanceDAO.insertVersionInformation(versionInformation);
systemVersionsList.clear();
systemVersionsList.addAll(persistanceDAO.getSystemVersions());
model.addObject("systemVersionsList",systemVersionsList);
model.addObject("versionInformation", new VersionInformation());
// end
return model;
}
注意:您应该将注释行移动到GET方法中,否则,您的版本等将在重定向后显示在URL中