Jsf 2 如何在页面重新加载时保留JSF flash作用域参数?

Jsf 2 如何在页面重新加载时保留JSF flash作用域参数?,jsf-2,flash-scope,Jsf 2,Flash Scope,我使用flash scope在@ViewScope控制器之间传递设置对象。但是如果我在其中一个上重新加载页面,那么flash映射是空的,并且设置对象没有初始化。是否可以在页面重新加载时保持flash范围 存储/检索设置的源代码: FistPage.xhtml ... <p:commandButton value="next" action="#{firstPageController.transferConfig}" process="@this" /> ...

我使用flash scope在@ViewScope控制器之间传递设置对象。但是如果我在其中一个上重新加载页面,那么flash映射是空的,并且设置对象没有初始化。是否可以在页面重新加载时保持flash范围

存储/检索设置的源代码:

FistPage.xhtml

...
<p:commandButton value="next"
    action="#{firstPageController.transferConfig}"  
    process="@this" />
...
...
<h:outputLabel value="value">
    <f:event type="preRenderComponent" listener="#{secondPageController.onPageLoad()}"/>
</h:outputLabel>
...
SecondPage.xhtml

...
<p:commandButton value="next"
    action="#{firstPageController.transferConfig}"  
    process="@this" />
...
...
<h:outputLabel value="value">
    <f:event type="preRenderComponent" listener="#{secondPageController.onPageLoad()}"/>
</h:outputLabel>
...
我使用Mojarra 2.1.29


谢谢

我刚刚在我的游乐场项目中做了一些测试,并意识到即使你再次获得页面,使用
{flash.keep}
也可以保持flash参数的状态。这就是他们的解释:

实施必须确保即使在包含
的情况下也能保持闪存的正确行为。该实现必须确保即使在同一会话上存在相邻GET请求的情况下,也能保持闪存的正确行为。这允许Faces应用程序充分利用Post/Redirect/Get设计模式

这里有一个很好的基本测试用例:

page1.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head />
<h:body>
    <h:form>
        <h:button id="nextButton" value="Next (button)" outcome="page2.xhtml" />
        <c:set target="#{flash}" property="foo" value="bar" />
    </h:form>
</h:body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html">
<head />
<body>foo = #{flash.keep.foo}
</body>
</html>

page2.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head />
<h:body>
    <h:form>
        <h:button id="nextButton" value="Next (button)" outcome="page2.xhtml" />
        <c:set target="#{flash}" property="foo" value="bar" />
    </h:form>
</h:body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html">
<head />
<body>foo = #{flash.keep.foo}
</body>
</html>

foo={flash.keep.foo}
只需打开第一页并单击按钮,即可将您重定向到第二页。然后根据需要多次刷新第二个页面,您会发现参数一直存在



在Mojarra 2.2.6中测试

从何处调用此方法?如果参数不在映射中,则此操作将不起任何作用。。。你是在其他地方录的吗?我刚意识到你根本没有为了进入第二个视图而进行重定向。你能看到地址栏上的url变了吗?是的,我能。我在上面的代码中更改了它。只有在重新加载第二页或使用update=“@all”在第二页上执行操作时,才会出现问题。它们是不同的东西。第一个是对视图的
GET
请求,第二个是对同一视图的回发。第二种方法可以避免保留flash参数或将其存储在
@ViewScoped
@Alex:使用flash范围重新加载
@ViewScoped
bean的同一页面有什么意义?您可以将该变量存储为该bean的实例变量,并且它在重新加载时仍然存在。您知道如何在托管bean中获取持久化的flash参数值吗?@EvaMariam,请参阅。我不想在前端(ui)中显示flash参数。手动重新加载时,应该在bean中重用它,以便从db中获取其他值。你能看一看吗?这里发生了什么样的黑魔法?keep是一个没有返回类型的方法,它接受字符串作为参数,但您在调用它时没有参数,而是使用.foo?@KorayTugay,noo链接它。你有一些关于这个的文档。或多或少:
Parameters:key-如果参数key是在整个生命周期中通过调用putNow(java.lang.String,java.lang.Object),或调用EL表达式#{flash.now.}的集合,或调用请求映射,将被提升到flash,就像调用put()一样或者正在调用表达式#{flash.}的集合。
。似乎是与EL相关的功能。