1

如何在 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");
}

我究竟做错了什么?

4

3 回答 3

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

于 2010-01-08T15:19:36.420 回答
1

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

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

于 2009-12-15T20:35:41.313 回答
0

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

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

于 2009-12-07T02:12:39.330 回答