दिलचस्प पोस्ट
रंगों के साथ टर्मिनल में प्रिंट करें? ईएस 6 को अर्रे में बदलना क्या आईओ-बाउंड ऑपरेशन के लिए मल्टीथ्रेडिंग का मतलब है? क्यों WPF MVVM पैटर्न में codebehind से बचने के लिए? अकाका के लिए अच्छा उपयोग केस जावास्क्रिप्ट में "|" (एकल पाइप) क्या करता है? PHP और fgetcsv फ़ंक्शन का उपयोग करते हुए सीएसवी फ़ाइल से एक सरणी कैसे बनाएं JavaScript विरासत और निर्माता संपत्ति एंड्रॉइड पर्यावरण का उपयोग कैसे करें .getExternalStorageDirectory () मैं मास्टर / मूल के साथ अलग सिर कैसे सम्मिलित कर सकता हूं? DOM parentNode और parentElement के बीच का अंतर जावा में किसी ऑब्जेक्ट की स्मृति स्थान कैसे प्राप्त कर सकता हूं? एंकर टैग के अंदर एंकर टैग बनाना एएसपी.नेट एमवीसी के अंतर्गत एसएसएल पेज एडीटी को 'org.eclipse.wst.sse.core 0.0.0' की आवश्यकता है लेकिन इसे नहीं मिला

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" लौटाते हैं, लेकिन अभी भी कुछ नहीं। कोई विचार?

Solutions Collecting From Web of "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>