Understanding PrimeFaces-process / Update und JSF f: Ajax ausführen / rendern Attribute

Was genau sind process und update in PrimeFaces p:commandXxx Komponenten und execute und render in f:ajax Tag?

Was funktioniert zum Zeitpunkt der validation? Was macht das update Attribut, anstatt den Wert für die Komponente vom Backend zu aktualisieren? process Attributbindungswert an das Modell? Was genau machen @this , @parent , @all und @form in beiden Attributen?

Das Beispiel unten funktioniert gut, aber ich bin ein wenig verwirrt in grundlegenden Konzepten.

 

    Das process ist serverseitig und kann nur die Implementierung von EditableValueHolder (Eingabefelder) oder ActionSource (Befehlsfelder) durch ActionSource . Das process teilt JSF mithilfe einer durch Leerzeichen getrennten Liste von Client-IDs mit, welche Komponenten bei der (teilweisen) Formularübergabe genau durch den gesamten JSF-Lebenszyklus verarbeitet werden müssen.

    JSF wendet dann die Anforderungswerte an (HTTP-Anforderungsparameter basierend auf der eigenen Client-ID der Komponente zu finden und dann im Fall von EditableValueHolder Komponenten entweder als übermittelten Wert EditableValueHolder oder im Falle von EditableValueHolder Komponenten ein neues ActionEvent ActionSource ), Konvertierung, validation und Aktualisierung der Modellwerte (nur EditableValueHolder Komponenten) und schließlich das in der Warteschlange befindliche ActionEvent (nur ActionSource Komponenten). JSF überspringt die Verarbeitung aller anderen Komponenten, die nicht durch das process abgedeckt process . Komponenten, deren rendered Attribut während der Phase der Apply-Anforderungswerte als false ausgewertet wird, werden auch als Teil der Sicherheitsmaßnahme für manipulierte Anforderungen übersprungen.

    Beachten Sie, dass es im Fall von ActionSource Komponenten (wie ) sehr wichtig ist, dass Sie auch die Komponente selbst in das process , insbesondere wenn Sie die mit der Komponente verknüpfte Aktion aufrufen . Das folgende Beispiel, das beabsichtigt, nur bestimmte Eingabekomponenten zu verarbeiten, wenn eine bestimmte Befehlskomponente aufgerufen wird, funktioniert nicht:

       

    Es würde nur die #{bean.foo} und nicht die #{bean.action} . Sie müssten auch die Befehlskomponente selbst hinzufügen:

       

    Oder, wie Sie anscheinend herausgefunden haben, @parent wenn sie die einzigen Komponenten mit einem gemeinsamen Elternteil sind:

         

    Oder wenn beide die einzigen Komponenten der übergeordneten UIForm Komponente sind, können Sie auch @form :

         

    Dies ist manchmal unerwünscht, wenn das Formular mehr Eingabekomponenten enthält, die bei der Verarbeitung übersprungen werden sollen, häufiger als in Fällen, in denen Sie eine andere Eingabekomponente oder einen UI-Abschnitt basierend auf der aktuellen Eingabekomponente aktualisieren möchten eine Ajax-Listener-Methode. Sie wollen nämlich nicht, dass validationserrors anderer Input-Komponenten verhindern, dass die Ajax-Listener-Methode ausgeführt wird.

    Dann ist da noch die @all . Dies hat keine besonderen Auswirkungen auf das process , sondern nur auf das update . Ein process="@all" verhält sich genauso wie process="@form" . HTML unterstützt das gleichzeitige Senden mehrerer Formulare nicht gleichzeitig.

    Es gibt übrigens auch eine @none die nützlich sein kann, wenn Sie absolut nichts verarbeiten müssen, sondern nur bestimmte Teile via update aktualisieren möchten, insbesondere jene Sektionen, deren Inhalt nicht von übermittelten Werten oder Action Listeners abhängt .

    Der Standard-JSF, der dem PrimeFaces-spezifischen process wird von . Es verhält sich genau gleich, außer dass es keine durch Kommas getrennte Zeichenfolge unterstützt, während PrimeFaces (obwohl ich persönlich empfehle, sich einfach an eine durch Leerzeichen getrennte Konvention zu halten) noch das @parent Schlüsselwort unterstützt. Außerdem kann es nützlich sein zu wissen, dass standardmäßig auf @form während und @this auf @this . Schließlich ist es auch nützlich zu wissen, dass der process die sogenannten “PrimeFaces Selectors” unterstützt, siehe auch Wie funktionieren PrimeFaces Selektoren wie in update = “@ (. MyClass)”?


    Das update ist clientseitig und kann sich auf die HTML-Darstellung aller UIComponent . Das update teilt JavaScript (das für die Verarbeitung der AJAX-Anforderung / Antwort verantwortlich ist) anhand einer durch Leerzeichen getrennten Liste von Client-IDs, welche Teile in der HTML-DOM-Struktur als Antwort auf die Formularübertragung aktualisiert werden müssen.

    JSF wird dann die richtige Ajax-Antwort vorbereiten, die nur die zu aktualisierenden Teile enthält. JSF überspringt alle anderen Komponenten, die in der Ajax-Antwort nicht durch das update Attribut abgedeckt sind, wodurch die Antwortinhaltsdaten klein gehalten werden. Komponenten, deren rendered Attribut während der Renderantwortphase als false ausgewertet wird, werden ebenfalls übersprungen. Beachten Sie, dass JavaScript zwar den Wert ” true zurückgibt, JavaScript jedoch nicht in der HTML-DOM-Struktur aktualisiert werden kann, wenn es ursprünglich false . Sie müssten es umbrechen oder stattdessen das übergeordnete Element aktualisieren. Siehe auch Ajax update / render funktioniert nicht bei einer Komponente, die das Attribut gerendert hat .

    In der Regel möchten Sie nur die Komponenten aktualisieren , die bei der (teilweisen) Formularübermittlung auf der Clientseite wirklich “aktualisiert” werden müssen. Im folgenden Beispiel wird das gesamte @form über @form :

            

    (Beachten Sie, dass das process weggelassen wird, da es standardmäßig auf @form )

    Während dies in Ordnung sein kann, ist die Aktualisierung von Eingabe- und Befehlskomponenten in diesem speziellen Beispiel nicht notwendig. Wenn Sie nicht die Modellwerte foo und bar innerhalb der action ändern (was wiederum in UX-Perspektive nicht intuitiv wäre), ist es nicht sinnvoll, sie zu aktualisieren. Die Nachrichtenkomponenten sind die einzigen, die wirklich aktualisiert werden müssen:

            

    Dies wird jedoch mühsam, wenn Sie viele von ihnen haben. Das ist einer der Gründe, warum PrimeFaces Selectors existieren. Diese Nachrichtenkomponenten haben in der generierten HTML-Ausgabe eine gemeinsame Stilklasse von ui-message , also sollte folgendes auch funktionieren:

            

    (Beachten Sie, dass Sie die IDs für Nachrichtenkomponenten beibehalten sollten, sonst funktioniert @(...) nicht! Siehe auch Wie funktionieren PrimeFaces-Selektoren wie in update = “@ (. myClass)”? für Details)

    Das @parent aktualisiert nur die übergeordnete Komponente, die somit die aktuelle Komponente und alle Geschwister und ihre @parent abdeckt. Dies ist sinnvoller, wenn Sie das Formular in vernünftigen Gruppen mit jeweils eigener Verantwortung getrennt haben. Das @this aktualisiert natürlich nur die aktuelle Komponente. Normalerweise ist dies nur notwendig, wenn Sie eines der eigenen HTML-Attribute der Komponente in der Aktionsmethode ändern müssen. Z.B

      

    Stellen Sie sich vor, das oncomplete muss mit dem value der in der action geändert wird, dann hätte dieses Konstrukt nicht funktioniert, wenn die Komponente nicht aktualisiert wird, weil oncomplete Teil der generierten HTML-Ausgabe (und damit aller EL-Ausdrücke) ist dort werden während der Renderantwort ausgewertet).

    Der @all aktualisiert das gesamte Dokument, das mit Vorsicht verwendet werden sollte. Normalerweise möchten Sie stattdessen eine echte GET-Anfrage verwenden, entweder durch einen einfachen Link ( oder ) oder eine Weiterleitung nach dem POST durch ?faces-redirect=true oder ExternalContext#redirect() . In effects hat process="@form" update="@all" genau die gleiche Wirkung wie eine nicht-ajax (nicht-partielle) submit. In meiner gesamten JSF-Karriere ist der einzige sinnvolle Anwendungsfall, den ich bei @all angetroffen @all , die Anzeige einer @all Fehlerseite, falls während einer Ajax-Anfrage eine Ausnahme auftritt. Siehe auch Wie ist der richtige Umgang mit JSF 2.0-Ausnahmen für AJAXified-Komponenten?

    Das Standard-JSF, das dem PrimeFaces-spezifischen update ist das render von . Es verhält sich genau gleich, außer dass es keine durch Kommas getrennte Zeichenfolge unterstützt, während PrimeFaces (obwohl ich persönlich empfehle, sich einfach an eine durch Leerzeichen getrennte Konvention zu halten) noch das @parent Schlüsselwort unterstützt. Sowohl update als auch render standardmäßig auf @none (was “nichts” ist).


    Siehe auch:

    • Wie finde ich die Client ID der Komponente für ajax update / render? Komponente mit Ausdruck “foo”, auf den von “bar” verwiesen wird, kann nicht gefunden werden
    • Ausführungsreihenfolge der Ereignisse beim Drücken von PrimeFaces p: commandButton
    • So verringern Sie die Anforderungsnutzlast von p: ajax während z. B. p: dataTable Paginierung
    • So zeigen Sie Details der aktuellen Zeile von p: dataTable in ap: dialog an und aktualisieren sie nach dem Speichern
    • Wie benutzt man in der JSF-Seite? Einzelform? Mehrere Formulare? Verschachtelte Formulare?

    Wenn Sie Schwierigkeiten haben, sich an die Standardwerte zu erinnern (ich weiß, dass ich … habe), ist hier ein kurzer Auszug aus der Antwort von BalusC:

     Komponente |  Abschicken |  Aktualisierung
     ------------ |  --------------- |  --------------
     f: Ajax |  execute = "@ this" |  render = "@ keiner"
     p: Ajax |  process = "@ this" |  update = "@ keine"
     p: commandXXX |  process = "@ form" |  update = "@ keine"
    

    Nach process (in der JSF-Spezifikation heißt es execute) weisen Sie JSF an, die Verarbeitung auf die Komponente zu beschränken, die angegeben wird, sonst wird alles ignoriert.

    update gibt an, welches Element aktualisiert wird, wenn der Server auf Ihre Anfrage antwortet.

    @all : Jede Komponente wird verarbeitet / gerendert.

    @this : Die anfordernde Komponente mit dem Attribut execute wird verarbeitet / gerendert.

    @form : Das Formular, das die anfordernde Komponente enthält, wird verarbeitet / gerendert.

    @parent : Das übergeordnete Element , das die anfordernde Komponente enthält, wird verarbeitet / gerendert.

    Mit Primefaces können Sie sogar JQuery-Selektoren verwenden, lesen Sie diesen Blog: http://blog.primefaces.org/?p=1867