我有一个数据表:
<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中。)
答案 0 :(得分:2)
如果您想在视图之间共享信息,可以考虑使用两种常用的替代方法。
将信息作为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>
使用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。
最后要注意的是:不要滥用HTTP会话。您不应该使用属于其他地方的信息污染会话。