वसंत में डिस्पैचर सर्वलेट क्या है?


195

इस छवि में (जो मुझे यहां से मिला ), HTTP अनुरोध डिस्पैचर सर्वलेट के लिए कुछ भेजता है

यहां छवि विवरण दर्ज करें

मेरा प्रश्न यह है कि डिस्पैचर सर्वलेट क्या करता है?

क्या यह कुछ ऐसा है जैसे वेब पेज से सूचनाओं को प्राप्त करना और उसे नियंत्रक को फेंकना?

जवाबों:


202

DispatcherServlet का काम एक आने वाले URI को लेना है और हैंडलर (आमतौर पर कंट्रोलर क्लासेस और आमतौर पर JSP) के सही कॉम्बिनेशन को ढूंढना है जो उस स्थान पर मिलने वाले पेज या संसाधन को बनाने के लिए संयोजित होते हैं।

मैंने शायद

  • एक पंक्ति /WEB-INF/jsp/pages/Home.jsp
  • और एक वर्ग पर एक विधि

    @RequestMapping(value="/pages/Home.html")
    private ModelMap buildHome() {
        return somestuff;
    }

डिस्पैचर सर्वलेट बिट कि "जानता" है जब एक ब्राउज़र पृष्ठ अनुरोध करता है कि विधि कॉल करने के लिए, और एक HTML दस्तावेज बनाने के लिए मिलान JSP फ़ाइल के साथ अपने परिणामों को जोड़ सकते हैं।

यह कैसे पूरा होता है यह विन्यास और स्प्रिंग संस्करण के साथ व्यापक रूप से भिन्न होता है।

वहाँ भी कोई कारण नहीं है अंतिम परिणाम वेब पेज होना चाहिए। यह RMI के अंतिम बिंदुओं का पता लगाने , SOAP अनुरोधों को संभालने , कुछ भी जो सर्वलेट में आ सकता है, वही कर सकता है।


4
ग्रेट रिपॉस्टे, अब एक सवाल कि डिस्पैसरसर्वलेट कैसे आता है, वर्ग के नाम और विधि के नाम की भी पहचान करता है। क्या आप मुझे एक कॉन्फ़िगरेशन का उदाहरण दिखा सकते हैं, जहां मेरे पास दो कक्षाएं और दो विधि नाम हैं और डिस्पैचरसर्वलेट सही अनुरोध को कैसे पकड़ता है।
केविन

10
यह वास्तव में उस एनोटेशन के लिए स्टार्ट अप पर क्लास पथ को स्कैन करता है और क्लास + मेथड को "/pages/Home.html" की मैपिंग बनाता है। यदि आपके पास दो विधियाँ हैं, जिनमें दोनों के "/ pages/Home.html" उनके एनोटेशन में कोई अन्य प्रतिबंध नहीं है, तो यह एक त्रुटि होगी और यह आप पर अपवादों को उछाल देगा। यदि आप oldschool हैं तो आप इसे XML के साथ भी तार कर सकते हैं।
Affe

2
क्या Dispatcher Servletएनोटेशन आधारित का उपयोग करते समय हमें एक xml फ़ाइल की आवश्यकता है @RestController?
वाइपर

1
web.xml में @viper हमें हमेशा डिस्पैचर सर्वलेट को कॉन्फ़िगर करने की आवश्यकता होती है, भले ही आप एनोटेशन या xml कॉन्फ़िगरेशन का उपयोग करें
Mahender Reddy Yasa

क्या कोई अन्य प्रकार का सर्वलेट है?
मिन्ह नघ्ना

72

स्प्रिंग एमवीसी में, आने वाले सभी अनुरोध एक एकल सर्वलेट से गुजरते हैं। यह सर्वलेट - DispatcherServlet- सामने नियंत्रक है। वेब एप्लिकेशन डेवलपमेंट में फ्रंट कंट्रोलर एक विशिष्ट डिज़ाइन पैटर्न है। इस मामले में, एक एकल सर्वलेट सभी अनुरोधों को प्राप्त करता है और उन्हें आवेदन के अन्य सभी घटकों में स्थानांतरित करता है।

का कार्य DispatcherServletविशिष्ट स्प्रिंग MVC नियंत्रक के लिए अनुरोध भेजना है।

