La capa de presentación basada en web es ofrecida por Spring a través de su propio Web MVC framework, sin que ello implique renunciar al uso de otras tecnologías populares como Struts o JSF por ejemplo.

Proyecto

Evidentemente, uno de los cambios importantes que hay que tener en cuenta con respecto a los ejemplos vistos hasta ahora, es que una aplicación web no se ejecuta con un tradicional main, por lo que la forma de instanciar el ApplicationContext a partir de un fichero XML tiene que cambiarse.

De hecho, también tiene que cambiarse el tipo de proyecto creado desde Eclipse. Más concretamente, debe crearse un proyecto de tipo web (File / New / Project… / Web / Dynamic Web Project / <No target runtime> / Finish). Esto determina la creación de la estructura de directorios adecuada, y sobre todo que el modo de empaquetamiento sea de tipo war.

Para seguir utilizando Maven es necesario modificar el proyecto para añadirle esa faceta (Configure / Convert to Maven Project). Y por comodidad, es mejor unificar la política de ubicación del directorio raíz de despliegue a src/main/webapp, y de la inclusión de las dependencias con Maven dentro de WEB-INF/lib (Properties / Deployment Assembly).

Una aplicación web se tiene que ejecutar dentro de algún tipo de servidor. Como el popular servidor de aplicaciones Tomcat, que puede descargarse e instalarse directamente desde el propio Eclipse. (Windows / Show View / Other… / Server / Servers / new server wizard… / Apache / Tomcat v7.0 Server / Next / Download and Install / Next / Finish).

Un último destalle a tener en cuenta es que es necesario cambiar el puerto por defecto de Tomcat, ya que es el mismo que utiliza la base de datos Oracle XE que se está usando para las pruebas (Directorio instalación / conf / server.xml / Connector port = «…»).

Finalmente, si todo hay ido correctamente, se podrá gestionar el arranque y parada del servidor web, e incluso el propio despliegue y prueba de la aplicación, directamente desde Eclipse.

Posiblemente esta no sea la forma más sencilla, ni desde luego la única, pero a mi personalmente me sirve de referencia para controlar esos pequeños detalles a tener en cuenta en caso de surgir algún problema.

Dependencias

Como de costumbre, para utilizar una característica concreta de Spring hay que añadir la dependencia correspondiente en el fichero pom.xml de Maven:

<properties>
  <spring.version>3.1.1.RELEASE</spring.version>
</properties>

<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
  </dependency>
</dependencies>

Notar que se añade también una dependencia con servlet-api, que contiene el API necesario para poder desarrollar servlets. Aunque sólo es necesaria durante la compilación, ya que es una dependencia que el servidor proveerá, y de ahí que se marque con el valor provided en su atributo scope.

Configuración

Spring ofrece dos clases para cargar un fichero XML con el que instanciar el contexto en una aplicación web. La primera es ContextLoaderListener, y la segunda ContextLoaderServlet. La única diferencia real entre ambas es que la segunda sólo se puede ejecutar en servidores que cumplan con la especificación Servlet 2.4. Aunque en la práctica, con la primera debería ser suficiente para cualquier aplicación.

Estas clases actúan como listeners, y se inicializan justo después de que el servidor cree el contexto para la ejecución de servlets, momento perfecto para instanciar el objeto ApplicationContext de Spring.

Al tratarse de un proyecto web, la configuración se realiza en el fichero web.xml:

<listener>
  <listener-class>
    org.springframework.web.context.ContextLoaderListener
  </listener-class>
</listener>

Esta clase intenta leer el fichero XML por defecto de /WEB-INF/applicationContext.xml. Y si no lo encuentra eleva una excepción. No obstante, se puede también configurar para que utilice uno o varios ficheros distintos al usado por defecto:

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

Y de igual forma que lo visto en artículos anteriores para las aplicaciones de escritorio, las aplicaciones web también pueden utilizar clases marcadas con la anotación @Configuration para definir el contexto usando los parámetros de configuración adecuados:

<context-param>
  <param-name>contextClass</param-name>
  <param-value>
    org.springframework.web.context.support.AnnotationConfigWebApplicationContext
   </param-value>
</context-param>

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>com.empresa.AppConfig</param-value>
</context-param>

Si la configuración es correcta, Spring creará un contexto de tipo WebApplicationContext, que es una clase especializada de contexto que añade características como la gestión de temas (themes) y, por supuesto, de servlets.

Una cosa importante a tener en cuenta es que la clase ContextLoaderListener no está relacionada con Web MVC, sólo sirve para inicializar el contexto de una forma conveniente, por lo que resulta útil también para trabajar con Spring cuando se usan otros frameworks de presentación distintos de Web MVC.