了解JSF2中的Flash Scope
根据我的理解,在面向请求生命周期中放置在Flash范围内的对象将可用于下一个面请求生命周期,然后清除。
假设我有两个页面: page01.xhtml: <h:form> <h:commandButton action="#{page01Bean.action}" /> </h:form> Page01Bean: @ManagedBean @RequestScoped public 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)和显示fooValuein page02.xhtml。但是,它不显示任何内容。 请纠正我对本示例中的Flash范围的误解。非常感谢 解决方法
简而言之,存储在闪存范围中的变量将在重定向后生存,并且它们之后将被丢弃。这在实现后重定向获取模式时非常有用。
如果您尝试通过重定向导航到另一个页面并访问负载上的属性,他们将在那里。请求完成后,闪存中的值将被丢弃。例如: 你在page1.xhtml,你有一个命令链接重定向到一个新的页面与这样的方法(注意:我将使用隐式导航)。 public String navigateToPageB() { FacesContext.getCurrentInstance().getExternalContext().getFlash().put("param1","Hello World!"); return "pageB?faces-redirect=true"; } 当呈现page.B.xhtml时,您可以通过EL表达式(如)来访问这些值 <h:outputLabel value="#{flash['param1']}" /> 将显示“Hello World!”。我们之前保存在navigateToPageB中的字符串。 至于您的问题,通过在您的资源管理器中打开一个新标签页,您不能访问您在上一个标签页上访问的相同上下文,因此您的变量将不可用。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |