दिलचस्प पोस्ट
विधानसभा सीमाओं में गतिशील गुमनाम प्रकार की वापसी / उपभोग सिद्धांत में डिफ़ॉल्ट मान मैं एन्क्रिप्शन कुंजी को जावा में कैसे सुरक्षित रूप से संग्रहीत कर सकता हूं? एक टेम्पलेट क्लास का कार्यान्वयन और घोषणा उसी हेडर फ़ाइल में क्यों होना चाहिए? जब वर्तमान चयनित आइटम को फिर से चुना जाता है तो मैं एंड्रॉइड स्पिनर में एक ईवेंट कैसे प्राप्त करूं? Android में संपर्कों का फ़ोन नंबर कैसे प्राप्त करें Django में डिबग कैसे करें, अच्छा तरीका है? Java में JSON ऑब्जेक्ट को पार्स करना जावा में instanceof का उपयोग करने का प्रदर्शन प्रभाव json ऑब्जेक्ट जावास्क्रिप्ट के माध्यम से चलना किसी भी एक enum सामान्य बाधा की कमी के लिए एक अच्छा कामकाज पता है? अस्थायी बिंदु समानता के लिए टेस्ट करें (FE_FLOATING_POINT_EQUALITY) बीएफएस द्वारा प्राप्त वास्तविक पथ को मैं कैसे प्राप्त करूं? Rails और Rake समस्याओं पर रूबी: uninitialized निरंतर रेक :: डीएसएल आप दो आयामी सरणी कैसे घुमाएं?

रीडायरेक्ट और नेविगेशन / अग्रेषित और क्या इस्तेमाल करने के दौरान क्या अंतर है?

JSF में एक नेविगेशन के बीच अंतर क्या है

FacesContext context = FacesContext.getCurrentInstance(); context.getApplication().getNavigationHandler().handleNavigation(context, null, url); 

और एक रीडायरेक्ट

 HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); response.sendRedirect(url); 

और कैसे तय करना है कि इसका उपयोग कब करना है?

नेविगेशन के साथ यह मुद्दा यह है कि जब तक faces-redirect=true नहीं होता है / जब तक कि नेविगेशन URL की क्वेरी स्ट्रिंग में जोड़ा जाता है, तब तक वह पृष्ठ URL नहीं बदलता है हालांकि, मेरे मामले में faces-redirect=true संलग्न faces-redirect=true त्रुटि को फेंकता है अगर मैं एक गैर-जेएसएफ पेज को एक सादा HTML पृष्ठ की तरह रीडायरेक्ट करना चाहता हूं।

और दूसरा विकल्प है जैसा कि बाल्सस ने JSF 2.0 रीडायरेक्ट त्रुटि पर सुझाव दिया है

Solutions Collecting From Web of "रीडायरेक्ट और नेविगेशन / अग्रेषित और क्या इस्तेमाल करने के दौरान क्या अंतर है?"

सबसे पहले, "पुनर्निर्देशन" शब्द वेब डेवलपमेंट की दुनिया में है, क्लाइंट को एक खाली एचटीएमपी प्रतिक्रिया भेजने के लिए सिर्फ एक Location हैडर के साथ उसमें उस नए यूआरएल पर जिस पर क्लाइंट को एक नया जीईटी अनुरोध भेजना होगा। तो मूल रूप से:

  • क्लाइंट कुछ somepage.xhtmlsomepage.xhtml को एक HTTP अनुरोध भेजता है
  • सर्वर Location: newpage.xhtml साथ एक HTTP प्रतिक्रिया वापस भेजता है Location: newpage.xhtml हेडर
  • ग्राहक newpage.xhtml लिए एक HTTP अनुरोध भेजता है (यह ब्राउज़र पता बार में दिखाई देता है!)
  • सर्वर newpage.xhtml की सामग्री के साथ एक HTTP प्रतिक्रिया वापस भेजता है

आप इसे वेबब्रोवर के बिल्टिन / एडन डेवलपर टूलसेट के साथ ट्रैक कर सकते हैं क्रोम / आईई 9 / फायरबग में एफ 12 दबाएं और इसे देखने के लिए "नेटवर्क" अनुभाग देखें।

