আপনার স্ট্যান্ডার্ড স্প্রিং এমভিসি অ্যাপ্লিকেশনটি এ এর মাধ্যমে সমস্ত অনুরোধগুলি সরবরাহ করবে 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
) হ্যান্ডেল করার জন্য ম্যাপযুক্ত একটি অভ্যন্তরীণ সার্লেট বাস্তবায়ন বেছে নেবে।
আপনি আপনার উদাহরণে এটি দেখতে পাচ্ছেন।