উত্তর:
কাজ DispatcherServlet একটি ইনকামিং কোনো URI গ্রহণ করা এবং হ্যান্ডেলার ডান সমন্বয় (সাধারণত উপর পদ্ধতি খুঁজে পেতে কন্ট্রোলার শ্রেণীর) এবং মতামত (সাধারণত JSPs) যে পৃষ্ঠা বা রিসোর্স যে অবস্থান এ পাওয়া যেতে অনুমিত যে গঠনের একত্র করি।
আমি থাকতে পারে
/WEB-INF/jsp/pages/Home.jsp
এবং একটি ক্লাসে একটি পদ্ধতি
@RequestMapping(value="/pages/Home.html")
private ModelMap buildHome() {
return somestuff;
}
ডেস্প্যাচার সার্ভলেট বিট যে "জানে" যখন একটি ব্রাউজার অনুরোধ করা পৃষ্ঠাগুলির যে পদ্ধতি কল, এবং একটি HTML ডকুমেন্ট তৈরি করতে ম্যাচিং JSP ফাইলের সাথে তার ফলাফল একত্রিত করতে হবে।
এটি কীভাবে এটি সম্পাদন করে তা কনফিগারেশন এবং স্প্রিং সংস্করণের সাথে ব্যাপকভাবে পরিবর্তিত হয়।
শেষ ফলাফলটি ওয়েব পৃষ্ঠাগুলি হওয়ার কোনও কারণ নেই। এটি আরএমআই এর শেষ পয়েন্টগুলি সনাক্ত করতে , এসওএপি অনুরোধগুলি হ্যান্ডেল করতে, সার্লেলে আসতে পারে এমন কিছু করতে পারে।
Dispatcher Servlet
টীকাগুলি ভিত্তিক ব্যবহার করার সময় আমাদের কি একটি এক্সএমএল ফাইলের প্রয়োজন @RestController
?
স্প্রিং এমভিসিতে, সমস্ত আগত অনুরোধগুলি একটি একক সার্লেটের মাধ্যমে যায়। এই সার্লেট - DispatcherServlet
- সামনের নিয়ামক। ফ্রন্ট কন্ট্রোলার ওয়েব অ্যাপ্লিকেশন বিকাশের একটি সাধারণ নকশা প্যাটার্ন। এই ক্ষেত্রে, একটি একক সার্লেট সমস্ত অনুরোধ গ্রহণ করে এবং সেগুলি অ্যাপ্লিকেশনের অন্যান্য সমস্ত উপাদানগুলিতে স্থানান্তর করে।
এর কাজটি DispatcherServlet
হ'ল নির্দিষ্ট স্প্রিং এমভিসি নিয়ামককে অনুরোধ প্রেরণ করা।
সাধারণত আমাদের 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) , তখন এটি ব্যবহারকারী কী জিজ্ঞাসা করছে সে সম্পর্কে তথ্য বহন করে। কমপক্ষে, অনুরোধটি অনুরোধ করা ইউআরএল বহন করবে। তবে এটি অতিরিক্ত ডেটাও বহন করতে পারে যেমন ব্যবহারকারীর দ্বারা একটি ফর্মে জমা দেওয়া তথ্য।
অনুরোধের ভ্রমণের প্রথম স্টপটি স্প্রিংয়ের ডিসপ্যাচার সার্ভেলে erv বেশিরভাগ জাভা ভিত্তিক ওয়েব ফ্রেমওয়ার্কগুলির মতো, স্প্রিং এমভিসি একটি একক ফ্রন্ট কন্ট্রোলার সার্লেটের মাধ্যমে অনুরোধ জানায়। ফ্রন্ট কন্ট্রোলার হ'ল একটি সাধারণ ওয়েব অ্যাপ্লিকেশন প্যাটার্ন যেখানে একক সার্ভলেট প্রকৃত প্রক্রিয়াজাতকরণের জন্য কোনও অ্যাপ্লিকেশনের অন্যান্য উপাদানগুলিকে অনুরোধের জন্য দায়িত্ব দেয়। স্প্রিং এমভিসির ক্ষেত্রে, ডিসপ্যাচারসারভাইলেট হ'ল সামনের নিয়ামক। ডিসপ্যাচারসারভেলের কাজ হ'ল অনুরোধটি একটি স্প্রিং এমভিসি নিয়ামককে প্রেরণ করা। একটি নিয়ামক একটি বসন্ত উপাদান যা অনুরোধটি প্রক্রিয়া করে। তবে একটি সাধারণ অ্যাপ্লিকেশনটিতে বেশ কয়েকটি নিয়ামক থাকতে পারে এবং ডিসপ্যাচার সার্ভলেটকে কোন নিয়ামককে অনুরোধটি প্রেরণ করতে হবে তা সিদ্ধান্ত নিতে কিছু সহায়তা প্রয়োজন needs সুতরাং ডিসপাচারসার সার্লেট এক বা একাধিক হ্যান্ডলার ম্যাপিংয়ের পরামর্শ নিয়েছে (২)অনুরোধের পরবর্তী স্টপটি কোথায় হবে তা নির্ধারণ করতে। হ্যান্ডলার ম্যাপিং কোনও সিদ্ধান্ত নেওয়ার সময় অনুরোধ দ্বারা পরিচালিত ইউআরএলটিতে বিশেষ মনোযোগ দেয়। একবার কোনও উপযুক্ত নিয়ামক নির্বাচিত হয়ে গেলে, DispatcherServlet তার আনন্দিত পথে অনুরোধটি নির্বাচিত নিয়ামকের কাছে প্রেরণ করে (3)। কন্ট্রোলারে, অনুরোধটি তার পেলোডটি বন্ধ করে দেয় (ব্যবহারকারীর জমা দেওয়া তথ্য) এবং নিয়ামক সেই তথ্য প্রক্রিয়া করার সময় ধৈর্য ধরে অপেক্ষা করে। (প্রকৃতপক্ষে, একটি সু-নকশাকৃত নিয়ামক খুব কম বা কোনও প্রক্রিয়াজাতকরণ নিজেই গঠন করে এবং পরিবর্তে ব্যবসায়িক লজিকের জন্য এক বা একাধিক পরিষেবা সামগ্রীর কাছে দায়িত্ব অর্পণ করে)) একটি নিয়ামক দ্বারা সম্পাদিত যুক্তি প্রায়শই এমন কিছু তথ্যের ফলশ্রুতিতে ফিরে আসে যা চালানোর প্রয়োজন হয় results ব্যবহারকারী এবং ব্রাউজারে প্রদর্শিত। এই তথ্য মডেল হিসাবে উল্লেখ করা হয়। তবে কাঁচা তথ্য ব্যবহারকারীর কাছে ফেরত পাঠানো সুবিধাজনক নয় — এটি ব্যবহারকারী-বান্ধব ফর্ম্যাট, সাধারণত এইচটিএমএলে ফর্ম্যাট করা দরকার। তার জন্য, তথ্যটি একটি দর্শনকে দেওয়া দরকার, সাধারণত একটি জাভা সার্ভার পৃষ্ঠা (জেএসপি)। একটি নিয়ামক সর্বশেষ কাজগুলির মধ্যে একটি হ'ল মডেল ডেটা প্যাকেজ করা এবং আউটপুট রেন্ডার হওয়া উচিত এমন একটি ভিউয়ের নাম সনাক্ত করা। এরপরে এটি মডেল এবং দর্শনের নামের সাথে অনুরোধ প্রেরণ করে ডিসপ্যাচারসার্ভলেটে ফিরে আসে(4) । যাতে নিয়ামকটি একটি নির্দিষ্ট দৃশ্যের সাথে মিলিত না হন, ডিসপ্যাচারসার্ভলেটে দেওয়া ভিউয়ের নামটি কোনও নির্দিষ্ট জেএসপি সরাসরি সনাক্ত করতে পারে না। এমনকি ভিউটি জেএসপি হওয়ারও অগত্যা পরামর্শ দেয় না। পরিবর্তে, এটি কেবল একটি যৌক্তিক নাম বহন করে যা ফলাফলটি প্রকাশ করবে এমন আসল দৃষ্টিভঙ্গি সন্ধান করতে ব্যবহৃত হবে। যৌক্তিক দৃশ্যের নামটিকে একটি স্পষ্টিফিক দৃষ্টিকোণ প্রয়োগের মানচিত্রের জন্য ডিসপ্যাচারসার্ভালেট একটি ভিউ রেজোলভার (5) এর পরামর্শ নেয়, যা জেএসপি হতে পারে বা নাও পারে। এখন যেহেতু ডিসপ্যাচারসার্ভালেট জানেন যে কোন ভিউ ফলাফলটি রেন্ডার করবে, অনুরোধটির কাজ প্রায় শেষ। এর চূড়ান্ত স্টপটি ভিউ বাস্তবায়নে (6), সাধারণত একটি জেএসপি, যেখানে এটি মডেল ডেটা সরবরাহ করে। অনুরোধের কাজ শেষ পর্যন্ত সম্পন্ন হয়েছে। ভিউটি আউটপুট রেন্ডার করতে মডেল ডেটা ব্যবহার করবে যা ক্লায়েন্টের কাছে ফিরে আসবে (না-পরিশ্রমী) প্রতিক্রিয়া অবজেক্ট (7) ।
@Controller
পদ্ধতির ঠিক উপরে একটি বিশেষ টীকা রেখেছিলেন যা @ResponseBody
নির্দেশ করে যে প্রত্যাবর্তিত প্রতিক্রিয়াটি সরাসরি এইচটিটিপি প্রতিক্রিয়া সংস্থায় লেখা উচিত, কোনও মডেল স্থাপন করা উচিত নয় বা যা দেখতে হবে তার সমাধান হিসাবে সমাধান করা উচিত ।
আমরা 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
ক্যাপচার অনুরোধ ইউআরআই এবং হস্তান্তর HandlerMapping
। HandlerMapping
নিয়ামকের পদ্ধতির সাহায্যে ম্যাপিং মটর সন্ধান করুন, যেখানে নিয়ামক যৌক্তিক নাম (দর্শন) ফেরান। তারপরে এই যৌক্তিক নামটি পাঠানো DispatcherServlet
হয় HandlerMapping
। তারপরে উপসর্গ এবং প্রত্যয় যুক্ত করে দেখার পূর্ণ অবস্থান দেওয়ার জন্য DispatcherServlet
বলুন ViewResolver
, তারপরে DispatcherServlet
ক্লায়েন্টকে দর্শন দিন।
ডিসপ্যাচার কন্ট্রোলার চিত্রটিতে প্রদর্শিত হয় সমস্ত আগত অনুরোধ প্রেরণকারী সার্লেট দ্বারা বন্ধ করা হয় যা সামনের নিয়ামক হিসাবে কাজ করে। প্রেরণকারী সার্লেটটি এক্সএমএল ফাইল থেকে হ্যান্ডলার ম্যাপিংয়ে একটি এন্ট্রি পায় এবং কন্ট্রোলারের কাছে অনুরোধটি ফরওয়ার্ড করে।
<?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>