web.xml vs Initializer avec Spring

1. Vue d’ensemble

Dans cet article, nous aborderons trois approches différentes de la configuration d’un DispatcherServlet disponible dans les versions récentes du Spring Framework:

  1. Nous allons commencer avec une configuration XML et un fichier web.xml

  2. Ensuite, nous allons migrer la déclaration Servlet du fichier web.xml vers

Java, mais nous laisserons toute autre configuration dans XML . Enfin, dans la troisième et dernière étape de la refactorisation, nous aurons un

Projet 100% configuré en Java

2. Le DispatcherServlet

L’un des concepts clés de Spring MVC est le DispatcherServlet . Le document Spring le définit comme suit:

__ Un répartiteur central pour les gestionnaires/contrôleurs de demandes HTTP, par ex. pour les contrôleurs d’interface utilisateur Web ou les exportateurs de services distants basés sur HTTP. Envoi aux gestionnaires enregistrés pour le traitement d’une demande Web, offrant des fonctions pratiques de mappage et de traitement des exceptions.

Fondamentalement, DispatcherServlet est le point d’entrée de chaque application MVC Spring. Son but est d’intercepter les requêtes HTTP et de les envoyer au bon composant qui saura le gérer.

=== 3. Configuration avec web.xml

Si vous traitez avec des projets Spring hérités, il est très courant de trouver la configuration XML et, jusqu’à Spring 3.1, le seul moyen de configurer le DispatcherServlet était avec le fichier WEB-INF/web.xml . Dans ce cas, deux étapes sont nécessaires.

Voyons un exemple de configuration - la première étape est la déclaration Servlet:

<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>

Avec ce bloc de XML , nous déclarons un servlet qui:

  1. Est nommé " dispatcher "

  2. Est une instance de org.springframework.web.servlet.DispatcherServlet

  3. Sera initialisé avec un paramètre nommé contextConfigLocation

qui contient le chemin d’accès à la configuration XML

load-on-startup est une valeur entière qui spécifie l’ordre de chargement de plusieurs servlets. Ainsi, si vous devez déclarer plusieurs servlets, vous pouvez définir dans quel ordre ils seront initialisés. Les servlets marqués avec des entiers inférieurs sont chargés avant les servlets marqués avec des entiers plus élevés.

Maintenant notre servlet est configuré. La deuxième étape consiste à déclarer un servlet-mapping :

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

Avec le mappage de servlet, nous le lions par son nom à un URL pattern qui spécifie quelles requêtes HTTP seront traitées par ce dernier.

=== 4. Configuration hybride

Avec l’adoption de la version 3.0 de Servlet APIs , le fichier web.xml est devenu facultatif et nous pouvons maintenant utiliser Java pour configurer le DispatcherServlet .

Nous pouvons enregistrer un servlet implémentant un WebApplicationInitializer .

C’est l’équivalent de la configuration XML ci-dessus:

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

Dans cet exemple, nous sommes:

  1. Implémentation de l’interface WebApplicationInitializer

  2. En remplaçant la méthode onStartup , nous créons un nouveau

XmlWebApplicationContext configuré avec le même fichier transmis en tant que contextConfigLocation vers le servlet dans l’exemple XML . Ensuite, nous créons une instance de DispatcherServlet avec le nouveau

contexte que nous venons d’instancié . Et finalement nous enregistrons le servlet avec un mapping URL

modèle

Nous avons donc utilisé Java pour déclarer le servlet et le lier à un URL mapping , mais nous avons conservé la configuration dans un fichier XML séparé:

dispatcher-config.xml .

=== 5. 100% Java Configuration

Avec cette approche, notre servlet est déclaré en Java _, mais nous avons encore besoin d’un fichier XML pour le configurer. Avec WebApplicationInitializer , vous pouvez obtenir une configuration à 100% Java_ .

Voyons comment nous pouvons reformuler l’exemple précédent.

La première chose à faire est de créer le contexte d’application du servlet.

Cette fois, nous utiliserons un contexte basé sur des annotations afin de pouvoir utiliser Java et des annotations pour la configuration et supprimer le besoin de fichiers XML comme dispatcher-config.xml :

AnnotationConfigWebApplicationContext context
  = new AnnotationConfigWebApplicationContext();

Ce type de contexte peut ensuite être configuré en enregistrant une classe de configuration:

context.register(AppConfig.class);

Ou définir un package complet qui sera analysé pour les classes de configuration:

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

Maintenant que notre contexte d’application est créé, nous pouvons ajouter un écouteur au ServletContext qui chargera le contexte:

container.addListener(new ContextLoaderListener(context));

La prochaine étape consiste à créer et à enregistrer notre servlet de répartiteur:

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

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

Maintenant, notre WebApplicationInitializer devrait ressembler à ceci:

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

La configuration de Java et des annotations offre de nombreux avantages. Cela conduit généralement à une configuration plus courte et concise et les annotations fournissent plus de contexte aux déclarations, car elles sont co-localisées avec le code qu’elles configurent.

Mais ce n’est pas toujours un moyen préférable ni même possible. Par exemple, certains développeurs peuvent préférer garder leur code et leur configuration séparés, ou vous devrez peut-être travailler avec du code tiers que vous ne pourrez pas modifier.

=== 6. Conclusion

Dans cet article, nous avons présenté différentes manières de configurer un DispatcherServlet dans Spring 3.2 et il vous appartient de choisir celle à utiliser en fonction de vos préférences. Le printemps adaptera à votre décision ce que vous choisissez.

Le code source de cet article est disponible sur here et ici .