Documento actualizado por última vez 13 abril 2001.
Estoy abierto a cualquier sugerencia que me ayude a
mejorar estos materiales. No dudes en escribir al autor,
Jonathan Revusky.
Recordarás que en el primer ejemplo, nuestro método
execDefault()
expuso dos variables de plantilla.
Las dos eran simplemente cadenas -- o podemos decir escalares
en la jerga de las plantillas. Mientras esto podría parecer como un gran
salto respecto a las páginas HTML completamente estáticas,
sólo es una parte muy pequeña de lo que podemos hacer con el sistema
incorporado de plantillas de página, que nos permite exponer dinámicamente
estructuras de datos arbitrariamente complejas, que componen
listas, correspondencias -- además de escalares.
Esta aplicación contiene 3 plantillas de página.
La plantilla entries.nhtml
muestra todas las entradas
del sistema. La plantilla add.nhtml
template
incorpora un formulario que permite al usario agregar
una entrada. El thanks.nhtml
simplemente
da las gracias al usuario por sus comentarios, después de procesar
el formulario. Echa una ojeada a entries.nhtml
. Como
indicamos en el primer ejemplo, las plantillas de freemarker usan
la sintaxis de ${...} para indicar contenido dinámico, es decir que
se trata de variables de plantilla.
La plantilla entries.nhtml
también introduce otro elemento
de sintaxis de freemarker. Mira la línea:
<list entries as entry>
Esto supone que existe una variable tipo list que se llama entries
.
Pues, bien. Una variable tipo escalar, siendo una cadena, normalmente lo exponemos
con la sintaxis ${...}. Por otra parte, lo que solemos hacer con una variable tipo list
tal como entries
en este caso, es que iteramos a través de sus
elementos. Es lo que la instrucción <list entries as entry>
dice en efecto. El código dentro de ese bloque list
se repite n veces,
n siendo el número de elementos de la lista. La variable entry
dentro del bloque representa la subvariable de la lista a traves de la cual
estamos iterando.
Lo que hace que hace que este ejemplo sea incluso más interesante
es que los elementos de la lista entries
son a su vez
correspondencias, con sus propias subvariables. Son
esas subvariables que, finalmente, son escalares. Entonces las
subvariables de entry
se usan directamente
en la página por medio de la sintaxis ${...} -- es decir,
${entry.name}
etcetera.
Ya que has echado un vistazo a la plantilla de página que muestra las entradas, mira ahora el código java en GuestbookServletInteraction.java. Fíjate en lo breve que es el método execEntries().
public void execEntries() throws IOException { this.page = getPage("entries.nhtml"); page.expose("entries", entries); // expone la lista de entradas a la página }
De hecho, el código java de este servlet es sorprendentemente breve.
El método más complicado es execProcess() que procesa las
variables CGI que manda el formulario en la plantilla
add.nhtml
.
Si el usuario no llenó el campo "name",
el método expone una variable que es un mensaje de error.
De no ser así, se crea un hashtable que contiene las subvariables
que componen la entrada en el guestbook y la agrega a la lista estática
de entradas.
Fíjate que el método exposeDefaultVariables
nos
da un gancho cómodo donde poner variables que siempre son
expuestas, y no dependen de cuál método
execXXX fue invocado.
Incluso siendo primitivo, ya que este ejemplo pasa por alto el tema de la persistencia de datos, hace mucho con poco código. Lo consigue hacer en gran parte debido a la posibilidad de exponer una estructura de datos arbitrariamente compleja a la plantilla de página. En este caso, pudimo poner una lista -- que a su vez contenía variables que eran correspondencias -- en la página y desenrollar todo el contenido encrustado para mostrar en la página, sin escribir código java para toda esa operación. ¡Fíjate que también podemos encrustar listas y correspondencias hasta un nivel arbitrario de complejidad! ¡Podríamos tener listas de listas que a su vez contienen correspondencias que contienen más listas!
Dado que todo el código -- contando el lado java y las plantillas de página -- no es mucho más que 100 líneas, debería ser factible estudiar este ejemplo y comprender bien todos los elementos que lo componen.
Te animaría a hacer pequeños cambios al código del ejemplo (lado java y plantillas) y observar el efecto de los cambios. Esto resforzará lo que has aprendido. Cuando hayas asimilado este ejemplo por completo, deberías pasar al próximo ejemplo, el mini-rolodex.