处理ActionBean中的数据

时间:2009-12-07 01:14:08

标签: java stripes

如何在ActionBean中的两个事件之间保存数据?在以下示例中,我在addContact()中创建联系人,保留联系人并将其保存到属性contact。当我尝试在重定向后访问contact时,在addNumber()中,它为空。

private Contact contact;
...
public Resolution addNumber() {
    log.debug("addNumber() to contact={}", contact);
    return new ForwardResolution("/addNumber.jsp");
}

public Resolution addContact() {
    log.debug("addContact() - name={}", name);
    contact=contactFacade.create(name, surname));
    log.debug("addContact() OK - contact={}", contact);
    return new RedirectResolution(this.getClass(), "addNumber");
}

我做错了什么?

3 个答案:

答案 0 :(得分:2)

这应该有效:

public Resolution addContact() {
    log.debug("addContact() - name={}", name);
    contact=contactFacade.create(name, surname));
    log.debug("addContact() OK - contact={}", contact);

    // Add this actionBean into the flash scope to preserve its state after redirection
    return new RedirectResolution(this.getClass(), "addNumber").flash(this);
}

来源:http://www.stripesframework.org/display/stripes/State+Management#StateManagement-RedirectafterPost

答案 1 :(得分:1)

RedirectResolution导致用户浏览器导航到新的URL,该URL由ActionBean的新实例处理(即使它们来自的是相同的ActioBean)

我在这种情况下的建议是重定向并向RedirectResolution添加一个参数,以便下一个请求中的URL包含联系人ID /密钥。你可以通过返回返回new RedirectResolution(this.getClass(),“addNumber”)来实现这一点.addParameter(“name”,name);

答案 2 :(得分:0)

我不做Stripes,但您熟悉HTTP / JSP / Servlet的工作原理吗?这就是Stripes在“引擎盖下”使用的东西。特别是重定向将创建 new 请求,从而导致所有请求范围属性丢失。此外,请求范围的生命周期较短(从客户端触发它到客户端从适当的响应中收到最后一位),而不是会话范围(从服务器第一次访问客户端开始) - 关联会话,直到会话超时或无效)。

问题的症状让我认为ActionBean和/或Contact而非会话范围,而代码期望它。另一方面,如果你想保持请求范围(这是非常合理的,我也更喜欢),那么你需要加载/构建相同的 Contact每一个请求。