Spring WebFlow Tiles

En este tutorial aprenderemos el uso de tiles para usarlo en conjunción con Spring WebFlow.

Spring WebFlow con Tiles

En el tutorial “Manual Básico
de Spring WebFlow” hemos visto cómo poner a funcionar
este maravilloso controlador. Cuando comenzamos a desarrollar una
aplicación, descubrimos inmediatamente que su interfaz de
usuario es un conjunto de “componentes visuales” que como
tales deben encapsularse y gestionarse. Habitualmente usamos includes
pero a medida que crece la complejidad de la aplicación esta
solución no es escalable. Surgen entonces propuestas como
Apache Tiles donde mediante uno o más ficheros de
configuración se indica cómo se compone una página.
Por ejemplo: podemos decir que la página “Principal”
se compone mediante la plantilla “SinColumnas” con el
cuerpo “paginaPrincipal” y el título “Aplicacion
X: Página Principal”.

El objetivo de este tutorial es
facilitar el primer contacto con esta tecnología partiendo del
ejemplo realizado en el tutorial “Manual Básico de
Spring WebFlow” analizar su aplicabilidad, recomendar algunos
links y comentaros nuestras conclusiones.

Preparación de las plantillas

Comenzaremos a partir del proyecto que creamos en el ejemplo
realizado en el tutorial “Manual Básico de Spring
WebFlow”.

Lo primero que haremos será refactorizar las páginas.
Crearemos /pruebaWebFlowSimple/web/WEB-INF/jsp/plantilla.jsp donde
pondremos:

<%@
taglib prefix=«tiles»
uri=«http://jakarta.apache.org/struts/tags-tiles»
%>

<html
xmlns=«http://www.w3.org/1999/xhtml»
xml:lang=«en»
lang=«en»>

<head>

<title><tiles:getAsString
name=«titulo»/></
title>

</head>

<body>

<tiles:insert
name=«cuerpo»/>

</body>

</html>

Entonces a las páginas
/pruebaWebFlowSimple/web/WEB-INF/jsp/paso1.jsp,
/pruebaWebFlowSimple/web/WEB-INF/jsp/paso2.jsp y
/pruebaWebFlowSimple/web/WEB-INF/jsp/paso3.jsp les quitaremos el
contenido anterior y posterior a <body>:

  • /pruebaWebFlowSimple/web/WEB-INF/jsp/paso1.jsp:

<h1>Asistente
sumador: Paso 1
</h1>

<form>

<input
type=«hidden»
name=«_flowId»
value=«asistente-flow»
/>

<input
type=«hidden»
name=«_eventId»
value=«siguiente»
/>

<input
type=«hidden»
name=«_flowExecutionKey»
value=«${flowExecutionKey}«
/>

<p>${form.mensaje}</p>

<p>Primer
número:
<input
type=«text»
name=«numero1»
value=«${form.numero1}«/></p>

<p>Segundo
número:
<input
type=«text»
name=«numero2»
value=«${form.numero2}«/></p>

<input
type=«submit»
value=«siguiente»
/>

</form>

  • /pruebaWebFlowSimple/web/WEB-INF/jsp/paso2.jsp

<h1>Asistente
sumador: Paso 2
</h1>

<form>

<input
type=«hidden»
name=«_flowId»
value=«asistente-flow»
/>

<input
type=«hidden»
name=«_eventId»
value=«siguiente»
/>

<input
type=«hidden»
name=«_flowExecutionKey»
value=«${flowExecutionKey}«
/>

<p>${form.mensaje}</p>

<input
type=«submit»
value=«siguiente»
/>

<input
type=«submit»
value=«anterior»
onclick=«document.forms[0]._eventId.value=’anterior’;return
true;»
/>

</form>

  • /pruebaWebFlowSimple/web/WEB-INF/jsp/paso3.jsp:

<h1>Asistente
sumador: Paso 3
</h1>

<form>

<p>${form.mensaje}</p>

</form>

Definición de las plantillas

Una vez que tenemos las plantillas, debemos definírselas a
Tiles mediante un fichero que crearemos en
/pruebaWebFlowSimple/web/WEB-INF/tiles/templates.xml con el siguiente
contenido:

<tiles-definitions>


<definition
name=«plantilla»
page=«/WEB-INF/jsp/plantilla.jsp»
/>


<definition
name=«paso1»
extends=«plantilla»>


<put
name=«cuerpo»
value=«/WEB-INF/jsp/paso1.jsp»
type=«page»/>


