所以,我尝试在这个问题中实现 Anthony/BalusC 的方法: How to get selected row index in JSF datatable?但无济于事。我还浏览了@BalusC的"Using datatables" article (一如既往的精彩)但那是为 JSF1.2 和 2.0 article 编写的并没有真正解决获取选定行数据的问题。当用户单击“添加到我的 Collection 夹”按钮时,所选行不会传递到支持 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>
最佳答案
the 2.0 article doesn't really address getting the selected row data
确实如此。也许您看得不够仔细,但它显示了获取所选行数据的两种方法。看edit()
和delete()
支持 bean 的方法。 first way通过 DataModel#getRowData()
执行和 second way只需使用新的 EL 2.2 功能将其直接传递到操作方法即可做到这一点。
When a user clicks the "Add to my favorites" button, the selected row is not getting passed to the backing bean, the navigation case is not being followed, and the current page is refreshed.
当 value
时就会发生这种情况<h:dataTable>
的与初始请求期间显示的带有表格的页面并不完全相同。如果 bean 是请求范围的和/或 value
,那么就会发生这种情况。 <h:dataTable>
的取决于请求参数。将 bean 放置在 View 范围中和/或确保您准备完全相同的 value
在 bean 的(后)构造函数中应该修复它。使用 View 范围时,您应该删除 binding
<h:dataTable>
的到 bean 。
在您的特定情况下,涉及导航到不同的 View ,也许还有另一种更好的方法。具体的功能需求不太清楚。这是一种确认页面吗?那么就使用 GET 吧。或者它只是成功操作后的登陆页面?而是使用 POST-Redirect-GET。有关其他提示,另请参阅 Communication in JSF 2.0 - Processing GET request parameters .
关于java - 从 JSF 中的数据表获取选定行数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11927157/