বসন্তে প্রেরণকারী সার্লেট কী?


195

এই ছবিটি (যা আমি থেকে পেয়েছেন এখানে ), HTTP- র অনুরোধে কিছু পাঠায় ডেস্প্যাচার সার্ভলেট।

এখানে চিত্র বর্ণনা লিখুন

আমার প্রশ্নটি ডিসপ্যাচার সার্ভলেট কী করে?

ওয়েব পৃষ্ঠা থেকে তথ্য ফেলে দেওয়া এবং এটি নিয়ামকের কাছে ফেলে দেওয়ার মতো কিছু?

উত্তর:


202

কাজ DispatcherServlet একটি ইনকামিং কোনো URI গ্রহণ করা এবং হ্যান্ডেলার ডান সমন্বয় (সাধারণত উপর পদ্ধতি খুঁজে পেতে কন্ট্রোলার শ্রেণীর) এবং মতামত (সাধারণত JSPs) যে পৃষ্ঠা বা রিসোর্স যে অবস্থান এ পাওয়া যেতে অনুমিত যে গঠনের একত্র করি।

আমি থাকতে পারে

  • একটি নথি /WEB-INF/jsp/pages/Home.jsp
  • এবং একটি ক্লাসে একটি পদ্ধতি

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

ডেস্প্যাচার সার্ভলেট বিট যে "জানে" যখন একটি ব্রাউজার অনুরোধ করা পৃষ্ঠাগুলির যে পদ্ধতি কল, এবং একটি HTML ডকুমেন্ট তৈরি করতে ম্যাচিং JSP ফাইলের সাথে তার ফলাফল একত্রিত করতে হবে।

এটি কীভাবে এটি সম্পাদন করে তা কনফিগারেশন এবং স্প্রিং সংস্করণের সাথে ব্যাপকভাবে পরিবর্তিত হয়।

শেষ ফলাফলটি ওয়েব পৃষ্ঠাগুলি হওয়ার কোনও কারণ নেই। এটি আরএমআই এর শেষ পয়েন্টগুলি সনাক্ত করতে , এসওএপি অনুরোধগুলি হ্যান্ডেল করতে, সার্লেলে আসতে পারে এমন কিছু করতে পারে।


4
দুর্দান্ত রিপোস্ট, এখন প্রশ্ন কীভাবে আসে ডিসপ্যাচার সার্ভলেট শ্রেণীর নাম এবং পদ্ধতির নামটি সনাক্ত করে। আপনি কি আমাকে এমন একটি কনফিগারেশনের উদাহরণ দেখাতে পারেন যেখানে আমার দুটি শ্রেণি এবং দুটি পদ্ধতির নাম রয়েছে এবং কীভাবে ডিসপ্যাচারসার সার্লেট সঠিক অনুরোধটি ধরবে।
কেভিন

10
এটি সেই টীকাগুলির শুরু করার জন্য শ্রেণীর পাথ স্ক্যান করে এবং ক্লাস + পদ্ধতিতে "/ পৃষ্ঠাগুলি / হোমএইচটিএমএল" এর ম্যাপিং করে। যদি আপনার কাছে দুটি পদ্ধতি থাকে যে উভয়েরই "/pages/Home.html" তাদের টীকাতে অন্য কোনও বিধিনিষেধ না করে থাকে, তবে এটি একটি ত্রুটি হবে এবং এটি আপনাকে ব্যতিক্রম টস করবে। আপনি যদি ওল্ডস্কুল হন তবে আপনি এটি এক্সএমএলের সাথে একসাথে তারেও লাগাতে পারেন।
এফাই

2
Dispatcher Servletটীকাগুলি ভিত্তিক ব্যবহার করার সময় আমাদের কি একটি এক্সএমএল ফাইলের প্রয়োজন @RestController?
ভাইপার

1
আপনি ওয়েব টেক্সট বা এক্সএমএল কনফিগারেশন ব্যবহার করা সত্ত্বেও ওয়েব.এক্সএমএল-তে উইপ্পারটি আমাদের সর্বদা প্রেরণকারী সার্লেট কনফিগার করতে হবে
মাহেন্দ্র রেড্ডি ইয়াসা 2:58

অন্য কোন ধরনের সার্লেট আছে?
মিন নাঘিয়া

72

স্প্রিং এমভিসিতে, সমস্ত আগত অনুরোধগুলি একটি একক সার্লেটের মাধ্যমে যায়। এই সার্লেট - DispatcherServlet- সামনের নিয়ামক। ফ্রন্ট কন্ট্রোলার ওয়েব অ্যাপ্লিকেশন বিকাশের একটি সাধারণ নকশা প্যাটার্ন। এই ক্ষেত্রে, একটি একক সার্লেট সমস্ত অনুরোধ গ্রহণ করে এবং সেগুলি অ্যাপ্লিকেশনের অন্যান্য সমস্ত উপাদানগুলিতে স্থানান্তর করে।

