当验证器发现表单错误时,表单页面将在POST URL处重新显示

时间:2011-05-11 21:18:21

标签: java spring spring-mvc

此网址显示一个项目:

/item/10101

使用此Controller方法:

@RequestMapping(value = "/item/{itemId}", method = RequestMethod.GET)
public final String item(HttpServletRequest request, ModelMap model, 
    @PathVariable long itemId)
{
    model = this.fillModel(itemId);
    return "item";
}

该页面包含一个在同一控制器中提交以下方法的表单:

@RequestMapping(value = "/process_form", method = RequestMethod.POST)
public final String processForm(HttpServletRequest request,
 @ModelAttribute("foo") FooModel fooModel,
    BindingResult bindResult,
    ModelMap model)
{

    FooModelValidator validator = new FooModelValidator();
    validator.validate(FooModel, bindResult);

      if (bindResult.hasErrors())
      {
        model = this.fillModel(fooModel.getItemId());
       return "item";
      }
    return "account";
}

如果验证器在表单中发现错误,它会重新显示该项目,而不是将其显示在原始网址上:

/item/10101

它在自己的网址上显示:

/process_form

是否可以在原始网址重新显示表单?

/item/10101

(我尝试获取引荐来源并在processForm中重定向到它,但随后所有模型内容最终显示为URL名称/值对:)

@RequestMapping(value = "/process_form", method = RequestMethod.POST)
public final String processForm(HttpServletRequest request,
 @ModelAttribute("foo") FooModel fooModel,
    BindingResult bindResult,
    ModelMap model)
{
    String referrer = request.getHeader("referer");

    FooModelValidator validator = new FooModelValidator();
    validator.validate(FooModel, bindResult);

      if (bindResult.hasErrors())
      {
        model = this.fillModel(fooModel.getItemId());
       return "redirect:" + referrer;
      }
    return "account";
}

1 个答案:

答案 0 :(得分:1)

简短回答:不。

服务器端重定向(转发)会发生什么,它在同一个请求中,因此提交的值会被保留(并显示在表单中)

如果您使用客户端重定向(return "redirect:item";),则网址会发生变化,但在这种情况下会出现新请求,并且提交的值将会丢失。

但这里有两个选项:

  • 在两种方法的映射中使用相同的URL,并根据请求方法区分它们 - 前者为GET,后者为POST。这可能会令人困惑,所以请记录下来。

  • 为spring-mvc查找/实现flash scope。内置任何东西都没有。闪存范围意味着为提交和后续重定向保留值(通常在会话中)。该选项包括手动处理,将提交的对象放入会话中,然后检索&删除它