La meilleure approche serait d'utiliser un DataModel
comme value
du h:dataTable
afin que vous puissiez récupérer l'objet de ligne sélectionnée par DataModel#getRowData()
. Vous devez seulement vous assurer que le bean conserve le même modèle dans la requête suivante. En d'autres termes, remplissez le modèle dans le constructeur du haricot.
<h:form>
<h:dataTable value="#{bean.model}" var="item">
<h:column>
<h:commandButton value="View Object" action="#{bean.view}"/>
</h:column>
</h:dataTable>
</h:form>
Avec une demande (ou session) SCOPED haricots qui ressemble à ceci:
public class Bean {
private DataModel model;
private Item item;
public Bean() {
List<Item> list = new ArrayList<Item>();
list.add(new Item(1, "value1"));
list.add(new Item(2, "value2"));
list.add(new Item(3, "value3"));
model = new ListDataModel(list);
}
public String view() {
item = (Item) model.getRowData();
return "view";
}
public DataModel getModel() {
return model;
}
public Item getItem() {
return item;
}
}
Je suppose que vous utilisez 1.x JSF et non encore 2.x, sinon un haricot @ViewScoped
était better.
Et dans la page suivante:
<p>#{bean.item.value}</p>
Je mis mon dataTable cette façon, en utilisant JSF2.0, GlassFish 3.0.1, et un haricot ViewScoped. Lorsque je navigue sur ma page d'affichage, rien ne s'affiche. Il semble que lorsque je navigue loin de la page avec le dataTable toutes les variables sortent de la portée. – Sean