प्राइमफेस प्रोसेस / अपडेट और जेएसएफ एफ को समझना: अजाक्स निष्पादित / रेंडर विशेषताएँ


194

वास्तव में क्या कर रहे हैं processऔर updatePrimeFaces में p:commandXxxघटकों और executeऔर renderमें f:ajaxटैग?

सत्यापन के समय कौन सा काम करता है? updateबैक एंड से कंपोनेंट पर वैल्यू अपडेट करने के बजाय एट्रिब्यूट क्या करता है ? क्या processविशेषता मॉडल के लिए बाइंड मूल्य है? वास्तव में क्या @this, @parent, @allऔर @formदोनों विशेषताओं में?

नीचे दिया गया उदाहरण ठीक काम कर रहा है, लेकिन मैं बुनियादी अवधारणाओं में थोड़ा भ्रमित हूं।

<p:commandButton process="@parent"
                 update="@form"
                 action="#{bean.submit}" 
                 value="Submit" />

जवाबों:


307

<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(जो है, "कुछ भी नहीं")।


यह सभी देखें:


जब मैं अपडेट = "" का उपयोग करता हूं, तो बैकिंग सेम की प्रबंधित संपत्ति सेट नहीं होती है और मेरी @PostConstruct दिनचर्या विफल हो जाती है। कोई विचार? EDIT: • यदि आप बाद के POST अनुरोधों में मौजूद # {param} की प्रबंधित संपत्ति पर भरोसा करते हैं, तो आपको इसे UICommand घटकों में <f: param> के रूप में शामिल करने की आवश्यकता है।
निकोलस

एक पैनलग्रुप की एक प्रक्रिया / अपडेट इस पैनलग्रुप के कंटेंट को प्रोसेस / अपडेट करेगा / कर सकता है: <h: panelGroup id = "pgId"> // इनपुट टेक्स्ट यहां जाता है <h: पैनलग्रुप> <p: कमांड लिंक = "pgId" अपडेट = "pgId" />
bob-cac

इस बहुत अच्छी व्याख्या के लिए Thx @BalusC!
ProgrammingIsAwsome

2
@ रैपर: क्योंकि processसेट नहीं है, इसलिए यह डिफ़ॉल्ट मान का उपयोग करता है @form। यह भी उपरोक्त उत्तर में समझाया गया है।
बालुसक

2
@ रोलैंड: यह ऐप कॉन्फिग के साथ एक अलग, अधिक गंभीर, समस्या को छिपा रहा है।
बालुस

54

यदि आपके पास डिफ़ॉल्ट मानों को याद करने में कठिन समय है (मुझे पता है कि मेरे पास है ...) BalusC के उत्तर से एक छोटा उद्धरण है:

घटक | सबमिट करें | ताज़ा करना
------------ | --------------- | --------------
f: अजाक्स | execute = "@ यह" | प्रस्तुत करना = "@ कोई नहीं"
p: अजाक्स | प्रक्रिया = "@ यह" | अद्यतन = "@ कोई नहीं"
p: कमांडएक्सएक्सएक्सएक्स | प्रक्रिया = "@ फॉर्म" | अद्यतन = "@ कोई नहीं"

बस एक छोटी सी सुधार: का डिफ़ॉल्ट मान processके लिए p:commandXXXहै @all। इसके अलावा, यह AJAX का समर्थन करने वाले हर घटक के लिए लागू होता है, जैसे कि p:menuitem
Stephan Rauh

1
हाय @StephanRauh, टिप्पणी के लिए बहुत बहुत धन्यवाद। आपने कहाँ पढ़ा डिफ़ॉल्ट क्या है @all? जहां तक ​​मैं बालुसक के उत्तर से पढ़ सकता हूं @form, यह प्रक्रिया में @allबराबर है @form। अन्य घटकों के बारे में अच्छी बात है, मुझे लगता है कि मुझे स्रोत कोड में देखना होगा जब समय यह देखने के लिए कि यह किन घटकों पर लागू होता है, क्योंकि मैं कुछ ऐसा नहीं लिखूंगा जो गलत हो सकता है
Jaqen H'ghar

