2013-02-21 73 views
30

एक ठेठ वसंत MVC वेब अनुप्रयोग में, आप तोस्प्रिंग एमवीसी और सर्वलेट 3.0 - क्या आपको अभी भी web.xml की आवश्यकता है?

<!-- MVC Servlet --> 
<servlet> 
    <servlet-name>sample</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
<load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>sample</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

श्रोताओं, फिल्टर के साथ की तरह web.xml में DispatcherServlet घोषणा करेंगे, आदि

सर्वलेट-api 3.0 के साथ

, आप के साथ अपने सर्वलेट्स घोषणा कर सकते हैं एनोटेशन @WebServlet उन्हें अपने web.xml में जोड़ने के बजाय। इसके संदर्भ विन्यास के लिए स्प्रिंग 3.2 में पहले से ही @Configuration और @EnableXYZ है। क्या इसमें DispatcherServlet, यानी कुछ समान है। क्या आपके पूर्ण स्प्रिंग एप्लिकेशन को किसी भी XML के बिना कॉन्फ़िगर करने का कोई तरीका है?

उत्तर

40
JEE6 साथ

, आपके आवेदन कंटेनर सर्वलेट है अगर 3.0 तैयार है कि आप क्या करने की आवश्यकता है:

  1. कि ServletContainerInitializer (यानी com.foo.FooServletContainer)
  2. लागू करता नामित अपने META-INF/services फ़ोल्डर में एक फ़ाइल बनाएँ एक कस्टम कक्षा बनाएं javax.servlet.ServletContainerInitializer जो ऊपर (com.foo.FooServletContainer)

स्प्रिंग 3 अपने कार्यान्वयन के नाम शामिल होंगेनाम के एक वर्ग के साथ आता हैजो ऊपर की सामग्री लागू करता है (इसलिए आपको META-INF/services में फ़ाइल बनाने की आवश्यकता नहीं है। यह वर्ग सिर्फ WebApplicationInitializer के कार्यान्वयन को कॉल करता है। तो आपको बस अपने क्लासपाथ में इसे लागू करने वाली एक कक्षा प्रदान करने की आवश्यकता है (निम्नलिखित कोड उपरोक्त दस्तावेज़ से लिया गया है)।

public class FooInitializer implements WebApplicationInitializer { 
    @Override 
    public void onStartup(ServletContext servletContext) { 
     WebApplicationContext appContext = ...; 

     ServletRegistration.Dynamic dispatcher = 
      container.addServlet("dispatcher", new DispatcherServlet(appContext)); 
     dispatcher.setLoadOnStartup(1); 
     dispatcher.addMapping("/"); 
    } 
} 

यह web.xml बात के लिए है कि, लेकिन आप @Configuration, @EnableWebMvc आदि का उपयोग webapp विन्यस्त करने की जरूरत ..

+0

तथ्य यह है कि आप अभी भी में कुछ डाल करने के लिए की जरूरत है - WebApplicationInitializer का एक सार आधार वर्ग कार्यान्वयन AbstractDispatcherServletInitializer नामित यह और भी आसान बस सर्वलेट मानचित्रण और DispatcherServlet विन्यास का स्थान निर्दिष्ट करने के तरीकों अधिभावी द्वारा DispatcherServlet रजिस्टर करने के लिए बनाता है मेटा-आईएनएफ बहुत परेशान है, लेकिन मैं कोशिश करूँगा। –

+8

यदि आप 'वसंत' का उपयोग कर रहे हैं, तो आपको इसकी आवश्यकता नहीं है, क्योंकि वसंत पहले से ही फ़ाइल प्रदान करता है जो 'SpringServletContainerInitializer' का संदर्भ देता है जो आपके' FooInitializer' क्लास को कॉल करेगा। मैंने 'मेटा-आईएनएफ /' समझाया ताकि आप समझ सकें कि यह कवर के तहत कैसे काम करता है। (मैंने ऊपर दिए गए उत्तर को संपादित किया क्योंकि यह शायद स्पष्ट नहीं था) – Alex

+0

आपकी व्याख्या उत्कृष्ट थी। –

1

हाँ आप web.xml की जरूरत नहीं अपने webapp सर्वलेट 3.0+ शुरूआत करने के लिए है। जैसा कि एलेक्स ने पहले ही उल्लेख किया है कि आप WebApplicationInitializer कक्षा को कार्यान्वित कर सकते हैं और onStartup() विधि ओवरराइड कर सकते हैं। WebApplicationInitializer स्प्रिंग एमवीसी द्वारा प्रदान किया गया एक इंटरफ़ेस है जो सुनिश्चित करता है कि आपका कार्यान्वयन पता चला है और स्वचालित रूप से किसी भी सर्वलेट 3 कंटेनर को प्रारंभ करने के लिए उपयोग किया जाता है।

वहाँ किसी भी एक्सएमएल के बिना अपना पूरा स्प्रिंग एप्लिकेशन को कॉन्फ़िगर करने के लिए एक रास्ता है?

इस उत्तर को जोड़ने का एक और तरीका जोड़ने के लिए। आपको WebApplicationInitializer को लागू करने की आवश्यकता नहीं है।

public class MyWebAppInitializer extends AbstractDispatcherServletInitializer { 

    @Override 
    protected WebApplicationContext createRootApplicationContext() { 
     return null; 
    } 

    @Override 
    protected WebApplicationContext createServletApplicationContext() { 
     XmlWebApplicationContext cxt = new XmlWebApplicationContext(); 
     cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml"); 
     return cxt; 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[] { "/" }; 
    } 

}