আপনার স্ট্যান্ডার্ড স্প্রিং এমভিসি অ্যাপ্লিকেশনটি এ এর মাধ্যমে সমস্ত অনুরোধগুলি সরবরাহ করবে DispatcherServlet আপনি আপনার সার্লেট ধারকটির সাথে নিবন্ধভুক্ত করেছেন তার ।
এর DispatcherServletচেহারা ApplicationContextএবং যদি উপলভ্য হয় তবে এটি ApplicationContextএকটি ContextLoaderListenerবিশেষ মটরশুটিটির জন্য নিবন্ধীকৃত এটির জন্য তার অনুরোধটি সরবরাহ করার যুক্তিটি সেটআপ করা দরকার। এই মটরশুটি ডকুমেন্টেশন বর্ণিত হয় ।
যুক্তিযুক্তভাবে সর্বাধিক গুরুত্বপূর্ণ, টাইপ HandlerMappingম্যাপের মটরশুটি
হ্যান্ডলারের কাছে আগত অনুরোধ এবং কিছু মানদণ্ডের উপর ভিত্তি করে প্রাক- এবং পোস্ট প্রসেসরগুলির একটি তালিকা (হ্যান্ডলার ইন্টারসেপ্টার) যার HandlerMappingপ্রয়োগের দ্বারা পৃথক হয় । সর্বাধিক জনপ্রিয় বাস্তবায়ন টীকাগুলি নিয়ন্ত্রকদের সমর্থন করে তবে অন্যান্য বাস্তবায়নও বিদ্যমান।
এর javadocHandlerMapping আরও বর্ণনা কিভাবে বাস্তবায়নের আচরণ নয়।
DispatcherServlet(কাস্টমাইজড করা যাবে) এই ধরনের সমস্ত মটরশুটি খুঁজে পায় এবং তাদের কিছু অনুক্রমে খাতাপত্র। একটি অনুরোধ পরিবেশন করার সময়, DispatcherServletএই HandlerMappingঅবজেক্টগুলির মধ্য দিয়ে লুপগুলি আসে এবং getHandlerস্ট্যান্ডার্ড হিসাবে উপস্থাপিত আগত অনুরোধটিকে পরিচালনা করতে পারে এমন একটি সন্ধানের জন্য এগুলির প্রত্যেকের পরীক্ষা করে HttpServletRequest। ৪.৩.x হিসাবে, এটি যদি কিছু না পায় তবে এটি যে সতর্কতাটি দেখছে তা লগ করে
কোন ম্যাপিং URI এর মাধ্যমে HTTP অনুরোধ জন্য পাওয়া যায় [/some/path]যে DispatcherServletনাম SomeName সঙ্গে
এবং হয় একটি নিক্ষেপNoHandlerFoundException বা অবিলম্বে 404 পাওয়া যায়নি স্থিতি কোড দিয়ে প্রতিক্রিয়া প্রকাশ করে comm
কেন খুঁজে পেলাম না DispatcherServletএকটিHandlerMapping যে আমার অনুরোধ হ্যান্ডেল করতে পারে?
সর্বাধিক সাধারণ HandlerMappingবাস্তবায়ন হ'ল RequestMappingHandlerMapping, যা শিমকে হ্যান্ডলার @Controllerহিসাবে নিবন্ধিত করে (সত্যই তাদের @RequestMappingবর্ণিত পদ্ধতিগুলি)। আপনি নিজেই এই ধরণের শিমটি নিজেই ঘোষণা করতে পারেন ( @Beanবা <bean>বা অন্য যন্ত্রে) বা আপনি অন্তর্নির্মিত বিকল্পগুলি ব্যবহার করতে পারেন । এইগুলো:
@Configurationদিয়ে আপনার ক্লাসটি টিকিয়ে দিন @EnableWebMvc।
<mvc:annotation-driven />আপনার এক্সএমএল কনফিগারেশনে কোনও সদস্য ঘোষণা করুন।
উপরের লিঙ্কটির বর্ণনা হিসাবে, এই দু'টিই RequestMappingHandlerMappingশিম (এবং অন্যান্য সামগ্রীর একগুচ্ছ) নিবন্ধভুক্ত করবে । যাইহোক, HandlerMappingএকটি হ্যান্ডলার ছাড়া খুব দরকারী নয়। RequestMappingHandlerMappingকিছু @Controllerমটরশুটি প্রত্যাশা করে তাই আপনার @Beanজাভা কনফিগারেশনের পদ্ধতিগুলির মাধ্যমে বা <bean>এক্সএমএল কনফিগারেশনে ঘোষণাপত্রের মাধ্যমে বা @Controllerউভয়টিতে এনোটোটেড ক্লাসগুলির উপাদান স্ক্যানিংয়ের মাধ্যমে আপনার সেগুলিও ঘোষণা করতে হবে। নিশ্চিত করুন যে এই মটরশুটি উপস্থিত রয়েছে।
যদি আপনি সতর্কতা বার্তা এবং একটি 404 পেয়ে থাকেন এবং আপনি উপরের সমস্তটি সঠিকভাবে কনফিগার করেছেন, তবে আপনি আপনার অনুরোধটি ভুল ইউআরআই-তে প্রেরণ করছেন , এটি সনাক্তকরণযুক্ত @RequestMappingএনোটোটেড হ্যান্ডলার পদ্ধতির দ্বারা পরিচালিত নয় ।
spring-webmvcঅন্যান্য গ্রন্থাগার অফার বিল্ট-ইন HandlerMappingবাস্তবায়নের। উদাহরণস্বরূপ, BeanNameUrlHandlerMappingমানচিত্র
URL গুলি থেকে মটরশুটি পর্যন্ত নামের সাথে স্ল্যাশ ("/") দিয়ে শুরু হয়
এবং আপনি সর্বদা আপনার নিজের লিখতে পারেন। স্পষ্টতই, আপনাকে নিশ্চিত করতে হবে যে আপনি যে অনুরোধটি পাঠাচ্ছেন তা নিবন্ধিত HandlerMappingঅবজেক্টের হ্যান্ডলারের অন্তত একটির সাথে মেলে ।
আপনি যদি স্পষ্টভাবে বা স্পষ্টভাবে কোনও HandlerMappingমটরশুটি (বা detectAllHandlerMappingsহয় true) DispatcherServletনিবন্ধন না করেন তবে কিছু ডিফল্ট নিবন্ধভুক্ত করুন । এগুলি শ্রেণীর DispatcherServlet.propertiesমতো একই প্যাকেজে সংজ্ঞায়িত হয় DispatcherServlet। এগুলি BeanNameUrlHandlerMappingএবং DefaultAnnotationHandlerMapping(যা অনুরূপ RequestMappingHandlerMappingতবে অবনমিত)।
ডিবাগিং
স্প্রিং এমভিসি এর মাধ্যমে নিবন্ধিত হ্যান্ডলারদের লগ করবে RequestMappingHandlerMapping। যেমন একটি @Controllerমত
@Controller
public class ExampleController {
@RequestMapping(path = "/example", method = RequestMethod.GET, headers = "X-Custom")
public String example() {
return "example-view-name";
}
}
INFO পর্যায়ে নিম্নলিখিত লগ ইন করবে
Mapped "{[/example],methods=[GET],headers=[X-Custom]}" onto public java.lang.String com.spring.servlet.ExampleController.example()
এটি নিবন্ধিত ম্যাপিং বর্ণনা করে। যখন আপনি কোনও হ্যান্ডলার খুঁজে পাওয়া যায়নি এমন সতর্কতাটি দেখেন, বার্তায় থাকা ইউআরআইকে এখানে তালিকাবদ্ধ ম্যাপিংয়ের সাথে তুলনা করুন। @RequestMappingহ্যান্ডলারটি নির্বাচন করতে স্প্রিং এমভিসির পক্ষে অবশ্যই নির্দিষ্ট করা সমস্ত বিধিনিষেধের সাথে মেলে।
অন্যান্য HandlerMappingবাস্তবায়নগুলি তাদের নিজস্ব বিবৃতি লগ করে যা তাদের ম্যাপিং এবং তাদের সম্পর্কিত হ্যান্ডলারগুলিতে ইঙ্গিত দেওয়া উচিত।
একইভাবে, কোন সিমের স্প্রিং রেজিস্টারগুলি তা দেখতে ডিইবিইউজি স্তরে স্প্রিং লগিং সক্ষম করুন। এটি কোন এনोटেটেড ক্লাসগুলি খুঁজে পেয়েছে, কোনটি প্যাকেজগুলি স্ক্যান করে, এবং কোনটি শিমটি শুরু করে তা রিপোর্ট করা উচিত। আপনি যা প্রত্যাশা করেছেন তা উপস্থিত না থাকলে আপনার ApplicationContextকনফিগারেশনটি পর্যালোচনা করুন ।
অন্যান্য সাধারণ ভুল
এ DispatcherServletকেবল একটি সাধারণ জাভা ইই Servlet। আপনি এটিকে আপনার আদর্শ <web.xml> <servlet-class>এবং <servlet-mapping>ঘোষণার সাথে রেজিস্ট্রেশন করুন , বা সরাসরি ServletContext#addServletএকটি মাধ্যমে WebApplicationInitializerবা স্প্রিং বুটের যে কোনও প্রক্রিয়া ব্যবহার করে। যেমন, আপনাকে সার্ভলেট নির্দিষ্টকরণে নির্দিষ্ট ইউআরএল ম্যাপিং যুক্তির উপর নির্ভর করতে হবে , অধ্যায় 12 দেখুন also আরও দেখুন
এই বিষয়টি মনে রেখে, একটি সাধারণ ভুল হ'ল একটি হ্যান্ডলার পদ্ধতি থেকে একটি ভিউয়ের নাম ফিরিয়ে দেওয়া এবং কোনও জেএসপি রেন্ডার হওয়ার প্রত্যাশা করে DispatcherServletইউআরএল ম্যাপিংয়ের মাধ্যমে নিবন্ধন করা। উদাহরণস্বরূপ, যেমন একটি হ্যান্ডলার পদ্ধতি বিবেচনা করুন/*@RequestMapping
@RequestMapping(path = "/example", method = RequestMethod.GET)
public String example() {
return "example-view-name";
}
একটি সঙ্গে InternalResourceViewResolver
@Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver vr = new InternalResourceViewResolver();
vr.setPrefix("/WEB-INF/jsps/");
vr.setSuffix(".jsp");
return vr;
}
আপনি অনুরোধটি কোনও জেএসপি রিসোর্সে পাঠানোর জন্য আশা করতে পারেন /WEB-INF/jsps/example-view-name.jsp। এটি হবে না। পরিবর্তে, একটি প্রেক্ষাপটে নাম অভিমানী Example, DisaptcherServletরিপোর্ট হবে
ইউআরআই- [/Example/WEB-INF/jsps/example-view-name.jsp]এর DispatcherServletসাথে 'প্রেরণকারী' নামের সাথে এইচটিটিপি অনুরোধের জন্য কোনও ম্যাপিং পাওয়া যায়নি
কারণ DispatcherServletম্যাপ করা হয় /*এবং /*সবকিছু মিলে যায় (সঠিক মিল, যা উচ্চ অগ্রাধিকার আছে ব্যতীত), DispatcherServletহ্যান্ডেল করতে বেছে নেওয়া হবে forwardথেকে JstlView(দ্বারা ফিরে InternalResourceViewResolver)। প্রায় প্রতিটি ক্ষেত্রেই, এই DispatcherServletজাতীয় অনুরোধটি পরিচালনা করতে কনফিগার করা হবে না ।
পরিবর্তে, এই সরল ক্ষেত্রে, আপনি রেজিস্টার করা উচিত DispatcherServletকরতে /, ডিফল্ট সার্ভলেট যেমন উপলক্ষে। একটি অনুরোধের জন্য ডিফল্ট সার্লেটটি সর্বশেষ ম্যাচ। এটি ডিফল্ট সার্লেটের সাহায্যে চেষ্টা করার আগে আপনার সাধারণ সার্লেট কন্টেইনারটিকে *.jspজেএসপি রিসোর্স (উদাহরণস্বরূপ, টমক্যাট রয়েছে JspServlet) হ্যান্ডেল করার জন্য ম্যাপযুক্ত একটি অভ্যন্তরীণ সার্লেট বাস্তবায়ন বেছে নেবে।
আপনি আপনার উদাহরণে এটি দেখতে পাচ্ছেন।