所以,我试图在这个问题中实施Anthony / BalusC的方法:How to get selected row index in JSF datatable?但无济于事。我还浏览了@BalusC的"Using datatables" article(这是一如既往的精彩),但这是为JSF1.2编写的,2.0 article并没有真正解决获取所选行数据的问题。当用户单击“添加到我的收藏夹”按钮时,所选行不会传递给辅助bean,导航案例不会被跟踪,并且当前页面会刷新。
我在这里做错了什么想法?
这是我的支持bean:
@ManagedBean(name = "selectedBean")
@RequestScoped
public class SelectedBeerBean
{
private List<Beer> favoriteBeers;
private Beer selectedBeer;
private HtmlDataTable datatableBeers;
public HtmlDataTable getDatatableBeers() {
return datatableBeers;
}
public void setDatatableBeers(HtmlDataTable datatableBeers) {
this.datatableBeers = datatableBeers;
}
public String addBeer()
{
selectedBeer = (Beer) datatableBeers.getRowData();
return "selectedBeer";
}
public List<Beer> getFavoriteBeers() {
return favoriteBeers;
}
public void setFavoriteBeers(List<Beer> favoriteBeers) {
this.favoriteBeers = favoriteBeers;
}
public Beer getSelectedBeer() {
return selectedBeer;
}
public void setSelectedBeer(Beer selectedBeer) {
this.selectedBeer = selectedBeer;
}
}
这是我的xhtml页面:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Welcome to Draft Savvy, #{draftSavvyController.name}</title>
</h:head>
<h:form>
<h:body style="background-image: url(Background-Wood.png); ">
<h3>You searched for "#{draftSavvyController.searchTerm}"</h3>
<h4>Here are your beers</h4>
<h:dataTable binding="#{selectedBean.datatableBeers}" value="#{draftSavvyController.beerList}" var="beer" border="1">
<h:column>
<f:facet name="header">
<h:outputText value="Logo"/>
</f:facet>
<h:graphicImage url="#{beer.icon}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Beer Name"/>
</f:facet>
<h:outputText value="#{beer.name}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Description"/>
</f:facet>
<h:outputText value="#{beer.description}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Beer ID"/>
</f:facet>
<h:outputLabel value="#{beer.id}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Add To My Favorites"/>
</f:facet>
<h:commandButton value="Add Beer" action="#{selectedBean.addBeer}">
<f:setPropertyActionListener target="#{selectedBean.selectedBeer}" value="#{beer}" />
</h:commandButton>
</h:column>
</h:dataTable>
</h:body>
</h:form>
</html>
答案 0 :(得分:2)
2.0 article并未真正解决获取所选行数据
的问题
确实如此。也许你看起来不够仔细,但它显示了两种获取所选行数据的方法。查看辅助bean的edit()
和delete()
方法。 first way由DataModel#getRowData()
完成,second way通过使用新的EL 2.2功能将其直接传递到操作方法来完成。
当用户单击“添加到我的收藏夹”按钮时,所选行未传递给辅助bean,导航案例未被跟踪,并且当前页面已刷新。
当value
的{{1}}与初始请求(其中已显示带有表格的页面)时的<h:dataTable>
不完全相同时,就会发生这种情况。如果bean是请求范围和/或value
的{{1}}取决于请求参数,则会发生这种情况。将bean放在视图范围中和/或确保在bean的(post)构造函数中准备完全相同的<h:dataTable>
应该修复它。使用视图范围时,您应删除1> value
到bean的binding
。
在您的特定情况下,导航到涉及的不同视图,可能还有另一种更好的方式。具体的功能要求并不十分清楚。这是一个确认页吗?而是使用GET。或者它只是成功行动后的目标网页?而是使用POST-Redirect-GET。有关其他提示,另请参阅Communication in JSF 2.0 - Processing GET request parameters。