Spring WebFlow Tiles

0
16045

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 .

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

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

Por favor ingrese su nombre aquí

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

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad