理解JSF2中的Flash Scope

理解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。但是,它什么也没显示。

请纠正我在这个例子中对闪存范围的误解。非常感谢


素胚勾勒不出你
浏览 601回答 3
3回答

万千封印

简而言之,存储在闪存范围中的变量将在重定向后继续存在,之后将被丢弃。这在实现Post-Redirect-Get模式时非常有用。如果您尝试通过重定向导航到另一个页面并在加载时访问属性,它们将在那里。完成该请求后,闪存中的值将被丢弃。例如:你在page1.xhtml中,你有一个commandLink,它使用类似这样的方法重定向到一个新页面(注意:我将使用隐式导航)。public&nbsp;String&nbsp;navigateToPageB()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;FacesContext.getCurrentInstance().getExternalContext().getFlash().put("param1",&nbsp;"Hello&nbsp;World!"); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"pageB?faces-redirect=true";}呈现pageB.xhtml时,您可以通过EL表达式访问这些值,例如<h:outputLabel&nbsp;value="#{flash['param1']}"&nbsp;/>这将显示“Hello World!”&nbsp;我们之前在navigateToPageB中保存的字符串。至于您的问题,通过在资源管理器中打开新选项卡,您无法访问上一个选项卡上访问的相同上下文,因此您的变量将不可用。

翻翻过去那场雪

把它设置在EL没有为我做的技巧,但相反,我可以建议将它放入托管bean:FacesContext.getCurrentInstance().getExternalContext().getFlash().keep("oValue"); this.oValue = (ValueClass) FacesContext.getCurrentInstance().getExternalContext().getFlash().get("oValue");&nbsp;它适用于GET再次ting页面,但它在ajax请求后以某种方式中断+&nbsp;GET。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java