<put
name=«titulo»
value=«asistente.paso1.titulo»
/>


</definition>


<definition
name=«paso2»
extends=«plantilla»>


<put
name=«cuerpo»
value=«/WEB-INF/jsp/paso2.jsp»
type=«page»/>


<put
name=«titulo»
value=«asistente.paso2.titulo»
/>


</definition>


<definition
name=«paso3»
extends=«plantilla»>


<put
name=«cuerpo»
value=«/WEB-INF/jsp/paso3.jsp»
type=«page»/>


<put
name=«titulo»
value=«asistente.paso3.titulo»
/>


</definition>

</tiles-definitions>

Vemos entonces cómo se define la plantilla, las páginas
que las utilizan y sus parámetros.

Actualización de las configuraciones

Ahora sólo resta la configuración. En actualizaremos
el viewResolver para adecuarlo al uso de Tiles:

<bean
id=«viewResolver»


class=«org.springframework.web.servlet.view.UrlBasedViewResolver»>


<property
name=«viewClass»


value=«org.springframework.web.servlet.view.tiles.TilesView»
/>


</bean>

Y añadiremos el tilesConfigurer para que lea el fichero que
hemos creado:

<bean
id=«tilesConfigurer»


class=«org.springframework.web.servlet.view.tiles.TilesConfigurer»>


<property
name=«definitions»>


<list>


<value>/WEB-INF/tiles/templates.xml</value>


</list>


</property>


</bean>

Ejecutando la aplicación

Lanzamos el servidor con la URL
http://localhost:8080/pruebaWebFlowSimple/asistente.flow
y veremos en funcionamiento el ejemplo .

Una mejora que podemos implementar es utilizar la
internacionalización para que el título y otros
parámetros se adecúen al idioma del usuario.

Algunos links interesantes

  • Sitio oficial de Tiles,
    http://struts.apache.org/1.x/struts-tiles/

  • Documentación oficial de Referencia ,
    http://struts.apache.org/1.x/struts-tiles/userGuide.html

  • Tiles 2, http://tiles.apache.org/

Conclusiones

Tras utilizarlo en proyectos de envergadura concluimos que:

  • El Apache Tiles se integra
    perfectamente con Spring WebFlow.

  • Su internacionalización
    soporta esquemas de plantillas específicos para cada idioma.

  • Incluye un rudimentario soporte de
    roles para adecuar las plantillas al perfil de seguridad del
    usuario.

  • Mediante TilesUtil se puede
    acceder a las definiciones y cambiarlas en caliente para adecuarlas
    a configuraciones en base de datos u otros criterios funcionales.

Desde Autentia contamos con los
conocimientos y experiencia para ayudarle a sacar la máxima
ventaja de las tecnologías más innovadoras y mejorar la
calidad de sus desarrollos software.

No dude en contactarse con nosotros
mediante www.autentia.com .

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

He leído y acepto la política de privacidad

Información básica acerca de la protección de datos

  • Responsable: IZERTIS S.A.
  • Finalidad: Envío información de carácter administrativa, técnica, organizativa y/o comercial sobre los productos y servicios sobre los que se nos consulta.
  • Legitimación: Consentimiento del interesado
  • Destinatarios: Otras empresas del Grupo IZERTIS. Encargados del tratamiento.
  • Derechos: Acceso, rectificación, supresión, cancelación, limitación y portabilidad de los datos.
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad

Ingeniero en Informática

¿Quieres publicar en Adictos al trabajo?

Te puede interesar

02/03/2026

José Antonio Sánchez Segovia

Zephyr es un RTOS open source respaldado por la Linux Foundation que permite desarrollar dispositivos embebidos conectados, eficientes y escalables, facilitando el paso de prototipo a producto final con una arquitectura mantenible.

23/02/2026

Enrique Casado Díez

LoRa y LoRaWAN son tecnologías clave en el ecosistema IoT cuando se requiere largo alcance y bajo consumo energético. En este artículo analizamos su funcionamiento, Spreading Factor, link budget, arquitectura de red, frecuencias y clases de dispositivos, con un caso práctico real.

19/02/2026

Juan José Díaz Antuña

Copilot Chat es la forma más sencilla y segura de empezar a usar IA en Microsoft 365. En este artículo vemos cómo funciona, cómo activarlo y en qué se diferencia de Microsoft 365 Copilot, Copilot Studio y los Agentes Inteligentes, con ejemplos prácticos y una comparativa clara.