<p:commandXxx process> <p:ajax process> <f:ajax execute>
processविशेषता सर्वर साइड है और केवल प्रभावित कर सकते हैं UIComponentलागू करने रों EditableValueHolder(इनपुट क्षेत्रों) या ActionSource(कमांड क्षेत्रों)। processविशेषता बताता है JSF, ग्राहक आईडी है, जो घटकों बिल्कुल पर पूरे JSF जीवन चक्र के माध्यम से संसाधित किया जाना चाहिए के एक अंतरिक्ष अलग की गई सूची का उपयोग कर (आंशिक) फ़ॉर्म सबमिट करें।
JSF तो अनुरोध मान लागू होगी (HTTP अनुरोध पैरामीटर घटक के अपने ग्राहक आईडी के आधार पर और फिर पाने के लिए या तो के मामले में प्रस्तुत मूल्य के रूप में सेट EditableValueHolderघटकों या एक नया कतार ActionEventके मामले में ActionSourceघटक), प्रदर्शन रूपांतरण, सत्यापन और अद्यतन करने मॉडल मूल्यों ( EditableValueHolderघटक केवल) और अंत में पंक्तिबद्ध ActionEvent( ActionSourceकेवल घटक)। जेएसएफ उन सभी अन्य घटकों के प्रसंस्करण को छोड़ देगा जो processविशेषता द्वारा कवर नहीं किए गए हैं। इसके अलावा, घटक जिनकी renderedविशेषता falseअनुरोध अनुरोध मान चरण के दौरान मूल्यांकन करती है, उन्हें भी छेड़छाड़ अनुरोधों के खिलाफ सुरक्षा के हिस्से के रूप में छोड़ दिया जाएगा।
ध्यान दें कि यह ActionSourceघटकों (जैसे <p:commandButton>) के मामले में बहुत महत्वपूर्ण है कि आप घटक को भी processविशेषता में शामिल करते हैं , खासकर यदि आप घटक के साथ जुड़ी कार्रवाई को लागू करने का इरादा रखते हैं। इसलिए नीचे का उदाहरण जो केवल कुछ इनपुट घटक (एस) को संसाधित करने का इरादा रखता है जब एक निश्चित कमांड घटक को काम पर नहीं लाया जाता है:
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="foo" action="#{bean.action}" />
यह केवल पर कार्रवाई होगी #{bean.foo}और नहीं#{bean.action} । आपको कमांड कंपोनेंट को भी शामिल करना होगा:
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="@this foo" action="#{bean.action}" />
या, जैसा कि आपको स्पष्ट रूप से पता चला है, @parentयदि वे एक समान माता-पिता होने वाले घटक होते हैं:
<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>
या, यदि वे दोनों मूल UIFormघटक के एकमात्र घटक होते हैं, तो आप भी उपयोग कर सकते हैं @form:
<h:form>
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="@form" action="#{bean.action}" />
</h:form>
यह कभी-कभी अवांछनीय होता है यदि फ़ॉर्म में अधिक इनपुट घटक होते हैं, जिन्हें आप प्रसंस्करण में छोड़ना चाहते हैं, तो ऐसे मामलों में जब आप किसी अन्य इनपुट घटक (एस) या कुछ यूआई अनुभाग को अपडेट करना चाहते हैं, तो वर्तमान इनपुट घटक के आधार पर अजाक्स श्रोता विधि। आप नहीं चाहते हैं कि अन्य इनपुट घटकों पर सत्यापन त्रुटियां अजाक्स श्रोता विधि को निष्पादित होने से रोक रही हैं।
तो फिर वहाँ है @all। यह processविशेषता में कोई विशेष प्रभाव नहीं है , लेकिन केवल updateविशेषता में है। एक process="@all"बिल्कुल वैसा ही व्यवहार करता है process="@form"। HTML वैसे भी एक साथ कई फ़ॉर्म सबमिट करने का समर्थन नहीं करता है।
इस तरह से वहाँ भी है @noneजो एक मामले में उपयोगी हो सकता है अगर आपको पूरी तरह से कुछ भी संसाधित करने की आवश्यकता नहीं है, लेकिन केवल कुछ विशिष्ट भागों के माध्यम से अपडेट करना चाहते हैं update, विशेषकर उन वर्गों के लिए जिनकी सामग्री प्रस्तुत मूल्यों या क्रिया श्रोताओं पर निर्भर नहीं करती है।
यह नोट किया जाना चाहिए कि processविशेषता का HTTP अनुरोध पेलोड (अनुरोध पैरामीटर की मात्रा) पर कोई प्रभाव नहीं है । मतलब, <h:form>वसीयत के HTML प्रतिनिधित्व के भीतर निहित "सब कुछ" भेजने का डिफ़ॉल्ट HTML व्यवहार प्रभावित नहीं होगा। यदि आपके पास एक बड़ा रूप है, और आप केवल इन आवश्यक प्रसंस्करण में HTTP अनुरोध पेलोड को कम करना चाहते हैं, अर्थात केवल इन्हें processविशेषता द्वारा कवर किया गया है, तो आप partialSubmitप्राइमफेस में अजाक्स घटकों में <p:commandXxx ... partialSubmit="true">या के रूप में विशेषता सेट कर सकते हैं <p:ajax ... partialSubmit="true">। आप इस 'ग्लोबली' को एडिट करके web.xmlऔर जोड़कर भी कॉन्फ़िगर कर सकते हैं
<context-param>
<param-name>primefaces.SUBMIT</param-name>
<param-value>partial</param-value>
</context-param>
वैकल्पिक रूप से, आप <o:form>OmniFaces 3.0+ का भी उपयोग कर सकते हैं जो इस व्यवहार के लिए चूक है।
PrimeFaces विशिष्ट करने के लिए मानक JSF बराबर processहै executeसे <f:ajax execute>। यह बिल्कुल वैसा ही व्यवहार करता है, सिवाय इसके कि यह कॉमा-सेपरेटेड स्ट्रिंग का समर्थन नहीं करता है जबकि प्राइमफेस एक करता है (हालांकि मैं व्यक्तिगत रूप से स्पेस-सेशन कन्वेंशन से चिपके रहने की सलाह देता हूं), और न ही @parentकीवर्ड। इसके अलावा, यह जानना उपयोगी हो सकता है कि <p:commandXxx process>चूक किस @formसमय <p:ajax process>और <f:ajax execute>चूक के लिए है @this। अंत में, यह जानना भी उपयोगी है कि processतथाकथित "प्राइमफेस सिलेक्टर्स" का समर्थन करता है, यह भी देखें कि प्राइमफेस सिलेक्टर्स को अपडेट में कैसे करें = "@ (। MyClass)" काम?
<p:commandXxx update> <p:ajax update> <f:ajax render>
updateविशेषता क्लाइंट पक्ष है और सभी के एचटीएमएल प्रतिनिधित्व को प्रभावित कर सकते UIComponentहै। updateविशेषता जावास्क्रिप्ट बताता है (एक ajax अनुरोध / प्रतिक्रिया संभालने के लिए जिम्मेदार), ग्राहक आईडी, जो एचटीएमएल डोम पेड़ जरूरत भागों प्रपत्र प्रस्तुत करने के लिए प्रतिक्रिया के रूप में अद्यतन किया जाना के एक अंतरिक्ष अलग की गई सूची का उपयोग कर।
JSF उसके बाद सही ajax प्रतिक्रिया तैयार करेगा, जिसमें केवल अपडेट किए गए भागों को शामिल किया जाएगा। जेएसएफ अन्य सभी घटकों को छोड़ देगा जो updateकि अजाक्स प्रतिक्रिया में विशेषता द्वारा कवर नहीं किए गए हैं , जिससे प्रतिक्रिया पेलोड को छोटा रखा गया है। इसके अलावा, घटक जिनकी renderedविशेषता falseप्रतिक्रिया चरण के दौरान मूल्यांकन करती है उन्हें छोड़ दिया जाएगा। ध्यान दें कि भले ही यह वापस आ जाए true, लेकिन जावास्क्रिप्ट इसे HTML DOM ट्री में अपडेट नहीं कर सकता है यदि यह शुरुआत में था false। इसके बजाय आपको इसे लपेटने या इसके माता-पिता को अपडेट करने की आवश्यकता होगी। यह भी देखें कि अजाक्स अद्यतन / रेंडर एक घटक पर काम नहीं करता है जिसने विशेषता प्रदान की है ।
आमतौर पर, आप केवल उन घटकों को अपडेट करना चाहेंगे जो वास्तव में (आंशिक) फॉर्म सबमिट करने के लिए ग्राहक पक्ष में "ताज़ा" होने की आवश्यकता है। नीचे दिए गए उदाहरण के माध्यम से पूरे मूल रूप को अद्यतन करता है @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विशेषता @formपहले से ही चूक के रूप में छोड़ी गई है )
जबकि जो ठीक काम कर सकता है, इनपुट और कमांड घटकों का अद्यतन इस विशेष उदाहरण में अनावश्यक है। जब तक आप मॉडल मूल्यों fooऔर barअंदर की actionविधि को नहीं बदलते (जो कि यूएक्स परिप्रेक्ष्य में अनजाने में होगा), उन्हें अपडेट करने का कोई मतलब नहीं है। संदेश घटक केवल वही हैं जिन्हें वास्तव में अद्यतन करने की आवश्यकता है:
<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>
हालाँकि, यह थकाऊ हो जाता है जब आप उनमें से कई हैं। यही कारण है कि PrimeFaces Selectors मौजूद हैं। उन संदेश घटकों में उत्पन्न HTML उत्पादन की एक सामान्य शैली वर्ग है ui-message, इसलिए निम्नलिखित को भी करना चाहिए:
<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>
(ध्यान दें कि आपको संदेश घटकों पर आईडी रखना चाहिए, अन्यथा @(...)काम नहीं करेगा! फिर, देखें कि कैसे अपडेट में प्रधान चयनकर्ताओं का चयन करें = "@ (। myClass)" काम? विस्तार के लिए)
@parentकेवल माता-पिता घटक है, जो इस प्रकार वर्तमान घटक और सभी भाई बहन और उनके बच्चों को शामिल किया गया अद्यतन करता है। यह अधिक उपयोगी है यदि आपने प्रत्येक अपनी जिम्मेदारी के साथ समझदार समूहों में फॉर्म को अलग कर दिया है। @thisअद्यतन, जाहिर है, केवल वर्तमान घटक। आम तौर पर, यह केवल तब आवश्यक होता है जब आपको एक्शन विधि में घटक के स्वयं के HTML विशेषताओं में से एक को बदलने की आवश्यकता होती है। उदाहरण के लिए
<p:commandButton action="#{bean.action}" update="@this"
oncomplete="doSomething('#{bean.value}')" />
कल्पना करें कि जिसके oncompleteसाथ काम करने की आवश्यकता है valueवह बदल गया है action, तो यह निर्माण काम नहीं करेगा यदि घटक को अद्यतन नहीं किया गया है, तो साधारण कारण के लिए जो oncompleteउत्पन्न HTML आउटपुट का हिस्सा है (और इस प्रकार सभी ईएल अभिव्यक्तियों का मूल्यांकन किया जाता है। प्रतिक्रिया के दौरान)।
@allजो देखभाल के साथ प्रयोग किया जाना चाहिए पूरे दस्तावेज, अद्यतन करता है। आम तौर पर, आप के बजाय या तो एक सादे लिंक (द्वारा इस के लिए एक सच्चे GET अनुरोध उपयोग करना चाहते हैं <a>या <h:link>) या एक से रीडायरेक्ट के बाद पोस्ट ?faces-redirect=trueया ExternalContext#redirect()। प्रभाव में, process="@form" update="@all"गैर-अजाक्स (गैर-आंशिक) सबमिट के समान प्रभाव होता है। मेरे पूरे JSF करियर में, मेरे द्वारा सामना किए जाने वाले एकमात्र समझदार उपयोग के मामले में @allएक त्रुटि पृष्ठ को प्रदर्शित करने के लिए है, जब एक ajax अनुरोध के दौरान अपवाद होता है। यह भी देखें कि AJAXified घटकों के लिए JSF 2.0 अपवादों से निपटने का सही तरीका क्या है?
PrimeFaces विशिष्ट करने के लिए मानक JSF बराबर updateहै renderसे <f:ajax render>। यह बिल्कुल वैसा ही व्यवहार करता है, सिवाय इसके कि यह कॉमा-सेपरेटेड स्ट्रिंग का समर्थन नहीं करता है जबकि प्राइमफेस एक करता है (हालांकि मैं व्यक्तिगत रूप से स्पेस-सेशन कन्वेंशन से चिपके रहने की सलाह देता हूं), और न ही @parentकीवर्ड। दोनों updateऔर renderचूक @none(जो है, "कुछ भी नहीं")।
यह सभी देखें: