Utilizando JSP 2.0, podemos combinar JSP e XSL para formatar documentos XML no servidor.
Nem sempre é possível (nem conveniente) utilizar o último do último. Se observarem, as grandes organizações normalmente padronizam uma versão de Java, JSP, EJB, etc... e até que se não passe um tempo e se consolidam as tecnologias (e aparecem remendos) não se muda de versão.
Então, é possível que tenhamos que nos virar para fazer o mesmo ..... com versões anteriores de JSP.
Vocês verão que é bastante simples e lhes mostraremos como se faz passo a passo.... utilizando o patrono MVC.
Colocaremos os exemplos com NetBeans. Muita gente me pergunta por que o utilizo..... A razão é simples, parece muito intuitivo... embora haja outras opções mais potentes.
Criar o Projeto
Criamos em NetBeans um projeto
Vamos criar alguns documentos XML e XSL com os geradores de código.
Selecionamos dentro do grupo XML
Atribuímos um nome
Vamos utilizar este documento como base:
<?xml versao="1.0" encoding="UTF-8"?>
<tutoriais>
<tutorial>
<autor>rcanales@autentia.com</autor>
<nome>JSP 2.0</nome>
<link>jspel</link>
<descricao>Novas caracteristicas de JSPs 2.0</descricao>
</tutorial>
<tutorial>
<autor>alejandropg@autentia.com</autor>
<nome>Struts e Eclipse</nome>
<link>struts</link>
<descricao>Configuração do ambiente Struts em Eclipse</descricao>
</tutorial>
</tutoriais>
Repetimos, porém agora selecionamos um documento XSL
Escrevemos nosso XSL
<?xml versao="1.0" encoding="UTF-8" ?>
<xsl:stylesheet versao="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>Nome</b></td>
<td><b>Link</b></td>
<td><b>Descrição</b></td>
</tr>
<xsl:for-each select="//tutorial">
<tr>
<td><xsl:value-of select="autor"/></td>
<td><xsl:value-of select="nome"/></td>
<td><xsl:value-of select="link"/></td>
<td><xsl:value-of select="descrição"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
Provar a transformação em NetBeans
Vamos usar as características de NetBeans para provar como ficaria....
Selecionamos, clicando o botão direito sobre o XML ou XSL
Selecionamos os arquivos
E vemos o resultado
Ativamos nosso diretório como uma WebApp
Introduzir o código Java
Agora, vamos escrever uma classe Java que seja capaz de fazer uma transformação e retorna-la como uma cadeia.
Escrever a classe Java de prova
Neste caso, vamos utilizar uma interface para motores de transformação denominado JAXP (
ver documentação em SUN)
Não temos que incluir nada extraordinário pela versão 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 pCadeia)
{
System.out.println("Mensagem: " + pCadeia);
}
public static void main(String [] args) {
transformador p = new transformador();
try
{
p.depura("Comecamos transformacao");
p.depura(p.transformar());
p.depura("Terminamos");
}
catch(Exception e)
{
p.depura("Erros em aplicacao");
e.printStackTrace();
}
}
public String transformar() throws Exception
{
String xmlOrigem = "C:\\exemplos\\jaxpjsp\\xmlbase.xml";
String xslOrigem = "C:\\exemplos\\jaxpjsp\\xslbase.xsl";
Source xmlSource = new StreamSource(new File(xmlOrigem));
Source xsltSource = new StreamSource(new File(xslOrigem));
StringWriter cadeiaSaida = new StringWriter();
Result bufferResultado = new StreamResult(cadeiaSaida);
TransformerFactory fabricaTrans = TransformerFactory.newInstance();
Transformer transformador = fabricaTrans.newTransformer(xsltSource);
transformador.transform(xmlSource, bufferResultado);
return cadeiaSaida.toString();
}
}
Se executamos este código, veremos na tela de saída:
Mensagem: Começamos transformação
Mensagem: <table border="1">
<br>
<tr>
<td><b>Autor</b></td><td><b>Nome</b> </td><td><b>Link</b></td><td><b>Descrição</b></td>
</tr>
<tr>
<td>rcanales@autentia.com</td><td>JSP 2.0</td><td>jspel</td><td>Novas caracteristicas de JSPs 2.0</td>
</tr>
<tr>
<td>alejandropg@autentia.com</td><td>Struts e Eclipse</td><td>struts</td><td>Configuração do ambiente Structs em Eclipse</td>
</tr>
</table>
Mensagem: Terminamos
Ou seja, funciona......
Criar o MVC
Agora, vamos criar um servlet, que gerará um XML e o passará (em MVC) a um JSP. Vamos introduzir diretamente o XML em uma cadeia de caracteres.... dando por suposto que se obteria de outro modo (por exemplo, usando um Banco de Dados XML)
Este JSP, pode executar o código da transformação com diferentes técnicas:
- Scriplet (Código Java no JSP)
- Um Java Bean
- Um TAG de usuário
- Usando JSTL de JSP 2.0
Mostraremos como fazê-lo com um JSP com Scriplet... o resto dos métodos é muito simples.
O 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 = "<tutoriais><tutorial><autor>rcanales@autentia.com</autor>
<nome>JSP 2.0</nome><link>jspel</link><descricao>Novas características de JSPs 2.0</descricao>
</tutorial><tutorial><autor>alejandropg@autentia.com</autor><nome>Struts e Eclipse</nome>
<link>struts</link><descricao>Configuração do ambiente Structs em Eclipse</descrição>
</tutorial></tutoriais>";
request.setAttribute ("xml",elXML);
getServletConfig().getServletContext().getRequestDispatcher("/apresentacao.jsp").forward(request, response);
}
catch (Exception ex)
{
ex.printStackTrace ();
}
}
}
O 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 com XSL</h1>
<br>
<%
String xmlOrigem = (String)request.getAttribute("xml");
String xslOrigem = "C:\\exemplos\\jaxpjsp\\xslbase.xsl";
Source xmlSource = new StreamSource(new StringBufferInputStream(xmlOrigem));
Source xsltSource = new StreamSource(new File(xslOrigem));
StringWriter cadeiaSaiida = new StringWriter();
Result bufferResultado = new StreamResult(cadeiaSaida);
TransformerFactory fabricaTrans = TransformerFabrica.newInstance();
Transformer transformador = fabricaTrans.newTransformer(xsltSource);
transformador.transform(xmlSource, bufferResultado);
out.print(cadeiaSaida.toString());
%>
</center>
</body>
</html>
A saída é:
Bom, já sabem como fazer ..... e com Struts.... seria também assim de simples!