2013-02-21 9 views
30

In einer typischen Web-App Spring MVC, würden Sie die DispatcherServlet in web.xml wie soSpring MVC und Servlets 3.0 - Brauchen Sie noch 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> 

Zusammen mit Hörern, Filter usw.

Mit Servlet-API 3.0 erklären Sie Servlets erklären können die Annotation @WebServlet anstatt sie zu Ihrer web.xml hinzuzufügen. Spring 3.2 hat bereits @Configuration und @EnableXYZ für seine Kontextkonfiguration. Hat es etwas ähnliches für die DispatcherServlet, dh. Gibt es eine Möglichkeit, Ihre vollständige Spring-Anwendung ohne XML zu konfigurieren?

Antwort

40

Mit JEE6, wenn Ihre Anwendung Container Servlet 3.0 bereit, was Sie tun müssen, ist:

  1. Erstellen Sie eine benutzerdefinierte Klasse, die ServletContainerInitializer (dh com.foo.FooServletContainer)
  2. Erstellen Sie eine Datei in Ihrem META-INF/services Ordner implementiert benannt javax.servlet.ServletContainerInitializer, die den Namen der Implementierung oben (com.foo.FooServletContainer)

Feder 3 gebündelt mit einer Klasseenthält benannt, das die obigen Schritte implementiert (Sie müssen also die Datei nicht in META-INF/services erstellen. Diese Klasse ruft nur eine Implementierung von WebApplicationInitializer auf. Sie müssen also nur eine Klasse bereitstellen, die es in Ihrem Klassenpfad implementiert (der folgende Code stammt aus dem obigen Dokument).

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("/"); 
    } 
} 

dass es für die web.xml Sache ist, aber Sie müssen die Webapp mit @Configuration, konfigurieren @EnableWebMvc etc ..

+0

Die Tatsache, dass Sie noch etwas setzen müssen in META-INF ist irgendwie nervig, aber ich werde es versuchen. –

+8

Sie müssen nicht, wenn Sie "Spring" verwenden, da Spring bereits die Datei bereitstellt, die auf "SpringServletContainerInitializer" verweist, die Ihre Klasse "FooInitializer" aufrufen wird. Ich habe das "META-INF /" erklärt, damit Sie verstehen, wie es unter dem Deckblatt funktioniert. (Ich habe die obige Antwort bearbeitet, weil sie vielleicht nicht klar war) – Alex

+0

Ihre Erklärung war ausgezeichnet. –

1

Ja Sie nicht web.xml benötigen eine Webapp Servlets 3.0+ bis zur Inbetriebnahme. Wie bereits erwähnt, können Sie WebApplicationInitializer Klasse implementieren und onStartup() Methode überschreiben. WebApplicationInitializer ist eine von Spring MVC bereitgestellte Schnittstelle, die dafür sorgt, dass Ihre Implementierung erkannt und automatisch zur Initialisierung eines Servlet 3-Containers verwendet wird.

Gibt es eine Möglichkeit, Ihre vollständige Spring-Anwendung ohne XML zu konfigurieren?

Hinzufügen dieser Antwort, nur um einen anderen Weg hinzuzufügen. Sie müssen WebApplicationInitializer nicht implementieren. Eine abstrakte Basisklassenimplementierung von WebApplicationInitializer genannt AbstractDispatcherServletInitializer macht es noch einfacher, die DispatcherServlet zu registrieren, indem Sie einfach Methoden Überschreiben der Servletzuordnung und die Position der DispatcherServlet Konfiguration angeben -

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[] { "/" }; 
    } 

} 
Verwandte Themen