Explicaremos cómo combinar XML y XSL para formatear un documento XML en el servidor con versiones antiguas de JSP.
Utilizando JSP 2.0, podemos combinar JSP y XSL para formatear documentos XML en el servidor
No siempre es posible (ni conveniente) utilizar lo último de lo último. Si os fijáis en las grandes organizaciones, normalmente estandarizan una versión de Java, JSP, EJB, etc... y hasta que no pasa un tiempo y se consolidan las tecnologías (y aparecen parches) no se cambia de versión.
Entonces, es posible que tengáis que apañaros para hacer lo mismo ..... con versiones anteriores de JSP.
Veréis que es bastante sencillo y os vamos a mostrar como se hace paso a paso.... utilizando el patrón MVC.
Pondremos los ejemplos con NetBeans. Mucha gente me pregunta por qué lo uso..... La razón es sencilla, me parece muy intuitivo... aunque hay otras opciones más potentes.
Crear el Proyecto
Creamos en NetBeans un proyecto
Vamos a crear unos documento XML y XSL con los generadores de código.
Seleccionamos dentro del grupo XML
Asignamos un nombre
Vamos a utilizar este documento como base:
<?xml version="1.0" encoding="UTF-8"?>
<tutoriales>
<tutorial>
<autor>rcanales@autentia.com</autor>
<nombre>JSP 2.0</nombre>
<enlace>jspel</enlace>
<descripcion>Nuevas caracteristicas de JSPs 2.0</descripcion>
</tutorial>
<tutorial>
<autor>alejandropg@autentia.com</autor>
<nombre>Struts y Eclipse</nombre>
<enlace>struts</enlace>
<descripcion>Configuración del entorno Struts en Eclipse</descripcion>
</tutorial>
</tutoriales>
Repetimos pero ahora seleccionamos un documento XSL
Escribimos nuestro XSL
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
<table border="1">
<tr>
<td><b>Autor</b></td>
<td><b>Nombre</b></td>
<td><b>Enlace</b></td>
<td><b>Descripción</b></td>
</tr>
<xsl:for-each select="//tutorial">
<tr>
<td><xsl:value-of select="autor"/></td>
<td><xsl:value-of select="nombre"/></td>
<td><xsl:value-of select="enlace"/></td>
<td><xsl:value-of select="descripcion"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
Probar la transformación en NetBeans
Vamos a usar las características de NetBeans para probar como quedaría....
Seleccionamos, pinchando el botón derecho sobre el XML o XSL
Seleccionamos los ficheros
Y vemos el resultado
Activamos nuestro directorio como una WebApp
Introducir el código Java
Ahora, vamos a escribir una clase Java que sea capaz de hacer una transformación y retornárnosla como una cadena.
Escribir la clase Java de prueba
En este caso, vamos a utilizar un interfaz para motores de transformación denominado JAXP (ver documentación en SUN)
No tenemos que incluir nada extraordinario por la versión de Java que estamos usando.
import java.io.*;
import javax.xml.transform.*;
import javax.xml.transform.sax.*;
import javax.xml.transform.stream.*;
import org.xml.sax.*;
/**
*
* @author Roberto Canales
*/
public class transformador
{
void depura (String pCadena)
{
System.out.println("Mensaje: " + pCadena);
}
public static void main(String [] args) {
transformador p = new transformador();
try
{
p.depura("Comenzamos transformación");
p.depura(p.transformar());
p.depura("Terminamos");
}
catch(Exception e)
{
p.depura("Errores en aplicación");
e.printStackTrace();
}
}
public String transformar() throws Exception
{
String xmlOrigen = "C:\\ejemplos\\jaxpjsp\\xmlbase.xml";
String xslOrigen = "C:\\ejemplos\\jaxpjsp\\xslbase.xsl";
Source xmlSource = new StreamSource(new File(xmlOrigen));
Source xsltSource = new StreamSource(new File(xslOrigen));
StringWriter cadenaSalida = new StringWriter();
Result bufferResultado = new StreamResult(cadenaSalida);
TransformerFactory factoriaTrans = TransformerFactory.newInstance();
Transformer transformador = factoriaTrans.newTransformer(xsltSource);
transformador.transform(xmlSource, bufferResultado);
return cadenaSalida.toString();
}
}
Si ejecutamos este código, veremos en la pantalla de salida:
Mensaje: Comenzamos transformación
Mensaje: <table border="1">
<br>
<tr>
<td><b>Autor</b></td><td><b>Nombre</b> </td><td><b>Enlace</b></td><td><b>Descripción</b></td>
</tr>
<tr>
<td>rcanales@autentia.com</td><td>JSP 2.0</td><td>jspel</td><td>Nuevas caracteristicas de JSPs 2.0</td>
</tr>
<tr>
<td>alejandropg@autentia.com</td><td>Struts y Eclipse</td><td>struts</td><td>Configuración del entorno Structs en Eclipse</td>
</tr>
</table>
Mensaje: Terminamos
Es decir, funciona......
Crear el MVC
Ahora, vamos a crear un servlet, que generará un XML y lo pasará (en MVC) a un JSP. Vamos a introducir directamente el XML en una cadena de caracteres.... dando por supuesto que se obtendría de otro modo (por ejemplo usando una Base de Datos XML)
Este JSP, puede ejecutar el código de la transformación con distintas técnicas:
Los distintos métodos de comunicación entre estos elementos (Servlets, Beans, JSPs y Tags los podéis ver en otro de loa tutoriales de adictosaltrabajo)
Os mostramos como hacerlo con un JSP con Scriplet... el resto de los métodos es muy sencillo .
El servlet
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class controlador extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
try
{
String elXML = "<tutoriales><tutorial><autor>rcanales@autentia.com</autor>
<nombre>JSP 2.0</nombre><enlace>jspel</enlace><descripcion>Nuevas caracteristicas de JSPs 2.0</descripcion>
</tutorial><tutorial><autor>alejandropg@autentia.com</autor><nombre>Struts y Eclipse</nombre>
<enlace>struts</enlace><descripcion>Configuración del entorno Structs en Eclipse</descripcion>
</tutorial></tutoriales>";
request.setAttribute ("xml",elXML);
getServletConfig().getServletContext().getRequestDispatcher("/presentacion.jsp").forward(request, response);
}
catch (Exception ex)
{
ex.printStackTrace ();
}
}
}
EL JSP
<%@page contentType="text/html" import="java.io.*,javax.xml.transform.*,javax.xml.transform.sax.*, javax.xml.transform.stream.*,org.xml.sax.*"%>
<html>
<head><title>JSP Page</title></head>
<body>
<center>
<H1>JSP, transformando XML con XSL</h1>
<br>
<%
String xmlOrigen = (String)request.getAttribute("xml");
String xslOrigen = "C:\\ejemplos\\jaxpjsp\\xslbase.xsl";
Source xmlSource = new StreamSource(new StringBufferInputStream(xmlOrigen));
Source xsltSource = new StreamSource(new File(xslOrigen));
StringWriter cadenaSalida = new StringWriter();
Result bufferResultado = new StreamResult(cadenaSalida);
TransformerFactory factoriaTrans = TransformerFactory.newInstance();
Transformer transformador = factoriaTrans.newTransformer(xsltSource);
transformador.transform(xmlSource, bufferResultado);
out.print(cadenaSalida.toString());
%>
</center>
</body>
</html>
La salida es:
Bueno, ya sabéis como hacerlo ..... y con Struts.... sería igual de sencillo.
No siempre es posible (ni conveniente) utilizar lo último de lo último. Si os fijáis en las grandes organizaciones, normalmente estandarizan una versión de Java, JSP, EJB, etc... y hasta que no pasa un tiempo y se consolidan las tecnologías (y aparecen parches) no se cambia de versión.
Entonces, es posible que tengáis que apañaros para hacer lo mismo ..... con versiones anteriores de JSP.
Veréis que es bastante sencillo y os vamos a mostrar como se hace paso a paso.... utilizando el patrón MVC.
Pondremos los ejemplos con NetBeans. Mucha gente me pregunta por qué lo uso..... La razón es sencilla, me parece muy intuitivo... aunque hay otras opciones más potentes.
Crear el Proyecto
Creamos en NetBeans un proyecto
Vamos a crear unos documento XML y XSL con los generadores de código.
Seleccionamos dentro del grupo XML
Asignamos un nombre
Vamos a utilizar este documento como base:
<?xml version="1.0" encoding="UTF-8"?>
<tutoriales>
<tutorial>
<autor>rcanales@autentia.com</autor>
<nombre>JSP 2.0</nombre>
<enlace>jspel</enlace>
<descripcion>Nuevas caracteristicas de JSPs 2.0</descripcion>
</tutorial>
<tutorial>
<autor>alejandropg@autentia.com</autor>
<nombre>Struts y Eclipse</nombre>
<enlace>struts</enlace>
<descripcion>Configuración del entorno Struts en Eclipse</descripcion>
</tutorial>
</tutoriales>
Repetimos pero ahora seleccionamos un documento XSL
Escribimos nuestro XSL
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
<table border="1">
<tr>
<td><b>Autor</b></td>
<td><b>Nombre</b></td>
<td><b>Enlace</b></td>
<td><b>Descripción</b></td>
</tr>
<xsl:for-each select="//tutorial">
<tr>
<td><xsl:value-of select="autor"/></td>
<td><xsl:value-of select="nombre"/></td>
<td><xsl:value-of select="enlace"/></td>
<td><xsl:value-of select="descripcion"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
Probar la transformación en NetBeans
Vamos a usar las características de NetBeans para probar como quedaría....
Seleccionamos, pinchando el botón derecho sobre el XML o XSL
Seleccionamos los ficheros
Y vemos el resultado
Activamos nuestro directorio como una WebApp
Introducir el código Java
Ahora, vamos a escribir una clase Java que sea capaz de hacer una transformación y retornárnosla como una cadena.
Escribir la clase Java de prueba
En este caso, vamos a utilizar un interfaz para motores de transformación denominado JAXP (ver documentación en SUN)
No tenemos que incluir nada extraordinario por la versión de Java que estamos usando.
import java.io.*;
import javax.xml.transform.*;
import javax.xml.transform.sax.*;
import javax.xml.transform.stream.*;
import org.xml.sax.*;
/**
*
* @author Roberto Canales
*/
public class transformador
{
void depura (String pCadena)
{
System.out.println("Mensaje: " + pCadena);
}
public static void main(String [] args) {
transformador p = new transformador();
try
{
p.depura("Comenzamos transformación");
p.depura(p.transformar());
p.depura("Terminamos");
}
catch(Exception e)
{
p.depura("Errores en aplicación");
e.printStackTrace();
}
}
public String transformar() throws Exception
{
String xmlOrigen = "C:\\ejemplos\\jaxpjsp\\xmlbase.xml";
String xslOrigen = "C:\\ejemplos\\jaxpjsp\\xslbase.xsl";
Source xmlSource = new StreamSource(new File(xmlOrigen));
Source xsltSource = new StreamSource(new File(xslOrigen));
StringWriter cadenaSalida = new StringWriter();
Result bufferResultado = new StreamResult(cadenaSalida);
TransformerFactory factoriaTrans = TransformerFactory.newInstance();
Transformer transformador = factoriaTrans.newTransformer(xsltSource);
transformador.transform(xmlSource, bufferResultado);
return cadenaSalida.toString();
}
}
Si ejecutamos este código, veremos en la pantalla de salida:
Mensaje: Comenzamos transformación
Mensaje: <table border="1">
<br>
<tr>
<td><b>Autor</b></td><td><b>Nombre</b> </td><td><b>Enlace</b></td><td><b>Descripción</b></td>
</tr>
<tr>
<td>rcanales@autentia.com</td><td>JSP 2.0</td><td>jspel</td><td>Nuevas caracteristicas de JSPs 2.0</td>
</tr>
<tr>
<td>alejandropg@autentia.com</td><td>Struts y Eclipse</td><td>struts</td><td>Configuración del entorno Structs en Eclipse</td>
</tr>
</table>
Mensaje: Terminamos
Es decir, funciona......
Crear el MVC
Ahora, vamos a crear un servlet, que generará un XML y lo pasará (en MVC) a un JSP. Vamos a introducir directamente el XML en una cadena de caracteres.... dando por supuesto que se obtendría de otro modo (por ejemplo usando una Base de Datos XML)
Este JSP, puede ejecutar el código de la transformación con distintas técnicas:
- Scriplet (Código Java en el JSP)
- Un Java Bean
- Un TAG de usuario
- Usando JSTL de JSP 2.0
Los distintos métodos de comunicación entre estos elementos (Servlets, Beans, JSPs y Tags los podéis ver en otro de loa tutoriales de adictosaltrabajo)
Os mostramos como hacerlo con un JSP con Scriplet... el resto de los métodos es muy sencillo .
El servlet
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class controlador extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
try
{
String elXML = "<tutoriales><tutorial><autor>rcanales@autentia.com</autor>
<nombre>JSP 2.0</nombre><enlace>jspel</enlace><descripcion>Nuevas caracteristicas de JSPs 2.0</descripcion>
</tutorial><tutorial><autor>alejandropg@autentia.com</autor><nombre>Struts y Eclipse</nombre>
<enlace>struts</enlace><descripcion>Configuración del entorno Structs en Eclipse</descripcion>
</tutorial></tutoriales>";
request.setAttribute ("xml",elXML);
getServletConfig().getServletContext().getRequestDispatcher("/presentacion.jsp").forward(request, response);
}
catch (Exception ex)
{
ex.printStackTrace ();
}
}
}
EL JSP
<%@page contentType="text/html" import="java.io.*,javax.xml.transform.*,javax.xml.transform.sax.*, javax.xml.transform.stream.*,org.xml.sax.*"%>
<html>
<head><title>JSP Page</title></head>
<body>
<center>
<H1>JSP, transformando XML con XSL</h1>
<br>
<%
String xmlOrigen = (String)request.getAttribute("xml");
String xslOrigen = "C:\\ejemplos\\jaxpjsp\\xslbase.xsl";
Source xmlSource = new StreamSource(new StringBufferInputStream(xmlOrigen));
Source xsltSource = new StreamSource(new File(xslOrigen));
StringWriter cadenaSalida = new StringWriter();
Result bufferResultado = new StreamResult(cadenaSalida);
TransformerFactory factoriaTrans = TransformerFactory.newInstance();
Transformer transformador = factoriaTrans.newTransformer(xsltSource);
transformador.transform(xmlSource, bufferResultado);
out.print(cadenaSalida.toString());
%>
</center>
</body>
</html>
La salida es:
Bueno, ya sabéis como hacerlo ..... y con Struts.... sería igual de sencillo.
Roberto Canales Mora
Director General de Autentia