दिलचस्प पोस्ट
एक गतिविधि संदर्भ के बाहर से शुरू कर रहा है नई गतिविधि शुरू करते समय गतिविधि स्लाइड-इन एनीमेशन अक्षम करें? जब बंदर एक विधि को पैचिंग करते हैं, तो क्या आप नए कार्यान्वयन से ओवरराइड विधि को कॉल कर सकते हैं? पता करें कि सूची दृश्य नीचे स्क्रॉल किया गया है? कैसे पृष्ठ लोड के बाद jQuery के माध्यम से गतिशील रूप से एक <स्क्रिप्ट> टैग डालें? $ .jax का उपयोग करते हुए JSON डेटा पोस्ट करते समय मैं एक एंटीफ़ोर्गरी टोकन कैसे प्रदान कर सकता हूं? क्या आप एक्सटेंशन से क्रोम: // पृष्ठों तक पहुंच सकते हैं? कुछ भी करने के लिए HTML फ़ॉर्म सबमिट नहीं करना चाहते django 1.5 – स्थिर टैग के अंदर चर का उपयोग कैसे करें मैं कंसोल कैसे साफ़ कर सकता हूं Dplyr के साथ कई स्तंभों का सारांश? क्लासपाथ से फाइल इंस्टेंस के रूप में लोड करने / संदर्भ कैसे करें LINQ का प्रयोग करके सूचकांक कैसे प्राप्त करें? जबकि ((सी = getc (फ़ाइल))! = EOF) लूप निष्पादित करना बंद नहीं करेगा वर्ग PLBuildVersion दोनों चौखटे में कार्यान्वित किया गया है

JSF फॉर्म पर GET अनुरोध क्वेरी स्ट्रिंग मापदंडों को बनाए रखना

मेरे पास 3 पृष्ठ हैं:

  • main.xhtml
  • agreement.xhtml
  • generated.xhtml

serviceId सही ढंग से लोड करने के लिए दो मापदंडों की जरूरत है: serviceId और site । इसलिए, एक सामान्य यूआरएल इस तरह दिखता है: /app/agreement.xhtml?site=US&serviceId=AABBCC

मेरे पास यह बटन है agreement.xhtml

 <h:form> <h:commandButton value="Generate License File" action="#{agreement.generateMethod}" /> </h:form> 

@RequestScoped बीन #{agreement} में यह विधि है:

 public String generateMethod(){ ....... return "generated"; } 

मुझे इसकी आवश्यकता है, क्लिक पर, generateMethod() विधि निष्पादित की जाती है, और इसे पूरा करने के बाद, उपयोगकर्ता को generated.xhtmlgenerated.xhtml पेज पर पुनः निर्देशित किया जाता generated.xhtml । क्या हो रहा है, यह है कि, क्लिक पर, पृष्ठ ब्राउज़र उपयोगकर्ता को /app/agreement.xhtml भेजता है, क्योंकि यह पैरामीटर site और serviceId /app/agreement.xhtml नहीं भेज रहा है, यह क्रैश करता है।

मैंने generateMethod() करने की कोशिश की है generateMethod() एक "generated?faces-redirect=true" लौटाते हैं, लेकिन अभी भी कुछ नहीं। कोई विचार?

वेब के समाधान से एकत्रित समाधान "JSF फॉर्म पर GET अनुरोध क्वेरी स्ट्रिंग मापदंडों को बनाए रखना"

आपकी ठोस समस्या का कारण बनता है क्योंकि एक JSF <h:form> किसी भी क्वेरी स्ट्रिंग के बिना वर्तमान अनुरोध URL को डिफ़ॉल्ट रूप से सबमिट करता है। जेनरेट किए गए HTML आउटपुट के करीब देखो, आप देखेंगे

 <form action="/app/agreement.xhtml" ...> 

इस प्रकार आपको स्पष्ट रूप से उन अनुरोध पैरामीटरों को स्वयं शामिल करना आवश्यक है इस को हल करने के कई तरीके हैं। यदि आप कोई रीडायरेक्ट नहीं भेज रहे थे, तो आप उन्हें जेएसएफ फ़ॉर्म में छिपी जानकारी के रूप में जोड़ सकते हैं।

 <h:form> <input type="hidden" name="site" value="#{param.site}" /> <input type="hidden" name="site" value="#{param.serviceId}" /> ... </h:form> 

केवल, उन मापदंडों को ब्राउज़र के एड्रेस बार में यूआरएल में पुनः प्रदर्शित नहीं किया जाएगा। यह एक समस्या नहीं है अगर आप केवल उसी पेज पर एजेक्स का प्रयोग कर रहे हैं। <h:inputHidden> उपयुक्त नहीं है, क्योंकि फॉर्म पर कोई रूपांतरण या सत्यापन त्रुटि होने पर यह अपने मूल्यों को भ्रमित करेगा।

