Una aplicación web Java sin web.xml

1. Información general

En este tutorial, estamos creando una aplicación web Java usando Servlet 3.0+.

Echaremos un vistazo a tres anotaciones, @WebServlet , @WebFilter y @WebListener , que pueden ayudarnos a descartar nuestros archivos web.xml .

2. La dependencia de Maven

Para utilizar estas nuevas anotaciones, necesitamos incluir la dependencia javax.servlet-api :

 javax.servlet javax.servlet-api 4.0.1 

3. Configuración basada en XML

Antes de Servlet 3.0, configurábamos una aplicación web Java en un archivo 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  

Comencemos reemplazando cada sección de configuración con las respectivas anotaciones introducidas en Servlet 3.0.

4. Servlets

JEE 6 se envió con Servlet 3.0 que nos permite usar anotaciones para definiciones de servlet, minimizando el uso de un archivo web.xml para una aplicación web.

Por ejemplo, podemos definir un servlet y exponerlo con la anotación @WebServlet

Definamos un servlet para el patrón de URL / mayúsculas . Transformará el valor del parámetro de solicitud de entrada a mayúsculas:

@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); } }

Tenga en cuenta que definimos un nombre para el servlet ( uppercaseServlet) al que ahora podemos hacer referencia. Usaremos esto en la siguiente sección.

Con la @WebServlet anotación, estamos reemplazando los servlets y servlet-mapping secciones del web.xml archivo.

5. Filtros

Un filtro es un objeto que se utiliza para interceptar solicitudes o respuestas, realizando tareas de procesamiento previo o posterior.

Podemos definir un filtro con la anotación @WebFilter .

Creemos un filtro para verificar si el parámetro de solicitud de entrada está presente:

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

Con la @WebFilter anotación, estamos reemplazando los filtros y el filtro de asignación de secciones del web.xml archivo.

6. Oyentes

A menudo, necesitaremos activar acciones basadas en ciertos eventos. Aquí es donde los oyentes acuden al rescate. Estos objetos escucharán un evento y ejecutarán el comportamiento que especifiquemos.

Como anteriormente, podemos definir un oyente con la anotación @WebListener .

Creemos un oyente que cuente cada vez que realizamos una solicitud al servidor. Implementaremos ServletRequestListener , escuchando ServletRequestEvent s:

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

Tenga en cuenta que estamos excluyendo las solicitudes al patrón / contador de URL .

Con la anotación @WebListener , reemplazamos la sección de escucha del archivo web.xml .

7. Construir y ejecutar

Para aquellos que lo siguen, tenga en cuenta que para las pruebas, hay un segundo servlet que hemos agregado para el punto final / counter que simplemente devuelve el atributo de contexto del servlet del contador .

Entonces, usemos Tomcat como servidor de aplicaciones.

Si usamos una versión de maven-war-plugin anterior a la 3.1.0, tendremos que establecer la propiedad failOnMissingWebXml en false .

Ahora, podemos implementar nuestro archivo .war en Tomcat y acceder a nuestros servlets.

Probemos nuestro punto final / mayúsculas :

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

Y también deberíamos ver cómo se ve nuestro manejo de errores:

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

Y finalmente, una prueba rápida de nuestro oyente:

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

8. Todavía se necesita XML

Incluso, con todas las características introducidas en Servlet 3.0, hay algunos casos de uso en los que todavía necesitaremos un archivo web.xml , entre ellos:

  • No podemos definir el orden del filtro con anotaciones ; todavía necesitamos el sección si tenemos varios filtros que necesitamos aplicar en un orden particular
  • Para definir un tiempo de espera de sesión, todavía necesitamos usar el sección
  • Todavía necesitamos el elemento para autorización basada en contenedor
  • Y para especificar archivos de bienvenida, todavía necesitaremos un sección

O, Servlet 3.0 también introdujo algo de soporte programático a través de ServletContainerInitializer , que también puede llenar algunos de estos vacíos.

9. Conclusión

En este tutorial, configuramos una aplicación web Java sin usar el archivo web.xml ejercitando las anotaciones equivalentes.

Como siempre, el código fuente de este tutorial se puede encontrar en GitHub. Además, también se puede encontrar una aplicación que utiliza el archivo web.xml tradicional en GitHub.

Para un enfoque basado en Spring, diríjase a nuestro tutorial web.xml frente a Initializer con Spring.