जवाबों:
DispatcherServlet का काम एक आने वाले URI को लेना है और हैंडलर (आमतौर पर कंट्रोलर क्लासेस और आमतौर पर JSP) के सही कॉम्बिनेशन को ढूंढना है जो उस स्थान पर मिलने वाले पेज या संसाधन को बनाने के लिए संयोजित होते हैं।
मैंने शायद
/WEB-INF/jsp/pages/Home.jsp
और एक वर्ग पर एक विधि
@RequestMapping(value="/pages/Home.html")
private ModelMap buildHome() {
return somestuff;
}
डिस्पैचर सर्वलेट बिट कि "जानता" है जब एक ब्राउज़र पृष्ठ अनुरोध करता है कि विधि कॉल करने के लिए, और एक HTML दस्तावेज बनाने के लिए मिलान JSP फ़ाइल के साथ अपने परिणामों को जोड़ सकते हैं।
यह कैसे पूरा होता है यह विन्यास और स्प्रिंग संस्करण के साथ व्यापक रूप से भिन्न होता है।
वहाँ भी कोई कारण नहीं है अंतिम परिणाम वेब पेज होना चाहिए। यह RMI के अंतिम बिंदुओं का पता लगाने , SOAP अनुरोधों को संभालने , कुछ भी जो सर्वलेट में आ सकता है, वही कर सकता है।
Dispatcher Servlet
एनोटेशन आधारित का उपयोग करते समय हमें एक xml फ़ाइल की आवश्यकता है @RestController
?
स्प्रिंग एमवीसी में, आने वाले सभी अनुरोध एक एकल सर्वलेट से गुजरते हैं। यह सर्वलेट - DispatcherServlet
- सामने नियंत्रक है। वेब एप्लिकेशन डेवलपमेंट में फ्रंट कंट्रोलर एक विशिष्ट डिज़ाइन पैटर्न है। इस मामले में, एक एकल सर्वलेट सभी अनुरोधों को प्राप्त करता है और उन्हें आवेदन के अन्य सभी घटकों में स्थानांतरित करता है।
का कार्य DispatcherServlet
विशिष्ट स्प्रिंग MVC नियंत्रक के लिए अनुरोध भेजना है।
आमतौर पर हमारे पास बहुत सारे नियंत्रक होते हैं और DispatcherServlet
लक्ष्य नियंत्रक को निर्धारित करने के लिए निम्नलिखित में से एक मैपर्स को संदर्भित करते हैं:
BeanNameUrlHandlerMapping
;ControllerBeanNameHandlerMapping
;ControllerClassNameHandlerMapping
;DefaultAnnotationHandlerMapping
;SimpleUrlHandlerMapping
।कोई विन्यास किया जाता है, तो DispatcherServlet
का उपयोग करता है BeanNameUrlHandlerMapping
और DefaultAnnotationHandlerMapping
डिफ़ॉल्ट रूप से।
जब लक्ष्य नियंत्रक की पहचान की जाती है, तो DispatcherServlet
उसे अनुरोध भेजता है। नियंत्रक अनुरोध के अनुसार कुछ काम करता है (या इसे अन्य वस्तुओं को सौंपता है), और DispatcherServlet
मॉडल और दृश्य के नाम के साथ वापस लौटता है ।
दृश्य का नाम केवल एक तार्किक नाम है। इस तार्किक नाम का उपयोग वास्तविक दृश्य (नियंत्रक और विशिष्ट दृश्य के साथ युग्मन से बचने के लिए) को खोजने के लिए किया जाता है। फिर दृश्य के विशिष्ट कार्यान्वयन के लिए दृश्य के तार्किक नाम DispatcherServlet
को संदर्भित करता है ViewResolver
और मैप करता है ।
के कुछ संभावित कार्यान्वयन ViewResolver
हैं:
BeanNameViewResolver
;ContentNegotiatingViewResolver
;FreeMarkerViewResolver
;InternalResourceViewResolver
;JasperReportsViewResolver
;ResourceBundleViewResolver
;TilesViewResolver
;UrlBasedViewResolver
;VelocityLayoutViewResolver
;VelocityViewResolver
;XmlViewResolver
;XsltViewResolver
।जब वह DispatcherServlet
दृश्य निर्धारित करता है जो परिणामों को प्रदर्शित करेगा तो इसे प्रतिक्रिया के रूप में प्रस्तुत किया जाएगा।
अंत में, ग्राहक को वापस वस्तु DispatcherServlet
लौटाता है Response
।
DispatcherServlet
स्प्रिंग एमवीसी फ्रंट कंट्रोलर पैटर्न का कार्यान्वयन है ।
स्प्रिंग डॉक्स में विवरण देखें यहाँ ।
अनिवार्य रूप से, यह एक सर्वलेट है जो आने वाले अनुरोध को लेता है, और उस अनुरोध के प्रसंस्करण को कई संचालकों में से एक को सौंपता है, जिसकी मैपिंग DispatcherServlet
कॉन्फ़िगरेशन में विशिष्ट है ।
DispatcherServlets
, यदि आपका आर्किटेक्चर इस तरह से अधिक समझ में आता है, लेकिन आमतौर पर इसका कोई कारण नहीं है।
मुझे पता है कि यह प्रश्न पहले से ही हल के रूप में चिह्नित है, लेकिन मैं इस पैटर्न को विस्तार से समझाते हुए एक नई छवि जोड़ना चाहता हूं (स्रोत: कार्रवाई 4 में वसंत):
व्याख्या
जब अनुरोध ब्राउज़र (1) को छोड़ देता है , तो यह इस बारे में जानकारी प्रदान करता है कि उपयोगकर्ता क्या मांग रहा है। कम से कम, अनुरोध किया गया URL ले जाएगा। लेकिन यह अतिरिक्त डेटा भी ले सकता है, जैसे कि उपयोगकर्ता द्वारा फॉर्म में प्रस्तुत की गई जानकारी।
अनुरोध की यात्रा का पहला पड़ाव स्प्रिंग की डिस्पैचरसर्वलेट में है। अधिकांश जावा-आधारित वेब फ्रेमवर्क की तरह, स्प्रिंग MVC फ़नल एकल फ्रंट कंट्रोलर सर्वलेट के माध्यम से अनुरोध करता है। एक फ्रंट कंट्रोलर एक सामान्य वेब एप्लिकेशन पैटर्न है जहां एक एकल सर्वलेट किसी एप्लिकेशन के अन्य घटकों के प्रति-वास्तविक प्रसंस्करण के लिए अनुरोध के लिए जिम्मेदारी सौंपता है। स्प्रिंग एमवीसी के मामले में, डिस्पैचरसर्वलेट फ्रंट कंट्रोलर है। DispatcherServlet का कार्य स्प्रिंग MVC नियंत्रक पर अनुरोध भेजना है। एक नियंत्रक एक स्प्रिंग घटक है जो अनुरोध को संसाधित करता है। लेकिन एक विशिष्ट एप्लिकेशन में कई नियंत्रक हो सकते हैं, और डिस्पैचरसर्वलेट को अनुरोध भेजने के लिए किस नियंत्रक को निर्णय लेने में कुछ मदद की आवश्यकता होती है। इसलिए डिस्पैचर सेर्वलेट एक या एक से अधिक हैंडलर मैपिंग (2) का पालन करता हैयह पता लगाने के लिए कि अनुरोध का अगला पड़ाव कहाँ होगा। हैंडलर मैपिंग अपना निर्णय लेते समय अनुरोध द्वारा किए गए URL पर विशेष ध्यान देता है। एक बार एक उपयुक्त नियंत्रक चुन लिए जाने के बाद, DispatcherServlet चुने गए नियंत्रक (3) को अपने तरीके से अनुरोध भेजता है। नियंत्रक पर, अनुरोध अपने पेलोड (उपयोगकर्ता द्वारा प्रस्तुत की गई जानकारी) को छोड़ देता है और उस जानकारी को नियंत्रित करते समय नियंत्रक प्रतीक्षा करता है। (वास्तव में, एक अच्छी तरह से डिज़ाइन किया गया नियंत्रक प्रति-स्वयं बहुत कम या कोई प्रसंस्करण नहीं बनाता है और इसके बजाय एक या अधिक सेवा ऑब्जेक्ट्स के लिए व्यावसायिक तर्क के लिए ज़िम्मेदारी को दर्शाता है।) एक नियंत्रक द्वारा किए गए तर्क में अक्सर कुछ जानकारी होती है जिसे वापस करने की आवश्यकता होती है। उपयोगकर्ता और ब्राउज़र में प्रदर्शित। इस जानकारी को मॉडल के रूप में संदर्भित किया जाता है। लेकिन उपयोगकर्ता को कच्ची जानकारी वापस भेजना पर्याप्त नहीं है - यह एक उपयोगकर्ता के अनुकूल प्रारूप में प्रारूपित करने की आवश्यकता है, आमतौर पर HTML। उसके लिए, जानकारी को देखने की जरूरत है, आमतौर पर एक जावा सर्वर पेज (JSP)। नियंत्रक द्वारा की जाने वाली अंतिम चीजों में से एक मॉडल डेटा पैकेज है और एक दृश्य के नाम की पहचान करता है जिसे आउटपुट प्रस्तुत करना चाहिए। यह फिर मॉडल और दृश्य नाम के साथ, डिस्पैचरसर्वलेट पर वापस अनुरोध भेजता है(४) । ताकि नियंत्रक किसी विशेष दृश्य के साथ युग्मित न हो, दृश्य नाम वापस डिस्पैचरवर्लेट में चला गया, जो सीधे एक विशिष्ट सीपीसी की पहचान नहीं करता है। यह भी जरूरी नहीं है कि दृश्य एक JSP है। इसके बजाय, यह केवल एक तार्किक नाम रखता है जिसका उपयोग वास्तविक दृश्य को देखने के लिए किया जाएगा जो परिणाम उत्पन्न करेगा। DispatcherServlet तार्किक दृश्य नाम को spe- cific दृश्य कार्यान्वयन में मैप करने के लिए एक दृश्य रिज़ॉल्वर (5) को संरक्षित करता है, जो JSP नहीं हो सकता है या नहीं। अब जब डिस्पैचरसर्वलेट जानता है कि कौन सा दृश्य परिणाम प्रस्तुत करेगा, अनुरोध का काम लगभग समाप्त हो गया है। इसका अंतिम पड़ाव दृश्य कार्यान्वयन पर है (6), आमतौर पर एक JSP, जहाँ यह मॉडल डेटा बचाता है। अनुरोध का काम अंत में किया जाता है। दृश्य आउटपुट को रेंडर करने के लिए मॉडल डेटा का उपयोग करेगा जो कि ग्राहक को (नहीं- तो-मेहनती) प्रतिक्रिया ऑब्जेक्ट (7) द्वारा वापस ले जाएगा ।
@Controller
कहा गया @ResponseBody
है कि संकेतित प्रतिक्रिया को सीधे HTTP प्रतिसाद निकाय पर लिखा जाना चाहिए, न कि किसी मॉडल में रखा जाना चाहिए या जिसे देखने के रूप में हल किया जाना चाहिए ।
हम कह सकते हैं कि DispatcherServlet
स्प्रिंग एमवीसी में हर चीज का ध्यान रखना।
वेब कंटेनर स्टार्ट अप में:
DispatcherServlet
कॉलिंग init()
विधि द्वारा लोड और आरंभ किया जाएगा
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 के अनुरोध पर कब्जा करने और उसे सौंपने के लिए HandlerMapping
। HandlerMapping
नियंत्रक की विधि के साथ खोज मैपिंग बीन, जहां नियंत्रक तार्किक नाम (दृश्य) लौटाता है। तब यह तार्किक नाम द्वारा भेजा जाता DispatcherServlet
है HandlerMapping
। फिर उपसर्ग और प्रत्यय जोड़कर देखने का पूरा स्थान DispatcherServlet
बताएं ViewResolver
, फिर DispatcherServlet
ग्राहक को दृश्य दें।
डिस्पैचर नियंत्रक को प्रदर्शित किया जाता है सभी आने वाले अनुरोध डिस्पैचर सर्वलेट द्वारा अवरोधन में होते हैं जो फ्रंट नियंत्रक के रूप में काम करता है। डिस्पैचर सर्वलेट को XML फ़ाइल से हैंडलर मैपिंग के लिए एक एंट्री मिलती है और कंट्रोलर के पास अनुरोध करने के लिए पासवर्ड होता है।
<?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>