JSF:将选定的变量值保存在数据表中以供下一个视图使用

时间:2013-07-03 13:47:29

标签: jsf jsf-2 tomahawk

我有一个数据表:

    <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,但我不确定如何只保存在Datatable中单击的变量。如果SessionScope是唯一可用的东西,有没有办法让kittenList在不同的范围内? (当在数据库中添加新小猫时,小猫列表应该更改,因此它应该在RequestScope或ViewScope中。)

1 个答案:

答案 0 :(得分: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>
    

    可以在What can <f:metadata> and <f:viewParam> be used for?

  2. 中找到更多优秀信息
  3. 使用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 the values in other jsf page's bean in request scope

  4. 中找到扩展示例

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