我正在寻找开发一个包含POST / Redirect / GET模式和输入验证的Spring MVC应用程序。在POST阶段,我执行一个Validator并返回一个BindingResult / Errors集合。如果有错误,我想重新定向到我的验证错误的表单。我希望这是一个重定向,解析为GET请求,以避免使用浏览器的导航按钮(后退,前进,刷新)时过期的缓存和重新提交提示。
这就是我处理初始表单显示的方式,如果有验证错误,我想将用户重定向到的位置。
@RequestMapping("/account/list")
public String listAccounts(HttpServletRequest request, Map<String, Object> map) {
log.debug("start of list accounts");
map.put("accountList", entityService.listAccounts());
map.put("account", new Account());
map.put("accountTypeValues", AccountTypes.values());
// Map<String, ?> inputFlashMap = RequestContextUtils.getInputFlashMap(request);
// if (inputFlashMap != null) {
// map.putAll(inputFlashMap);
// }
return "account";
}
这是处理POST的方法的片段:
@RequestMapping(value = "/account/add", method = RequestMethod.POST)
public String addAccount(@ModelAttribute("account") @Valid Account account, BindingResult result, RedirectAttributes redirectAttributes, HttpServletRequest request, Map<String, Object> model) {
accountValidator.validate(account, result);
if (result.hasErrors()) {
redirectAttributes.addFlashAttribute("account", account);
redirectAttributes.addFlashAttribute(BindingResult.MODEL_KEY_PREFIX + "account", result);
return "redirect:/account/list";
}
我可以在addAccount方法末尾的HttpServletRequest对象中看到FlashMap,并在listAccounts方法中重定向后再次看到。但是,该映射永远不会与listAccounts中的Model合并。如果我取消注释listAccounts中的inputFlashMap位,那么我会得到所需的结果。
为什么RedirectAttributes(又名FlashMap)在重定向后没有合并到模型中?
答案 0 :(得分:1)
方法listAccounts需要@ModelAttribute(&#34; account&#34;)params中的帐户帐户,例如addAccount
答案 1 :(得分:0)
您无需担心缓存POST请求。因为POST请求根本不应该被追逐。
因此,返回输入表单以响应无效的POST请求是有效的。
答案 2 :(得分:0)
我认为你可以通过添加
来达到理想的行为@SessionAttributes("account")
到您的控制器而不是使用闪存范围。但是,在这种情况下,您需要注意在需要时从会话中删除属性。