wake-up-neo.com

Wie kann man einen ausgewählten Zeilenindex in JSF datatable bekommen?

Ich habe eine Datenbank auf 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>

Meine Bohne:

@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);
    }
}

Mein Problem ist, dass ich immer den gleichen Index im Serverprotokoll erhalte, obwohl ich auf die verschiedenen Bearbeitungsschaltflächen klicke. Stellen Sie sich vor, es gibt eine Sammlung, die der Datentabelle zur Verfügung gestellt wird. Das habe ich in Bean nicht gezeigt.

Wenn ich den Bereich von ViewScope zu RequestScope ändere, funktioniert dies einwandfrei. Was kann das Problem mit @ViewScoped sein? Danke im Voraus :)

BEARBEITEN:

<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

Sie haben die Komponente <h:dataTable> bereits an die Bean gebunden. Alles was Sie tun müssen ist:

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

Der <f:param> wird auch hier nicht benötigt. Weitere Hinweise finden Sie auch in diesem Artikel .

Update : Ich kann dein Problem reproduzieren. Dies ist wahrscheinlich ein Fehler mit @ViewScoped. Wenn die Bean auf @RequestScoped gesetzt ist, funktioniert sie wie erwartet. Auch wenn Sie die Komponentenbindung entfernen und die Komponente selbst aus dem Viewroot abrufen, funktioniert dies wie erwartet. Ich habe Ausgabe 1658 darüber eingereicht.

14
BalusC

Wenn Sie EL 2.2 verwenden, zum Beispiel mit Tomcat7, können Sie es versuchen

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

Ich hoffe zu helfen

0
amanas