Curso JAVA
Unidad 9:
"Applets, Ventanas, Servidores y JavaBeans y XML"
Objetivos de la Unidad:
1.- Tipos de aplicaciones JAVA
Pueden distinguirse 4 tipos:
�
Como aplicaci�n tipo consola (entrada/salida standard modo texto)
� Como
aplicaci�n tipo ventanas (Windows, X-Windows, Mac...)
� Como Applet
incrustado en un navegador Web
� Como Servlet o conjunto de Servlets (ver
Unidad 8)
Ejecuci�n como aplicaci�n tipo
consola
� Al menos una clase deber� tener un m�todo main() que
ser� el punto de arranque.
� La clase java.lang.System provee de dos objetos
in y out que corresponden a la entrada-salida standard.
� Ejemplo
m�nimo:
// HolaMundo.java
class
HolaMundo
{
public static void main(String []
args)
{
System.out.println("Hola
mundo");
}
}
Los servlets podr�an
entrar en esta categor�a:
import javax.servlet.*;
import javax.servlet.http.*;
import
java.io.*;
public class HolaServlet extends
HttpServlet
{
public void service (HttpServletRequest req,
HttpServletResponse res)
throws
ServletException,
IOException
{
PrintWriter p =
res.getWriter();
res.setContentType("text/html");
p.println("<html><body>");
p.println("<h1>Hola
mundo</h1>");
p.println("</body></html>");
p.close();
}
}
Para probar el servlet hay que ir a un navegador
y pedir la siguiente URL:
http://[direcci�n
ip]:[port]/servlet/HolaServlet
Si arrancamos el servidor y el navegador
en la misma m�quina hay 3 alternativas m�s (suponiendo que arranca por el port
8080):
http://localhost:8080/servlet/HolaServlet
http://127.0.0.1:8080/servlet/HolaServlet
http://[nombre
m�quina windows]:8080/servlet/HolaServlet
Ejecuci�n como aplicaci�n tipo ventanas
� Hay que
gestionar el evento de cerrar la aplicaci�n
//
MiVentana.java
import java.awt.*;
public class MiVentana extends
Frame
{
public static void main(String
args[])
{
MiVentana
f = new MiVentana("Ventana");
}
public MiVentana( String s
)
{
// llama al
constructor de la clase base
super( s
);
Label a = new Label( "Hola Mundo."
);
add( "North", a
);
resize(300,
300);
show();
}
public
boolean handleEvent( Event e
)
{
if ( e.id ==
Event.WINDOW_DESTROY )
{
hide();
// esconde la
ventana
dispose();
// libera
recursos
return
true;
}
return
super.handleEvent( e );
}
}
Ejecuci�n como aplicaci�n tipo Applet
� La clase
MiApplet deriva de Applet
// MiApplet.java
import
java.applet.Applet;
import java.awt.Graphics;
public class
MiApplet extends Applet
{
public void paint(
Graphics g
)
{
g.drawString(
"Hola Mundo.", 25, 25 );
}
}
Un applet se integra dentro de una
p�gina HTML como sigue:
<html>
<head>
<title>Welcome</title>
</head>
<body>
<applet
code=MiApplet.class width=200
height=200></applet>
</body>
</html>
Centrar
una ventana
Podemos a�adir la funci�n centra() a nuestra ventana y llamarla antes de mostrarla:
public void centra()
{
int anchoPantalla =
getToolkit().getScreenSize().width;
int altoPantalla =
getToolkit().getScreenSize().height;
int
anchoVentana = getSize().width;
int altoVentana =
getSize().height;
setLocation( (anchoPantalla -
anchoVentana) / 2, (altoPantalla - altoVentana) / 2);
}
La versi�n Foundation de JBuilder no incorpora el asistente para crear
Dialog. Para poder ser editado con el IDE un Dialog debe incorporar un panel
seg�n la siguiente plantilla:
import java.awt.*;
import
java.awt.event.*;
public class MiDlg extends Dialog
{
Panel
dlgPanel = new Panel();
public MiDlg(Frame parent, String
tit)
{
super(parent, tit);
jbInit();
add(dlgPanel);
}
private
void jbInit()
{
dlgPanel.setLayout(null);
}
}
En demodlg.zip se muestra
c�mo manipular un helper con un di�logo activado desde un Frame.
2.- Applets de JAVA
Para
empezar como lectura introductoria sobre applets puede empezarse por el tutorial
en castellano de Agust�n Froufe en http://www.fie.us.es/info/internet/JAVA/Cap2/holamapp.html
En particular la cuesti�n del ciclo de vida de los applets est� expuesta en el mismo tutorial en http://www.fie.us.es/info/internet/JAVA/Cap2/metodv.html
Ya en ingl�s sobre
applets puede consultarse la versi�n del tutorial de Sun en http://java.sun.com/docs/books/tutorial/applet/overview/index.html
En http://www.galeon.com/juegosjava/menu.html se encuentra una buena colecci�n de juegos interactivos basados en applets de Java.
En relaci�n a la optimizaci�n de los tiempos de carga y respuesta de los applets se pueden consultar los siguientes art�culos:
En cuanto a applets y seguridad
(certificados):
Un applet puede abrir un fichero en el servidor de
donde ha sido descargado y leer datos de �l. Para ello hay que a�adir las
siguientes l�neas de c�digo:
URL
url = new URL(getDocumentBase(), "fichero.txt");
InputStream in = url.openStream();
Para implementar una soluci�n cliente/servidor el applet deber�
comunicarse con un servidor. Una posibilidad es usar RMI. Esta opci�n, si bien
puede ser �ptima en un �mbito tipo red de �rea local presenta ciertas
limitaciones en entornos tipo Internet en que los proxies y firewalls pueden
presentar problemas de conexi�n. La otra posibilidad es comunicar el applet con
un servlet v�a HTTP. Las formas de c�mo realizarlo se describen en el art�culo
http://www.gamelan.com/journal/techworkshop/012600_appserv.html
Un applet puede ser descargado y
ejecutarse aut�nomamente, sin conexi�n con otro proceso pero realizando ciertas
funcionalidades. En el ejemplo siguiente se muestra como provocar una llamada a
una p�gina web en funci�n de un click del mouse. El ejemplo puede ampliarse
carruseles din�micos de im�genes o a mapas.
3.- Ejemplo de
Marquee
import
java.awt.*;
import java.applet.*;
import java.net.*;
public class Marquee
extends Applet implements Runnable
{
String text;
Font font = new Font("Helvetica", 1, 24);
Color color = new Color(94, 60, 215);
int xpos = 0;
Thread killme = null;
public
void init()
{
text = getParameter("TEXT");
}
public
void paint(Graphics g)
{
setBackground(new Color(196, 196,
210));
g.setFont(font);
g.setColor(color);
g.drawString(text, xpos, 25);
}
public
void start()
{
if(killme == null)
{
killme = new
Thread(this);
killme.start();
}
}
public void
setText(String s)
{
text =
s;
}
public void
setCoord(int x)
{
xpos =
x;
}
public void setCoord()
{
xpos =
xpos-5;
if(xpos <
-120)>
xpos =
size().width;
}
public
void run()
{
while(killme != null)
{
try
{
Thread.sleep(100);
}
catch
(InterruptedException e){}
setCoord();
repaint();
}
}
public
void stop()
{
killme = null;
}
public
boolean mouseDown(Event e, int x, int
y)
{
try
{
URL
u = new URL("http://www.yahoo.com");
getAppletContext().showDocument(u);
}
catch
(Exception
ex)
{
System.out.println(ex);
// es enviado a la Java
console
}
return
false;
}
}
HTML asociado ilustrando la
interacci�n con JavaScript:
<HTML>
<BODY>
<H2>Interacción de
JavaScript con Java</H2>
<FORM>
<APPLET
CODEBASE =
"."
CODE = "Marquee.class"
NAME = "TestApplet"
WIDTH = 240
HEIGHT =
35
HSPACE = 0
VSPACE = 0
ALIGN = middle
>
<PARAM
NAME="TEXT" VALUE="Hola">
</APPLET>
<P>
<INPUT
TYPE="BUTTON" VALUE="Poner coordenada a 30"
onClick="coord(30);"><BR>
<HR>
<INPUT TYPE="TEXT"
VALUE="Adi�s" NAME="TEXTO" SIZE="25">
<INPUT TYPE="BUTTON" VALUE="Poner
texto"
onClick="text(window.document.forms[0].elements['TEXTO'].value);"><BR>
</FORM>
</BODY>
<SCRIPT>
function
coord(x)
{
window.document.TestApplet.setCoord(x);
}
function
text(s)
{
window.document.TestApplet.setText(s);
}
</SCRIPT>
</HTML>
4.- Introspecci�n y Java reflection
Uno de los puntales de los
JavaBeans son los mecanismos de introspecci�n:
(Nota: Para que el ejemplo
funcione es preferible declarar public algunos campos de la clase Rectangulo ya
utilizada en la Ud 3)
import java.lang.reflect.*;
public class PruebasReflection
{
public static void main(String[] args) throws
Exception
{
Rectangulo r = new
Rectangulo(1, 2, 3, 4);
Class clase =
r.getClass(); // Tambi�n valdr�a Class clase =
Rectangulo.class;
System.out.println("r
es de la clase " +
clase.getName());
//
introspecci�n de los campos p�blicos
//
getDeclaredFieds() devuelve los declarados excluyendo los
heredados
Field[] campos =
clase.getFields();
for
(int i = 0; i < campos.length;
i++)
{
Class
tipoCampo =
campos[i].getType();
System.out.println(campos[i].getName()
+ " es del tipo " +
tipoCampo.getName());
}
//
introspecci�n de los m�todos p�blicos
//
getDeclaredMethods() devuelve los declarados excluyendo los
heredados
Method[] metodos =
clase.getMethods();
for
(int i = 0; i < metodos.length;
i++)
{
Class
tipoValorRetorno =
metodos[i].getReturnType();
Class[]
tiposParametros =
metodos[i].getParameterTypes();
System.out.println("M�todo:
" +
metodos[i].getName());
System.out.println("
Retorno: " +
metodos[i].getReturnType().getName());
for
(int j = 0; j < tiposParametros.length;
j++)
{
System.out.println("
Par�metro: " +
tiposParametros[j].getName());
}
}
//
ejemplo del CallByName del m�todo setX(int
valor)
Class[] tiposParams =
new Class[1];
tiposParams[0] = Integer.TYPE; //
Interesante ver c�mo referenciar a los tipos
primitivos
Method metodoSetBase =
clase.getMethod("setBase",
tiposParams);
Object[] params =
new Object[1];
params[0] = new
Integer(8);
metodoSetBase.invoke(r,
params);
//
comprobaci�n:
System.out.println("Nueva base: " +
r.getBase());
// CallByName de
area
tiposParams = new Class[0]; // truco para
indicar que no recibe par�metros
Method metodoArea =
clase.getMethod("area", tiposParams);
params = new
Object[0];
Double area = (Double)
metodoArea.invoke(r,
params);
System.out.println("Nueva �rea: " +
area.doubleValue());
}
}
A continuaci�n se dispone de una clase Rectangulo reducida en caso de no tener a mano la de la Ud3
public class Rectangulo
{
private int base;
private int altura;
public int x;
protected int y; public Rectangulo(int x, int y, int base, int altura)
{
this.x = x;
this.y = y;
setBase(base);
setAltura(altura);
} public void setBase(int valor)
{
base = valor;
} public int getBase()
{
return base;
} public void setAltura(int valor)
{
altura = valor;
} public int getAltura()
{
return altura;
} public double area()
{
return base * altura;
}
}
A continuaci�n se muestra un ejemplo curioso. Se trata de un programa que crea un fichero ASCII de c�digo fuente denominado Holax.java, lo compila generando el fichero Holax.class, a continuaci�n carga la clase Holax con el m�todo forName() y finalmente crea una instancia de la clase Holax con newInstance(). Debido a que el constructor de la clase Holax imprime "Holax" se comprueba que realmente dicho constructor se ejecuta.
import java.io.*;
public
class Autogeneracion
{
public static void main(String[] args)
throws Exception
{
FileOutputStream f
= new FileOutputStream("Holax.java");
PrintWriter p =
new
PrintWriter(f);
p.println("public
class
Holax");
p.println("{");
p.println("
public Holax()");
p.println("
{");
p.println("
System.out.println(\"Holax\");");
p.println("
}");
p.println("}");
p.close();
String
params[] = new String[1];
params[0] =
"Holax.java";
// Este
paquete viene con el JDK pero no est� documentado.
//
En realidad el comando "javac" es equivalente a "java
sun.tools.javac.Main"
new
sun.tools.javac.Main(System.out,
"javac").compile(params);
Class
clase =
Class.forName("Holax");
clase.newInstance();
}
}
5.- JavaBeans
Los JavaBeans constituyen el
sistema de software basado en componentes de la plataforma Java. Existe un
mercado de componentes de software JavaBeans. Actualmente la mayor�a de
proveedores de componentes ofrecen tanto la versi�n ActiveX como la JavaBean. Un
directorio de referencia global sobre este mercado est� en http://www.flashline.com y para el mercado espa�ol est� http://www.ramblainf.com
Un JavaBean es en terminolog�a UML un
estereotipo. No se define como una subclase de una clase o un interface sino que
responde a un cierto modo de implementar una clase.
Las reglas b�sicas
son:
Con lo dicho anteriromente la propiedad ya aparece en la ventana de propiedades y es utilizable lo que nos valdr� en la mayor�a de los casos
Adicionalmente puede aumentarse el nivel de personalizaci�n de los JavaBeans que puede realizar a dos niveles:
El otro aspecto personalizable son los eventos. Se adjunta un ejemplo completo en que se crea un Bean a partir de la clase java.awt.List y a la que se a�ade el evento TopeEvent que se dispara al seleccionar al primero o �ltmo elemento. El m�todo getDonde() indicar� si estamos al principio o al fin:
/**************************************************************
*
Ejemplo completo de JavaBean con custom
event
**************************************************************/
package
PruebaBeanEvent;
import java.util.*;
public class TopeEvent
extends EventObject
{
private String
donde;
public TopeEvent(Object
origen)
{
super(origen);
}
public
TopeEvent(Object origen, String
donde)
{
super(origen);
this.donde
= donde;
}
public String
getDonde()
{
return
donde;
}
}
///////////////////////////////////////////////////////////////
package
PruebaBeanEvent;
import java.util.*;
public interface
TopeEventListener extends EventListener
{
public void
topeAlcanzado(TopeEvent
e);
}
///////////////////////////////////////////////////////////////
package
PruebaBeanEvent;
import java.util.*;
import java.awt.*;
import
java.awt.event.*;
public class Lista extends
List
{
private transient Vector
topeEventListeners;
public
Lista()
{
super();
try
{
jbInit();
}
catch
(Exception
e)
{
e.printStackTrace();
}
}
private
void jbInit() throws
Exception
{
this.setFont(new
Font("Courier", 0, 12));
this.setSize(new
Dimension(151, 177));
this.addItemListener(new
java.awt.event.ItemListener()
{
public
void itemStateChanged(ItemEvent
e)
{
this_itemStateChanged(e);
}
});
}
void
this_itemStateChanged(ItemEvent
e)
{
int item =
getSelectedIndex();
int n =
getItemCount();
if (item
==
0)
{
fireTopeEvent("Inicio");
}
if
(item == n -
1)
{
fireTopeEvent("Fin");
}
}
public
synchronized void addTopeEventListener(TopeEventListener
el)
{
if (topeEventListeners ==
null)
topeEventListeners = new
Vector();
topeEventListeners.addElement(el);
}
public
synchronized void removeTopeEventListener(TopeEventListener
el)
{
if (topeEventListeners !=
null)
topeEventListeners.removeElement(el);
}
private
void fireTopeEvent(String donde)
{
if
(topeEventListeners !=
null)
{
Vector
v =
(Vector)topeEventListeners.clone();
TopeEvent
e = new TopeEvent(this,
donde);
for
(int i = 0; i < v.size();
i++)
{
TopeEventListener
el;
el = (TopeEventListener)
v.elementAt(i);
el.topeAlcanzado(e);
}
}
}
}
/**************************************************************
*
Frame de
pruebas
**************************************************************/
package
PruebaBeanEvent;
import java.awt.*;
import java.awt.event.*;
import
PruebaBeanEvent.*;
public class FramePrueba extends
Frame
{
Lista lista1 = new Lista();
Button
button1 = new Button();
public
FramePrueba()
{
try
{
jbInit();
}
catch
(Exception
e)
{
e.printStackTrace();
}
}
public
static void main(String[]
args)
{
FramePrueba framePrueba1 = new
FramePrueba();
framePrueba1.setVisible(true);
}
private
void jbInit() throws
Exception
{
this.setBackground(new
Color(192, 192, 213));
this.setSize(new
Dimension(372, 274));
this.addWindowListener(new
java.awt.event.WindowAdapter()
{
public
void windowClosing(WindowEvent
e)
{
this_windowClosing(e);
}
});
lista1.setBounds(new
Rectangle(30, 39, 310,
163));
lista1.addTopeEventListener(new
PruebaBeanEvent.TopeEventListener()
{
public
void topeAlcanzado(TopeEvent
e)
{
lista1_topeAlcanzado(e);
}
});
button1.setBounds(new
Rectangle(154, 226, 68,
28));
button1.setLabel("Omplir");
button1.addActionListener(new
java.awt.event.ActionListener()
{
public
void actionPerformed(ActionEvent
e)
{
button1_actionPerformed(e);
}
});
this.setLayout(null);
this.add(lista1,
null);
this.add(button1,
null);
int anchoPantalla =
getToolkit().getScreenSize().width;
int
altoPantalla =
getToolkit().getScreenSize().height;
int anchoVentana =
getSize().width;
int altoVentana =
getSize().height;
setLocation(
(anchoPantalla - anchoVentana) / 2, (altoPantalla - altoVentana) /
2);
}
void
button1_actionPerformed(ActionEvent
e)
{
lista1.add("Sol
|Domingo");
lista1.add("Luna
|Lunes");
lista1.add("Mercurio
|Mi�rcoles");
lista1.add("Venus
|Viernes");
lista1.add("Tierra
|");
lista1.add("Marte
|Martes");
lista1.add("Jupiter
|Jueves");
lista1.add("Saturno
|S�bado");
lista1.add("Urano
|");
lista1.add("Neptuno
|");
lista1.add("Plut�n
|");
}
void
this_windowClosing(WindowEvent
e)
{
System.exit(0);
}
void
lista1_topeAlcanzado(TopeEvent
e)
{
System.out.println("Evento al " +
e.getDonde());
}
}
Existe en Java el concepto de
propiedades ligadas y funciona de forma similar al ejemplo anterior. La idea es
que cuando var�a una de ellas se dispara el evento PropertyChangeEvent que es enviado a todos los listeners registrados. Luego, como
de cualquier EventObject (superclase de
PropertyChangeEvent) se
puede obtener con getSource() el objeto emisor
y discriminar la acci�n a tomar.
El bean con propiedades ligadas deber�
cumplir los siguientes requisitos:
1) import java.beans.*;
2) Referenciar un objeto del tipo PropertyChangeSupport como atributo del bean:
private PropertyChangeSupport gestorLigadas = new PropertyChangeSupport(this);
3) Incluir sendos m�todos para dar de alta y de baja los PropertyChangeListeners:
public void
addPropertyChangeListener (PropertyChangeListener p)
{
gestorLigadas.addPropertyChangeListener(p);
}
public void
removePropertyChangeListener (PropertyChangeListener p)
{
gestorLigadas.removePropertyChangeListener(p);
}
4) Modificar los "setters" de las propiedades que queramos que disparen el evento PropertyChangeEvent en los listeners registrados:
public final void
set<propiedad> (<Tipo> valor)
{
...
gestorLigadas.firePropertyChange("<nombre_propiedad>",
<valor_anterior>, valor);
...
}
Los IDE suelen incorporar asistentes
para facilitar la personalizaci�n de los Beans. Para el caso de Visual Age for
Java se puede encontrar interesante informaci�n sobre c�mo crear custom events
en
http://www-4.ibm.com/software/developer/education/cdtut4java/vptut2_cd_1.htm
El libro "Processing XML in Java" se puede consultar on-line en http://www.ibiblio.org/xml/books/xmljava/chapters y es una buena referencia bibliogr�fica. Un buen punto de referencia sobre est�ndares sectoriales se puede encontrar en http://www.xml.org/xml/industry_industrysectors.jsp
IBM dispone de parsers XML en Java de reconocido prestigio. IBM Jap�n es l�der en este �mbito. Sun tambi�n provee un est�ndar para parsers XML denominado JAXP y la implantaci�n denominada Xerces. (incluido en Tomcat y para JDK >= 1.4 est� disponible en http://java.sun.com/xml/xml_jaxp.html)
import
java.io.*;
import org.apache.xerces.parsers.*;
import
org.apache.xerces.dom.*;
import org.apache.xml.serialize.*;
import
org.w3c.dom.*;
public class PruebaXML
{
public static void
main(String[] args) throws
Exception
{
// Interfaz
DOM
Document doc = new
DocumentImpl();
Text
text;
Element pedido =
(Element) doc.createElement
("pedido");
pedido.setAttribute ("ancho",
"45");
doc.appendChild
(pedido);
text =
doc.createTextNode ("Etiqueta interna");
pedido.appendChild (text);
Element clienteId =
(Element) doc.createElement
("clienteId");
pedido.appendChild
(clienteId);
text = doc.createTextNode
("0123A");
clienteId.appendChild
(text);
Comment com = doc.createComment("Ejemplo de
XML. Bit SA");
pedido.appendChild(com);
Element
items = (Element) doc.createElement
("item");
pedido.appendChild
(items);
text = doc.createTextNode
("100");
items.appendChild
(text);
items = (Element)
doc.createElement ("item");
pedido.appendChild
(items);
text = doc.createTextNode
("200");
items.appendChild
(text);
System.out.println("Salida
XML");
// con el parser antiguo de Sun era as� de
simple:
// doc.write
(out);
//Con Xerces es:
OutputFormat format = new OutputFormat( doc ); //Serialize
DOM
format.setEncoding("ISO-8859-1"); // OJO: si no se
pone utiliza UTF-8
XMLSerializer serial = new
XMLSerializer(System.out, format);
serial.asDOMSerializer();
serial.serialize(doc.getDocumentElement());
// si en lugar
de System.out utilizamos un FileOutputStream recordar cerrarlo:
f.close();
System.out.println("----------------------------");
System.out.println("Listado
del arbol:\n");
NodeList nl =
doc.getChildNodes();
System.out.println("\nPrimer nivel:");
for (int i =
0; i < nl.getLength();
i++)
{
System.out.println(nl.item(i).getNodeName());
}
nl
=
doc.getElementsByTagName("*");
System.out.println("\nTodos los niveles:");
for (int
i = 0; i < nl.getLength();
i++)
{
Node nod =
nl.item(i);
System.out.println(nod.getNodeName() + ": " +
nod.getFirstChild().getNodeValue());
}
}
}
IBM, Sun, Oracle y Microsoft (entre
otras empresas) est�n apostando fuerte en el campo de XML. En particular Oracle
ofrece soluciones Java con soporte para DTDs y XSLT de las que se habla en
http://otn.oracle.com/tech/xml/info/htdocs/otnwp/about_xml.htm
El ejemplo
anterior con el parser de Oracle (disponible gratuitamente previo registro en
http://otn.oracle.com/software/content.html) quedar�a como sigue:
import java.io.*;
import
oracle.xml.parser.*;
import oracle.xml.parser.v2.*;
import
org.w3c.dom.*;
public class
PruebaXML
{
public static void main(String[] args) throws
Exception
{
// Interfaz DOM
Document doc
= new XMLDocument();
Text text;
Element
pedido = (Element) doc.createElement ("pedido");
pedido.setAttribute ("ancho", "45");
doc.appendChild
(pedido);
text =
doc.createTextNode ("Etiqueta interna");
pedido.appendChild (text);
Element
clienteId = (Element) doc.createElement ("clienteId");
pedido.appendChild (clienteId);
text = doc.createTextNode
("0123A");
clienteId.appendChild (text);
Comment com
= doc.createComment("Ejemplo de XML. Bit SA");
pedido.appendChild(com);
Element items = (Element)
doc.createElement ("item");
pedido.appendChild
(items);
text = doc.createTextNode
("100");
items.appendChild (text);
items =
(Element) doc.createElement ("item");
pedido.appendChild
(items);
text = doc.createTextNode
("200");
items.appendChild (text);
System.out.println("Salida XML");
((XMLDocument)doc).setEncoding("ISO-8859-1"); // OJO: si no se pone podr�a salir
UTF-8
((XMLDocument)doc).print(System.out);
System.out.flush();
System.out.println("----------------------------");
System.out.println("Listado del arbol:\n");
NodeList
nl = doc.getChildNodes();
System.out.println("Primer
nivel:");
for (int i = 0; i < nl.getLength();
i++)
System.out.println(nl.item(i).getNodeName());
nl =
doc.getElementsByTagName("*");
System.out.println("\nTodos los niveles:");
for (int i =
0; i < nl.getLength(); i++)
{
Node nod =
nl.item(i);
System.out.println(nod.getNodeName() + ": " +
nod.getFirstChild().getNodeValue());
}
}
}
En el siguiente ejemplo se ve c�mo descargar una p�gina XML de Internet y c�mo obtener un objeto DOM asociado y listar su contenido:
import java.io.*; import java.net.*; import org.apache.xerces.parsers.*; import org.apache.xerces.dom.*; import org.apache.xml.serialize.*; import org.w3c.dom.*;
public class PruebaXML2
{
public static void main(String[] args) throws Exception
{
// con Oracle es (acordarse de los imports - ver ej. anterior)
//// URL url = new URL("file:///C:\\Windows\\Escritorio\\pedido.xml"); // para fichero local
//URL url = new URL("http://www.bit-net.org/java/pedido.xml");
//URLConnection conn = url.openConnection();
//InputStream in = conn.getInputStream();
//DOMParser dp = new DOMParser();
//dp.setPreserveWhitespace(true);
//dp.parse(in);
//Document doc = dp.getDocument();
// String fichero = "file:///C:/Windows/Escritorio/pedido.xml";
String fichero = "http://www.bit-net.org/java/pedido.xml";
DOMParser dp = new DOMParser();
dp.setIncludeIgnorableWhitespace(true);
dp.parse(fichero);
Document doc = dp.getDocument();
System.out.println("----------------------------");
System.out.println("Listado del arbol:\n");NodeList nl = doc.getChildNodes();
System.out.println("Primer nivel:");
for (int i = 0; i < nl.getLength(); i++)
System.out.println(nl.item(i).getNodeName()); nl = doc.getElementsByTagName("*"); System.out.println("\nTodos los niveles:");
for (int i = 0; i < nl.getLength(); i++)
{
Node nod = nl.item(i);
System.out.println(nod.getNodeName() + ": " + nod.getFirstChild().getNodeValue());
}
}
}
Un aspecto de creciente inter�s es
la generaci�n de capa de presentaci�n mediante la interacci�n de documentos XML
y XSL. Para ilustrarlo disponemos de un ejemplo xmlpruebas.zip basado en
las librer�as de Oracle.
Para transformaciones XSLT con Xalan (Java)
puede tomarse el siguiente c�digo como ejemplo.
import java.io.*; import javax.xml.transform.*; import javax.xml.transform.stream.*;
public static void genHTML(String xmlFile, String xslFile, String outFile) throws Exception
{
OutputStream out = new FileOutputStream(outFile);
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer(new StreamSource(xslFile));
FileInputStream fin = new FileInputStream(xmlFile);
transformer.transform(new StreamSource(fin), new StreamResult(out));
out.close();
System.out.println("************* The result is in ???.html,.xml,... *************");}
Y para transformaciones PDF con Fop (y con peque�as variaciones a texto o AWT) puede utilizarse el siguiente c�digo de referencia:
import java.io.*; import org.apache.fop.apps.*; import org.xml.sax.XMLReader; import com.sun.xml.tree.XmlDocument; import org.w3c.dom.*;
public static void genPDF(File xmlFile, File xslFile, File outFile) throws Exception
{ Driver driver = new Driver();
driver.setRenderer(Driver.RENDER_PDF); // RENDER_TXT, RENDER_AWT, RENDER_SVG, RENDER_PCL etc.
InputHandler inputHandler = new XSLTInputHandler(xmlFile, xslFile);
XMLReader parser = inputHandler.getParser();
FileOutputStream fout = new FileOutputStream(outFile);
driver.setOutputStream(fout);
driver.render(parser, inputHandler.getInputSource());
driver.reset();
fout.close();
System.out.println("************* The result is in ???.pdf *************");
}
Informaci�n de las API (SAX y DOM ya integrado en el JDK 1.4): http://java.sun.com/j2se/1.4/docs/api/index.html
Unidad anterior - Unidad siguiente
Copyright DENVIR STUDIOS �
Lima - Per�, 2002