आमतौर पर हमारे पास बहुत सारे नियंत्रक होते हैं और DispatcherServletलक्ष्य नियंत्रक को निर्धारित करने के लिए निम्नलिखित में से एक मैपर्स को संदर्भित करते हैं:

कोई विन्यास किया जाता है, तो DispatcherServletका उपयोग करता है BeanNameUrlHandlerMappingऔर DefaultAnnotationHandlerMappingडिफ़ॉल्ट रूप से।

जब लक्ष्य नियंत्रक की पहचान की जाती है, तो DispatcherServletउसे अनुरोध भेजता है। नियंत्रक अनुरोध के अनुसार कुछ काम करता है (या इसे अन्य वस्तुओं को सौंपता है), और DispatcherServletमॉडल और दृश्य के नाम के साथ वापस लौटता है ।

दृश्य का नाम केवल एक तार्किक नाम है। इस तार्किक नाम का उपयोग वास्तविक दृश्य (नियंत्रक और विशिष्ट दृश्य के साथ युग्मन से बचने के लिए) को खोजने के लिए किया जाता है। फिर दृश्य के विशिष्ट कार्यान्वयन के लिए दृश्य के तार्किक नाम DispatcherServletको संदर्भित करता है ViewResolverऔर मैप करता है ।

के कुछ संभावित कार्यान्वयन ViewResolverहैं:

जब वह DispatcherServletदृश्य निर्धारित करता है जो परिणामों को प्रदर्शित करेगा तो इसे प्रतिक्रिया के रूप में प्रस्तुत किया जाएगा।

अंत में, ग्राहक को वापस वस्तु DispatcherServletलौटाता है Response


47

DispatcherServletस्प्रिंग एमवीसी फ्रंट कंट्रोलर पैटर्न का कार्यान्वयन है ।

स्प्रिंग डॉक्स में विवरण देखें यहाँ

अनिवार्य रूप से, यह एक सर्वलेट है जो आने वाले अनुरोध को लेता है, और उस अनुरोध के प्रसंस्करण को कई संचालकों में से एक को सौंपता है, जिसकी मैपिंग DispatcherServletकॉन्फ़िगरेशन में विशिष्ट है ।


क्या यह फ्लेक्स में होने वाली घटनाओं की तरह है, जहां मुझे एक एमएमएमएल से दूसरे या सर्वर पर डिस्पैच इवेंट मिलते हैं। क्या मैं अपने आवेदन में एक से अधिक DispatcherServlet कर सकता हूं। क्या प्रत्येक वर्ग फ़ाइलों में एक अलग डिस्पैचरवार्लेट है।
केविन

आमतौर पर केवल एक फ्रंट कंट्रोलर होता है। यह आपके द्वारा बनाए गए मॉडल और विचारों की परवाह किए बिना है। यह सिर्फ विशिष्ट मॉडल और विचारों को एक साथ लाता है।
बालुसक

2
@बैंड: आपके पास कई हो सकते हैं DispatcherServlets, यदि आपका आर्किटेक्चर इस तरह से अधिक समझ में आता है, लेकिन आमतौर पर इसका कोई कारण नहीं है।
स्केफमैन

47

मुझे पता है कि यह प्रश्न पहले से ही हल के रूप में चिह्नित है, लेकिन मैं इस पैटर्न को विस्तार से समझाते हुए एक नई छवि जोड़ना चाहता हूं (स्रोत: कार्रवाई 4 में वसंत):

यहां छवि विवरण दर्ज करें

व्याख्या

जब अनुरोध ब्राउज़र (1) को छोड़ देता है , तो यह इस बारे में जानकारी प्रदान करता है कि उपयोगकर्ता क्या मांग रहा है। कम से कम, अनुरोध किया गया URL ले जाएगा। लेकिन यह अतिरिक्त डेटा भी ले सकता है, जैसे कि उपयोगकर्ता द्वारा फॉर्म में प्रस्तुत की गई जानकारी।