1
@ JaqenH'ghar थॉमस एंड्रास्को ने मुझे @allबिट के बारे में बताया । उसे पता होना चाहिए, उसने हाल ही में प्राइमफेस के AJAX इंजन को फिर से लागू किया है। बाद में, मैंने इसे डबल चेक किया लेकिन प्राइमफेस के सोर्स कोड को पढ़कर और XHR अनुरोधों को देखकर। मुझे उम्मीद है कि इस बार मुझे सही मिल गया है क्योंकि मैंने प्रधानमंत्री के AJAX अनुरोधों के लिए AJAX अनुरोधों को लागू किया है।
चरण रोह

यह कहना भ्रामक होगा, कि जब HTML कई रूपों के सबमिट का समर्थन नहीं करता है तो डिफ़ॉल्ट @all है। डेवलपर्स को प्रभावी डिफ़ॉल्ट मान जानने की आवश्यकता है (इसलिए थॉमस इसे तदनुसार बदल सकते हैं)। वैसे, इन चूक को गलत तरीके से प्राइमफेस यूजर गाइड 6.2 में शून्य के रूप में परिभाषित किया गया है।
मार्क डेज़बेल

27

प्रक्रिया के द्वारा (JSF विनिर्देशन जिसे इसे निष्पादित कहा जाता है) में आप जेएसएफ को प्रोसेसिंग को उस घटक तक सीमित करने के लिए कहते हैं जो हर उस चीज़ को निर्दिष्ट किया जाता है जिसे केवल अनदेखा किया जाता है।

अद्यतन इंगित करता है कि कौन सा तत्व अपडेट किया जाएगा जब सर्वर आपके अनुरोध पर प्रतिक्रिया देगा।

@all : प्रत्येक घटक को संसाधित / प्रस्तुत किया जाता है।

@ यह : निष्पादित विशेषता के साथ अनुरोधित घटक संसाधित / प्रस्तुत किया गया है।

@ सुधार : अनुरोध घटक को शामिल करने वाले प्रपत्र को संसाधित / प्रस्तुत किया जाता है।

@ अपरेंट : वह पैरेंट जिसमें रिक्वेस्टिंग कंपोनेंट होता है, उसे प्रोसेस / रेंडर किया जाता है।

प्रधानमंत्री के साथ आप JQuery के चयनकर्ताओं का भी उपयोग कर सकते हैं, इस ब्लॉग को देखें: http://blog.primefaces.org/??==67


2

कृपया ध्यान दें कि PrimeFaces मानक JSF 2.0+ कीवर्ड का समर्थन करता है:

  • @this वर्तमान घटक।
  • @all पूरा दृश्य।
  • @form वर्तमान घटक का निकटतम पूर्वज रूप।
  • @none कोई घटक नहीं।

और मानक JSF 2.3+ कीवर्ड:

  • @child(n) nth बच्चा।
  • @composite निकटतम कंपोजिट घटक पूर्वज।
  • @id(id) घटक ट्री संरचना और नामकरण कंटेनरों की अनदेखी करके उनकी आईडी से घटकों की खोज करने के लिए उपयोग किया जाता है।
  • @namingcontainer वर्तमान घटक का निकटतम पूर्वज नामकरण कंटेनर।
  • @parent वर्तमान घटक के जनक।
  • @previous पिछला सहोदर
  • @next अगला सिबलिंग।
  • @root दृश्य का UIViewRoot उदाहरण, वर्तमान घटक के बजाय रूट से खोज शुरू करने के लिए इस्तेमाल किया जा सकता है।

लेकिन, यह कुछ प्राइमफेस विशिष्ट कीवर्ड के साथ भी आता है:

  • @row(n) nth पंक्ति।
  • @widgetVar(name) दिए गए विजेटविअर के साथ घटक।

और आप "प्राइमफेस सिलेक्टर्स" नामक कुछ का भी उपयोग कर सकते हैं जो आपको jQuery चयनकर्ता एपीआई का उपयोग करने की अनुमति देता है। उदाहरण के लिए सीएसएस वर्ग के साथ एक तत्व में सभी जानकारी संसाधित करने के लिए myClass:

process="@(.myClass :input)"

देख:


2
ध्यान दें कि यहां तक ​​कि JSF2.3 + कीवर्ड का सबसे अधिक समर्थन करता है।
तंद्राश्चको
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.