Une application Web Java sans web.xml

1. Vue d'ensemble

Dans ce didacticiel, nous créons une application Web Java à l'aide de Servlet 3.0+.

Nous examinerons trois annotations - @WebServlet , @WebFilter et @WebListener - qui peuvent nous aider à supprimer nos fichiers web.xml .

2. La dépendance Maven

Afin d'utiliser ces nouvelles annotations, nous devons inclure la dépendance javax.servlet-api :

 javax.servlet javax.servlet-api 4.0.1 

3. Configuration basée sur XML

Avant Servlet 3.0, nous configurions une application Web Java dans un fichier web.xml :

  com.baeldung.servlets3.web.listeners.RequestListener   uppercaseServlet com.baeldung.servlets3.web.servlets.UppercaseServlet   uppercaseServlet /uppercase   emptyParamFilter com.baeldung.servlets3.web.filters.EmptyParamFilter   emptyParamFilter /uppercase  

Commençons par remplacer chaque section de configuration par les annotations respectives introduites dans Servlet 3.0.

4. Servlets

JEE 6 est livré avec Servlet 3.0 qui nous permet d'utiliser des annotations pour les définitions de servlet, minimisant ainsi l'utilisation d'un fichier web.xml pour une application Web.

Par exemple, nous pouvons définir un servlet et l'exposer avec l' annotation @WebServlet

Définissons un servlet pour le modèle d'URL / majuscule . Il transformera la valeur du paramètre de demande d' entrée en majuscule:

@WebServlet(urlPatterns = "/uppercase", name = "uppercaseServlet") public class UppercaseServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { String inputString = request.getParameter("input").toUpperCase(); PrintWriter out = response.getWriter(); out.println(inputString); } }

Notez que nous avons défini un nom pour la servlet ( uppercaseServlet) que nous pouvons maintenant référencer. Nous en ferons usage dans la section suivante.

Avec l' annotation @WebServlet , nous remplaçons les sections servlet et servlet-mapping du fichier web.xml .

5. Filtres

Un filtre est un objet utilisé pour intercepter des demandes ou des réponses, en effectuant des tâches de pré ou post-traitement.

Nous pouvons définir un filtre avec l' annotation @WebFilter .

Créons un filtre pour vérifier si le paramètre de requête d' entrée est présent:

@WebFilter(urlPatterns = "/uppercase") public class EmptyParamFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { String inputString = servletRequest.getParameter("input"); if (inputString != null && inputString.matches("[A-Za-z0-9]+")) { filterChain.doFilter(servletRequest, servletResponse); } else { servletResponse.getWriter().println("Missing input parameter"); } } // implementations for other methods }

Avec l' annotation @WebFilter , nous remplaçons les sections de filtre et de mappage de filtre du fichier web.xml .

6. Auditeurs

Nous aurons souvent besoin de déclencher des actions en fonction de certains événements. C'est là que les auditeurs viennent à la rescousse. Ces objets écouteront un événement et exécuteront le comportement que nous spécifions.

Comme précédemment, nous pouvons définir un auditeur avec l' annotation @WebListener .

Créons un écouteur qui compte chaque fois que nous effectuons une requête au serveur. Nous implémenterons ServletRequestListener , en écoutant les ServletRequestEvent :

@WebListener public class RequestListener implements ServletRequestListener { @Override public void requestDestroyed(ServletRequestEvent event) { HttpServletRequest request = (HttpServletRequest)event.getServletRequest(); if (!request.getServletPath().equals("/counter")) { ServletContext context = event.getServletContext(); context.setAttribute("counter", (int) context.getAttribute("counter") + 1); } } // implementations for other methods }

Notez que nous excluons les demandes au modèle / compteur d' URL .

Avec l' annotation @WebListener , nous remplaçons la section écouteur du fichier web.xml .

7. Construire et exécuter

Pour ceux qui suivent, notez que pour les tests, nous avons ajouté un deuxième servlet pour le point de terminaison / counter qui renvoie simplement l' attribut de contexte du servlet de compteur .

Alors, utilisons Tomcat comme serveur d'applications.

Si nous utilisons une version de maven-war-plugin antérieure à 3.1.0, nous devrons définir la propriété failOnMissingWebXml sur false .

Maintenant, nous pouvons déployer notre fichier .war sur Tomcat et accéder à nos servlets.

Essayons notre point de terminaison / majuscule :

curl //localhost:8080/spring-mvc-java/uppercase?input=texttouppercase TEXTTOUPPERCASE

Et nous devrions également voir à quoi ressemble notre gestion des erreurs:

curl //localhost:8080/spring-mvc-java/uppercase Missing input parameter

Et enfin, un petit test de notre auditeur:

curl //localhost:8080/spring-mvc-java/counter Request counter: 2

8. XML toujours nécessaire

Même avec toutes les fonctionnalités introduites dans Servlet 3.0, il existe des cas d'utilisation où nous aurons encore besoin d'un fichier web.xml , parmi lesquels:

  • Nous ne pouvons pas définir l'ordre du filtre avec des annotations - nous avons toujours besoin du section si nous avons plusieurs filtres que nous devons appliquer dans un ordre particulier
  • Pour définir un délai d'expiration de session, nous devons toujours utiliser le section
  • Nous avons encore besoin du élément pour l'autorisation basée sur le conteneur
  • Et pour spécifier les fichiers de bienvenue, nous aurons toujours besoin d'un section

Ou, Servlet 3.0 a également introduit une prise en charge programmatique via ServletContainerInitializer , qui peut également combler certaines de ces lacunes.

9. Conclusion

Dans ce didacticiel, nous avons configuré une application Web Java sans utiliser le fichier web.xml en appliquant les annotations équivalentes.

Comme toujours, le code source de ce didacticiel se trouve sur GitHub. De plus, une application utilisant le fichier web.xml traditionnel peut également être trouvée sur GitHub.

Pour une approche basée sur Spring, rendez-vous sur notre tutoriel web.xml vs Initializer with Spring.