Dentro de xsp:page se pueden usar etiquetas para generar un contenido algo m�s din�mico. Algunas de ellas son propias de XSP (las que pertenecen al espacio de nombres xsp) y otras son definidas por el usuario. A continuaci�n se detallan las etiquetas nativas:
- <xsp:structure>: Engloba directivas globales a nivel de programa. Debe colgar directamente de xsp:page.
- <xsp:include>: Permiten importar m�dulos de forma seg�n el lenguaje. En el caso de
Java el contenido del xsp:include es transformado en imports. Por ejemplo
<xsp:include>java.util.Date</xsp:include> se transformar�a en:
import java.util.Date ;
- <xsp:logic>: Especifica que su contenido debe ser considerado como c�digo embebido en la p�gina.
- <xsp:content>: Usado dentro de un bloque <xsp:logic> indica que el contenido pasa a ser considerado como XML para el documento final.
- <xsp:expr>: Se usa para evaluar variables o expresiones y colocar su resultado en el
documento generado.
- Si el contenido de xsp:expr es de un tipo primitivo, se inserta en un nodo de texto su representaci�n como cadena.
- Si el resultado de evaluar la expresion es instancia de alguna subclase de org.w3c.dom.Node se insertan si pertenecen al mismo documento o se clonan e insertan si pertenecen a un documento distinto (para cambiar el Document propietario).
- Si la expresi�n es de tipo String se insertar� dentro de un nodo de texto. N�tese que si la cadena representa un fragmento de XML �ste no ser� insertado como tal, sino como texto normal de forma que los caracteres ">", "<" y "&" ser�n escapados.
- Si la expresi�n es un Array, se tratar� como un org.w3c.dom.DocumentFragment y se le a�adir� cada elemento del array como hijo aplic�ndole estas mismas reglas.
- Si el resultado no es de ninguno de estos tipos se insertar� como nodo de texto basado en un toString() del objeto.
- <xsp:element>: Permite insertar un nuevo elemento en el documento cuyo nombre
ser� el especificado en el atributo name de esta etiqueta. El contenido de la etiqueta ser�
el contenido del elemento. Es �til si el nombre del elemento se decide din�micamente. Por ejemplo:
<clock> <xsp:element name=time><xsp:content><xsp:expr>new Date()</xsp:expr><xsp:content></xsp:element> </clock>
se traducir� en el documento final en:
<clock> <time>Wed Jul 04 15:12:49 CEST 2001</time> </clock>
- <xsp:attribute>: Permite a�adir un atributo al nodo actual. El nombre del atributo ser�
el especificado en el atributo name de la etiqueta y el valor ser� su contenido. Por
ejemplo:
<clock> <xsp:attribute name=time><xsp:expr>new Date()</xsp:expr></xsp:attribute> </clock>
se traducir� en el documento final en:
<clock time="Wed Jul 04 15:12:49 CEST 2001"/>
- <xsp:pi>: Permite insertar una instrucci�n de proceso en el documento generado. El
nombre de la instrucci�n de proceso vendr� determinado por el atributo target de esta
etiqueta. El contenido ser� colocado dentro del cuerpo de la instrucci�n de proceso. Por
ejemplo:
<xsp:pi target="process"> href="<xsp:expr>request.getQueryString()</xsp:expr>" type="forward" </xsp:pi>
Se traducir� en:
<?process href="http://www.aqs.com/xsp/example" type="forward"?>
- <xsp:comment>: Permite insertar un texto a modo de comentario din�mico en el
documento generado. El texto del comentario ser� el contenido de esta etiqueta. Por
ejemplo:
<xsp:comment> Bla Bla Bla </xsp:comment>
Se traducir� en:
Bla Bla Bla
Aunque pueda parecer m�s razonable algo como <!-- Bla Bla Bla -->, este es el comportamiento actual de Cocoon (v1.82).
Ahora s�lo queda por ver c�mo pueden colocarse estas etiquetas. Puesto que en una XSP no se sabe a priori que elementos van a aparecer, dif�cilmente se puede hacer una DTD o un schema rigurosos, por lo que se va a dar una notaci�n alternativa que debe entenderse como orientativa m�s que como determinante.
Etiqueta | Contenido v�lido | Atributos |
---|---|---|
xsp:page | xsp:structure (?) , xsp:logic (?) , [user root] | language indent-result: yes | no xmlns:xsp xml:space: default | preserve [user name_space definitions] |
xsp:structure | xsp:dtd (?), xsp:include (*) | � |
xsp:dtd | [texto] | � |
xsp:include | [texto] | � |
[user root] | ( [texto] | xsp:attribute(*) | xsp:logic (*) | xsp:element (*) | xsp:expr (*) | xsp:pi (*) | xsp:comment | [user tag] (*) )* |
[user root attributes] |
xsp:attribute | ( [texto] | xsp:expr (*) )* |
name xml:space: default | preserve |
xsp:logic | ( [texto (c�digo embebido)] | xsp:content (*) | xsp:pi (*) | xsp:comment )* |
xml:space: default | preserve |
xsp:content | ( [texto (XML)] | xsp:logic (*) | xsp:expr(*) | xsp:element (*) | xsp:pi (*) | xsp:comment (*)| [user tag] (*) )* |
� |
xsp:pi | ( [texto] | xsp:expr )* |
target |
xsp:comment | ( [texto] | xsp:expr(*) )* |
� |
xsp:element | ( [texto] | xsp:attribute (*) | xsp:element (*)| xsp:logic (*) | xsp:expr (*) | [user tag] (*) )* |
name |
xsp:expr | [texto] | � |
[user tag] | ( [texto] | xsp:attribute(*) | xsp:logic (*) | xsp:element (*) | xsp:expr (*) | xsp:pi (*) | xsp:comment | [user tag] (*) )* |
[user root attributes] |
Leyenda | (?) -> 0 � 1 | (+) -> 1 � m�s | (*) -> 0 � m�s | Si no, 1 |
---|
El uso t�pico de estas etiquetas es:
- Una etiqueta <xsp:page> despu�s de las instrucciones de proceso. Este ser� el elemento ra�z de la XSP (no del documento generado).
- Una etiqueta <xsp:structure> que contiene la lista de importaciones mediante etiquetas <xsp:include>.
- A continuaci�n puede venir una etiqueta <xsp:logic> donde se escribir� la l�gica a nivel de clase (es decir, definiciones de atributos y de m�todos).
- Despu�s ha de venir una etiqueta definida por el usuario. Esta ser� la ra�z del documento generado y su contenido pasar� a formar parte del m�todo populateDocument() de XSPPage. Dentro de la etiqueta xsp:page s�lo puede haber una etiqueta no xsp.
- Dentro de la ra�z de usuario se puede escribir en dos modos para generar el
documento final: En modo XML y en modo c�digo embebido.
- En el modo XML se pueden escribir directamente etiquetas XML que pasar�n a formar parte del documento generado. Este es el modo por defecto dentro del elemento ra�z definido por el usuario. Para pasar a modo XML se introduce una etiqueta <xsp:content>. Si en este modo se quiere insertar el resultado de evaluar una expresi�n o una variable definidos en un bloque de l�gica se debe usar una etiqueta <xsp:expr>. En este modo tambi�n se pueden insertar elementos y atributos usando <xsp:element> y %lt;xsp:attribute>.
- En el modo de c�digo embebido se puede escribir c�digo fuente usando la
sintaxis del lenguaje elegido en el atributo language del elemento
xsp:page, normalmente Java. Este c�digo pasar� a formar parte
directamente del c�digo fuente generado para la XSPPage. Para pasar a
este modo hay que usar una etiqueta <xsp:logic>. No hay que olvidar
que una XSP es un documento XML y como tal tiene ciertos caracteres
reservados que hay que escapar. Estos son:
- "<" -> "<"
- ">" -> ">"
- "&" -> "&"
As�, por ejemplo, para escribir:
if ( (a > 10) && (a < 20) ) { . . . }
se tendr�a que escribir en la XSP:
if ( (a > 10) && (a < 20) ) { . . . }
o, de forma alternativa:
<![CDATA[ if ( (a > 10) && (a < 20) ) { . . . } ]]>
Las XSP proveen de ciertas facilidades al desarrollador:
Ya se incluyen por defecto muchos imports frecuentes:
- java.io.*;
- java.util.*;
- org.w3c.dom.*;
- org.xml.sax.*;
- javax.servlet.*;
- javax.servlet.http.*;
- org.apache.cocoon.parser.*;
- org.apache.cocoon.producer.*;
- org.apache.cocoon.framework.*;
- org.apache.cocoon.processor.xsp.*;
Tambi�n se instancian objetos corrientes para que est�n ya en la p�gina listos para ser usados. Estos son:
- request. El objeto HttpServletRequest que encapsula la petici�n. Se trata de un wrapper del objeto real que recibe Cocoon, pero con la misma funcionalidad.
- response. Un wrapper del objeto HttpServletResponse que recibe Cocoon. Ofrece todas las funciones del objeto real salvo el acceso al ServletOutputStream para preservar la consistencia de la salida manejada por Cocoon.
- session. El objeto HttpSession.
- servletContext. El objeto ServletContext est�ndar.
- document. El org.w3c.Document donde se van insertando todos los elementos hasta conformar el resultado final.
- xspGlobal. Es un contenedor de informaci�n compartida a nivel de aplicaci�n. Su existencia viene justificada porque el objeto servletContext de versiones del JSDK anteriores a la 2.2 no admit�an su uso para mantener informaci�n compartida a nivel de aplicaci�n. En futuras versiones, este objeto ser� depreciado.
- xspNodeStack. Una pila (java.util.Stack) para controlar la anidaci�n de los elementos del documento.
- xspCurrentNode. El org.w3c.Node actual.
- xspParentNode. El org.w3c.Node padre del nodo actual.
- xspParser. Un DOM parser proporcionado por Cocoon.
Una vez conocidos los elementos que puede contener una XSP y c�mo pueden combinarse y el entorno de objetos y clases accesibles, se pasar� a explicar aspectos interesantes para el desarrollador sobre c�mo funciona internamente una XSP.
La primera vez que se invoca una XSP, comienza el proceso de transformaciones del XML hasta llegar al c�digo fuente de la XSPPage. Se produce una transformaci�n por cada espacio de nombres definido en el elemento xsp:page que se corresponda con una logicsheet (nombre que da Cocoon a las taglibs) definida en el cocoon.properties. Esto se ver� con mayor detalle en el apartado dedicado a las taglibs. La �ltima transformaci�n convierte el XML a c�digo fuente en el lenguaje indicado (por el momento Java). Este c�digo fuente incluye:
- Un nombre de paquete generado por Cocoon.
- Una lista de imports mezcla de los predefinidos y de los definidos por el usuario con xsp:include.
- Un nombre de clase generado por Cocoon. Esta clase extiende XSPPage.
- Si colgando de xsp:page cuelga un bloque xsp:logic, esta l�gica se introducir� tal cual dentro de la clase. Por lo que se puede aprovechar para definir atributos y m�todos.
- El contenido del elemento ra�z definido por el usuario ser� transformado en c�digo para generar XML dentro del m�todo populateDocument(). Este m�todo declara que puede lanzar Exception, por lo que no ser� necesario introducir este c�digo dentro de un try-catch, ya que estas excepciones las recoge Cocoon para generar una p�gina de error. Aunque no sea necesario es recomendable controlar en cada momento estos errores y no permitir que aparezca la pantalla de error de Cocoon.
Tras la generaci�n del c�digo fuente se procede a la compilaci�n de la p�gina. Tanto el c�digo fuente como el compilado son guardados en sendos archivos seg�n la estructura de paquetes generada a partir del directorio repository (nombre por defecto, que se puede cambiar en el cocoon.properties) en el ra�z del servidor.
Posteriormente Cocoon invoca el m�todo populateDocument() de la XSPPage para obtener el XML resultante.
Este XML puede ser reprocesado por Cocoon si incluye m�s instrucciones de proceso. El proceso m�s habitual es la transformaci�n con ayuda de XSLT, aunque tambi�n se pueden usar instrucciones de formateo y de acceso a bases de datos.
Para asignar una XSL al resultado de la XSP se debe incluir 2 instrucciones de proceso especiales despu�s de la instrucci�n de proceso de XSP:
<?cocoon-process type="xslt"?> <?xml-stylesheet type="text/xsl" href="<ruta_archivo_xsl>"?>
Tambi�n se puede asignar de forma din�mica desde el c�digo de la p�gina:
<xsp:page ......> <root> <xsp:logic> Node rootNode = xspCurrentNode; String MY_XSL = "myXSL.xsl"; ...//more code and more XML document.insertBefore( document.createProcessingInstruction( "cocoon-process", "type=\"xslt\"" ), nodeRoot ); document.insertBefore( document.createProcessingInstruction( "xml-stylesheet", "href=\""+MY_XSL+"\" type=\"text/xsl\"" ), nodeRoot ); ...//more code and more XML </xsp:logic> </root> </xsp:page>
En el pr�ximo cap�tulo se describe un ejemplo de XSP.