<p:commandXxx process>
<p:ajax process>
<f:ajax execute>
Das process
Attribut ist serverseitig und kann nur die UIComponent
Implementierung EditableValueHolder
(Eingabefelder) oder ActionSource
(Befehlsfelder) beeinflussen. Das process
Attribut teilt JSF mithilfe einer durch Leerzeichen getrennten Liste von Client-IDs mit, welche Komponenten beim (teilweisen) Senden des Formulars während des gesamten JSF-Lebenszyklus genau verarbeitet werden müssen.
JSF wird dann die Anfrage Werte gelten (HTTP - Request - Parameter auf die Komponente der eigenen Client - ID basiert zu finden und dann entweder als übermittelten Wert bei Einstellung EditableValueHolder
Komponenten oder eine neue Schlange stehen ActionEvent
bei ActionSource
Komponenten), führen Konvertierung, Validierung und Aktualisierung der Modellwerte ( EditableValueHolder
nur Komponenten) und schließlich die Warteschlange aufrufen ActionEvent
( ActionSource
nur Komponenten). JSF überspringt die Verarbeitung aller anderen Komponenten, die nicht durch process
Attribute abgedeckt sind . Außerdem werden Komponenten, deren rendered
Attribut false
während der Phase der Anwendung von Anforderungswerten ausgewertet wird, als Teil des Schutzes vor manipulierten Anforderungen übersprungen.
Beachten Sie, dass es bei ActionSource
Komponenten (z. B. <p:commandButton>
) sehr wichtig ist, dass Sie auch die Komponente selbst in das process
Attribut aufnehmen, insbesondere wenn Sie die mit der Komponente verknüpfte Aktion aufrufen möchten. Das folgende Beispiel, das nur bestimmte Eingabekomponenten verarbeiten soll, wenn eine bestimmte Befehlskomponente aufgerufen wird, funktioniert also nicht:
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="foo" action="#{bean.action}" />
Es würde nur das verarbeiten #{bean.foo}
und nicht das #{bean.action}
. Sie müssen auch die Befehlskomponente selbst einschließen:
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="@this foo" action="#{bean.action}" />
Oder, wie Sie anscheinend herausgefunden haben, verwenden, @parent
wenn sie zufällig die einzigen Komponenten sind, die ein gemeinsames übergeordnetes Element haben:
<p:panel><!-- Type doesn't matter, as long as it's a common parent. -->
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="@parent" action="#{bean.action}" />
</p:panel>
Wenn beide zufällig die einzigen Komponenten der übergeordneten UIForm
Komponente sind, können Sie auch Folgendes verwenden @form
:
<h:form>
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="@form" action="#{bean.action}" />
</h:form>
Dies ist manchmal unerwünscht, wenn das Formular mehr Eingabekomponenten enthält, die Sie bei der Verarbeitung überspringen möchten, mehr als häufig, wenn Sie eine andere Eingabekomponente oder einen anderen UI-Abschnitt basierend auf der aktuellen Eingabekomponente in aktualisieren möchten eine Ajax-Listener-Methode. Sie möchten nämlich nicht, dass Validierungsfehler bei anderen Eingabekomponenten die Ausführung der Ajax-Listener-Methode verhindern.
Dann ist da noch die @all
. Dies hat keine besonderen Auswirkungen auf das process
Attribut, sondern nur auf das update
Attribut. A process="@all"
verhält sich genauso wie process="@form"
. HTML unterstützt ohnehin nicht das gleichzeitige Senden mehrerer Formulare.
Es gibt übrigens auch eine, @none
die nützlich sein kann, wenn Sie absolut nichts verarbeiten müssen, sondern nur einige bestimmte Teile über aktualisieren möchten update
, insbesondere jene Abschnitte, deren Inhalt nicht von übermittelten Werten oder Aktionslistenern abhängt.
Es sollte beachtet werden, dass das process
Attribut keinen Einfluss auf die Nutzlast der HTTP-Anforderung (die Anzahl der Anforderungsparameter) hat. Dies bedeutet, dass das Standard-HTML-Verhalten beim Senden von "alles", das in der HTML-Darstellung von enthalten <h:form>
ist, nicht beeinflusst wird. Wenn Sie ein großes Formular haben und die Nutzlast der HTTP-Anforderung auf nur die für die Verarbeitung unbedingt erforderlichen reduzieren möchten, dh nur auf die von process
Attributen abgedeckten , können Sie das partialSubmit
Attribut in PrimeFaces Ajax-Komponenten wie in <p:commandXxx ... partialSubmit="true">
oder festlegen <p:ajax ... partialSubmit="true">
. Sie können dies auch "global" konfigurieren, indem Sie es bearbeiten web.xml
und hinzufügen
<context-param>
<param-name>primefaces.SUBMIT</param-name>
<param-value>partial</param-value>
</context-param>
Alternativ können Sie auch <o:form>
OmniFaces 3.0+ verwenden, das standardmäßig dieses Verhalten verwendet.
Das Standard-JSF, das den spezifischen PrimeFaces entspricht, process
stammt execute
von <f:ajax execute>
. Es verhält sich genauso, außer dass es keine durch Kommas getrennte Zeichenfolge unterstützt, während die PrimeFaces-Zeichenfolge (obwohl ich persönlich empfehle, sich nur an die durch Leerzeichen getrennte Konvention zu halten) oder das @parent
Schlüsselwort unterstützt. Es kann auch nützlich sein zu wissen, dass der <p:commandXxx process>
Standardwert " @form
while" <p:ajax process>
und der <f:ajax execute>
Standardwert " while" ist @this
. Schließlich ist es auch nützlich zu wissen, dass process
die sogenannten "PrimeFaces-Selektoren" unterstützt werden, siehe auch Wie funktionieren PrimeFaces-Selektoren wie in update = "@ (. MyClass)"?
<p:commandXxx update>
<p:ajax update>
<f:ajax render>
Das update
Attribut ist clientseitig und kann die HTML-Darstellung aller UIComponent
s beeinflussen. Das update
Attribut teilt JavaScript (das für die Verarbeitung der Ajax-Anforderung / Antwort verantwortlich ist) mithilfe einer durch Leerzeichen getrennten Liste von Client-IDs mit, welche Teile im HTML-DOM-Baum als Antwort auf die Formularübermittlung aktualisiert werden müssen.
JSF bereitet dann die richtige Ajax-Antwort dafür vor und enthält nur die angeforderten Teile, die aktualisiert werden sollen. JSF überspringt alle anderen Komponenten, die update
in der Ajax-Antwort nicht durch Attribute abgedeckt sind , wodurch die Nutzdaten der Antwort klein bleiben . Außerdem werden Komponenten übersprungen , deren rendered
Attribut false
während der Renderantwortphase ausgewertet wird. Beachten Sie, dass true
JavaScript es im HTML-DOM-Baum nicht aktualisieren kann , obwohl es zurückkehren würde , wenn es ursprünglich war false
. Sie müssten es stattdessen umbrechen oder das übergeordnete Element aktualisieren. Siehe auch Ajax Update / Render funktioniert nicht für eine Komponente, die ein Attribut gerendert hat .
Normalerweise möchten Sie nur die Komponenten aktualisieren , die auf der Clientseite beim (teilweisen) Senden des Formulars wirklich "aktualisiert" werden müssen. Im folgenden Beispiel wird das gesamte übergeordnete Formular aktualisiert über @form
:
<h:form>
<p:inputText id="foo" value="#{bean.foo}" required="true" />
<p:message id="foo_m" for="foo" />
<p:inputText id="bar" value="#{bean.bar}" required="true" />
<p:message id="bar_m" for="bar" />
<p:commandButton action="#{bean.action}" update="@form" />
</h:form>
(Beachten Sie, dass das process
Attribut weggelassen wird, da es standardmäßig @form
bereits verwendet wird.)
Während dies gut funktionieren kann, ist die Aktualisierung der Eingabe- und Befehlskomponenten in diesem speziellen Beispiel nicht erforderlich. Wenn Sie die Modellwerte foo
und die bar
Inside- action
Methode nicht ändern (was in der UX-Perspektive wiederum nicht intuitiv wäre), ist es sinnlos, sie zu aktualisieren. Die Nachrichtenkomponenten sind die einzigen, die wirklich aktualisiert werden müssen:
<h:form>
<p:inputText id="foo" value="#{bean.foo}" required="true" />
<p:message id="foo_m" for="foo" />
<p:inputText id="bar" value="#{bean.bar}" required="true" />
<p:message id="bar_m" for="bar" />
<p:commandButton action="#{bean.action}" update="foo_m bar_m" />
</h:form>
Das wird jedoch langweilig, wenn Sie viele davon haben. Dies ist einer der Gründe, warum PrimeFaces Selectors existieren. Diese Nachrichtenkomponenten haben in der generierten HTML-Ausgabe eine gemeinsame Stilklasse von ui-message
, daher sollte auch Folgendes gelten:
<h:form>
<p:inputText id="foo" value="#{bean.foo}" required="true" />
<p:message id="foo_m" for="foo" />
<p:inputText id="bar" value="#{bean.bar}" required="true" />
<p:message id="bar_m" for="bar" />
<p:commandButton action="#{bean.action}" update="@(.ui-message)" />
</h:form>
(Beachten Sie, dass Sie die IDs für Nachrichtenkomponenten behalten sollten, da dies sonst @(...)
nicht funktioniert . Weitere Informationen finden Sie unter Funktionsweise von PrimeFaces-Selektoren wie in update = "@ (. myClass)". )
Das @parent
aktualisiert nur die übergeordnete Komponente, die somit die aktuelle Komponente und alle Geschwister und ihre untergeordneten Komponenten abdeckt. Dies ist nützlicher, wenn Sie das Formular in vernünftigen Gruppen mit jeweils eigener Verantwortung getrennt haben. Die @this
Updates sind natürlich nur die aktuelle Komponente. Normalerweise ist dies nur erforderlich, wenn Sie eines der HTML-Attribute der Komponente in der Aktionsmethode ändern müssen. Z.B
<p:commandButton action="#{bean.action}" update="@this"
oncomplete="doSomething('#{bean.value}')" />
Stellen Sie sich vor, dass die oncomplete
Notwendigkeit besteht, mit dem zu arbeiten, value
was geändert action
wurde. Dann hätte dieses Konstrukt nicht funktioniert, wenn die Komponente nicht aktualisiert worden wäre, aus dem einfachen Grund, der oncomplete
Teil der generierten HTML-Ausgabe ist (und daher werden alle darin enthaltenen EL-Ausdrücke ausgewertet während der Renderantwort).
Das @all
aktualisiert das gesamte Dokument, das mit Vorsicht verwendet werden sollte. Normalerweise möchten Sie dafür eine echte GET-Anforderung verwenden, entweder über einen einfachen Link ( <a>
oder <h:link>
) oder eine Umleitung nach dem POST durch ?faces-redirect=true
oder ExternalContext#redirect()
. Hat in Effekten process="@form" update="@all"
genau den gleichen Effekt wie ein Nicht-Ajax-Submit (nicht partiell). In meiner gesamten JSF-Karriere bestand der einzige sinnvolle Anwendungsfall @all
darin, eine Fehlerseite vollständig anzuzeigen, falls während einer Ajax-Anforderung eine Ausnahme auftritt. Siehe auch Wie gehe ich mit JSF 2.0-Ausnahmen für AJAXified-Komponenten richtig um?
Das Standard-JSF, das den spezifischen PrimeFaces entspricht, update
stammt render
von <f:ajax render>
. Es verhält sich genauso, außer dass es keine durch Kommas getrennte Zeichenfolge unterstützt, während die PrimeFaces-Zeichenfolge (obwohl ich persönlich empfehle, sich nur an die durch Leerzeichen getrennte Konvention zu halten) oder das @parent
Schlüsselwort unterstützt. Beides update
und render
standardmäßig @none
(was "nichts" ist).
Siehe auch: