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.

This document in English
Ce document en français

Explorar las Variables de Plantilla

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.

El código Java

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.

Conclusiones

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.