重定向或转发维护BindingResults

时间:2013-01-17 15:48:37

标签: java spring-mvc

我正在寻找一种方法来重定向或从一个Controller请求映射转发到另一个。

情况是我有一个控制器,它有三个阶段:用户输入数据 - >预览页面 - >提交。在预览请求映射中,我有Model Attribute及其BindingResult。如果我在绑定中有错误,我想使用重定向将用户推回到New表单,但是当我这样做时,Spring会重新评估ModelAttribute,从而重新创建BindingResult。

一些代码:

@RequestMapping(value = "\new", method = RequestMethod.GET)
@ApplicationUserCreated
public String formNew(
        @ModelAttribute("formBean") FormBean formBean,
        BindingResult bindingResults,
        Model uiModel) {
    // Do some stuff

    // Send the "new form" view
    return "new.jsp";
}

@RequestMapping("/preview", method = RequestMethod.POST)
@ApplicationUserCreated
public String formPreview(
        @ModelAttribute("formBean") FormBean formBean,
        BindingResult bindingResults,
        Model uiModel) {
    // TODO: Validate the form
    if(bindingResults.hasErrors()) {
        // Redirect them back to the "New" form
        return "redirect:" + "/new";
    } else {
        return "preview.jsp";
    }
}

请原谅任何拼写错误,因为我必须尝试简化代码。我尝试从formNew()方法中删除BindingResults,但是当Preview重定向到New时,它似乎仍然会覆盖BindingResults。我也尝试过做“前进”,但结果相同。

3 个答案:

答案 0 :(得分:1)

当我需要将用户发送回new.jsp时,我最终只是从 formPreview()调用 formNew()。我没有得到重定向,所以浏览器中的URL显示为“/ preview”,但至少它正在工作,我觉得我不是在浪费时间重复代码。

答案 1 :(得分:0)

您可以在会话中存储BindingResult,或者如果您至少有春季3.1,则可以尝试使用Spring Flash Attributes发送该数据。

**如果ManagementMovesFormBean扩展或实现了你的FormBean,你应该在flash属性中发送该bean。

**顺便说一下,为了验证你的形式,你应该在@ModelAttribute(“.....

”之前添加@Valid

不要忘记将BindingResult分配给单个类,在您的示例中,您有2个具有不同预期对象的方法,因此这两个BindingObjects是不同的

答案 2 :(得分:0)

我不确定预览页面的用途是什么,但我建议在同一页面上执行验证,并且只有在输入有效时才能使用重定向进行预览。