Frage

Ich bin mit Datentabelle auf Seite und mit Bindung Attribut es meinen Backing Bean zu binden. Dies ist mein Code: -

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
            <h:form prependId="false">

                <h:dataTable var="item" value="#{testBean.stringCollection}" binding="#{testBean.dataTable}">
                    <h:column>
                        <h:outputText value="#{item}"/>
                    </h:column>
                    <h:column>
                        <h:commandButton value="Click" actionListener="#{testBean.action}"/>
                    </h:column>
                </h:dataTable>

            </h:form>

    </h:body>
</html>

Das ist meine Bohne: -

package managedBeans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.html.HtmlDataTable;

@ManagedBean(name="testBean")
@ViewScoped
public class testBean implements Serializable {

    private List<String> stringCollection;

    public List<String> getStringCollection() {
        return stringCollection;
    }

    public void setStringCollection(List<String> stringCollection) {
        this.stringCollection = stringCollection;
    }

    private HtmlDataTable dataTable;

    public HtmlDataTable getDataTable() {
        return dataTable;
    }

    public void setDataTable(HtmlDataTable dataTable) {
        this.dataTable = dataTable;
    }

    @PostConstruct
    public void init(){
        System.out.println("Post Construct fired!!");
        stringCollection = new ArrayList<String>();
        stringCollection.add("a");
        stringCollection.add("b");
        stringCollection.add("c");

    }

    public void action(){
        System.out.println("Clicked!!");

    }
}

Bitte sagen Sie mir, warum die @PostConstruct jedes Brennen und jedes Mal, wenn ich auf die Schaltfläche klicken? Es sollte nur einmal schießen, solange ich auf der gleichen Seite bin beacause meine Bohne @ViewScoped ist. Ferner kann, wenn ich die Bindung Attribut entfernen dann funktioniert alles einwandfrei und nur einmal Feuer @PostConstruct Rückruf. Warum dann jedes Mal, wenn ich Attribut verbindlich? Ich brauche verbindliches Attribut und will Initialisierung Aufgaben wie Daten aus webservice holen, etc nur einmal. Was soll ich machen? Wo soll ich meine Initialisierung Aufgabe schreiben?

War es hilfreich?

Lösung

Interessant, wenn Sie verwenden Komponente auf einem Blick Bindung scoped Bohne, der Viewbereich bricht.

Ich bin nicht sicher, ob das ein Fehler in JSF2 ist, würde ich zuerst die gesamte JSF2 Spezifikation lesen muß. Was nun die beste Wahl ist, um die Komponente verbindlich für jetzt und übergeben Sie das ausgewählte Element über neue EL 2.2 Methode Argument Syntax löschen:

<h:dataTable var="item" value="#{testBean.stringCollection}">
    <h:column>
        <h:outputText value="#{item}"/>
    </h:column>
    <h:column>
        <h:commandButton value="Click" action="#{testBean.action(item)}"/>
    </h:column>
</h:dataTable>

Siehe auch:


Aktualisieren (Dezember 2012): Das ist in der Tat ein Fehler in JSF2. Es ist ein Henne-Ei-Problem. Die Ansicht scoped Bohnen sind in dem JSF Ansichtszustand gespeichert. So ist die Ansicht sind scoped Bohnen nach Wiederherstellungsansicht Phase zur Verfügung. Allerdings kehren die binding Attribut läuft während Ansicht Phase, während die Ansicht Bohnen scoped sind noch nicht verfügbar. Diese Ursachen Schaffung einer neue Ansicht Bean-Instanz scoped, die dann durch die reale Ansicht ersetzt später scoped Bohne, das in dem restaurierten JSF Ansichtszustand gespeichert wurde.

Dies wird berichtet, wie JSF Ausgabe 1492 und JSF-Spezifikation isssue 787 die für JSF 2.2 behoben werden. Bis dahin ist die beste Wahl binding auf Anfrage ausschließlich scoped Bohnen zu verwenden oder zu suchen alternative Möglichkeiten für die bestimmte funktionale Anforderung.


Aktualisieren (März 2015): Der JSF 2.2 Update wurde auf Mojarra 2.1.18 zurückzuportiert. Also, wenn Sie noch JSF mit 2.0 / 2.1, sollten Sie am besten Upgrade auf mindestens diese Version. Siehe auch u.a. Was ist Bindungskomponente in JSF? Wenn es bevorzugt verwendet werden? und JSTL in JSF2 Facelets ... Sinn macht?

Andere Tipps

Wie andere schon gesagt, ich würde sagen, dass das Beste, was zu tun ist, Komponente fällt Bindung (Sie brauchen es nicht hier).

Aber ich möchte hinzufügen, dass Sie das gleiche erreichen können, wie Sie in einer objektorientierten Art und Weise zu tun versuchen durch Aktionsparameter verwendet wird, wie folgt aus:

<h:commandButton value="Click" action="#{testBean.action(item)}"/>

... und in Ihrem Java-Code:

  public void action(Item item){
    System.out.println("Clicked!!" + item);
}

Wenn Sie eine viewscoped Bohne und wenn Sie möchten, Werte erhalten, die auf dem Formular eingegeben wurde oder nicht wollen, postconstruct gefeuert, sollten Sie null aus Ihrer Aktion-Methode zurück.

Wenn Sie einige Ergebnis zurückgeben (z ungültig) und zeigen Sie dann das ungültige Ergebnis auf die gleiche Seite faces-config.xml verwenden, dann die viewscoped Bean wird neu erstellt und damit bewirkt, dass es postconstruct Feuer wieder.

Andere Lösung:

  • Die Bindung des HtmlDataTable in einer Anfrage Umfang Bohne.
  • Inject diese Anfrage Anwendungsbereich Bohne in der Ansicht Umfang Bohne.

JBoss Seam verwenden diese Lösung JSF componentes zu einem Gespräch Umfang Komponente für die Bindung.

Die Antwort des balusc hat mir sehr geholfen, ich würde sagen, dass ich diesen Fehler mit mojarra Version 2.1.7 hatte ich zur Zeit 2.1.29-01 im Januar 2015 veröffentlicht und bin mit dieser Fehler behoben ist, mein Problem eine TabView auf eine viewscoped Bohne wurde verbindlich. Mit dieser Version nicht, daß ich diesen Fehler hat und die Bindung und postconstruct funktioniert gut. Ich benutze Jboss 5.2 und ich habe verwenden mojarra 2.1.x so ich diese Antwort Hilfe andere Menschen in der gleichen Situation hoffen.

http://mvnrepository.com/artifact/ com.sun.faces / JSF-api / 2.1.29-01 http://mvnrepository.com/artifact/com.sun .faces / JSF-impl / 2.1.29-01

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top