Desarrollar Soluciones XML con Tecnología JSP
XML (eXtensible Markup Language) es un conjunto de reglas de síntaxis y guías para definir lenguajes de texto basados en marcas.
Los lenguajes XML tienen un gran número de usos, incluyendo.
- El intercambio de información
- La definición de tipos de documentos
- La especificación de mensajes
La información que se expresa en un formato estructurado basado en texto puede ser fácilmente transmitida, trasformada e
interpretada por entidades que entiendan la estructura. De esta forma XML nos trae los mismos beneficios multi-plataforma para
el intercambio de información que el lenguaje de programación Java tiene para el procesamiento.
La tecnología JavaServer Pages (JSP) proporciona especificación y servicios de documentos que combinan elementos de lenguaje
de marcas estáticos y elementos creados dinámicamente mediante objetos del lenguaje Java. Las páginas JSP se ejecutan como
Servlets Java, normalmente en el contexto de un servidor Web donde generan documentos de respuesta dependientes del
contenido usando datos almacenados en bases de datos y en otros objetos de aplicación basados en servidor.
Los servidores de aplicaciones y las herramientas de desarrollo que soportan la tecnología JSP están disponibles a través de muchos
vendedores (inlcuyendo grupos de código abierto) para un ámplio rango de plataformas hardware y software.
La tecnología JSP proporciona un número de capacidades que son ideales para trabajar con XML. Las páginas JSP pueden contener
cualquier tipo de datos basados en texto, por eso son correctas para generar documentos que contienen marcas XML. Las páginas
JSP también pueden usar todo el poder de la plataforma Java para acceder a objetos del lenguaje para analizar y transformar
mensajes XML en documentos. En particular, como parte del entorno Java, las páginas JSP pueden usar objetos que utilicen los
nuevos APIs Java para procesar datos XML. Finalmente la tecnología JSP proporciona un mecanismo de abstracción para encapsular
la funcionalidad y así facilitar su uso dentro de una página JSP.
Está página muestra cómo las páginas JSP pueden.
Esta página asume que estás familiarizado con la tecnología JSP, incluyendo los componentes JavaBeans y las librerías de etiquetas personalizadas.
Usar Fuentes de datos XML en Páginas JSP
Es sencillo usar múltiple fuentes de datos, incluyendo fuentes XML, en una página JSP; la siguiente figura ilustra la forma estándard
de hacer esto. Una página conecta con un fuente de datos a través de un objeto del lado del servidor, transforma la información en
obstracciones de datos y los muestra usando elementos JSP.
Consideremos la siguiente representación XML de un inventario de libros.
<?xml version="1.0" encoding="ISO-8859-1"?>
<books>
<book isbn="123">
<title>Web Servers for Fun and Profit</title>
<quantity>10</quantity>
<price>$17.95</price>
</book>
<book isbn="456">
<title>Web Programming for Mobile Devices</title>
<quantity>2</quantity>
<price>$38.95</price>
</book>
<book isbn="789">
<title>Duke: A Biography of the Java Evangelist</title>
<quantity>25</quantity>
<price>$15.00</price>
</book>
</books>
Hay dos formas en las que podríamos usar datos XML en una página JSP.
- Convertir los elementos XML en objetos del lado del servidor y luego extraer las propiedades de los objetos.
- Invocar una transformación de los datos XML.
Convertir XML en Objetos del Lado del Servidor y Extraer las Propiedades del Objeto
En la primera aproximación, los objetos se crearon para representar la información contenida en el documento XML. Actualmente
tenemos que escribir código, usando DOM o SAX y encapsularlo dentro de una etiqueta de usuario o un componente JavaBean, para
crear estos objetos. En el futuro, la tecnología "XML/Java Binding" (JSR 31 en el "Java Community Process") automatizará este
proceso porque nos permitirá compilar un esquema XML en una clase Java.
En el siguiente ejemplo, una página JSP recupera datos XML desde dos URLs y usa los datos para generar una página HTML. Observa
que la URL puede apuntar a una fuente que genere datos XML de forma dinámica, o a un documento XML estático, se puede utilizar
la misma técnica para generar XML.
La página JSP usa la etiqueta personalizada del analizador para extraer y almacenar los datos XML en dos objetos: un
customer y una colección books. Luego la página extrae las propiedas del objeto
customer y usa una etiqueta personalizada para iterar a través de la colección y mostrar una tabla que liste
las propiedades de los objetos book.
<%@ taglib uri="..." prefix="tl" %>
<html>
<tl:parse id="customer" type="Customer"
xml="XML_Customer_URL"/>
<tl:parse id="saleBooks" type="BookInventory"
xml="XML_Book_Inventory_URL"/>
<head>
<title>Welcome</title>
</head>
<body>
Welcome
<jsp:getProperty name="customer" property="lastName"/>
<jsp:getProperty name="customer" property="firstName"/>
<table border="0" width="50%">
<tl:iterate id ="book" type=”Book”
collection=”<%= saleBooks.getBooks() %>” >
<tr>
<td>
<jsp:getProperty name="book"
property="title"/>
</td>
<td>
<jsp:getProperty name="book"
property="price"/>
</td>
</tr>
</tl:iterate>
</table>
</body>
</html>
Uno de los documentos XML de este ejemplo (los datos del inventario de libros) está compuesto por fragmentos XML (elementos
book). No es realmente necesario analizar el documento completo en memoria para extraer los datos -- podemos analizarlo usando
SAX o JDOM, por ejemplo, y extraer los datos de un fragmento cada vez. La siguiente versión del ejemplo usa la etiqueta
personalizada iterateOnXMLStream para implementar esta alternativa.
<%@ taglib uri="..." prefix="tl" %>
<html>
<tl:parse id="customer" type="Customer"
xml="XML_Customer_URL"/>
<head>
<title>Welcome</title>
<body>
as above ...
<table border="0" width="50%">
<tl:iterateOnXMLStream id="book" type="Book"
xml="XML_Book_Inventory_URL">
<tr>
as above ...
</tr>
</tl:iterateOnXMLStream>
</table>
</body>
</html>
Convertir XML Usando una Transformación XSLT
Otra forma de usar datos XML en un página JSP es aplicar una transformación a la fuente de los datos XML, o para extraer los datos,
o para crear un nuevo formato. Esta transformación puede hacerse usando varios mecanismos diferentes y accediendo a través de
etiquetas personalizadas.
XSLT es un lenguaje transformacional estándarizado en el W3C que puede ser usado para transformar datos XML en HTML, PDF u
otro formato XML. Por ejemplo, podemos usar XSLT para convertir un documento XML de un formato usado por una compañia al
formato usado por otra compañia.
Para generar el HTML de la página de la sección anterior usando está aproximación necesitamos una hoja de estilo XSL y una forma
de aplicar esa hoja de estilos. La hoja de estilos XSL del ejemplo siguiente realiza las transformaciones necesarias para los elementos
book y customer. La hoja de estilos genera marcas HTML y extrae los datos de los
elementos.
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="books">
<table border="0" width="50%">
<xsl:for-each select="book">
<tr>
<td>
<i><xsl:value-of select="title"/></i>
</td>
<td>
<xsl:value-of select="price"/>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
<xsl:template match="customer">
<b><xsl:value-of select="first_name"/>
<xsl:value-of select="last_name"/></b>
</xsl:template>
</xsl:stylesheet>
Para aplicar la hoja de estilo, programáticamente invocamos a un procesador XSLT desde un scriplet JSP o una etiqueta
personalizada. El proyecto de jakarta-taglibs de la "Apache Software Foundation" mantiene una librería de
etiquetas que contiene varias de ellas para procesar entradas XML y aplicar transformaciones XSLT. La página JSP siguiente invoca a
la etiqueta apply de esta librería con store.xsl para transformar los datos del cliente
y del inventario de libros.
<%@taglib uri="http://jakarta.apache.org/taglibs/xsl-1.0"
prefix="xsltlib" %>
<html>
<head>
<title>Book Inventory</title>
</head>
<body bgcolor="white">
<center>
Welcome
<xsltlib:apply xml="XML_Customer_URL" xsl="store.xsl"/>!
<p></p>
<font color="red">
On Sale Today ...
</font>
<p></p>
<xsltlib:apply xml="XML_Book_Inventory_URL" xsl="store.xsl"/>
</center>
</body>
</html>
Abajo puedes ver el resultado de la ejecución de esta página.
Generar Lenguajes de Marcas usando Páginas JSP
Para que los servicios basados en Web tengan un uso más amplio tienen que conseguir un incremento importante para que sean
accesibles desde la más amplia variedad de clientes. En los últimos años han proliferado diferentes tipo de clientes orientados a
usuarios para aplicaciones basadas en Web: PDAs, teléfonos móviles WAP, y clientes de línea de voz terrestre. Con el incremento
de las transaciones negocio-a-negocio, los servidores que consumen XML pueden también ser clientes. El escenario que nosotros
visionamos se parecería a esto.
Estos clientes hablan los siguientes lenguajes:
| Cliente |
Lenguaje de Marcas |
| Navegador basado en PC |
HTML, DHTML y XHTML |
| PDA |
WML y XHTML |
| Teléfono Móvil |
WML y XHTML |
| Teléfono Terrestre |
XML de Voz |
| Servidor |
Lenguajes XML específicos de la aplicación |
El esfuerzo requerido para soportar todos estos clientes empequeñecerá el esfuerzo que se hizo con las aplicaciones HTML durante
los noventa. Afortunadamente las mejores herramientas ya están disponibles: la tecnología JSP y XML. Luego describiremos cómo
usar estas herramientas para desarrollar aplicaciones Web multi-lenguaje.
Generar XML desde una Página JSP
Ya hemos visto como las páginas JSP pueden consumir datos XML para generar contenido dinámico. Las páginas JSP también
pueden generar datos XML. Recordamos el documento XML presentado al principio de esta página.
<?xml version="1.0" encoding="ISO-8859-1"?>
<books>
<book isbn="123">
<title>Web Servers for Fun and Profit</title>
<quantity>10</quantity>
<price>$17.95</price>
</book>
...
</books>
Una página JSP podría generar un respuesta conteniendo este documento para satisfacer una petición de negocio-a-negocio sobre
los contenidos de un almacen de libros. El ejemplo del consumidor descrito anteriormente también podría usar esta página como
fuente de datos XML.
El punto principal para generar XML es que la página JSP seleccione el tipo de contenido de la página de forma apropiada:
<%@ page contentType=”text/xml”%>
... XML document
Con este cambio, las técnicas descritas anteriormente para generar contenido HTML pueden usarse para generar XML.
Generar Multiples Lenguajes de Marcas
Hay varias aproximaciones para generar multiples lenguajes de marcas desde una aplicación Web.
- Tubería sencilla
- Tubería múltiple
- Combinación de tuberías
Tubería Sencilla
En la aproximación de tubería sencilla, las páginas JSP de la aplicación Web generan marcas específicas de clientes aplicando
transformaciones a los datos XML entrantes. Cada tipo de cliente requiere una hoja de estilo diferente y el principal coste de
desarrollo está asociado con la creacción y mantenimiento de estas hojas de estilo.
Esta aproximación aplaza la generación de las porciones estática y dinámica de una respuesta al momento de ejecución. El coste de
la ejecución está asociado con.
- Analizar los Datos XML
- Analizar la hoja de estilos
- Aplicar la Transformación
Si estamos usando transformaciones XSLT, podremos mejorar el rendimiento de las transformaciones creando una representación
binaria (usando un compilador XSLT, por ejemplo, XSLTC) para una hoja de estilo. Sin embargo, esto también hace el proceso de
mantenimiento más complejo: cada vez que la presentación cambie, la hoja de estilo debe recompilarse.
Algunas veces las diferencia entre clientes son menores y podría no merecer la pena modificar la transformación. Por ejemplo, hay
una variedad de ligeras diferencias entre clientes de escritorio basados en navegadores. En algunos casos, uno podría querer
aprovecharse de las diferencias en vez de generar contenido para el mínimo común denominador. Frecuentemente las diferencias
entre estos clientes pueden encapsularse en una etiqueta personalizada que genera diferentes contenidos dependiendo de las
propiedades del cliente.
Generar la presentación para clientes con diferentes modelos de interacción y flujo de control (por ejemplo, navegadores basados
en PC contra teléfonos WAP) requiere transformaciones muy diferentes. Por ejemplo, un teléfono móvil no puede mostrar una tabla
que contiene datos de un inventario de libros. En su lugar los datos tendrían que mostrase en un conjunto de listas anidadas.
Soportar dichas transformaciones incrementa tanto los costes de desarrollo como de ejecución.
Tuberías Múltiples
La aproximación de tuberías múltiples usa un conjunto de páginas JSP específicas del cliente para generar la salida.
Comparándola con la utilización de transformaciones XSLT, esta aproximación mantiene el trabajo de creacción de contenido
estático en la fase de desarrollo dejando que la generación de contenido dinámico sea durante la ejecución.
Junto con las creacción de páginas JSP específicas del cliente, los costes de desarrollo incurren en la creacción y mantenimiento de
objetos del lado del servidor que representan la abstracción de datos de la aplicación. Este paso no es necesario para la
aproximación de tubería sencilla. De todas formas la aproximación de tuberías múltiples puede ser más barata que la de tubería
sencilla por las siguientes razones.
- Las abstracciones de datos pueden reutilizarse en diferentes tipos de páginas JSP.
- Las abstracciones de datos cambian mucho menos que la presentación.
- La ejecución de una página JSP para generar marcas es mucho más eficiente que realizar una transformación XSLT para generar
la misma marca.
La siguiente tabla sumariza el coste de cada aproximación:
| Tubería |
Desarrollo |
Ejecución |
| Sencillo |
El cliente especifica una hoja de estilo |
Analizar Datos XML
Analizar Hoja de Estilos
Aplicar Transformación |
| Múltiple |
Abstracción de Datos
El cliente especifica una página JSP |
Analizar Datos XML
Ejemplarizar e inicializar los componentes de abstracción
Ejecutar la página JSP |
Combinación de Tuberías
Podemos combinar las aproximacioens de tuberías simples y múltiples. Si nuestros clientes usan diferentes lenguajes probablemente
deberíamos usar una tubería para cada lenguaje. Para generar dialectos de un lenguaje, podríamos aplicar transformaciones XSLT a
la tubería de ese lenguaje.
Conclusión
La tecnología JavaServer Pages y el XML son compañeros naturales que usan fuentes de datos heterogéneas y soportan clientes
multi-lenguaje. Esta página ha descrito varias aproximaciones para direccionar estos requerimientos que mejoran el desarrollo y
mantenimiento contra el coste de ejecución. Como parte de la plataforma Java, las tecnología JSP proporciona a los
desarrolladores la capacidad de evaluar estas mejoras y de adoptar una tecnología para procesamiento XML que satisfaga los
rendimientos de su aplicación particular.
Recursos
Para posterior información sobre las tecnologías descritas en esta página, puedes visitar las siguientes sites (en Inglés).