0

我有一个数据表:

    <h:dataTable binding="#{table}" value="#{chooseKittens.kittenList}">
      <h:column>
        <p:commandLink value="#{chooseKittens.kittenList[table.rowIndex]}" action="#{chooseKittens.petKitten}"/>
      </h:column>
    </h:dataTable>

dataTable 是一个链接,可将您带到不同的页面。但是,当我转到不同的页面时,我想保存单击的命令链接的值,以便可以在后续视图中显示它。没有 SessionScope 有没有办法做到这一点?我查看了 t:saveState,但我不确定如何只保存在数据表中单击的变量。如果 SessionScope 是唯一可用的,有没有办法让 kittenList 在不同的范围内?(当新的小猫添加到数据库中时,小猫列表应该改变,所以它应该在 RequestScope 或 ViewScope 中)。

4

1 回答 1

2

如果您想在视图之间共享信息,您可以考虑两种常用的替代方法。

  1. 将信息作为 GET 参数传递给下一个视图

    在这种情况下,您将使用 JSF 组件生成普通导航链接并将查询参数附加到该链接,如下所示:

    <h:link value="Next page" outcome="/view-kitten">
        <f:param name="id" value="#{kitten.id}"/>
    </h:link>
    

    在接收页面中,参数可通过以下方式获得:

    <f:metadata>
        <f:viewParam name="id" value="#{kittenBean.id}/>
    </f:metadata>
    

    更多优秀的信息可以在可以<f:metadata><f:viewParam>用于什么中找到?

  2. 使用将信息传递给重定向视图Flash

    在这种情况下,您正在命令组件的操作方法中执行重定向,并将使用对象将必要的数据附加到目标视图Flash

    <h:commandButton value="Next page" action="#{bean.next}"/>
    

    public String next() {
        //do business job
        FacesContext.getCurrentInstance().getExternalContext().getFlash().put("kitten", selectedKitten);
        return "/view-kitten?faces-redirect=true";
    }
    

    它将在目标视图中通过 EL 使用#{flash.kitten}或以编程方式使用FacesContext.getCurrentInstance().getExternalContext().getFlash().get("kitten").

    扩展示例可以在JSF2.0 - How to get values in other jsf page's bean in request scope中找到。

最后要注意的是:不要滥用 HTTP 会话。你不应该用属于其他地方的信息污染会话。

于 2013-07-03T15:25:14.423 回答