जेएसएफ नेविगेशनहोल्डर एक रीडायरेक्ट नहीं भेजता है। इसके बजाय, यह लक्ष्य पृष्ठ की सामग्री का उपयोग HTTP प्रतिसाद के रूप में करता है।

  • क्लाइंट कुछ somepage.xhtmlsomepage.xhtml को एक HTTP अनुरोध भेजता है
  • सर्वर newpage.xhtml की सामग्री के साथ एक HTTP प्रतिक्रिया वापस भेजता है

हालांकि मूल HTTP अनुरोध somepage.xhtml लिए था, ब्राउज़र पता बार में यूआरएल अपरिवर्तित रहता है। यदि आप मूल सर्विसलेट एपीआई से परिचित हैं, तो आपको समझना चाहिए कि इसका RequestDispatcher#forward() उसी तरह है जैसा कि RequestDispatcher#forward()


के रूप में sendRedirect() को जेएसएफ डाकू के नीचे से खींचकर sendRedirect() और sendRedirect() उचित है; नहीं, यह उचित उपयोग नहीं है आपका सर्वर लॉग IllegalStateException अव्यवस्थित हो जाएगा क्योंकि इस तरह से आप जेएसएफ को नहीं बता रहे हैं कि आपने पहले ही प्रतिक्रिया से निपटने के नियंत्रण पर कब्जा कर लिया है और इस प्रकार जेएसएफ को अपनी डिफ़ॉल्ट प्रतिक्रिया से निपटने की नौकरी नहीं करना चाहिए। आपको वास्तव में FacesContext#responseComplete() निष्पादित करना चाहिए FacesContext#responseComplete() बाद में

इसके अलावा, जब भी आपको javax.servlet.* से कुछ आयात करने की आवश्यकता javax.servlet.* एक जेएसएफ आर्टिफैक्ट में प्रबंधित बीन की तरह पैकेज, आपको पूरी तरह से कोड लिखना बंद करना चाहिए और दो बार सोचना चाहिए अगर आप वास्तव में सही तरीके से काम कर रहे हैं और खुद से पूछें कि क्या वहां मौजूद है जो भी आप प्राप्त करने की कोशिश कर रहे हैं, उसके लिए "मानक जेएसएफ का रास्ता" पहले से ही नहीं है और / या यदि ये काम वास्तव में जेएसएफ प्रबंधित सेम में है (ऐसे में कुछ मामलों में एक साधारण सर्वलेट फ़िल्टर बेहतर स्थान होता है)।

JSF में रीडायरेक्ट करने का उचित तरीका faces-redirect=true क्वेरी स्ट्रिंग का उपयोग क्रिया परिणाम में है:

 public String submit() { // ... return "/newpage.xhtml?faces-redirect=true"; } 

या ExternalContext#redirect() का उपयोग ExternalContext#redirect() जब आप एक एजेक्स या प्रीरेण्डर श्रोता विधि जैसे किसी एक्शन विधि के अंदर नहीं होते हैं:

 public void listener() throws IOException { // ... ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); ec.redirect(ec.getRequestContextPath() + "/newpage.xhtml"); } 

(हाँ, आपको IOException पर इसके चारों ओर एक try-catch ज़रूरत नहीं है, बस अपवाद throws , सर्विसलेट कंटेनर इसे संभाल देगा)

या विशिष्ट स्थितियों में NavigationHandler#handleNavigation() का उपयोग करते हुए अगर आप एक्सएमएल नेविगेशन मामलों और / या कुछ अंतर्निहित श्रोता के साथ एक कस्टम नेविगेशन हैंडलर का उपयोग कर रहे हैं:

 public void listener() { // ... FacesContext fc = FacesContext.getCurrentInstance(); NavigationHandler nh = fc.getApplication().getNavigationHandler(); nh.handleNavigation(fc, null, "/newpage.xhtml?faces-redirect=true"); } 

के रूप में क्यों नेविगेशन हैंडलर "सादे एचटीएमएल" फाइलों के लिए विफल रहता है, यह सिर्फ इसलिए है क्योंकि नेविगेशन हैंडलर केवल JSF दृश्यों को संसाधित कर सकता है, न कि अन्य फाइलें आपको ExternalContext#redirect() का उपयोग करना चाहिए ExternalContext#redirect() तब।

यह भी देखें:

  • कैसे JSF में नेविगेट करने के लिए? यूआरएल कैसे करें वर्तमान पेज को प्रतिबिंबित करें (और पिछला नहीं)
  • जब मैं एच का प्रयोग करना चाहिए: h: commandLink के बजाय outputLink?