web.xml vs Initializer mit Spring

1. Überblick

In diesem Artikel werden drei verschiedene Ansätze zum Konfigurieren eines DispatcherServlet beschrieben, die in den neuesten Versionen des Spring Framework verfügbar sind:

  1. Wir beginnen mit einer XML -Konfiguration und einer web.xml -Datei

  2. Dann migrieren wir die Servlet-Deklaration aus der Datei web.xml nach

Java config, aber wir lassen alle anderen Konfigurationen in XML . Im dritten und letzten Schritt des Refactorings haben wir eine

100% Java-konfiguriertes Projekt

2. Das DispatcherServlet

Eines der Kernkonzepte von Spring MVC ist das DispatcherServlet . Die http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/DispatcherServlet.html () Dokumentation definiert dies als

Ein zentraler Dispatcher für HTTP-Request-Handler/-Controller, z. für Web-UI-Controller oder HTTP-basierte Remote-Service-Exporter. Versendet an registrierte Handler zur Verarbeitung einer Webanforderung und bietet komfortable Karten- und Ausnahmebehandlungsfunktionen.

Grundsätzlich ist das DispatcherServlet der Einstiegspunkt jeder Spring-MVC -Anwendung. Ihr Zweck ist es, HTTP -Anforderungen abzufangen und sie an die richtige Komponente zu senden, die wissen wird, wie sie damit umgehen soll.

=== 3. Konfiguration mit web.xml

Wenn Sie mit älteren Spring -Projekten arbeiten, ist es sehr üblich, die XML -Konfiguration zu finden. Bis Spring 3.1 konnte die Konfiguration des DispatcherServlet nur mit der Datei WEB-INF/web.xml vorgenommen werden. In diesem Fall sind zwei Schritte erforderlich.

Sehen wir uns ein Beispiel an - der erste Schritt ist die Servlet-Deklaration:

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/dispatcher-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

Mit diesem Block von XML deklarieren wir ein Servlet, das:

  1. Heißt " dispatcher "

  2. Ist eine Instanz von org.springframework.web.servlet.DispatcherServlet

  3. Wird mit einem Parameter namens contextConfigLocation initialisiert

welche enthält den Pfad zur Konfiguration XML

load-on-startup ist ein ganzzahliger Wert, der die Reihenfolge für das Laden mehrerer Servlets angibt. Wenn Sie also mehr als ein Servlet deklarieren müssen, können Sie festlegen, in welcher Reihenfolge sie initialisiert werden. Mit niedrigerer Ganzzahl gekennzeichnete Servlets werden vor Servlets mit höheren Ganzzahlen geladen.

Nun ist unser Servlet konfiguriert. Im zweiten Schritt wird ein servlet-mapping deklariert:

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

Beim Servlet-Mapping binden wir es durch seinen Namen an ein URL pattern , das angibt, welche HTTP -Anforderungen von ihm verarbeitet werden.

=== 4. Hybridkonfiguration

Mit der Übernahme der Version 3.0 von Servlet APIs ist die Datei web.xml optional geworden, und wir können Java jetzt zum Konfigurieren des DispatcherServlet verwenden.

Wir können ein Servlet registrieren, das einen WebApplicationInitializer implementiert.

Dies ist das Äquivalent der obigen XML -Konfiguration:

public class MyWebAppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext container) {
        XmlWebApplicationContext context = new XmlWebApplicationContext();
        context.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");

        ServletRegistration.Dynamic dispatcher = container
          .addServlet("dispatcher", new DispatcherServlet(context));

        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }
}

In diesem Beispiel sind wir:

  1. Implementierung der WebApplicationInitializer -Schnittstelle

  2. Durch das Überschreiben der onStartup -Methode erstellen wir eine neue

XmlWebApplicationContext wurde mit der gleichen Datei konfiguriert, die als übergeben wird contextConfigLocation an das Servlet im XML -Beispiel . Dann erstellen wir eine Instanz von DispatcherServlet mit dem neuen

Kontext, den wir gerade instanziiert haben . Und schließlich registrieren wir das Servlet mit einem Mapping URL

Muster

Also haben wir Java verwendet, um das Servlet zu deklarieren und an ein URL-Mapping zu binden. Die Konfiguration wurde jedoch in einer separaten XML -Datei gespeichert:

dispatcher-config.xml .

=== 5. 100% Java Konfiguration

Bei diesem Ansatz wird unser Servlet in Java _, deklariert, wir benötigen jedoch noch eine XML -Datei, um es zu konfigurieren. Mit WebApplicationInitializer können Sie eine 100% Java_ -Konfiguration erreichen.

Mal sehen, wie wir das vorherige Beispiel umgestalten können.

Als erstes müssen wir den Anwendungskontext für das Servlet erstellen.

Dieses Mal verwenden wir einen auf Annotationen basierenden Kontext, sodass wir Java und Annotationen für die Konfiguration verwenden können und keine XML -Dateien wie dispatcher-config.xml benötigen:

AnnotationConfigWebApplicationContext context
  = new AnnotationConfigWebApplicationContext();

Dieser Kontext kann dann konfiguriert werden, indem eine Konfigurationsklasse registriert wird:

context.register(AppConfig.class);

Oder legen Sie ein gesamtes Paket fest, das nach Konfigurationsklassen durchsucht wird:

context.setConfigLocation("com.example.app.config");

Jetzt, da unser Anwendungskontext erstellt wurde, können wir dem ServletContext einen Listener hinzufügen, der den Kontext lädt:

container.addListener(new ContextLoaderListener(context));

Der nächste Schritt ist das Erstellen und Registrieren unseres Dispatcher-Servlets:

ServletRegistration.Dynamic dispatcher = container
  .addServlet("dispatcher", new DispatcherServlet(context));

dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");

Nun sollte unser WebApplicationInitializer so aussehen:

public class MyWebAppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext container) {
        AnnotationConfigWebApplicationContext context
          = new AnnotationConfigWebApplicationContext();
        context.setConfigLocation("com.example.app.config");

        container.addListener(new ContextLoaderListener(context));

        ServletRegistration.Dynamic dispatcher = container
          .addServlet("dispatcher", new DispatcherServlet(context));

        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }
}

Java und Anmerkungskonfiguration bietet viele Vorteile. Normalerweise führt dies zu kürzeren und präziseren Konfigurationen. Anmerkungen bieten mehr Kontext für Deklarationen, da sie gemeinsam mit dem von ihnen konfigurierten Code platziert werden.

Dies ist jedoch nicht immer ein bevorzugter oder sogar möglicher Weg. Einige Entwickler ziehen es beispielsweise vor, Code und Konfiguration getrennt zu halten, oder Sie müssen mit Code von Drittanbietern arbeiten, den Sie nicht ändern können.

=== 6. Fazit

In diesem Artikel haben wir verschiedene Möglichkeiten beschrieben, ein DispatcherServlet in Spring 3.2 + zu konfigurieren, und es liegt an Ihnen, zu entscheiden, welches Sie verwenden möchten. Spring passt sich Ihrer Entscheidung an.

Den Quellcode aus diesem Artikel finden Sie auf Github https://github.com/eugenp/tutorials/tree/master/spring-mvc-javaglich ]und hier .