7.1 Esquema general de web.xml

El archivo web.xml almacena información de configuración de la aplicación. No es una parte obligatoria de la misma, pero es muy utilizada para configurar una aplicación web.

Este archivo debe estar ubicado en la carpeta WEB-INF . Cuando se inicia Tomcat, lee su contenido y utiliza la configuración que contiene. Si el archivo contiene errores, Tomcat también muestra un error.

Ejemplo web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
  http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">

  <servlet>
       <servlet-name>HelloWorld</servlet-name>
       <servlet-class>HelloServlet</servlet-class>
   </servlet>

  <servlet-mapping>
      <servlet-name>HelloWorld</servlet-name>
      <url-pattern>/welcome</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
      <welcome-file>index.html</welcome-file>
  </welcome-file-list>

</web-app>

"HelloWorld"La asignación del nombre del servlet y la clase del servlet se escribe aquí en verde"HelloServlet" . La asignación del nombre del servlet y el fragmento de URL se escribe en azul"HelloWorld""http://localhost/welcome" . Por lo tanto, aquí dice que al acceder a la ruta /welcome, debe llamar al servlet HelloServlet.class.

El color rojo indica el archivo que debe entregarse a pedido http://localhost/: esta es la llamada página de bienvenida . Si el usuario simplemente escribe en el navegador el nombre correspondiente a la raíz de nuestra aplicación web, entonces el contenido del archivo index.html.

7.2 servlet, mapeo de servlet

Un servlet puede atender solicitudes en diferentes URL, por lo que en web-xml, el servlet y su asignación a URL se escriben por separado. Primero, describimos los servlets, dando a cada uno un nombre de cadena único, y luego especificamos cómo se asigna cada servlet a qué URL.

Ejemplo web.xml:

<web-app>

  <servlet>
    <servlet-name>remoting</servlet-name>
    <servlet-class>com.codegym.RemotingServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>remoting</servlet-name>
    <url-pattern>/remoting/*</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>restapi</servlet-name>
    <servlet-class>com.codegym.RestApiServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>restapi</servlet-name>
    <url-pattern>/api/*</url-pattern>
  </servlet-mapping>

</web-app>

En este ejemplo, se declaran dos servlets y cada uno se asigna a una plantilla de URL diferente. El servlet RemotingServletatiende todas las solicitudes que van a/remoting/* . El servlet RestApiServletatiende todas las solicitudes que van a/api/* . Los servlets también tienen el orden de carga: el parámetro de carga al inicio.

7.3 Opciones de servlet

Con la ayuda de web.xml, los parámetros se pueden pasar al servlet durante su inicialización, estarán disponibles a través de la interfaz ServletConfig. También puede establecer parámetros para toda la aplicación web, estarán disponibles a través del archivo ServletContext.

Ejemplo web.xml:

<web-app>
  <context-param>
     <description>Server production mode</description>
     <param-name>productionMode</param-name>
     <param-value>false</param-value>
  </context-param>

  <context-param>
     <param-name>appPropertiesConfig</param-name>
     <param-value>
        classpath:local-app.properties
        classpath:web-app.properties
     </param-value>
  </context-param>

  <servlet>
     <servlet-name>mainservlet</servlet-name>
     <servlet-class>com.codegym.ApplicationServlet</servlet-class>
     <init-param>
        <param-name>application</param-name>
        <param-value>com.codegym.App</param-value>
     </init-param>
     <init-param>
        <param-name>widgetset</param-name>
        <param-value>com.codegym.WidgetSet</param-value>
     </init-param>
     <init-param>
        <param-name>ui</param-name>
        <param-value>com.codegym.AppUI</param-value>
     </init-param>
  </servlet>
</web-app>

El código resaltado en verde es donde establecemos los parámetros paraServletContext . Hay dos de ellos:

  • productionModecon valor falso
  • appPropertiesConfigcon una matriz de dos cadenas:
    • classpath:local-app.properties
    • classpath:web-app.properties

Los parámetros para el servlet se indican en azulApplicationServlet , estarán disponibles para el mismo a través de ServletConfig:

  • applicationcon valor com.codegym.App
  • widgetsetcon valor com.codegym.WidgetSet
  • uicon valor com.codegym.AppUI

7.4 filtro, mapeo de filtros

La aplicación web también puede contener archivos especiales utility servlets - filters. Realizan diversas tareas de servicio: redirigir llamadas, verificar autorización, etc.

Ejemplo web.xml:

<web-app>

  <servlet>
      <servlet-name>remoting</servlet-name>
      <servlet-class>RemotingServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
      <servlet-name>remoting </servlet-name>
      <url-pattern>/remoting/*</url-pattern>
  </servlet-mapping>

  <filter>
      <filter-name>total_filter</filter-name>
      <filter-class>com.javrush.TotalFilter</filter-class>
  </filter>

  <filter-mapping>
      <filter-name>total_filter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>

Antes de que la solicitud llegue al servlet RemotingServlet, será procesada por el filtro TotalFiler. Este filtro está configurado para interceptar todas las solicitudes que van a nuestra aplicación web. Esto se insinúa claramente en la plantilla de URL a la que está asignada: /*.

Leerá más sobre servlets y filtros en las siguientes lecciones.