web.xml vs Initializer mit Spring

1. Übersicht

In diesem Artikel werden drei verschiedene Ansätze zum Konfigurieren eines DispatcherServlets behandelt, die in neueren Versionen des Spring Framework verfügbar sind :

  1. Wir beginnen mit einer XML- Konfiguration und einer web.xml- Datei
  2. Anschließend migrieren wir die Servlet-Deklaration aus der Datei web.xml in die Java-Konfiguration, belassen jedoch jede andere Konfiguration in XML
  3. Im dritten und letzten Schritt des Refactorings haben wir schließlich ein 100% Java-konfiguriertes Projekt

2. Das DispatcherServlet

Eines der Kernkonzepte von Spring MVC ist das DispatcherServlet . Die Spring-Dokumentation definiert es als:

Ein zentraler Dispatcher für HTTP-Anforderungshandler / -controller, z. B. für Web-UI-Controller oder HTTP-basierte Remote-Service-Exporteure. Versendungen an registrierte Handler zur Verarbeitung einer Webanforderung, die bequeme Funktionen für die Zuordnung und Ausnahmebehandlung bieten.

Grundsätzlich ist das DispatcherServlet der Einstiegspunkt jeder Spring MVC- Anwendung. Der Zweck besteht darin, HTTP- Anforderungen abzufangen und an die richtige Komponente zu senden, die weiß, wie sie zu behandeln ist.

3. Konfiguration mit w eb.xml

Wenn Sie mit Legacy beschäftigen Frühling Projekten ist es sehr häufig zu finden XML - Konfiguration und bis Frühling 3.1 die einzige Möglichkeit , das konfigurieren DispatcherServlet war mit der WEB-INF / web.xml Datei. In diesem Fall sind zwei Schritte erforderlich.

Sehen wir uns eine Beispielkonfiguration an - der erste Schritt ist die Servlet-Deklaration:

 dispatcher  org.springframework.web.servlet.DispatcherServlet   contextConfigLocation /WEB-INF/spring/dispatcher-config.xml  1 

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

  1. Wird " Dispatcher " genannt
  2. Ist eine Instanz von org.springframework.web.servlet.DispatcherServlet
  3. Wird mit einem Parameter namens contextConfigLocation initialisiert, der den Pfad zum Konfigurations- XML enthält

Load-on-Startup ist ein ganzzahliger Wert, der die Reihenfolge angibt, in der mehrere Servlets geladen werden sollen. Wenn Sie also mehr als ein Servlet deklarieren müssen, können Sie festlegen, in welcher Reihenfolge diese initialisiert werden. Mit niedrigeren Ganzzahlen gekennzeichnete Servlets werden vor Servlets mit höheren Ganzzahlen geladen.

Jetzt ist unser Servlet konfiguriert. Der zweite Schritt ist das Deklarieren einer Servlet-Zuordnung :

 dispatcher / 

Mit der Servlet-Zuordnung binden wir sie durch ihren Namen an ein URL- Muster , das angibt, welche HTTP- Anforderungen von ihr verarbeitet werden.

4. Hybridkonfiguration

Mit der Einführung der Version 3.0 der Servlet-APIs ist die Datei web.xml optional geworden, und wir können jetzt das DispatcherServlet mit Java konfigurieren .

Wir können ein Servlet registrieren, das einen WebApplicationInitializer implementiert . Dies entspricht 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. Implementieren der WebApplicationInitializer- Schnittstelle
  2. Beim Überschreiben der onStartup- Methode erstellen wir einen neuen XmlWebApplicationContext , der mit derselben Datei konfiguriert ist , die im XML- Beispiel als contextConfigLocation an das Servlet übergeben wird
  3. Dann erstellen wir eine Instanz von DispatcherServlet mit dem neuen Kontext, den wir gerade instanziiert haben
  4. Und schließlich registrieren wir das Servlet mit einem Mapping- URL- Muster

Wir haben Java verwendet , um das Servlet zu deklarieren und an eine URL-Zuordnung zu binden, aber wir haben die Konfiguration in einer separaten XML- Datei gespeichert: dispatcher-config.xml .

5. 100% Java- Konfiguration

Bei diesem Ansatz wird unser Servlet in Java deklariert , aber wir benötigen 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 werden wir einen annotationsbasierten Kontext verwenden, damit wir Java und Annotationen für die Konfiguration verwenden und die Notwendigkeit von XML- Dateien wie dispatcher-config.xml beseitigen können :

AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();

Diese Art von 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");

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

Jetzt sollte unser WebApplicationInitializer folgendermaßen 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 and annotation configuration offers many advantages. Usually it leads to shorter and more concise configuration and annotations provide more context to declarations, as it's co-located with the code that they configure.

But this is not always a preferable or even possible way. For example some developers may prefer keeping their code and configuration separated, or you may need to work with third party code that you can't modify.

6. Conclusion

In this article we covered different ways to configure a DispatcherServlet in Spring 3.2+ and it's up to you to decide which one to use based on your preferences. Spring will accommodate to your decision whatever you choose.

You can find the source code from this article on Github here and here.