从JSF中的Datatable获取选定的行数据

时间:2012-08-13 01:11:01

标签: java java-ee jsf-2 xhtml ejb

所以,我试图在这个问题中实施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>

1 个答案:

答案 0 :(得分:2)

  

2.0 article并未真正解决获取所选行数据

的问题

确实如此。也许你看起来不够仔细,但它显示了两种获取所选行数据的方法。查看辅助bean的edit()delete()方法。 first wayDataModel#getRowData()完成,second way通过使用新的EL 2.2功能将其直接传递到操作方法来完成。


  

当用户单击“添加到我的收藏夹”按钮时,所选行未传递给辅助bean,导航案例未被跟踪,并且当前页面已刷新。

value的{​​{1}}与初始请求(其中已显示带有表格的页面)时的<h:dataTable>不完全相同时,就会发生这种情况。如果bean是请求范围和/或value的{​​{1}}取决于请求参数,则会发生这种情况。将bean放在视图范围中和/或确保在bean的(post)构造函数中准备完全相同的<h:dataTable>应该修复它。使用视图范围时,您应删除 value到bean的binding


在您的特定情况下,导航到涉及的不同视图,可能还有另一种更好的方式。具体的功能要求并不十分清楚。这是一个确认页吗?而是使用GET。或者它只是成功行动后的目标网页?而是使用POST-Redirect-GET。有关其他提示,另请参阅Communication in JSF 2.0 - Processing GET request parameters