El sistema de publicación en web Cocoon

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:
      • "<" -> "&lt;"
      • ">" -> "&gt;"
      • "&" -> "&amp;"

      As�, por ejemplo, para escribir:

      if ( (a > 10) && (a < 20) ) {
      . . .
      }
          

      se tendr�a que escribir en la XSP:

      if ( (a &gt; 10) &amp;&amp; (a &lt; 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.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
SIGUIENTE ARTÍCULO