এর কাজটি DispatcherServletহ'ল নির্দিষ্ট স্প্রিং এমভিসি নিয়ামককে অনুরোধ প্রেরণ করা।

সাধারণত আমাদের DispatcherServletলক্ষ্য নিয়ামক নির্ধারণের জন্য প্রচুর নিয়ামক থাকে এবং নিম্নলিখিত ম্যাপারগুলির মধ্যে একটিকে উল্লেখ করি:

যদি কোনও কনফিগারেশন সম্পাদিত না হয় তবে DispatcherServletব্যবহারগুলি BeanNameUrlHandlerMappingএবং DefaultAnnotationHandlerMappingডিফল্টরূপে।

লক্ষ্য নিয়ন্ত্রণকারী সনাক্ত করা গেলে, DispatcherServletএটিতে অনুরোধ প্রেরণ করে। কন্ট্রোলার অনুরোধ অনুসারে কিছু কাজ সম্পাদন করে (বা এটি অন্য বস্তুর কাছে অর্পণ করে) এবং DispatcherServletমডেল এবং ভিউয়ের নামটি দিয়ে ফিরে আসে ।

ভিউয়ের নামটি কেবল একটি যৌক্তিক নাম। এই যৌক্তিক নামটি তখন আসল ভিউ (নিয়ামক এবং নির্দিষ্ট দৃশ্যের সাথে মিলিত হওয়া এড়াতে) অনুসন্ধান করতে ব্যবহৃত হয়। তারপরে DispatcherServletভিউটির ViewResolverযৌক্তিক নামটি মানচিত্রের উল্লেখ করে এবং ভিউটির নির্দিষ্ট বাস্তবায়নের জন্য মানচিত্রগুলি দেখায়।

এর কয়েকটি সম্ভাব্য বাস্তবায়নগুলি হ'ল ViewResolver:

DispatcherServletফলাফল প্রদর্শন করবে এমন দৃশ্য নির্ধারণ করে যখন এটি প্রতিক্রিয়া হিসাবে রেন্ডার হবে।

অবশেষে, DispatcherServletফেরৎ Responseক্লায়েন্ট বস্তুর ফিরে।


47

DispatcherServletহ'ল স্প্রিং এমভিসি'র সামনের নিয়ামক ধাঁচের প্রয়োগ ।

স্প্রিং ডক্সে এখানে বর্ণনা দেখুন ।

মূলত, এটি একটি সার্লেট যা আগত অনুরোধটি গ্রহণ করে এবং সেই অনুরোধটির প্রসেসিং হ্যান্ডলারের একটিতে প্রেরণ করে, যার ম্যাপিংটি DispatcherServletকনফিগারেশনে নির্দিষ্ট ।


এটি কি ফ্লেক্সের ইভেন্টগুলির মতো, যেখানে আমি এক এমএক্সএমএল থেকে অন্য কোনও সার্ভারে বা প্রেরণের ইভেন্টগুলি পাই। আমার অ্যাপিকেশনটিতে আমি কি একাধিক ডিসপ্যাচার সার্ভলেট রাখতে পারি? প্রতিটি শ্রেণীর ফাইলগুলিতে পৃথক ডিসপাপচারার সার্লেট থাকে।
কেভিন

সাধারণত একমাত্র সামনের নিয়ামক থাকে। এটি আপনার কাছে যে মডেল এবং ভিউ রয়েছে তা নির্বিশেষে। এটি কেবল নির্দিষ্ট মডেল এবং ভিউগুলি একসাথে নিয়ে আসে।
বালাসসি

2
@ থাইব্যান্ড: আপনার আর্কিটেকচারটি যদি সেভাবে আরও বেশি বোঝায় তবে আপনার একাধিক থাকতে পারে DispatcherServlets, তবে সাধারণত এর কোনও কারণ নেই।
স্কাফম্যান

47

আমি জানি এই প্রশ্নটি ইতিমধ্যে সমাধান করা হিসাবে চিহ্নিত হয়েছে তবে আমি এই প্যাটার্নটি বিশদভাবে ব্যাখ্যা করে একটি নতুন চিত্র যুক্ত করতে চাই (উত্স: স্প্রিং অ্যাকশন 4):

এখানে চিত্র বর্ণনা লিখুন

ব্যাখ্যা

যখন অনুরোধটি ব্রাউজারটি ছেড়ে যায় (1) , তখন এটি ব্যবহারকারী কী জিজ্ঞাসা করছে সে সম্পর্কে তথ্য বহন করে। কমপক্ষে, অনুরোধটি অনুরোধ করা ইউআরএল বহন করবে। তবে এটি অতিরিক্ত ডেটাও বহন করতে পারে যেমন ব্যবহারকারীর দ্বারা একটি ফর্মে জমা দেওয়া তথ্য।