अनुरोध की यात्रा का पहला पड़ाव स्प्रिंग की डिस्पैचरसर्वलेट में है। अधिकांश जावा-आधारित वेब फ्रेमवर्क की तरह, स्प्रिंग MVC फ़नल एकल फ्रंट कंट्रोलर सर्वलेट के माध्यम से अनुरोध करता है। एक फ्रंट कंट्रोलर एक सामान्य वेब एप्लिकेशन पैटर्न है जहां एक एकल सर्वलेट किसी एप्लिकेशन के अन्य घटकों के प्रति-वास्तविक प्रसंस्करण के लिए अनुरोध के लिए जिम्मेदारी सौंपता है। स्प्रिंग एमवीसी के मामले में, डिस्पैचरसर्वलेट फ्रंट कंट्रोलर है। DispatcherServlet का कार्य स्प्रिंग MVC नियंत्रक पर अनुरोध भेजना है। एक नियंत्रक एक स्प्रिंग घटक है जो अनुरोध को संसाधित करता है। लेकिन एक विशिष्ट एप्लिकेशन में कई नियंत्रक हो सकते हैं, और डिस्पैचरसर्वलेट को अनुरोध भेजने के लिए किस नियंत्रक को निर्णय लेने में कुछ मदद की आवश्यकता होती है। इसलिए डिस्पैचर सेर्वलेट एक या एक से अधिक हैंडलर मैपिंग (2) का पालन करता हैयह पता लगाने के लिए कि अनुरोध का अगला पड़ाव कहाँ होगा। हैंडलर मैपिंग अपना निर्णय लेते समय अनुरोध द्वारा किए गए URL पर विशेष ध्यान देता है। एक बार एक उपयुक्त नियंत्रक चुन लिए जाने के बाद, DispatcherServlet चुने गए नियंत्रक (3) को अपने तरीके से अनुरोध भेजता है। नियंत्रक पर, अनुरोध अपने पेलोड (उपयोगकर्ता द्वारा प्रस्तुत की गई जानकारी) को छोड़ देता है और उस जानकारी को नियंत्रित करते समय नियंत्रक प्रतीक्षा करता है। (वास्तव में, एक अच्छी तरह से डिज़ाइन किया गया नियंत्रक प्रति-स्वयं बहुत कम या कोई प्रसंस्करण नहीं बनाता है और इसके बजाय एक या अधिक सेवा ऑब्जेक्ट्स के लिए व्यावसायिक तर्क के लिए ज़िम्मेदारी को दर्शाता है।) एक नियंत्रक द्वारा किए गए तर्क में अक्सर कुछ जानकारी होती है जिसे वापस करने की आवश्यकता होती है। उपयोगकर्ता और ब्राउज़र में प्रदर्शित। इस जानकारी को मॉडल के रूप में संदर्भित किया जाता है। लेकिन उपयोगकर्ता को कच्ची जानकारी वापस भेजना पर्याप्त नहीं है - यह एक उपयोगकर्ता के अनुकूल प्रारूप में प्रारूपित करने की आवश्यकता है, आमतौर पर HTML। उसके लिए, जानकारी को देखने की जरूरत है, आमतौर पर एक जावा सर्वर पेज (JSP)। नियंत्रक द्वारा की जाने वाली अंतिम चीजों में से एक मॉडल डेटा पैकेज है और एक दृश्य के नाम की पहचान करता है जिसे आउटपुट प्रस्तुत करना चाहिए। यह फिर मॉडल और दृश्य नाम के साथ, डिस्पैचरसर्वलेट पर वापस अनुरोध भेजता है(४) । ताकि नियंत्रक किसी विशेष दृश्य के साथ युग्मित न हो, दृश्य नाम वापस डिस्पैचरवर्लेट में चला गया, जो सीधे एक विशिष्ट सीपीसी की पहचान नहीं करता है। यह भी जरूरी नहीं है कि दृश्य एक JSP है। इसके बजाय, यह केवल एक तार्किक नाम रखता है जिसका उपयोग वास्तविक दृश्य को देखने के लिए किया जाएगा जो परिणाम उत्पन्न करेगा। DispatcherServlet तार्किक दृश्य नाम को spe- cific दृश्य कार्यान्वयन में मैप करने के लिए एक दृश्य रिज़ॉल्वर (5) को संरक्षित करता है, जो JSP नहीं हो सकता है या नहीं। अब जब डिस्पैचरसर्वलेट जानता है कि कौन सा दृश्य परिणाम प्रस्तुत करेगा, अनुरोध का काम लगभग समाप्त हो गया है। इसका अंतिम पड़ाव दृश्य कार्यान्वयन पर है (6), आमतौर पर एक JSP, जहाँ यह मॉडल डेटा बचाता है। अनुरोध का काम अंत में किया जाता है। दृश्य आउटपुट को रेंडर करने के लिए मॉडल डेटा का उपयोग करेगा जो कि ग्राहक को (नहीं- तो-मेहनती) प्रतिक्रिया ऑब्जेक्ट (7) द्वारा वापस ले जाएगा ।


