在Spring中保持控制器之间的对象数据

时间:2012-02-14 17:47:47

标签: java forms spring-mvc

我有一个名为Request的对象,它是我的门户网站的主要对象,它存储请求的所有信息,用户,他们的表单选择等。如何在不同的表单之间保留所有以前的信息?在每个.GET中我必须设置请求对象,然后在每个.POST中,传递给它的唯一信息是.GET页面上的表单中的内容。所以在每个页面上我都必须有隐藏的字段,例如

<form:input path='requestId' style='display:none' />

<form:input path='currentUserId' style='display:none' />

<form:input path="step" style='display:none' />

我需要这些字段,并且还希望请求对象中的其余字段不在表单上,​​而不必为对象中的每个字段重复该字段。

@RequestMapping(value = "/review", method = RequestMethod.GET)
public ModelAndView showCorReview(@RequestParam(value = "requestId") String requestId,
                                  @CookieValue(value = "EMP_ID", defaultValue = "168") int userId)
{
    Request request = requestManager.getRequestById(Integer.parseInt(requestId));

    request.setCurrentUserId(userId);

    String pageTitle = "2.1: Initiate New Service Request -- (Review)";
    ModelAndView mav = new ModelAndView();
    mav.setViewName("newRequest/review");
    mav.addObject("title", pageTitle);
    mav.addObject("request", request);
    mav.addObject("cpm", userManager.getUserById(request.getCpm()).getName());
    return mav;
}

@RequestMapping(value = "/review", method = RequestMethod.POST)
public String saveReview(Request request, @RequestParam(value = "commentData", required = false) String[] additionalComments)
{
    if (additionalComments != null)
        commentLogManager.addCommentLog(additionalComments, request);

    if (request.getRejectReason() == "")
    {
        request.setCpm(admin.getCPM(request.getContract()).getId());
        request.setCor(admin.getCOR(request.getContract()).getId());
        requestManager.updateRequest(request);           
    }
    else
    {
        if (request.getSubmitType().equals("return"))
        {
            request.setNextStep(1);
            requestManager.moveRequestToStep(request);
        }
    }
    return worksheetUrl + request.getId();
}

另外我也可以在.POST中做 Request request = requestManager.getRequestById(Integer.parseInt(requestId))

然后在所有表单字段上使用setter,但同样,我更希望数据实际上保留在它上面而不显式调用它。

1 个答案:

答案 0 :(得分:0)

@Tim,如果我正确地理解了您的要求,您就有了一系列表单,并且您希望将信息从一个表单传输到下一个表单,而无需访问数据库或将请求变量从一个表单复制到另一个表单。我可以支持@JB Nizel建议使用HTTP Session,但你可能不想让会话变得“沉重”;毕竟,它是应用范围之后的下一个最持久的范围。

Spring Web Flow可能就是答案。当用户从一个表单前进到下一个表单时,Flow-scope将允许您构建表单状态。另外,当流程结束时,您不必担心表单范围的变量,这与您不想留下的会话变量不同。