如何在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");
}
我做错了什么?
答案 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
每一个请求。