Web applications 使用datatable列中的commandbutton在JSF中传递行索引

Web applications 使用datatable列中的commandbutton在JSF中传递行索引,web-applications,jsf,datatable,Web Applications,Jsf,Datatable,我在datatable列中添加了一个commandbutton,如下所示。单击按钮时,记录的id将用于更新数据库中的其他一些记录。以下是我尝试过的: <ice:dataTable value="#{myBean.storedRecords}" var="record" rows="10"> <h:column> <h:commandButton id="myButton#{record.id}" value="#{record.id}"

我在datatable列中添加了一个commandbutton,如下所示。单击按钮时,记录的id将用于更新数据库中的其他一些记录。以下是我尝试过的:

<ice:dataTable value="#{myBean.storedRecords}" var="record" rows="10">
   <h:column>
     <h:commandButton id="myButton#{record.id}" value="#{record.id}" 
             actionListener="myBean.buttonActionListener" />
   </h:column>
</ice:dataTable>

在输出中,我可以看到该值是记录的id。但是,在buttonAction侦听器方法中,按钮的id似乎只有“myButton”,而没有记录的id

请您指出如何动态设置按钮的id。或者,您可以建议一种方法,通过单击按钮将该行的索引传递给服务器

非常感谢您的帮助。

返回数据表,而不是
列表

private DataModel storedRecords;

public MyBean() {
    storedRecords = new ListDataModel(recordDAO.listStoredRecords());
}

// ...
然后,您可以通过内部bean的操作方法获得当前行

public String buttonAction() {
    StoredRecord storedRecord = (StoredRecord) storedRecords.getRowData();
    // ...
    return "outcome";
}
请注意,我隐式地提示使用
action
而不是按钮上的
actionListener

以下是我的解决方案

通过调试和谷歌搜索,我意识到我HtmlDataTable是HtmlCommandButton的祖父母(!)。HtmlDataTable扩展了UIData类。UIData有一个公共方法来获取当前行中的存储值

public void btnActionListenerMethod(Action e) {
  if(e.getSource() instanceof HtmlCommandButton) {
    HtmlCommandButton button = (HtmlCommandButton) e.getSource();
    UIData dataTable = (UIData) button.getParent().getParent();
    MyRecord record = (MyRecord) dataTable.getRowData();
    // ......
  }
}