অনুরোধের ভ্রমণের প্রথম স্টপটি স্প্রিংয়ের ডিসপ্যাচার সার্ভেলে erv বেশিরভাগ জাভা ভিত্তিক ওয়েব ফ্রেমওয়ার্কগুলির মতো, স্প্রিং এমভিসি একটি একক ফ্রন্ট কন্ট্রোলার সার্লেটের মাধ্যমে অনুরোধ জানায়। ফ্রন্ট কন্ট্রোলার হ'ল একটি সাধারণ ওয়েব অ্যাপ্লিকেশন প্যাটার্ন যেখানে একক সার্ভলেট প্রকৃত প্রক্রিয়াজাতকরণের জন্য কোনও অ্যাপ্লিকেশনের অন্যান্য উপাদানগুলিকে অনুরোধের জন্য দায়িত্ব দেয়। স্প্রিং এমভিসির ক্ষেত্রে, ডিসপ্যাচারসারভাইলেট হ'ল সামনের নিয়ামক। ডিসপ্যাচারসারভেলের কাজ হ'ল অনুরোধটি একটি স্প্রিং এমভিসি নিয়ামককে প্রেরণ করা। একটি নিয়ামক একটি বসন্ত উপাদান যা অনুরোধটি প্রক্রিয়া করে। তবে একটি সাধারণ অ্যাপ্লিকেশনটিতে বেশ কয়েকটি নিয়ামক থাকতে পারে এবং ডিসপ্যাচার সার্ভলেটকে কোন নিয়ামককে অনুরোধটি প্রেরণ করতে হবে তা সিদ্ধান্ত নিতে কিছু সহায়তা প্রয়োজন needs সুতরাং ডিসপাচারসার সার্লেট এক বা একাধিক হ্যান্ডলার ম্যাপিংয়ের পরামর্শ নিয়েছে (২)অনুরোধের পরবর্তী স্টপটি কোথায় হবে তা নির্ধারণ করতে। হ্যান্ডলার ম্যাপিং কোনও সিদ্ধান্ত নেওয়ার সময় অনুরোধ দ্বারা পরিচালিত ইউআরএলটিতে বিশেষ মনোযোগ দেয়। একবার কোনও উপযুক্ত নিয়ামক নির্বাচিত হয়ে গেলে, DispatcherServlet তার আনন্দিত পথে অনুরোধটি নির্বাচিত নিয়ামকের কাছে প্রেরণ করে (3)। কন্ট্রোলারে, অনুরোধটি তার পেলোডটি বন্ধ করে দেয় (ব্যবহারকারীর জমা দেওয়া তথ্য) এবং নিয়ামক সেই তথ্য প্রক্রিয়া করার সময় ধৈর্য ধরে অপেক্ষা করে। (প্রকৃতপক্ষে, একটি সু-নকশাকৃত নিয়ামক খুব কম বা কোনও প্রক্রিয়াজাতকরণ নিজেই গঠন করে এবং পরিবর্তে ব্যবসায়িক লজিকের জন্য এক বা একাধিক পরিষেবা সামগ্রীর কাছে দায়িত্ব অর্পণ করে)) একটি নিয়ামক দ্বারা সম্পাদিত যুক্তি প্রায়শই এমন কিছু তথ্যের ফলশ্রুতিতে ফিরে আসে যা চালানোর প্রয়োজন হয় results ব্যবহারকারী এবং ব্রাউজারে প্রদর্শিত। এই তথ্য মডেল হিসাবে উল্লেখ করা হয়। তবে কাঁচা তথ্য ব্যবহারকারীর কাছে ফেরত পাঠানো সুবিধাজনক নয় — এটি ব্যবহারকারী-বান্ধব ফর্ম্যাট, সাধারণত এইচটিএমএলে ফর্ম্যাট করা দরকার। তার জন্য, তথ্যটি একটি দর্শনকে দেওয়া দরকার, সাধারণত একটি জাভা সার্ভার পৃষ্ঠা (জেএসপি)। একটি নিয়ামক সর্বশেষ কাজগুলির মধ্যে একটি হ'ল মডেল ডেটা প্যাকেজ করা এবং আউটপুট রেন্ডার হওয়া উচিত এমন একটি ভিউয়ের নাম সনাক্ত করা। এরপরে এটি মডেল এবং দর্শনের নামের সাথে অনুরোধ প্রেরণ করে ডিসপ্যাচারসার্ভলেটে ফিরে আসে(4) । যাতে নিয়ামকটি একটি নির্দিষ্ট দৃশ্যের সাথে মিলিত না হন, ডিসপ্যাচারসার্ভলেটে দেওয়া ভিউয়ের নামটি কোনও নির্দিষ্ট জেএসপি সরাসরি সনাক্ত করতে পারে না। এমনকি ভিউটি জেএসপি হওয়ারও অগত্যা পরামর্শ দেয় না। পরিবর্তে, এটি কেবল একটি যৌক্তিক নাম বহন করে যা ফলাফলটি প্রকাশ করবে এমন আসল দৃষ্টিভঙ্গি সন্ধান করতে ব্যবহৃত হবে। যৌক্তিক দৃশ্যের নামটিকে একটি স্পষ্টিফিক দৃষ্টিকোণ প্রয়োগের মানচিত্রের জন্য ডিসপ্যাচারসার্ভালেট একটি ভিউ রেজোলভার (5) এর পরামর্শ নেয়, যা জেএসপি হতে পারে বা নাও পারে। এখন যেহেতু ডিসপ্যাচারসার্ভালেট জানেন যে কোন ভিউ ফলাফলটি রেন্ডার করবে, অনুরোধটির কাজ প্রায় শেষ। এর চূড়ান্ত স্টপটি ভিউ বাস্তবায়নে (6), সাধারণত একটি জেএসপি, যেখানে এটি মডেল ডেটা সরবরাহ করে। অনুরোধের কাজ শেষ পর্যন্ত সম্পন্ন হয়েছে। ভিউটি আউটপুট রেন্ডার করতে মডেল ডেটা ব্যবহার করবে যা ক্লায়েন্টের কাছে ফিরে আসবে (না-পরিশ্রমী) প্রতিক্রিয়া অবজেক্ট (7)


