理解JSF2中的Flash Scope根据我的理解,面向请求生命周期中放置在Flash作用域内的对象将可用于下一个面请求生命周期,然后清除。假设我有两页:page01.xhtml:<h:form>
<h:commandButton action="#{page01Bean.action}" /></h:form>Page01Bean:@ManagedBean@RequestScopedpublic class Page01Bean {
public void action(){
FacesContext.getCurrentInstance().getExternalContext().getFlash().put("fooKey", "fooValue");
}}page02.xhtml:<h:outputText value="#{flash.fooKey}"/>因此,当page01.xhtml单击按钮时,面部请求生命周期(比如生命周期A)开始并将值设置为所调用的键下的闪存fooKey然后我打开另一个浏览器选项卡并浏览 page02.xhtml。另一个面临请求生命周期(比如生命周期B)开始呈现此页面。我预计生命周期B可以访问其上一个生命周期的闪存范围(即生命周期A)并显示fooValue在其中 page02.xhtml。但是,它什么也没显示。请纠正我在这个例子中对闪存范围的误解。非常感谢
3 回答
万千封印
TA贡献1891条经验 获得超3个赞
简而言之,存储在闪存范围中的变量将在重定向后继续存在,之后将被丢弃。这在实现Post-Redirect-Get模式时非常有用。
如果您尝试通过重定向导航到另一个页面并在加载时访问属性,它们将在那里。完成该请求后,闪存中的值将被丢弃。例如:
你在page1.xhtml中,你有一个commandLink,它使用类似这样的方法重定向到一个新页面(注意:我将使用隐式导航)。
public String navigateToPageB() { FacesContext.getCurrentInstance().getExternalContext().getFlash().put("param1", "Hello World!"); return "pageB?faces-redirect=true";}
呈现pageB.xhtml时,您可以通过EL表达式访问这些值,例如
<h:outputLabel value="#{flash['param1']}" />
这将显示“Hello World!” 我们之前在navigateToPageB中保存的字符串。
至于您的问题,通过在资源管理器中打开新选项卡,您无法访问上一个选项卡上访问的相同上下文,因此您的变量将不可用。
翻翻过去那场雪
TA贡献2065条经验 获得超14个赞
把它设置在EL没有为我做的技巧,但相反,我可以建议将它放入托管bean:FacesContext.getCurrentInstance().getExternalContext().getFlash().keep("oValue"); this.oValue = (ValueClass) FacesContext.getCurrentInstance().getExternalContext().getFlash().get("oValue");
它适用于GET
再次ting页面,但它在ajax请求后以某种方式中断+ GET
。
添加回答
举报
0/150
提交
取消