2011-01-07 18 views
12

में डिफ़ॉल्ट-सर्वलेट-हैंडलर कहां डालें, मेरे web.xml में, डिफ़ॉल्ट सर्वलेट मैपिंग, यानी /, स्प्रिंग प्रेषक के लिए मैप किया गया है। मेरे स्प्रिंग डिस्पैचर कॉन्फ़िगरेशन में, मेरे पास DefaultAnnotationHandlerMapping, ControllerClassNameHandlerMapping और AnnotationMethodHandlerAdapter है जो मुझे अपने वर्ग के नाम या @Requestmapping एनोटेशन द्वारा नियंत्रकों को यूआरएल मैप करने की अनुमति देता है। हालांकि, वेब रूट के तहत कुछ स्थिर संसाधन हैं जो मैं वसंत प्रेषक को डिफ़ॉल्ट सर्वलेट का उपयोग करने के लिए भी सेवा देना चाहता हूं। Spring documentation के अनुसार, यह <mvc:default-servlet-handler/> टैग का उपयोग कर किया जा सकता है।स्प्रिंग एमवीसी कॉन्फ़िगरेशन

नीचे दिए गए कॉन्फ़िगरेशन में, 4 उम्मीदवार स्थान हैं जिन्हें मैंने चिह्नित किया है जो इस टैग को सम्मिलित करना संभव है।

केस 1: अलग स्थान में टैग डालते डिस्पैचर निम्नलिखित के रूप में अलग ढंग से व्यवहार करने का कारण बनता है, तो मैं स्थान 1 में डालने, डिस्पैचर अब @RequestMapping और नियंत्रक वर्ग के नाम से मानचित्रण संभाल करने में सक्षम हो जाएगा लेकिन यह सामान्य रूप से स्थैतिक सामग्री की सेवा करेगा।

कैस 2, 3: यह @RequestMapping और नियंत्रक वर्ग के नाम से मैपिंग को संभालने में सक्षम होगा और साथ ही साथ अन्य मैपिंग सफलतापूर्वक नहीं किया जा सकता है, तो स्थिर सामग्री की सेवा करने में सक्षम हो जाएगा।

केस 4: यह स्थिर सामग्री की सेवा करने में सक्षम नहीं होगा।निष्कासन नोट: नियंत्रक को कार्यान्वित करते समय यह एक बग था जिसमें /** पर मैप किए गए विधि हैं लेकिन नियंत्रक वर्ग नाम पर स्पष्ट अनुरोध मैपिंग नहीं है।

इसलिए, केस 2 और वांछनीय प्रलेखन वसंत के .according कर रहे हैं, इस टैग हैंडलर जो पूर्वता क्रम सबसे कम तो क्यों स्थिति मामलों को दिया जाता है कॉन्फ़िगर करता है? और इस टैग को रखने के लिए सबसे अच्छी स्थिति कौन सा है?

<?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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 

    <context:annotation-config/> 
    <context:component-scan base-package="webapp.controller"/> 
    <!-- Location 1 --> 

    <!-- Enable annotation-based controllers using @Controller annotations --> 
    <bean id="annotationUrlMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> 

    <!-- Location 2 --> 
    <bean id="controllerClassNameHandlerMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/> 

    <!-- Location 3 --> 
    <bean id="annotationMethodHandlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> 

    <!-- Location 4 --> 
    <mvc:default-servlet-handler/> 

    <!-- All views are JSPs loaded from /WEB-INF/jsp --> 
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
     <property name="prefix" value="/WEB-INF/jsp/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 
</beans> 

उत्तर

9

डिफ़ॉल्ट रूप से, वसंत HandlerMapping के Integer.MAX_VALUE के क्रम का मान सेट करता है जो सबसे कम प्राथमिकता आदेश देता है। जब प्रेषक कॉन्फ़िगरेशन पहली बार लोड होता है, DispatcherServletHandlerMapping की सूची को सॉर्ट करने के लिए इस मान का उपयोग करेगा।

यदि आदेश का स्पष्ट मूल्य सेट नहीं है, तो सभी हैंडलर मैपिंग ऑब्जेक्ट का Integer.MAX_VALUE का एक ही क्रम होगा। इस प्रकार, सॉर्टिंग के बाद, हैंडलर मैपिंग का क्रम बीन्स परिभाषाओं के क्रम के समान ही रहेगा।[यह प्रेषक के कार्यान्वयन में एक बग की तरह लगता है]

इसलिए, यदि हैंडलर मैपिंग के ऑर्डर वैल्यू स्पष्ट रूप से सेट हैं, तो <mvc:default-servlet-handler/> टैग को बीन परिभाषा में कहीं भी सुरक्षित रखना सुरक्षित है।

यहाँ उदाहरण है:

<?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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 
    <context:annotation-config/> 
    <context:component-scan base-package="webapp.controller"/> 

    <mvc:default-servlet-handler /> 

    <!-- Enable annotation-based controllers using @Controller annotations --> 
    <bean id="annotationUrlMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
     <property name="order" value="0" /> 
    </bean> 

    <bean id="controllerClassNameHandlerMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"> 
     <property name="order" value="1" /> 
    </bean> 

    <bean id="annotationMethodHandlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> 

    <!-- All views are JSPs loaded from /WEB-INF/jsp --> 
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
     <property name="prefix" value="/WEB-INF/jsp/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 
</beans> 
2

मुझे लगता है कि यह दस्तावेज़ीकरण में खराब शब्द के नीचे है।

यह "/**"

का URL मानचित्रण (एक न्यूनतम पूर्वता आदेश दिया गया है) मैं इस का मतलब है आप यह एक कम पूर्वता आदेश देना चाहिए लगता है के साथ एक DefaultServletHttpRequestHandler कॉन्फ़िगर करता है, और नहीं है कि वसंत करना होगा यह स्वचालित रूप से

मुझे समझ में नहीं आ रहा है कि इसे स्थान 4 पर क्यों डालना काम नहीं करता है, हालांकि, मुझे स्थान 4 और स्थान 3 के बीच कोई अंतर नहीं दिखता है - हैंडलर एडाप्टर को मैपिंग प्राथमिकता में हस्तक्षेप नहीं करना चाहिए।

+0

लेकिन आप इस टैग के माध्यम से इस मानचित्रण का क्रम निर्धारित नहीं कर सकते। – gigadot

+0

@ गीगाडॉट: आदेश बीन परिभाषाओं के क्रम में अंतर्निहित है। – skaffman

+0

आप इस बारे में सही हैं कि स्थान 3 और 4 के बीच कोई अलग नहीं है। मैंने प्रश्न और उत्तर अपडेट किया है। स्प्रिंग हैंडलर मैपिंग को सबसे कम प्राथमिकता आदेश देता है जिसे 'एमवीसी: डिफॉल्ट-सर्वलेट-हैंडलर' टैग द्वारा कॉन्फ़िगर किया गया है लेकिन यह स्पष्ट मान सेट नहीं होने पर अन्य हैंडलर मैपिंग के लिए भी वही मान देता है। बीटीडब्ल्यू, आपकी प्रतिक्रिया के लिए धन्यवाद। – gigadot

संबंधित मुद्दे