2. Introducción (I)
Composición de páginas
Directamente en los JSP
Código repetido
Imposible de mantener
Consistencia costosa
Método “<jsp:include/>”
Utilizando plantillas
3. Introducción (II)
Funcionamiento de <jsp:include/>
Request
<jsp:include.../>
Request
Página Página
original Response incluida
Response
4. Introducción (III)
Utilizando plantillas
Layout.jsp
Header.jsp Título
El relleno
Body.jsp
Footer.jsp (c)
5. Introducción (y IV)
Ventajas e inconvenientes
Para <jsp:include>
Tecnología estable y probada
Contenedores optimizados para JSP
Pueden ser HTML no editable
Para plantillas
Mayor reutilización de código
Mayor flexibilidad
Más páginas a monitorizar
6. Instalación
Forman parte de Struts (1.1+)
Plug-In
Pueden utilizarse sin Struts
Declaración en “struts-config.xml”
<plug-in className="org.apache.struts.tiles.TilesPlugin" >
<set-property property="definitions-config"
value="/WEB-INF/tiles-defs.xml,
/WEB-INF/tiles-tests-defs.xml" />
<set-property property="definitions-parser-validate" value="true" />
</plug-in>
7. Creando la plantilla base (I)
Primer paso:
Identificar las diferentes plantillas
necesarias
Buscar reutilización (pero no forzarla)
El layout se corresponde con las
regiones de la página
Cada región es un “tile”
Los tiles pueden ser recursivos
10. Creando la plantilla base (IV)
Los tags básicos son
“tiles:insert”
El valor del atributo se supone una página
“tiles:getAsString”
El valor se supone o convierte a String
11. Creando la plantilla base (y V)
Atributos opcionales
<tiles:insert attribute="extra" ignore="true" />
No se queja si no se encuentra.
12. Pero, ¿qué hace un tile?
Tile: cada región o “cuadrado” de la
página
Puede utilizarse con XML
No sólo para presentación
Parametrizables
Paso de argumentos como “atributos”
“Definiciones”
Un tile junto a sus atributos: instancia
13. Definiciones de “tiles” (I)
<%@ taglib uri="/tags/tiles" prefix="tiles" %>
<tiles:insert page="/layouts/myLayout.jsp" flush="true">
<tiles:put name="title" value="Hello World" />
<tiles:put name="header" value="/tiles/header.jsp" />
<tiles:put name="body" type="string">
<%-- Place the content from /tiles/pageTwo.jsp here --%>
</tiles:put>
<tiles:put name="footer" value="/tiles/footer.jsp" />
<tiles:put name="menu" value="/tiles/menu.jsp" />
</tiles:insert>
14. Definiciones de “tiles” (II)
Para cada “instancia” tenemos varios
parámetros
Sólo unos pocos cambian de página en
página
¿Qué necesitamos?
Un lugar donde dejar estas definiciones
Poder reutilizarlas
Definir sólo las diferencias
15. Definiciones de “tiles” (III)
Declaración de una definición
En base a tags
Información necesaria
Identificador
Una plantilla base (path a la misma)
Algunos atributos para insertar
16. Definiciones de “tiles” (y IV)
Características avanzadas
Una Definición puede sobrecargarse añadiendo
más atributos o reemplazándolos cuando se utiliza.
Podemos extender una definición utilizando como
plantilla base otra definición (herencia de
definiciones).
Una definición puede ser reutilizada almacenándola
en un JSP o en cargándola desde un archivo de
definiciones en formato XML.
Una definción puede utilizarse como “objetivo” de
un ActionForward de Struts.
17. Fichero de definiciones (I)
Configurado dentro del “plugin”
Parámetro “definitions-config”
Cada definición tiene un identificador
No se corresponde con una URI
19. Fichero de definiciones (III)
Derivando definiciones
<definition name="portal.page" extends="portal.masterPage">
<put name="title" value="Tiles 1.1 Portal" />
<put name="body" value="portal.body" />
</definition>
Nomenclatura recomendada
Similar a los paquetes de Java
20. Declaración en JSP (I)
Menos utilizada pero más flexible
<%@ taglib uri="/tags/tiles" prefix="tiles" %>
<tiles:definition id="definitionName" page="/layouts/myLayout.jsp">
<tiles:put name="title" value="Hello World" />
<tiles:put name="header" value="/tiles/header.jsp" />
<tiles:put name="footer" value="/tiles/footer.jsp" />
<tiles:put name="menu" value="/tiles/menu.jsp" />
<tiles:put name="body" value="/tiles/helloBody.jsp" />
</tiles:definition>
Ámbito de página (atributo “scope”)
21. Declaración en JSP (II)
Reutilización
<%@ taglib uri="/tags/tiles" prefix="tiles" %>
<%@ include file="definitionsConfig.jsp" %>
<tiles:insert beanName="definitionName" beanScope="request" />
<tiles:put name="title" value="Another Page" />
<tiles:put name="body" value="/tiles/anotherBody.jsp" />
</tiles:insert>
22. Declaración en JSP (y III)
Problema de “sobredefinición”
Utilizar el tag “<logic:notPresent>”
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<%@ taglib uri="/tags/tiles" prefix="tiles" %>
<logic:notPresent name="definitionName" scope="application">
<tiles:definition id="definitionName" page="/layouts/myLayout.jsp">
<tiles:put name="title" value="Hello World" />
<tiles:put name="header" value="/tiles/header.jsp" />
<tiles:put name="footer" value="/tiles/footer.jsp" />
<tiles:put name="menu" value="/tiles/menu.jsp" />
<tiles:put name="body" value="/tiles/helloBody.jsp" />
</tiles:definition>
<%-- … other definitions … --%>
</logic:notPresent>
23. Tiles como ActionForwards
Plugin de Tiles
Comprueba el path de los ActionForwards
Si coincide con una definición de tile usa el
tile
<action
path="/tutorial/testAction2"
type="org.apache.struts.example.tiles.tutorial.ForwardExampleAction">
<forward
name="failure"
path=".forward.example.failure.page"/>
<forward
name="success"
path=".forward.example.success.page"/>
</action>
24. Atributos de tiles (I)
Hasta ahora
Atributos estáticos
¿No podemos especificarlos en runtime?
¡Claro que sí!
Contexto propio de tiles
Diferente a los de servlets
Ámbito de request
25. Atributos de tiles (II)
“put”
Equivalente a “setAttribute”
Diferentes formas de uso
Como propiedad
<tiles:put name="title" value="My first page" />
<tiles:put name="title" value="<%=myObject%>" />
Como cuerpo del tag
<tiles:put name="title">My first page</tiles:put>
Como bean
<tiles:put name="title" beanName="myBean" beanScope="session"/>
Como propiedad de un bean
<tiles:put name="title" beanName="myBean" beanProperty="myProperty"/>
26. Atributos de tiles (III)
“put”
Es posible indicar el tipo (type=):
“page”, “string” o “definition”
Y el rol de seguridad
Si el usuario no dispone del rol no se añade el
atributo
<tiles:put name="title" value="myValue" role="myManager"/>
<tiles:put name="title" value="myValue" role="myStaff"/>
Si se especifica en una definición se comprueba
el rol al inicializar el contexto de tiles.
27. Atributos de tiles (III)
“useAttribute”
Permite acceder al valor del atributo desde
otro contexto
Se puede mapear directamente
<tiles:useAttribute name="myAttribute" />
O con otro nombre
<tiles:useAttribute attributeName="anAttribute" name="myAttribute" />
28. Atributos de tiles (IV)
“importAttribute”
Funciona como “useAttribute”, pero
No permite renombrarlos
Si no se especifica atributo los importa todos
<tiles:importAttribute/>
Podemos especificar el “scope”
29. Atributos de tiles (y V)
“putList” y “add”
Podemos insertar los atributos como lista
Tag “putList”
Tag “add” para cada elemento de la lista
<tiles:insert page="menu.jsp" >
<tiles:putList name="items">
<tiles:add value="home" />
<tiles:add value="documentation"/>
</tiles:putList>
</tiles:insert>
Luego podemos utilizar la “java.util.List” con
un “importAttribute”
30. La guinda final...
Podemos incluir hojas de estilo CSS en
las plantillas base
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<HTML>
<HEAD>
<TITLE><tiles:getAsString name="title"/></TITLE>
<html:base/>
<LINK rel="stylesheet" type="text/css"
ref="<html:rewrite page='/styles/global.css'/>">
page='/styles/global.css'/>
</HEAD>
<BODY>
...
32. Aplicando tiles (I)
Pensamos el diseño
Cabecera: logos, menu de idioma
Cuerpo: contenido
Pie de página: copyright
Diagrama de plantillas
.layout.order.form
.layout.order.confirm
.layout.main .layout.order
33. Aplicando tiles (II)
Activamos el plugin
<plug-in className="org.apache.struts.tiles.TilesPlugin" >
<set-property property="definitions-config"
value="/WEB-INF/conf/tiles-defs.xml/>
</plug-in>