UICommand
और UIInput
घटकों को एक UIForm
घटक के अंदर रखा जाना चाहिए , जैसे <h:form>
(और इस तरह सादे HTML नहीं <form>
), अन्यथा सर्वर पर कुछ भी नहीं भेजा जा सकता है। UICommand
घटकों में भी type="button"
विशेषता नहीं होनी चाहिए , अन्यथा यह एक मृत बटन होगा जो केवल जावास्क्रिप्ट के लिए उपयोगी है onclick
। यह भी देखें कि फॉर्म इनपुट वैल्यू कैसे भेजें और JSF बीन में एक विधि लागू करें और <h: कमांडबटन> एक पोस्टबैक शुरू नहीं करता है ।
आप UIForm
एक दूसरे में कई घटकों को घोंसला नहीं दे सकते । यह HTML में अवैध है। ब्राउज़र व्यवहार अनिर्दिष्ट है। बाहर फ़ाइलों के साथ देखो! आप UIForm
समानांतर में घटकों का उपयोग कर सकते हैं , लेकिन वे सबमिट के दौरान एक दूसरे को संसाधित नहीं करेंगे। आपको "गॉड फॉर्म" एंटीपैटर्न के साथ भी देखना चाहिए; सुनिश्चित करें कि आप अनजाने में अन्य सभी (अदृश्य) इनपुटों को एक ही रूप में संसाधित / मान्य नहीं करते हैं (जैसे कि बहुत ही रूप में आवश्यक इनपुट के साथ एक छिपा हुआ संवाद करना)। यह भी देखें कि JSF पेज में <h: form> का उपयोग कैसे करें? एकल रूप? कई रूपों? घोंसले के रूप? ।
कोई UIInput
मान सत्यापन / रूपांतरण त्रुटि नहीं होनी चाहिए थी। आप <h:messages>
किसी भी संदेश को दिखाने के लिए उपयोग कर सकते हैं जो किसी भी इनपुट-विशिष्ट <h:message>
घटकों द्वारा नहीं दिखाए जाते हैं। शामिल करने के लिए मत भूलना id
के <h:messages>
में <f:ajax render>
, यदि कोई हो, इतना है कि यह अच्छी तरह से ajax अनुरोध पर के रूप में अद्यतन किया जाएगा। यह भी देखें : संदेश तब प्रदर्शित नहीं होता है जब p: कमांडबटन को दबाया जाता है ।
अगर UICommand
या UIInput
घटकों को एक पुनरावृत्ति घटक जैसे <h:dataTable>
, <ui:repeat>
आदि, के अंदर रखा जाता है , तो आपको यह सुनिश्चित करने की आवश्यकता है कि value
फॉर्म सबमिट अनुरोध के लागू अनुरोध मान चरण के दौरान ठीक उसी पुनरावृत्ति घटक को संरक्षित किया गया है। जेएसएफ उस पर क्लिक किए गए लिंक / बटन और प्रस्तुत इनपुट मानों को खोजने के लिए इसे दोहराएगा। बीन को दृश्य के दायरे @PostConstruct
में रखना और / या यह सुनिश्चित करना कि आप बीन में डेटा मॉडल को लोड करते हैं (और इस तरह एक गेटर विधि में नहीं!) इसे ठीक करना चाहिए। यह भी देखें कि मुझे h के लिए डेटाबेस से मॉडल को कैसे और कब लोड करना चाहिए: dataTable ।
यदि UICommand
या UIInput
घटकों को एक गतिशील स्रोत द्वारा शामिल किया जाता है जैसे कि <ui:include src="#{bean.include}">
, तो आपको यह सुनिश्चित करने की आवश्यकता है कि #{bean.include}
फॉर्म सबमिट अनुरोध के दृश्य निर्माण समय के दौरान समान मूल्य संरक्षित है। जेएसएफ घटक वृक्ष के निर्माण के दौरान इसका पुन: उपयोग करेगा। बीन को दृश्य के दायरे @PostConstruct
में रखना और / या यह सुनिश्चित करना कि आप बीन में डेटा मॉडल को लोड करते हैं (और इस तरह एक गेटर विधि में नहीं!) इसे ठीक करना चाहिए। यह भी देखें कि नेविगेशन मेनू द्वारा कैसे अजाक्स-रिफ्रेश डायनामिक में सामग्री शामिल है? (जेएसएफ एसपीए) ।
rendered
घटक और उसके माता पिता के सभी और की विशेषता test
किसी भी माता-पिता की विशेषता <c:if>
/ <c:when>
मूल्यांकन नहीं किया जाना चाहिए करने के लिए false
के दौरान लागू प्रपत्र के अनुरोध मान चरण अनुरोध सबमिट करें। जेएसएफ इसे छेड़छाड़ / हैक किए गए अनुरोधों के खिलाफ सुरक्षा के हिस्से के रूप में फिर से जाँच करेगा। चर एक में हालत के लिए जिम्मेदार भंडारण @ViewScoped
सेम या सुनिश्चित करें कि आपने ठीक तरह से हालत preinitializing की दिशा @PostConstruct
में एक की @RequestScoped
फलियों इसे ठीक करना चाहिए। वही disabled
घटक की विशेषता पर लागू होता है , जिसे true
लागू अनुरोध मान चरण के दौरान मूल्यांकन नहीं करना चाहिए । जेएसएफ कमांडबटन की कार्रवाई को भी न देखें , सशर्त रूप से प्रदान किए गए घटक में फॉर्म जमा न करें औरh: कमांडबटन काम नहीं कर रहा है जब मैं इसे एक <h: panelGroup रेंडर> में लपेटता हूं ।
onclick
की विशेषता UICommand
घटक और onsubmit
की विशेषता UIForm
घटक वापस नहीं जाना चाहिए false
या JavaScript त्रुटि का कारण है। ब्राउज़र के JS कंसोल में दिखाई देने वाली JS त्रुटियाँ नहीं होनी चाहिए <h:commandLink>
या होनी चाहिए <f:ajax>
। आमतौर पर सटीक त्रुटि संदेश को देखने से आपको पहले ही उत्तर मिल जाएगा। गैर-टाइप किए गए टाइपर्स में प्राइमफेस के परिणाम के साथ jQuery को मैन्युअल रूप से जोड़ना / लोड करना भी देखें ।
यदि आप JSF 2.x <f:ajax>
या उदा प्रधानमंत्री के माध्यम से अजाक्स का उपयोग कर रहे हैं <p:commandXxx>
, तो सुनिश्चित करें कि आपके पास <h:head>
इसके बजाय मास्टर टेम्पलेट में है <head>
। अन्यथा जेएसएफ आवश्यक जावास्क्रिप्ट फ़ाइलों को ऑटो में शामिल नहीं कर पाएगा जिसमें अजाक्स फ़ंक्शन शामिल हैं। इसका परिणाम जावास्क्रिप्ट त्रुटि में होगा जैसे कि ब्राउज़र के जेएस कंसोल में "मोज़रा परिभाषित नहीं है" या "प्राइमफेस परिभाषित नहीं है"। यह भी देखें : जब कमांड का इस्तेमाल नहीं किया जाता है तो कमांडलिंक एक्शनलिस्टर को f: ajax और ui: रिपीट के साथ प्रयोग किया जाता है ।
यदि आप अजाक्स का उपयोग कर रहे हैं, और जमा किए गए मान समाप्त हो रहे हैं null
, तो सुनिश्चित करें कि UIInput
और UICommand
ब्याज के घटकों को <f:ajax execute>
या उदाहरण के लिए कवर किया गया है <p:commandXxx process>
, अन्यथा उन्हें निष्पादित / संसाधित नहीं किया जाएगा। <F: ajax> से <h: commandButton> और अंडरस्टैंडिंग प्राइमफेस प्रोसेस / अपडेट और JSF f: ajax को निष्पादित / रेंडर करने की विशेषताओं को जोड़ते समय सबमिट किए गए फॉर्म वैल्यू को मॉडल में अपडेट नहीं किया गया देखें ।
यदि जमा किए गए मान अभी भी समाप्त हो रहे हैं null
, और आप सेम का प्रबंधन करने के लिए सीडीआई का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आप सही पैकेज से गुंजाइश एनोटेशन आयात करते हैं, अन्यथा सीडीआई डिफ़ॉल्ट रूप से @Dependent
ईएल के हर एक मूल्यांकन पर प्रभावी रूप से बीन को फिर से बनाएगा। अभिव्यक्ति। यह भी देखें @SessionScoped सेम लूप स्कोप खो देता है और हर समय रीक्रिएट हो जाता है, फ़ील्ड अशक्त हो जाते हैं और JSF 2 एप्लिकेशन में डिफ़ॉल्ट प्रबंधित बीन स्कोप क्या है?
यदि बटन के <h:form>
साथ एक अभिभावक UICommand
पहले से ही प्रस्तुत किया गया है / एक ही पृष्ठ में एक और रूप से आने वाले एक अजाक्स अनुरोध द्वारा अद्यतन किया गया है, तो जेएसएफ 2.2 या पुराने में पहली कार्रवाई हमेशा विफल रहेगी। दूसरी और बाद की क्रियाएं काम करेंगी। यह राज्य के संचालन को ध्यान में रखते हुए एक बग के कारण होता है जिसे JSF कल्पना अंक 790 और वर्तमान में JSF 2.3 में नियत किया जाता है। पुराने JSF संस्करणों के लिए, आप स्पष्ट रूप से की आईडी निर्दिष्ट करने की आवश्यकता <h:form>
में render
की <f:ajax>
। यह भी देखें : कमांडबटन / एच: कमांडलिंक पहले क्लिक पर काम नहीं करता है, केवल दूसरे क्लिक पर काम करता है ।
अगर <h:form>
है enctype="multipart/form-data"
समर्थन फ़ाइल अपलोड करने के क्रम में निर्धारित करते हैं, तो आप यह है कि आप कम से कम JSF 2.2 का उपयोग कर रहे हैं, या कि जो बहुखण्डीय / फार्म डेटा अनुरोधों पार्स करने के लिए जिम्मेदार है सर्वलेट फिल्टर ठीक से विन्यस्त है, अन्यथा सुनिश्चित करने की आवश्यकता FacesServlet
इच्छा अंत में कोई अनुरोध पैरामीटर नहीं मिल रहा है और इस प्रकार अनुरोध मानों को लागू करने में सक्षम नहीं है। इस तरह के फ़िल्टर को कैसे कॉन्फ़िगर किया जाए, यह फ़ाइल अपलोड किए जाने वाले घटक पर निर्भर करता है। टॉमहॉक के लिए <t:inputFileUpload>
, इस उत्तर की जांच करें और प्राइमफेस के लिए <p:fileUpload>
, इस उत्तर को देखें । या, यदि आप वास्तव में एक फ़ाइल अपलोड नहीं कर रहे हैं, तो पूरी तरह से विशेषता को हटा दें।
सुनिश्चित करें कि के ActionEvent
तर्कactionListener
एक है javax.faces.event.ActionEvent
और इस प्रकार नहीं है java.awt.event.ActionEvent
, जो कि सबसे अधिक आईडीई 1 स्वत: पूर्ण विकल्प के रूप में सुझाता है। यदि आप उपयोग करते हैं तो कोई तर्क गलत नहीं है actionListener="#{bean.method}"
। यदि आप अपने तरीके में तर्क नहीं चाहते हैं, तो उपयोग करें actionListener="#{bean.method()}"
। या शायद आप वास्तव में action
इसके बजाय उपयोग करना चाहते हैं actionListener
। एक्शन और एक्शनलिस्ट के बीच अंतर भी देखें ।
सुनिश्चित करें कि अनुरोध-प्रतिक्रिया श्रृंखला में PhaseListener
किसी भी या किसी भी EventListener
व्यक्ति ने जेएसएफ जीवनचक्र को बदलकर चालान कॉल को चरणबद्ध नहीं किया है, उदाहरण के लिए कॉलिंग FacesContext#renderResponse()
या FacesContext#responseComplete()
।
सुनिश्चित करें कि कोई भी Filter
या Servlet
एक ही अनुरोध-प्रतिक्रिया श्रृंखला ने FacesServlet
किसी भी तरह से अनुरोध को अवरुद्ध नहीं किया है । उदाहरण के लिए, स्प्रिंग सुरक्षा जैसे लॉगिन / सुरक्षा फ़िल्टर। विशेष रूप से अजाक्स अनुरोध में डिफ़ॉल्ट रूप से कोई UI प्रतिक्रिया के साथ अंत में होगा। स्प्रिंग सिक्योरिटी 4 और प्राइमफेस 5 एजेएएक्स अनुरोध को भी देखें ।
यदि आप एक प्राइमफेस <p:dialog>
या ए का उपयोग कर रहे हैं <p:overlayPanel>
, तो सुनिश्चित करें कि उनका अपना है<h:form>
। क्योंकि, ये घटक HTML के अंत में स्थानांतरित जावास्क्रिप्ट द्वारा डिफ़ॉल्ट रूप से हैं <body>
। इसलिए, यदि वे मूल रूप से अंदर बैठे थे <form>
, तो वे अब अंदर नहीं बैठेंगे <form>
। पी भी देखें : कमांडबटन कार्रवाई पी के अंदर काम नहीं करती है: संवाद
बग के ढांचे में। उदाहरण के लिए, RichFaces एक "है रूपांतरण त्रुटि " होती है जब विशेषता के rich:calendar
साथ UI तत्व का उपयोग किया जाता है defaultLabel
(या, कुछ मामलों में, एक rich:placeholder
उप-तत्व)। कैलेंडर तिथि के लिए कोई मान सेट नहीं होने पर यह बग बीन विधि को लागू होने से रोकता है। ट्रेसिंग फ्रेम बग को एक सरल कार्य उदाहरण के साथ शुरू करके और बग का पता चलने तक पृष्ठ का निर्माण करके पूरा किया जा सकता है।
यदि आप अभी भी अटके हैं, तो यह डीबग करने का समय है। क्लाइंट साइड में, वेब डेवलपर टूलसेट खोलने के लिए वेबब्रोज़र में F12 दबाएं। कंसोल टैब पर क्लिक करें ताकि जावास्क्रिप्ट कोनोसल दिखाई दे। यह किसी भी जावास्क्रिप्ट त्रुटियों से मुक्त होना चाहिए। नीचे स्क्रीनशॉट क्रोम से एक उदाहरण है जो <f:ajax>
नहीं होने पर सक्षम बटन सबमिट करने के मामले को दर्शाता है<h:head>
घोषित (जैसा कि ऊपर बिंदु 7 में वर्णित है)।
सर्वर साइड में, सुनिश्चित करें कि सर्वर डीबग मोड में शुरू किया गया है। ब्याज की जेएसएफ घटक की एक विधि में एक डिबग ब्रेकपॉइंट डालें जिसे आप फॉर्म जमा करने की प्रक्रिया के दौरान बुलाए जाने की उम्मीद करते हैं। जैसे UICommand
घटक के मामले में , यह होगा UICommand#queueEvent()
और UIInput
घटक के मामले में , यह होगा UIInput#validate()
। कोड निष्पादन के माध्यम से बस कदम रखें और निरीक्षण करें कि प्रवाह और चर उम्मीदों के अनुसार हैं या नहीं। नीचे स्क्रीनशॉट ग्रहण के डिबगर से एक उदाहरण है।