web-dev-qa-db-ja.com

JSFデータテーブルで選択した行インデックスを取得するにはどうすればよいですか?

Index.xhtmlにデータベールがあります

<h:dataTable style="border: solid 2px black;"
    value="#{IndexBean.bookList}" var="item"
    binding="#{IndexBean.datatableBooks}">

    <h:column>
        <h:commandButton value="Edit" actionListener="#{IndexBean.editBook}">
            <f:param name="index" value="#{IndexBean.datatableBooks.rowIndex}"/>
        </h:commandButton>
    </h:column>
</h:dataTable>

私の豆:

@ManagedBean(name="IndexBean")
@ViewScoped
public class IndexBean implements Serializable {
    private HtmlDataTable datatableBooks;

    public HtmlDataTable getDatatableBooks() {
        return datatableBooks;
    }

    public void setDatatableBooks(HtmlDataTable datatableBooks) {
        this.datatableBooks = datatableBooks;
    }

    public void editBook() throws IOException{
        int index = Integer.parseInt(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("index").toString());
        System.out.println(index);
    }
}

私の問題は、異なる編集ボタンをクリックしても、サーバーログで常に同じインデックスを取得することです。データテーブルに提供されるコレクションが1つあると想像してください。私はそれをbeanで示していません。

スコープをViewScopeからRequestScopeに変更すると、正常に機能します。 @ViewScopedの問題は何でしょうか?前もって感謝します :)

編集:

<h:column>
    <h:commandButton value="Edit" actionListener="#{IndexBean.editBook}" />
</h:column>

public void editBook(ActionEvent ev) throws IOException{
    if (ev.getSource() != null && ev.getSource() instanceof HtmlDataTable) {
        HtmlDataTable objHtmlDataTable = (HtmlDataTable) ev.getSource();
        System.out.println(objHtmlDataTable.getRowIndex());
    }
}
10
TCM

<h:dataTable>コンポーネントはすでにBeanにバインドされています。あなたがする必要があるのは:

public void editBook() throws IOException{
    int index = datatableBooks.getRowIndex(); // Actually not interesting info.
    Book book = (Book) datatableBooks.getRowData(); // This is what you want.
}

<f:param>もここでは必要ありません。その他のヒントについては、 この記事 も参照してください。

更新:問題を再現できます。これはおそらく@ViewScopedのバグです。 Beanが@RequestScopedに設定されている場合、期待どおりに機能します。また、コンポーネントバインディングを削除し、自分でビュールートからコンポーネントを取得すると、期待どおりに機能します。私はこれについて 問題1658 を提出しました。

14
BalusC

たとえばTomcat7でEL2.2を使用している場合は、試すことができます。

<h:commandLink action="#{IndexBean.editBook(item)}" immediate="true">

お手伝いしたい

0
amanas