जवाबों:
requestDispatcher - आगे () विधि
जब हम
forward
विधि का उपयोग करते हैं , तो अनुरोध को आगे की प्रक्रिया के लिए उसी सर्वर के भीतर किसी अन्य संसाधन में स्थानांतरित किया जाता है।के मामले में
forward
, वेब कंटेनर आंतरिक रूप से सभी प्रसंस्करण को संभालता है और क्लाइंट या ब्राउज़र शामिल नहीं है।जब ऑब्जेक्ट
forward
पर कॉल किया जाता हैrequestDispatcher
, तो हम अनुरोध और प्रतिक्रिया ऑब्जेक्ट पास करते हैं, इसलिए हमारा पुराना अनुरोध ऑब्जेक्ट नए संसाधन पर मौजूद है जो आपके अनुरोध को संसाधित करने जा रहा है।नेत्रहीन, हम अग्रेषित पते को देखने में सक्षम नहीं हैं, यह पारदर्शी है।
forward()
विधि का उपयोग करने से तेज हैsendRedirect
।जब हम आगे का उपयोग करके रीडायरेक्ट करते हैं, और हम एक नए संसाधन में उसी डेटा का उपयोग करना चाहते हैं, तो हम उपयोग कर सकते हैं
request.setAttribute()
क्योंकि हमारे पास अनुरोध वस्तु उपलब्ध है।SendRedirect
के मामले में
sendRedirect
, अनुरोध को किसी अन्य संसाधन, एक अलग डोमेन, या आगे के प्रसंस्करण के लिए एक अलग सर्वर पर स्थानांतरित किया जाता है।जब आप उपयोग करते हैं
sendRedirect
, तो कंटेनर क्लाइंट या ब्राउज़र को अनुरोध स्थानांतरित करता है, इसलिएsendRedirect
विधि के अंदर दिया गया URL क्लाइंट के नए अनुरोध के रूप में दिखाई देता है।
sendRedirect
कॉल के मामले में , पुराने अनुरोध और प्रतिक्रिया ऑब्जेक्ट खो जाते हैं क्योंकि इसे ब्राउज़र द्वारा नए अनुरोध के रूप में माना जाता है।एड्रेस बार में, हम नए रीडायरेक्ट किए गए पते को देख पा रहे हैं। यह पारदर्शी नहीं है।
sendRedirect
धीमी है क्योंकि एक अतिरिक्त दौर की यात्रा की आवश्यकता है, क्योंकि एक पूरी तरह से नया अनुरोध बनाया गया है और पुरानी अनुरोध वस्तु खो गई है। दो ब्राउज़र अनुरोध आवश्यक हैं।लेकिन
sendRedirect
, यदि हम नए संसाधन के लिए उसी डेटा का उपयोग करना चाहते हैं, तो हमें डेटा को सत्र में संग्रहीत करना होगा या URL के साथ पास करना होगा।कौन सा अच्छा है?
यह इस बात पर निर्भर करता है कि कौन सी विधि अधिक उपयोगी है।
यदि आप चाहते हैं कि नियंत्रण नए सर्वर या संदर्भ में स्थानांतरित हो, और इसे पूरी तरह से नए कार्य के रूप में माना जाता है, तो हम इसके लिए जाते हैं
sendRedirect
। आमतौर पर, एक फॉरवर्ड का उपयोग किया जाना चाहिए, यदि ऑपरेशन को वेब पेज के ब्राउज़र रीलोड पर सुरक्षित रूप से दोहराया जा सकता है और परिणाम को प्रभावित नहीं करेगा।
वेब डेवलपमेंट की दुनिया में, "रीडायरेक्ट" शब्द क्लाइंट को खाली HTTP रिस्पांस भेजने की क्रिया है, जिसमें केवल एक Location
नया URL होता है, जिसमें क्लाइंट को एक नया GET अनुरोध भेजना होता है। तो मूल रूप से:
some.jsp
।Location: other.jsp
हेडर के साथ सर्वर HTTP प्रतिक्रिया भेजता हैother.jsp
(यह ब्राउज़र एड्रेस बार में परिलक्षित होता है!)other.jsp
।आप इसे वेब ब्राउजर के बिल्टइन / ऐडऑन डेवलपर टूलसेट से ट्रैक कर सकते हैं। Chrome / IE9 / Firebug में F12 दबाएं और इसे देखने के लिए "नेटवर्क" अनुभाग देखें।
वास्तव में ऊपर से हासिल किया है sendRedirect("other.jsp")
। RequestDispatcher#forward()
एक रीडायरेक्ट नहीं भेजता है। इसके बजाय, यह HTTP प्रतिक्रिया के रूप में लक्ष्य पृष्ठ की सामग्री का उपयोग करता है।
some.jsp
।other.jsp
।हालाँकि, जैसा कि मूल HTTP अनुरोध था some.jsp
, ब्राउज़र एड्रेस बार में URL अपरिवर्तित रहता है। इसके अलावा, नियंत्रक के पीछे कोई भी अनुरोध विशेषताएँ some.jsp
उपलब्ध होंगी other.jsp
। यह पुनर्निर्देशित के दौरान नहीं होता है क्योंकि आप मूल रूप से क्लाइंट को एक नया HTTP अनुरोध बनाने के लिए मजबूर कर रहे हैं, जिससे other.jsp
इसके some.jsp
सभी एट्रीब्यूट्स सहित मूल अनुरोध को फेंक दिया जाता है।
RequestDispatcher
MVC प्रतिमान में अत्यंत उपयोगी है और / या आप JSP के छिपाने के लिए सीधी पहुँच से चाहते हैं। आप JSP के /WEB-INF
फ़ोल्डर में रख सकते हैं Servlet
और अनुरोधों को नियंत्रित, प्रीप्रोसेस और पोस्टप्रोसेस का उपयोग कर सकते हैं। /WEB-INF
फ़ोल्डर में JSPs सीधे URL द्वारा पहुँच योग्य नहीं हैं, लेकिन Servlet
उपयोग करके उन्हें एक्सेस कर सकते हैं RequestDispatcher#forward()
।
उदाहरण के लिए, आपके पास एक JSP फ़ाइल हो सकती है /WEB-INF/login.jsp
और LoginServlet
जिसमें से एक पर मैप किया जाता url-pattern
है /login
। जब आप आह्वान करेंगे http://example.com/context/login
, तब सर्वलेट का आह्वान doGet()
किया जाएगा। आप किसी भी पूर्व प्रसंस्करण सामान को वहां कर सकते हैं और अंत में अनुरोध को आगे बढ़ा सकते हैं:
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
जब आप एक फॉर्म जमा करते हैं, तो आप सामान्य रूप से उपयोग करना चाहते हैं POST
:
<form action="login" method="post">
इस तरह सर्वलेट का doPost()
आह्वान किया जाएगा और आप किसी भी पोस्ट प्रोसेसिंग सामान को वहां कर सकते हैं (जैसे सत्यापन, व्यावसायिक तर्क, उपयोगकर्ता को लॉगिन करें आदि)।
यदि कोई त्रुटि हो, तो आप सामान्य रूप से करना चाहते हैं आगे एक ही पृष्ठ पर अनुरोध वापस और वहाँ इनपुट फ़ील्ड के बगल में और इतने पर त्रुटियों प्रदर्शित करते हैं। आप इसके लिए उपयोग कर सकते हैं RequestDispatcher
।
यदि कोई POST
सफल है, तो आप सामान्य रूप से अनुरोध को पुनर्निर्देशित करना चाहते हैं, ताकि जब उपयोगकर्ता अनुरोध को फिर से ताज़ा करे (जैसे कि F5 दबाने या इतिहास में वापस नेविगेट करने पर) अनुरोध फिर से जमा नहीं किया जाएगा।
User user = userDAO.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user); // Login user.
response.sendRedirect("home"); // Redirects to http://example.com/context/home after succesful login.
} else {
request.setAttribute("error", "Unknown login, please try again."); // Set error.
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to same page so that you can display error.
}
इस प्रकार एक रीडायरेक्ट क्लाइंट को GET
दिए गए URL पर एक नए अनुरोध को आग लगाने का निर्देश देता है । अनुरोध को ताज़ा करने पर केवल पुनर्निर्देशित अनुरोध ताज़ा होगा और प्रारंभिक अनुरोध नहीं। यह "डबल सबमिट्स" और भ्रम और बुरे उपयोगकर्ता अनुभवों से बचना होगा। इसे POST-Redirect-GET
पैटर्न भी कहा जाता है ।
RequestDispatcher
इंटरफेस आप एक सर्वर साइड आगे करने की अनुमति देता / जबकि शामिल sendRedirect()
एक ग्राहक के पक्ष रीडायरेक्ट करता है। एक क्लाइंट साइड रीडायरेक्ट में, सर्वर एक HTTP स्टेटस कोड 302
(अस्थायी रीडायरेक्ट) को वापस भेज देगा जो वेब ब्राउज़र को GET
रीडायरेक्ट किए गए स्थान पर सामग्री के लिए एक नया HTTP अनुरोध जारी करने का कारण बनता है । इसके विपरीत, RequestDispatcher
इंटरफ़ेस का उपयोग करते समय , नए संसाधन में शामिल / आगे सर्वर साइड पर पूरी तरह से संभाला जाता है।
forward
, न कि पुनर्निर्देशित।
फॉरवर्ड () और सेंडरिडायरेक्ट () विधि के बीच मुख्य महत्वपूर्ण अंतर यह है कि फॉरवर्ड के मामले में (), रीडायरेक्ट सर्वर एंड पर होता है और क्लाइंट को दिखाई नहीं देता है, लेकिन सेंडरिडायरेक्ट () के मामले में, रीडायरेक्ट क्लाइंट एंड पर होता है और यह दिखाई देता है। ग्राहक के लिए।
इन तरीकों में से कोई भी "बेहतर" हो सकता है, यानी अधिक उपयुक्त, जो आप करना चाहते हैं उसके आधार पर।
एक सर्वर-साइड रीडायरेक्ट तेजी से इनोफ़र है क्योंकि आपको ब्राउज़र की एक गोल यात्रा किए बिना एक अलग पृष्ठ से डेटा मिलता है। लेकिन ब्राउज़र में देखा गया URL अभी भी मूल पता है, इसलिए आप वहां थोड़ी असंगतता पैदा कर रहे हैं।
क्लाइंट-साइड रीडायरेक्ट अधिक बहुमुखी इन्सोफ़र है क्योंकि यह आपको पूरी तरह से अलग सर्वर पर भेज सकता है, या प्रोटोकॉल को बदल सकता है (जैसे HTTP से HTTPS), या दोनों। और ब्राउज़र नए URL से अवगत है। लेकिन यह सर्वर और क्लाइंट के बीच एक अतिरिक्त बैक-एंड-आगे ले जाता है।
SendRedirect()
सर्वरों के बीच सामग्री को खोजेगा। यह धीमा है क्योंकि इसमें सामग्री का URL भेजकर ब्राउज़र को अंतरंग करना है। तब ब्राउज़र उसी सर्वर के भीतर या किसी अन्य में सामग्री के लिए एक नया अनुरोध बनाएगा।
RquestDispatcher
मुझे लगता है कि सर्वर के भीतर सामग्री की खोज के लिए है। इसकी सर्वर साइड प्रक्रिया है और यह SendRedirect()
विधि की तुलना में तेज है । लेकिन बात यह है कि यह उस ब्राउज़र को अंतरंग नहीं करेगा जिस सर्वर में यह आवश्यक दिनांक या सामग्री खोज रहा है, न ही यह ब्राउज़र को URL टैब में URL बदलने के लिए नहीं कहेगा। इसलिए इससे उपयोगकर्ता को थोड़ी असुविधा होती है।
यदि हमें अलग-अलग डोमेन पर नियंत्रण स्थानांतरित करने या कार्य को अलग करने की आवश्यकता है, तो तकनीकी रूप से पुनर्निर्देशित किया जाना चाहिए।
उदाहरण के लिए भुगतान एप्लिकेशन में हम पहले भुगतानप्रोसेस करते हैं और फिर प्रदर्शनप्रदर्शन में अनुप्रेषित करते हैं। यदि क्लाइंट केवल ब्राउज़र को रीफ्रेश करता है, तो डिस्प्लेपाइंटइन्फो फिर से किया जाएगा और पेमेंटप्रोसेस को दोहराया नहीं जाएगा। लेकिन अगर हम इस परिदृश्य में आगे का उपयोग करते हैं, तो PaymentProcess और DisplayPaymentInfo दोनों को क्रमिक रूप से फिर से निष्पादित किया जाएगा, जिसके परिणामस्वरूप असंगत डेटा हो सकता है।
अन्य परिदृश्यों के लिए, आगे का उपयोग करने के लिए कुशल है क्योंकि यह sendRedirect की तुलना में तेज़ है
अनुरोध डिस्पैचर एक इंटरफ़ेस है जिसका उपयोग वेब संसाधन से दूसरे वेब संसाधन के लिए अनुरोध या प्रतिक्रिया को भेजने के लिए किया जाता है। इसमें मुख्य रूप से दो विधियाँ समाहित हैं।
request.forward(req,res)
: इस विधि का उपयोग एक वेब संसाधन से दूसरे संसाधन तक अनुरोध को अग्रेषित करने के लिए किया जाता है। यानी एक सर्वलेट से दूसरे सर्वलेट या फिर एक वेब एप्लिकेशन से दूसरी वेब अप्लीकेशन।
response.include(req,res)
: इस विधि का उपयोग एक सर्वलेट से दूसरे सर्वलेट की प्रतिक्रिया शामिल है
नोट: अनुरोध डिस्पैचर का उपयोग करके हम उसी सर्वर में अनुरोध या प्रतिक्रियाओं को अग्रेषित या शामिल कर सकते हैं।
request.sendRedirect()
: इसका उपयोग करके हम विभिन्न सर्वरों के अनुरोध या प्रतिक्रियाओं को अग्रेषित या शामिल कर सकते हैं। इसमें ग्राहक को पृष्ठ को पुनर्निर्देशित करते समय एक सूचना मिल जाती है लेकिन उपरोक्त प्रक्रिया में ग्राहक को सूचना नहीं मिलेगी
बस के बीच अंतर है Forward(ServletRequest request, ServletResponse response)
और sendRedirect(String url)
है
आगे():
forward()
विधि सर्वर साइड में मार डाला गया है।forward ()
विधि सर्वलेट कंटेनर द्वारा प्रदान की जाती है।forward()
विधि तेजी से है sendRedirect()
विधि।RequestDispatcher
इंटरफ़ेस में घोषित किया गया है।sendRedirect ():
response.sendRedirect("..")
वेबसाइट के index.jsp पेज पर आता हूं । लेकिन यह jsp पृष्ठ से सीएसएस फ़ाइलों और कुछ पाठ को याद करता है, जिससे पृष्ठ का आंशिक लोड होता है। लेकिन जब मैं वेबसाइट के स्वागत पृष्ठ को index.jsp बनाता हूं, तो सब कुछ ठीक काम करता है और पेज लोड पूरा हो जाता है। रीडायरेक्ट में क्या गलत है?