मेरा एक प्रश्न है कि, JSON ऑब्जेक्ट को जो हम ब्राउज़र में देखते हैं, वापस करने के मामले में यह दृश्य कैसे चुनता है, क्या यह उसी URI में वापस आता है यदि कोई तार्किक दृश्य चयनित नहीं है?
नेसरीन

1
@Nesrin यह आपके द्वारा पूछे जाने के बाद की उम्र है, लेकिन यहाँ एक जवाब है: आपने एक विशेष एनोटेशन रखा है, जिसमें यह @Controllerकहा गया @ResponseBodyहै कि संकेतित प्रतिक्रिया को सीधे HTTP प्रतिसाद निकाय पर लिखा जाना चाहिए, न कि किसी मॉडल में रखा जाना चाहिए या जिसे देखने के रूप में हल किया जाना चाहिए ।
डैशबोर्ड

6

हम कह सकते हैं कि DispatcherServletस्प्रिंग एमवीसी में हर चीज का ध्यान रखना।

वेब कंटेनर स्टार्ट अप में:

  1. DispatcherServletकॉलिंग init()विधि द्वारा लोड और आरंभ किया जाएगा
  2. init()की DispatcherServletतरह नामकरण परंपराओं के साथ वसंत विन्यास दस्तावेज़ की पहचान करने की कोशिश करेंगे "servlet_name-servlet.xml"तो सभी सेम पहचाना जा सकता है।

उदाहरण:

public class DispatcherServlet extends HttpServlet {

    ApplicationContext ctx = null;

    public void init(ServletConfig cfg){
        // 1. try to get the spring configuration document with default naming conventions
        String xml = "servlet_name" + "-servlet.xml";

        //if it was found then creates the ApplicationContext object
        ctx = new XmlWebApplicationContext(xml);
    }
    ...
}

इसलिए, आम तौर DispatcherServletपर URI के अनुरोध पर कब्जा करने और उसे सौंपने के लिए HandlerMappingHandlerMappingनियंत्रक की विधि के साथ खोज मैपिंग बीन, जहां नियंत्रक तार्किक नाम (दृश्य) लौटाता है। तब यह तार्किक नाम द्वारा भेजा जाता DispatcherServletहै HandlerMapping। फिर उपसर्ग और प्रत्यय जोड़कर देखने का पूरा स्थान DispatcherServletबताएं ViewResolver, फिर DispatcherServletग्राहक को दृश्य दें।


यह एक अच्छी व्याख्या है। आपका पॉइंट नंबर 2 कहता है कि डिस्पैचर सेर्वलेट "सर्वलेट_नाम-सर्वलेट.एक्सएमएल" जैसे नामकरण सम्मेलनों के साथ स्प्रिंग कॉन्फ़िगरेशन दस्तावेज़ की पहचान करने की कोशिश करेगा। हालाँकि, मैंने ऐसी परियोजनाएँ देखी हैं जो केवल "डिस्पैचर" जैसे नाम का उपयोग करती हैं, और यह ठीक काम करती है। मैंने भी यही कोशिश की है। लेकिन मुझे पता नहीं क्यों?
सुभाषिश भट्टाचार्जी

0

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


-1
<?xml version='1.0' encoding='UTF-8' ?>
<!-- was: <?xml version="1.0" encoding="UTF-8"?> -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
               http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
    <context:component-scan base-package="com.demo" />
    <context:annotation-config />

    <mvc:annotation-driven />


    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" />

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="datasource" />
    </bean> 

          <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
        <property name="url" value="jdbc:mysql://localhost:3306/employee" />
        <property name="username" value="username" />
        <property name="password" value="password" />
    </bean> 

</beans>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.