11

我对在 jsf 2 中使用 flash 范围有一个误解。我想在我的操作过程中将一个对象放在 flash map 中,并在下一页中显示这个对象。这是我的操作(由 h:commandLink 调用):

public String showDetail(PersonneDTO personne) {
    MessageFlashBean message = new MessageFlashBean();
    message.addMessage("test");
    FacesContext.getCurrentInstance().getExternalContext().getFlash()
        .put("test", message);
    return "showDetail";
}

这只是一个测试,但我要使用的真实对象更复杂。

这是使用闪光灯的第二页:

<ui:fragment rendered="#{flash.test != null and flash.test.hasMessage()}" >
    <ui:repeat var="message" value="#{flash.test.messages}">
        #{message}
    </ui:repeat>
</ui:fragment>

这是导航(这是我的问题:)):

<navigation-rule>
    <from-view-id>/index.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>showDetail</from-outcome>
        <to-view-id>/private/showDetail.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

在这种情况下,闪光灯范围工作正常,我的消息出现了。

但是如果我在导航案例中添加重定向,我在 Flash 地图中的对象就消失了。

我不明白为什么我不能在导航规则中使用重定向(我相信这是 Flash 范围的目标)。

可能是我的代码有问题。

有人可以帮助我吗?

谢谢

4

2 回答 2

14

Mojarra 的 JSF2 Flash 范围的实现有很多问题。大多数问题都在每个新的 Mojarra 版本中得到解决。目前,使用最新的Mojarra 版本2.1.6,据我所知,仍然只有一个主要的未解决问题:如果您重定向到不同的基本路径,它将无法工作。另请参阅issue 1751中长期讨论中的(当前)最后评论。

现在,您基本上有以下选择:

  1. 当您需要重定向到不同的基本路径时,请忘记使用 Flash。请改用请求参数或尝试使用自定义 cookie 模拟 flash 范围。

  2. 如果可能,请重新组织文件夹结构,以便在需要 Flash 作用域生存时无需重定向到不同的基本路径。

  3. 试试MyFaces而不是 Mojarra。也许它在闪光范围方面做得更好。


更新:根据问题 2136,在即将推出的Mojarra 2.1.14中解决了在不同路径上重定向后 Flash 范围不可用的最后一个开放问题。因此,在这个版本中,到目前为止发现和打开的所有与 Flash 范围相关的问题都应该得到解决和关闭。

于 2012-02-06T03:33:49.123 回答
2

带有netbeans 的jsf 2.1 在flash 上有这个问题。使用/somepage?redirect-faces=true or /somedirectory/somepage?faces-redirect=true 不起作用。它必须是somepage?redirect-faces=true

测试了mojarra 2.1.7,但没有出现上述问题。

于 2012-04-01T22:18:19.670 回答