আমার একটি প্রশ্ন আছে দয়া করে, আমরা ব্রাউজারে যে JSON অবজেক্টটি দেখি তা ফিরিয়ে দেওয়ার ক্ষেত্রে এটি কীভাবে দৃষ্টিভঙ্গি নির্বাচন করে, যদি কোনও যৌক্তিক দৃষ্টিভঙ্গি নির্বাচিত না হয় তবে এটি কি একই ইউআরআইতে ফিরে আসবে?
নেসারিন

1
@ নেসরিন আপনি জিজ্ঞাসা করার পরে যুগে যুগে চলে এসেছেন তবে এখানে একটি উত্তর এখানে দেওয়া হয়েছে: আপনি এই @Controllerপদ্ধতির ঠিক উপরে একটি বিশেষ টীকা রেখেছিলেন যা @ResponseBodyনির্দেশ করে যে প্রত্যাবর্তিত প্রতিক্রিয়াটি সরাসরি এইচটিটিপি প্রতিক্রিয়া সংস্থায় লেখা উচিত, কোনও মডেল স্থাপন করা উচিত নয় বা যা দেখতে হবে তার সমাধান হিসাবে সমাধান করা উচিত ।
ড্যাশবোর্ড

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ক্যাপচার অনুরোধ ইউআরআই এবং হস্তান্তর HandlerMappingHandlerMappingনিয়ামকের পদ্ধতির সাহায্যে ম্যাপিং মটর সন্ধান করুন, যেখানে নিয়ামক যৌক্তিক নাম (দর্শন) ফেরান। তারপরে এই যৌক্তিক নামটি পাঠানো DispatcherServletহয় HandlerMapping। তারপরে উপসর্গ এবং প্রত্যয় যুক্ত করে দেখার পূর্ণ অবস্থান দেওয়ার জন্য DispatcherServletবলুন ViewResolver, তারপরে DispatcherServletক্লায়েন্টকে দর্শন দিন।


এটি একটি সুন্দর ব্যাখ্যা। আপনার পয়েন্ট নম্বর 2 বলছে যে ডিসপ্যাচারসার্ভালেট "servlet_name-servlet.xML" এর মতো নামকরণের সম্মেলনগুলির সাথে বসন্ত কনফিগারেশন ডকুমেন্টকে সনাক্ত করার চেষ্টা করবে। তবে, আমি এমন প্রকল্পগুলি দেখেছি যা কেবল "প্রেরণকারী" এর মতো নাম ব্যবহার করে, এবং এটি দুর্দান্ত কাজ করে। আমিও তা চেষ্টা করেছি। কিন্তু আমি জানিনা কেন?
শুভশীষ ভট্টাচার্য

0

ডিসপ্যাচার কন্ট্রোলার চিত্রটিতে প্রদর্শিত হয় সমস্ত আগত অনুরোধ প্রেরণকারী সার্লেট দ্বারা বন্ধ করা হয় যা সামনের নিয়ামক হিসাবে কাজ করে। প্রেরণকারী সার্লেটটি এক্সএমএল ফাইল থেকে হ্যান্ডলার ম্যাপিংয়ে একটি এন্ট্রি পায় এবং কন্ট্রোলারের কাছে অনুরোধটি ফরওয়ার্ড করে।


-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>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.