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 .