<p:commandXxx process> <p:ajax process> <f:ajax execute>
processNitelik sunucu tarafı ve sadece etkileyebilir UIComponentuygulayan s EditableValueHolder(giriş alanları) veya ActionSource(komut alanları). processÖzelliği, bileşenlerin tam olarak üzerine tüm MTU yaşam döngüsü boyunca işlenmesi gereken müşteri kimlikleri, bir boşluk ile ayrılmış listesini kullanarak, JSF söyler (kısmi) formunda göndermek.
JSF daha sonra istek değerlerini uygular (bileşenin kendi istemci kimliğine göre HTTP istek parametresini bulur ve ardından EditableValueHolderbileşenler durumunda gönderilen değer olarak ayarlar veya bileşenler ActionEventdurumunda yeni bir kuyruk ActionSourceoluşturur), dönüştürme, doğrulama ve model değerlerini güncelleme ( EditableValueHolderyalnızca bileşenler) ve son olarak kuyruğa alınanları çağırır ActionEvent( ActionSourceyalnızca bileşenler). JSF, processöznitelik kapsamında olmayan diğer tüm bileşenlerin işlenmesini atlayacaktır . Ayrıca, başvuru istek değerleri aşamasında renderedözniteliği değerlendirilen bileşenler falsede kurcalanmış isteklere karşı korumanın bir parçası olarak atlanacaktır.
Şu nedenlerden dolayı olduğunu Not ActionSource(örneğin bileşenler <p:commandButton>de bileşenin kendisini dahil olması çok önemlidir) processEğer bileşeni ile ilişkili işlemi çağırmak niyetinde, özellikle öznitelik. Bu nedenle, belirli bir komut bileşeni çağrıldığında yalnızca belirli giriş bileşenlerini işlemeyi amaçlayan aşağıdaki örnek çalışmaz:
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="foo" action="#{bean.action}" />
Sadece işlemek olur #{bean.foo}ve değil#{bean.action} . Komut bileşeninin kendisini de eklemeniz gerekir:
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="@this foo" action="#{bean.action}" />
Ya da, görünüşe göre, @parentortak bir ebeveyne sahip olan tek bileşen olup olmadıklarını kullanarak :
<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>
Veya, her ikisi de ana UIFormbileşenin tek bileşenleri olursa , şunları da kullanabilirsiniz @form:
<h:form>
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="@form" action="#{bean.action}" />
</h:form>
Formda, işlemde atlamak istediğiniz daha fazla girdi bileşeni varsa, başka bir girdi bileşenini veya geçerli girdi bileşenini temel alan bir UI bölümünü güncellemek istediğinizden daha sık bu bazen istenmeyen bir durumdur. ajax dinleyici yöntemi. Diğer giriş bileşenlerindeki doğrulama hatalarının ajax dinleyici yönteminin yürütülmesini engellemesini istemezsiniz.
Sonra @all. Bunun processözellikte özel bir etkisi yoktur , sadece updateözellikte vardır. A process="@all"tam olarak aynı şekilde davranır process="@form". HTML zaten aynı anda birden çok form göndermeyi desteklemiyor.
Bu arada @none, kesinlikle hiçbir şey işlemeniz gerekmemesi durumunda yararlı olabilecek bir de vardır, ancak yalnızca belirli bölümleri update, özellikle içeriği gönderilen değerlere veya eylem dinleyicilerine bağlı olmayan bölümler aracılığıyla güncellemek istersiniz .
Gibi olmalıdır kaydeden processöznitelik vardır bir HTTP isteği bilgisi (istek parametrelerinin miktarı) üzerinde etki. Yani, HTML temsilini içeren "her şeyi" gönderme varsayılan HTML davranışı <h:form>etkilenmez. Büyük bir formunuz varsa ve HTTP isteği yükünü yalnızca işlemede kesinlikle gerekli olanlara, yani yalnızca processöznitelik kapsamında olanlara azaltmak istiyorsanız , partialSubmitözniteliği PrimeFaces Ajax bileşenlerinde <p:commandXxx ... partialSubmit="true">veya olarak ayarlayabilirsiniz <p:ajax ... partialSubmit="true">. Bu 'global olarak' düzenleyerek web.xmlve ekleyerek de yapılandırabilirsiniz.
<context-param>
<param-name>primefaces.SUBMIT</param-name>
<param-value>partial</param-value>
</context-param>
Alternatif olarak, <o:form>bu davranışı varsayılan OmniFaces 3.0+ kullanabilirsiniz .
PrimeFaces spesifik standart MTU eşdeğer processolduğunu executeden <f:ajax execute>. PrimeFaces'ın yaptığı gibi virgülle ayrılmış bir dizeyi desteklememesi dışında tamamen aynı şekilde davranır (kişisel olarak yalnızca boşlukla ayrılmış konvansiyona sadık kalmayı öneririm) veya @parentanahtar kelime. Ayrıca, <p:commandXxx process>varsayılan olarak @formwhile <p:ajax process>ve <f:ajax execute>varsayılan olarak bilmek yararlı olabilir @this. Son olarak, process"PrimeFaces Seçicileri" olarak adlandırılanları desteklediğini bilmek de yararlıdır , ayrıca bkz. PrimeFaces Seçicileri update = "@ (. MyClass)" daki gibi nasıl çalışır?
<p:commandXxx update> <p:ajax update> <f:ajax render>
updateNitelik istemci tarafı ve tüm HTML sunumunu etkileyebilir UIComponents. updateNitelik JavaScript söyler, HTML DOM ağacı muhtaç parçalar forma göndermek için tepki olarak güncellenmesine müşteri kimlikleri, bir boşlukla ayrılmış listesini kullanarak (ajax isteği / tepkisini işlemek için sorumlu bir).
JSF daha sonra yalnızca güncellenmesi istenen parçaları içeren doğru ajax yanıtını hazırlayacaktır . JSF update, ajax yanıtında özniteliğin kapsamadığı diğer tüm bileşenleri atlayarak yanıt yükünü küçük tutar. Ayrıca, oluşturma yanıtı aşamasında renderedniteliği değerlendirilen bileşenler falseatlanacaktır. Geri dönmesine rağmen trueJavaScript'in başlangıçta HTML DOM ağacında güncelleyemeyeceğini unutmayın false. Bunun yerine sarmanız veya üst öğesini güncellemeniz gerekir. Ayrıca bkz. Ajax güncelleme / render özelliği oluşturulan bir bileşen üzerinde çalışmaz .
Genellikle, yalnızca (kısmi) form gönderildikten sonra istemci tarafında gerçekten "yenilenmesi" gereken bileşenleri güncellemek istersiniz . Aşağıdaki örnek, üst formun tamamını şu şekilde günceller @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>
( processözelliğin @formzaten varsayılan olarak atlandığını unutmayın )
Bu işe yarayabilse de, giriş ve komut bileşenlerinin güncellenmesi bu örnekte gereksizdir. Model değerlerini foove barinside actionyöntemini değiştirmediğiniz sürece (bu da UX perspektifinde sezgisel olmayacaktır), bunları güncellemenin bir anlamı yoktur. Mesaj bileşenleri gerçekten güncellenmesi gereken bileşenlerdir :
<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>
Ancak, birçoğunuz olduğunda bu sıkıcı olur. PrimeFaces Seçicilerinin var olmasının nedenlerinden biri de budur. Bu ileti bileşenleri, oluşturulan HTML çıktısında ortak bir stil sınıfına sahiptir ui-message, bu nedenle aşağıdakiler de yapılmalıdır:
<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>
(kimlikleri ileti bileşenlerinde tutmanız gerektiğini unutmayın, aksi takdirde @(...)çalışmaz! Yine, bkz. PrimeFaces Seçicileri update = "@ (. myClass)" daki gibi nasıl çalışır? ayrıntılar için)
@parentBöylece cari bileşeni ve tüm kardeşleri ve çocukları kapsayan tek ebeveyn bileşeni, günceller. Formu aklı başında gruplar halinde kendi sorumlulukları ile ayırdıysanız, bu daha yararlıdır. @thisGüncellemeler, belli ki, sadece mevcut bileşeni. Normalde, bu yalnızca bileşenin eylem yöntemindeki kendi HTML özelliklerinden birini değiştirmeniz gerektiğinde gereklidir. Örneğin
<p:commandButton action="#{bean.action}" update="@this"
oncomplete="doSomething('#{bean.value}')" />
Üzerinde değişiklik oncompleteyapılan çalışma ihtiyaçlarının , bileşen güncellenmezse, bu yapının , oluşturulan HTML çıktısının bir parçası olan basit bir nedenden dolayı işe yaramayacağını düşünün (ve buradaki tüm EL ifadeleri değerlendirilir. render yanıtı sırasında).valueactiononcomplete
@allDikkatle kullanılması gereken belgenin tamamını, günceller. Normalde, bunun yerine bir düz bağlantı (ya bu için gerçek bir GET isteğinde kullanmak istiyorum <a>ya <h:link>) ya da bir yönlendirme-sonra-POST ?faces-redirect=trueveya ExternalContext#redirect(). Efektlerde, process="@form" update="@all"ajax olmayan (kısmi olmayan) bir gönderme ile tamamen aynı etkiye sahiptir. Tüm JSF kariyerim boyunca, karşılaştığım tek mantıklı kullanım durumu @all, bir ajax isteği sırasında istisna olması durumunda bir hata sayfasını bütünüyle görüntülemektir. Ayrıca bkz . AJAXified bileşenleri için JSF 2.0 özel durumlarıyla başa çıkmanın doğru yolu nedir?
PrimeFaces spesifik standart MTU eşdeğer updateolduğunu renderden <f:ajax render>. PrimeFaces'ın yaptığı gibi virgülle ayrılmış bir dizeyi desteklememesi dışında tamamen aynı şekilde davranır (kişisel olarak yalnızca boşlukla ayrılmış konvansiyona sadık kalmayı öneririm) veya @parentanahtar kelime. Hem updateve rendervarsayılan olarak @none(yani, "hiçbir şey").
Ayrıca bakınız: