java - 当 validator 发现表单错误时,表单页面将在 POST url 处重新显示

标签 java spring spring-mvc

此 URL 显示一个项目:

/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";
}

该页面包含一个表单,该表单提交到同一 Controller 中的以下方法:

@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";
}

如果 validator 在表单中发现错误,它会重新显示该项目,但不会在原始 URL 处显示它:

/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";
}

最佳答案

简短回答:否。

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

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

但是您有两个选择:

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

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

关于java - 当 validator 发现表单错误时,表单页面将在 POST url 处重新显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5970734/

相关文章:

java - 序列化 Hibernate 对象时抛出奇怪的 Jackson 异常

java - 从 list 文件 java 禁用类路径

java - 将 SQL 结果相互链接

java - 实体没有表单对象所需的字段

java - Apache ActiveMQ 回退机制

Spring - 无法解析 MVC "view"thymeleaf

java - 如何确定 .text 文件中整数列表的最小值和最大值?

spring - 当多个配置文件不活动时如何有条件地声明 Bean?

java - Spring Test模拟一个依赖

java - Controller 单元测试无法 Autowiring 所需的 bean