【发布时间】:2014-09-20 14:52:51
【问题描述】:
我使用 Flash 范围在 @viewscoped 控制器之间传递设置对象。但是,如果我在其中一个上重新加载页面,则闪存映射为空,并且设置对象未初始化。是否可以在页面重新加载时保持 Flash 范围?
我用于存储/检索设置的源代码:
FistPage.xhtml
...
<p:commandButton value="next"
action="#{firstPageController.transferConfig}"
process="@this" />
...
FirstPageController.java
@ManagedBean(name = "firstPageController")
@ViewScoped
public class FirstPageController {
...
public String transferConfig() {
FacesContext.getCurrentInstance().getExternalContext().getFlash().put("searchConfig", searchConfig);
return "/secondPage.xhtml?faces-redirect=true";
}
...
}
SecondPage.xhtml
...
<h:outputLabel value="value">
<f:event type="preRenderComponent" listener="#{secondPageController.onPageLoad()}"/>
</h:outputLabel>
...
SecondPageController.java
@ManagedBean(name = "secondPageController")
@ViewScoped
public class SecondPageController {
...
public void onPageLoad()
{
flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
searchConfig = ((SearchFilterConfig) flash.get("searchConfig"));
flash.putNow("searchConfig", searchConfig);
flash.keep("searchConfig");
}
...
}
我使用 Mojarra 2.1.29
谢谢
【问题讨论】:
-
你从哪里调用这个方法?如果参数不在地图中,这将无济于事......您是否在其他任何地方记录它?
-
我刚刚意识到您根本没有执行重定向以转到您的第二个视图。你能看到地址栏中的 url 改变了吗?
-
是的,我可以。我在上面的代码中更改了它。仅当我使用 update="@all" 重新加载 secondPage 或对 secondPage 执行操作时才会出现问题
-
它们是不同的东西。第一个是对视图的
GET请求,您所说的第二个是对同一视图的回发。第二个可以避免保留闪存参数或将其存储在@ViewScoped。 -
@Alex:使用 flash 范围对
@ViewScopedbean 进行同一页面重新加载有什么意义?您可以将变量存储为该 bean 的实例变量,并且在重新加载时它仍然存在
标签: jsf-2 flash-scope