उन्हें यूआरएल में फिर से देखने के लिए, आपको <f:viewParam> और includeViewParams शामिल करना होगा काम करने के लिए includeViewParams को शामिल करने के लिए, आपको निम्नलिखित स्रोत पृष्ठ agreement.xhtml दोनों में घोषित करना होगा …

 <f:metadata> <f:viewParam name="site" value="#{agreement.site}" /> <f:viewParam name="serviceId" value="#{agreement.serviceId}" /> </f:metadata> 

और लक्ष्य पृष्ठ generated.xhtml :

 <f:metadata> <f:viewParam name="site" value="#{generated.site}" /> <f:viewParam name="serviceId" value="#{generated.serviceId}" /> </f:metadata> 

अब आप देखें पैरामीटरों को निम्नानुसार रीडायरेक्ट भेज सकते हैं:

 public String generateMethod() { // ... return "generated?faces-redirect=true&includeViewParams=true"; } 

ध्यान दें कि बीन को देखने के लिए @ViewScoped होना चाहिए ताकि उन पैरामीटर को पृष्ठ के साथ पृष्ठ खोलने और फ़ॉर्म सबमिट करने के साथ, सत्यापन त्रुटियों पर भी जीवित रहने के लिए जीवित रहें। अन्यथा, जब एक @RequestScoped बीन पर @RequestScoped , तो आपको उन घटकों में <f:param> रूप में बनाए रखना चाहिए:

 <h:commandButton ...> <f:param name="site" value="#{generated.site}" /> <f:param name="serviceId" value="#{generated.serviceId}" /> </h:commandButton> 

इन्हें निर्धारित करने के लिए कोई रास्ता नहीं है। इनपुट घटक के अंदर, आपकी बीन तो वास्तव में @ViewScoped होना चाहिए।


वैकल्पिक रूप से, अगर आप पहले से ही जेएसएफ यूटिलिटी लाइब्रेरी OmniFaces का उपयोग करते हैं, तो आप <h:form> को <o:form> रूप में निम्नानुसार बदल सकते हैं ( उदाहरण भी दिखाएं ):

 <o:form includeRequestParams="true"> 

वह मूल रूप से सभी है यह एक <form action> उत्पन्न होगा जिसमें वर्तमान क्वेरी स्ट्रिंग शामिल है।

 <form action="/app/agreement.xhtml?site=US&serviceId=AABBCC" ...> 

उन अनुरोध पैरामीटर तो बस फार्म के अनुरोध पैरामीटर मानचित्र में उपलब्ध हैं। आपको अतिरिक्त मेटाडेटा / व्यूपरम की ज़रूरत नहीं है और आपको एक रीडायरेक्ट भेजने की भी ज़रूरत नहीं है और यदि आपकी आवश्यकता होती है, तो अपने बीन को @ रेवेस्ट सेंड किया जा सकता है।

 public String generateMethod() { // ... return "generated"; } 

या, अगर आप "सुंदर URL" लाइब्रेरी जैसे PrettyFaces या FacesViews का उपयोग कर रहे हैं या शायद कुछ ही घर के लिए और ब्राउज़र के एड्रेस बार में दिखाई देने वाले बिल्कुल उसी यूआरएल को सबमिट करना चाहते हैं, तो आप इसके बजाय useRequestURI उपयोग कर सकते हैं

 <o:form useRequestURI="true"> 

यह भी देखें:

  • <F: मेटाडाटा>, <f: viewParam> और <f: viewAction> के लिए क्या इस्तेमाल किया जा सकता है?
  • कैसे JSF में नेविगेट करने के लिए? यूआरएल कैसे करें वर्तमान पेज को प्रतिबिंबित करें (और पिछला नहीं)

आपके generateMethod को वापस करना होगा

 return "generated?site=US&amp;serviceId=AABBCC&amp;faces-redirect=true"; 

आप यहां तक ​​कि &amp; साथ में लेकिन इसे अपने एक्सएचटीएमएल में बचें

आपके generated.xhtml किया गया। <f:viewParam> आप उन पैरामीटर को पकड़ सकते हैं जिन्हें <f:viewParam> इस तरह से पास किया जा रहा है

 <f:metadata> <f:viewParam name="site" value="#{yourBean.site}"/><!--Make sure you have a setter--> <f:viewParam name="serviceId" value="#{yourBean.serviceId}"/><!--Make sure you have a setter- </f:metadata> <h:head>