Logo Studenta

Apuntes completos de Java por temas_ Desde Introducción a POO hasta J2EE_ Por José M_ Ordax

Esta es una vista previa del archivo. Inicie sesión para ver el archivo original

AplicacionesJEE.zip
m4ch3.pdf
1
Java Enterprise Edition
Aplicaciones Java EE
(Enterprise Applications)
Copyright (c) 2008
José M. Ordax
Copyright
Este documento puede ser distribuido solo bajo los 
términos y condiciones de la Licencia de 
Documentación de javaHispano v1.0 o posterior.
La última versión se encuentra en 
http://www.javahispano.org/licencias/
2
Ejecución de ejemplo
Este sería un posible flujo de una aplicación 
Java EE:
Ensamblado
Las aplicaciones Java EE se empaquetan en un 
archivo EAR (Enterprise ARchive).
Un EAR se compone a su vez de módulos (1..n).
Módulo Web empaquetado como archivo WAR.
Módulo EJB empaquetado como archivo JAR.
Módulo Cliente empaquetado como archivo JAR.
Módulo Adaptador empaquetado como archivo RAR.
Se puede usar la herramienta jar.exe incluida con 
la JDK para crearlo.
3
Ensamblado (cont.)
El código propiamente dicho.
Un descriptor de despliegue: fichero XML que describe 
el contenido y características del módulo.
Un módulo se compone a su vez de:
Estructura de un archivo EAR:
Ensamblado (cont.)
El descriptor de despliegue del EAR se llama 
application.xml y se ubica en el directorio
\META-INF:
http://java.sun.com/xml/ns/javaee/application_5.xsd
Ejemplo:
4
Ensamblado (cont.)
Los Módulos Web se empaquetan en un archivo 
WAR (Web ARchive).
Se puede usar la herramienta jar.exe incluida con 
la JDK para crearlo.
Estructura de un 
archivo WAR:
Ensamblado (cont.)
El descriptor de despliegue del WAR se llama 
web.xml y se ubica en el directorio \WEB-INF:
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd
Ejemplo:
5
Ensamblado (cont.)
Los Módulos EJB se empaquetan en un archivo 
JAR (Java ARchive).
Se puede usar la herramienta jar.exe incluida con 
la JDK para crearlo.
Estructura de un archivo JAR de EJBs:
Ensamblado (cont.)
El descriptor de despliegue del JAR de EJB se 
llama ejb-jar.xml y se ubica en el directorio 
\META-INF:
http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd
Ejemplo:
6
Ensamblado (cont.)
Los Módulos Cliente se empaquetan en un 
archivo JAR (Java ARchive).
Se puede usar la herramienta jar.exe incluida con 
la JDK para crearlo.
Estructura de un archivo JAR de Cliente:
Ensamblado (cont.)
El descriptor de despliegue del JAR de Cliente se 
llama application-client.xml y se ubica en el 
directorio \META-INF:
http://java.sun.com/xml/ns/javaee/application-client_5.xsd
Ejemplo:
7
Ensamblado (cont.)
Los Módulos Adaptador se empaquetan en un 
archivo RAR (Resource ARchive).
Se puede usar la herramienta jar.exe incluida con 
la JDK para crearlo.
Estructura de un archivo RAR de Adaptador:
Ensamblado (cont.)
El descriptor de despliegue del RAR se llama 
ra.xml y se ubica en el directorio \META-INF:
http://java.sun.com/xml/ns/javaee/connector_1_5.xsd
Ejemplo:
8
Bibliografía
The Java EE 5 Tutorial (3rd edition)
Eric Jendrock, Jennifer Ball, Debbie Carson, e Ian Evans.
Prentice Hall.
Designing Enterprise Apps with J2EE
(2nd edition)
Inderjeet Singh, Beth Stearns y Mark Johnson.
Prentice Hall.
J2EE Design and Development
Rob Johnson.
Wrox.
The Java EE tutorial
http://java.sun.com/javaee/5/docs/tutorial/doc/
Applets.zip
m3ch3.pdf
1
Java Avanzado
Java Applets
Copyright (c) 2004
José M. Ordax
Copyright
Este documento puede ser distribuido solo bajo los 
términos y condiciones de la Licencia de 
Documentación de javaHispano v1.0 o posterior.
La última versión se encuentra en 
http://www.javahispano.org/licencias/
2
Los Applets Java se cargan de la siguiente forma:
¿Qué es un Applet Java?
Es un tipo de aplicación Java que se inserta 
dentro de páginas HTML. Cuando estas se
descargan, los Applets se ejecutan en el 
navegador.
Se escribe una URL en el navegador.
El navegador carga la página HTML.
El navegador carga las clases del Applet Java.
Se ejecuta el Applet Java.
Restricciones de seguridad
Los Applets Java, a diferencia de las aplicaciones
Java no se ejecutan siempre con el conocimiento 
del usuario. Podemos estar navegando y cargar 
un Applet Java sin saberlo.
Por ello, sufren una serie de restricciones de
seguridad no existentes en las aplicaciones Java
convencionales.
Los navegadores implementan un entorno de
ejecución seguro habitualmente conocido con el
nombre de SandBox.
Existen técnicas de firma digital para poder evitar
estas restricciones. (http://java.sun.com/docs/books/tutorial/security/index.html)
3
Algunas restricciones son:
De esta manera, un Applet Java jamás podrá
dañar o robar información del sistema.
Realizar llamadas llamadas a programas externos.
Realizar operaciones de entrada/salida.
Realizar llamadas a métodos nativos (JNI).
Abrir conexiones con servidores remotos distintos al 
origen del propio Applet Java.
Restricciones de seguridad
Las clases Applet y JApplet
La clase Applet es un contenedor visual del estilo
de los Frame y Panel o los JFrame y JPanel.
Existen dos implementaciones: AWT y Swing
AWT:
Se encuentra en el paquete java.applet.*
Hereda de java.awt.Panel
Se le aplican LayoutManagers y se le añaden 
componentes como ya hiciéramos con los contenedores
estándar AWT. Ocurre lo mismo con la gestión de eventos.
4
Las clases Applet y JApplet
Swing:
Se encuentra en el paquete javax.swing.*
Hereda de java.applet.Applet
Se le aplican LayoutManagers y se le añaden 
componentes como ya hiciéramos con los contenedores
estándar Swing. Ocurre lo mismo con la gestión de eventos.
Ciclo de vida
A diferencia de las aplicaciones Java 
convencionales, los Applets Java no tienen un
método: public static void main(String[] args)
para ejecutarse.
public void start();
public void destroy();
public void paint(Graphics g);
Por el contrario tienen estos cinco métodos:
public void stop();
public void init();
5
Ciclo de vida
public void init();
Es el primer método que se ejecuta una vez que se ha
llamado al constructor del applet.
public void start(); 
Solo se ejecuta una vez en la vida del applet.
Se suele usar para la inicialización del applet.
Se ejecuta una vez haya terminado el método init().
A diferencia del método init(), start() se ejecuta cada vez
que haya que arrancar el applet (recarga, maximizar,...).
Se suele usar para arrancar procesos (ej: Threads).
Ciclo de vida
public void stop();
Se ejecuta cada vez que haya que parar el applet (reload,
minimizar, cargar otra página,.....).
public void destroy(); 
Se suele usar para parar procesos (ej: Threads).
Se ejecuta al cerrar el Navegador o cuando este decide
eliminarle (ej: purgado de caché).
Solo se ejecuta una vez en la vida del applet.
Se suele usar para liberar cualquier recurso utilizado.
6
Ciclo de vida
public void paint(Graphics g);
Recibe una instancia de la clase java.awt.Graphics 
Esta instancia se puede utilizar para escribir o pintar en el
applet. 
Se ejecuta cada vez que se necesita refrescar el Applet
(ej: recarga, maximizar,....).
Ejemplo del Ciclo de vida
Carga del Applet:
Se ejecuta el constructor por defecto (sin parámetros) del
applet.
Salida y vuelta a entrar en la página HTML:
Se ejecuta el método init().
Se ejecuta el método start().
Se ejecuta el método stop() al salir.
Se ejecuta el método start() al volver.
Cierre del navegador:
Se ejecuta el método stop().
Se ejecuta el método destroy().
7
Ejemplo del Ciclo de Vida
import java.awt.Graphics;
import javax.swing.JApplet;
public class JAppletTest extends JApplet
{
public JAppletTest() { System.out.println("JAppletTest()"); }
public void init() { System.out.println("init()"); }
public void start() { System.out.println("start()"); }
public void paint(Graphics g) { System.out.println("paint()"); }
public void stop() { System.out.println("stop()"); }
public void destroy()
{ System.out.println("destroy()"); }
}
HTML
HTML – HiperText Markup Language
Es un lenguaje simple utilizado para crear 
documentos Web de extensión *.html o *.htm
Se limita a describir la estructura y el contenido de
un documento.
Actualmente se encuentra en su versión 4.01
Es un lenguaje basado en etiquetas. Cada etiqueta
se escribe entre los caracteres: < >.
Las etiquetas pueden tener atributos.
8
Estructura básica
Las etiquetas suelen ir formando bloques: <> y </>.
Esqueleto básico:
<HTML>
<HEAD>
<TITLE>Mi primer HTML</TITLE>
</HEAD>
<BODY>
</BODY>
</HTML>
La etiqueta <applet>
Sintaxis:
name: especifica un nombre al applet.
code: especifica el nombre de la clase principal del applet,
incluyendo el paquete y la extensión (edu.upco.einf.MiApplet.class)
<applet [name=?] [codebase=?] code=? [archive=?] width=? height=?
[align=?] [vspace=?] [hspace=?] [alt=?]>
[<param name=? value=?]>
.......
</applet>
codebase: especifica la URL por defecto del applet en caso
de que sea distinta a la del HTML.
Descripción:
9
Descripción (cont.):
align: especifica el alineamiento del applet respecto del
texto. Algunos valores válidos son: left, right, top, middle....
hspace: especifica el espacio a dejar por derecha e 
izquierda del applet en pixels.
vspace: especifica el espacio a dejar por encima y por
debajo del applet en pixels.
La etiqueta <applet>
archive: especifica los archivos JAR o ZIP que contengan
clases necesarias y que deban ser precargados por el
navegador.
width: especifica el ancho del applet en pixels.
height: especifica el alto del applet en pixels.
<param>: es la manera de pasar parámetros al applet
desde el exterior. Esta etiqueta tiene dos atributos: name
para el nombre del parámetro y value para su valor.
Descripción (cont.):
La etiqueta <applet>
alt: especifica el texto a mostrar en caso de que el
navegador no sea capaz de mostrar el applet.
Los applets cuentan con dos métodos para acceder
a los parámetros (no usar en el constructor):
public String getParameter(String name);
public String[][] getParameterInfo();
10
Ejemplo
<HTML>
<HEAD>
<TITLE>Mi primer HTML</TITLE>
</HEAD>
<BODY>
<APPLET name="Test1" codebase="." code=“edu.upco.einf.MiApplet.class" 
archive="miApplet.jar" width="200" height="300" align="middle"
vspace="5" hspace="5" alt="No tiene soporte de Applets Java">
<PARAM name="param1" value="value1">
<PARAM name="parma2" value="value2">
</APPLET>
<APPLET code= "edu.upco.einf.OtroApplet.class" width="200" height="300">
</APPLET>
</BODY>
</HTML>
El SDK (o JDK) contiene una herramienta para
probar los Applets Java sin necesidad de un
navegador.
appletviewer.exe HelloWorld.html
<HTML>
<APPLET code= "HelloWorld.class" width="200" height="300">
</APPLET>
</HTML>
Probando los Applets
Esta herramienta se llama appletviewer.exe
Carga un fichero HTML como argumento:
Ese fichero HTML requiere como mínimo:
11
Ejemplo
<HTML>
<APPLET code="HelloWorld.class"
width="100" height="50">
</APPLET>
</HTML>
import java.applet.Applet;
import java.awt.Graphics;
public class HelloWorld extends Applet
{
public void paint(Graphics g)
{
g.drawString("Hello World!",10,10);
}
}
No obstante podemos probar directamente en un
navegador abriendo en local la página HTML:
Probando los Applets
O desplegando la página HTML y el Applet Java a
un Servidor Web:
file:///c:/test/index.html
http://www.upco.es/test/index.html
12
Ejemplo
<HTML>
<APPLET code="HelloWorld2.class"
width="100" height="50">
</APPLET>
</HTML>
import javax.swing.JApplet;
import javax.swing.JLabel;
public class HelloWorld2 extends JApplet
{
public void init()
{
JLabel l = new JLabel("Hello World!");
this.getContentPane().add(l);
}
}
import java.applet.Applet;
import java.applet.AudioClip;
public class AudioClipTest extends Applet
{
AudioClip clip = null;
public void init()
{
clip = this.getAudioClip(this.getDocumentBase(),“audio/test.au");
}
public void start() { clip.play(); }
public void stop() { clip.stop(); }
}
public AudioClip getAudioClip(URL url, String clip):
Otras posibilidades del API
13
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;
public class ImageTest extends Applet
{
Image img = null;
public void init()
{
img = this.getImage(this.getDocumentBase(),"images/test.gif");
}
public void paint(Graphics g)
{
g.drawImage(img, 10,20, this);
}
}
public Image getImage(URL url, String img):
Otras posibilidades del API
Es un formato de fichero.
El fichero JAR
El SDK (o JDK) contiene una herramienta para
crear, listar o expandir archivos JAR.
jar.exe {ctxu} [vfm0M] [fichero-jar] [fichero-manifest] [-C dir] ficheros....
Empaqueta comprimidos en un único fichero clases
Java y otro tipo de recursos (imágenes, sonidos,....).
Sintaxis:
14
El fichero JAR
Esto es debido a que la ejecución de los Applets
se realiza sin el conocimiento y aprobación de los
usuarios.
Seguridad
Ya hemos comentado, que un Applet se ejecuta 
en un entorno restringido, de forma que no tiene
acceso a los recursos de la máquina donde se
ejecuta.
Pero existen los certificados y firmas digitales 
para evitar estas restricciones.
15
Ejemploimport java.applet.Applet;import java.awt.Graphics;import java.io.*;
public class PruebaSeguridad extends Applet
{
public void paint(Graphics g) 
{
BufferedReader br = null;
try
{
br = new BufferedReader(new FileReader("C:\\WINDOWS\\system32\\drivers\\etc\\hosts"));
StringBuffer buffer = new StringBuffer();
String temp = null;
while((temp = br.readLine()) != null)
buffer.append(temp);
g.drawString("Lectura realizada...",10,30);
br.close();
}
catch(IOException ex)
{
g.drawString("Problemas de I/O...",10,30);
}
catch(SecurityException ex)
{
ex.printStackTrace();
g.drawString("Acceso restringido...",10,30);
}
}
}
Nota: Se trata de un Applet que intenta conocer 
otras máquinas de nuestra red accediendo al 
fichero c:\windows\system32\drivers\etc\hosts
<HTML>
<HEAD>
<TITLE>Prueba de Seguridad</TITLE>
</HEAD>
<BODY>
<APPLET code="PruebaSeguridad.class"
archive="prueba.jar" width="300" height="50">
</APPLET>
</BODY>
</HTML>
Ejemplo
16
Firma digital
La idea básica de la firma digital es:
Generamos un par de claves: pública y privada.
Firmamos el código con la clave privada.
Nota: firmar significa aplicar un algoritmo hash sobre el 
código y el resultado, cifrarlo con la clave privada,
obteniendo así la firma digital.
Enviamos el código firmado junto con la clave pública.
En la recepción, se aplica el mismo algoritmo hash sobre
el código y se compara el resultado con la firma digital
(después de haberla descifrado, esta vez, con la clave 
pública).
Normalmente, la clave pública se envía en un certificado
digital para validar la identidad del firmante.
Para firmar digitalmente código Java, hay que 
seguir los siguientes pasos:
Crear ficheros JAR con todo el código compilado.
Generar un par de claves (pública y privada) así como un
certificado digital con la clave pública.
Firmar digitalmente los ficheros JAR con la clave privada.
En la JDK tenemos todo lo necesario para llevar
a cabo estos pasos.
Firma digital
17
Generar un par de claves
El JDK incluye una herramienta para este fin:
keytool.exe
-genkey: comando para generar las claves.
-dname: con el distinguished name del propietario de las
claves.
Usaremos los siguientes parámetros:
-keystore: con el repositorio (es un fichero) donde se va a 
guardar toda la información generada.
-alias: con el identificador a usar para referirse a las claves.
-storepass: con la contraseña de acceso al repositorio.
Generar un par de claves
-keypass: con la contraseña para utilizar las claves.
-validity: con el número
de días de validez del certificado.
Esta herramienta admite otros comandos como
por ejemplo:
-list: lista el contenido de un repositorio.
-delete: borra una entrada de un repositorio.
-export: exporta un certificado.
-import: importa un certificado.
-help: muestra la ayuda (listando todos los comandos).
18
Generar un par de claves
Ejemplo:
Como resultado, se habrá creado un fichero llamado 
repositorio con toda la información: un par de claves pública
y privada, y un certificado digital.
Firmar digitalmente un JAR
El JDK incluye una herramienta para este fin:
jarsigner.exe
-keystore: con el repositorio donde está la clave privada.
-storepass: con la contraseña de acceso al repositorio.
Usaremos los siguientes parámetros:
-verbose: para que muestre información de lo que va
haciendo por pantalla.
%fichero%: fichero a firmar.
%alias%: identificador de la clave a utilizar.
19
Ejemplo:
La herramienta ha añadido el fichero de la firma (*.SF) y el
fichero de bloques de firmas (*.DSA).
Firmar digitalmente un JAR
Firmar digitalmente un JAR
20
Esta vez el navegador detecta que el Applet que
intenta acceder a los recursos del sistema está
firmado.
El nombre del firmante.
Si se confía en dicha Autoridad Certificadora o no.
Nos muestra información sobre el firmante:
Si el certificado es válido y no ha caducado.
La Autoridad Certificadora que verifica la identidad del
firmante.
Y nos pregunta si confiamos en el firmante y le 
damos permiso de acceso.
Firmar digitalmente un JAR
Firmar digitalmente un JAR
21
Certificados digitales
¿Podemos evitar que nos pregunte y le de 
permiso de acceso por defecto?
Si, pero para ello, tenemos que añadir el certificado del 
firmante a la lista de certificados en los que confiamos.
Un certificado digital está formado por:
La clave pública del firmante.
El distinguised name del firmante: nombre, unidad 
organizativa, organización, ciudad, provincia y país.
Algunos ejemplos: Equifax, FNMT, VeriSign, Thawte, etc...
Certificados digitales
La firma digital del emisor del certificado (denominado
Autoridad Certificadora).
El distinguised name del emisor del certificado.
Una Autoridad Certificadora, es una entidad que
certifica la identidad de un firmante.
22
Conseguir un certificado digital cuesta dinero.
http://www.cert.fnmt.es/index.php?cha=cit&sec=obtain_cert
Certificados digitales
Certificados auto-firmados, es decir, el propio firmante 
certifica que es quien dice ser.
En España, la Fabrica Nacional de Moneda y
Timbre (FNMT) emite gratuitamente certificados
a todos los españoles con DNI.
Por ello, normalmente para realizar pruebas
creamos nuestros propios certificados:
Nota: la firma digital tiene validez legal, por lo que
su uso debe ser cuidadoso y responsable.
Para exportar nuestro certificado, debemos utilizar
de nuevo la herramienta:
keytool.exe
-export: comando para exportar el certificado.
-keystore: con el nombre del repositorio donde está el 
certificado.
Con los siguientes parámetros:
-file: con el nombre del fichero donde guardar el certificado
exportado.
-alias: con el identificador de las claves/certificado.
-storepass: con la contraseña de acceso al repositorio.
Certificados digitales
23
Ejemplo:
Con el comando –printcert podemos ver los detalles del 
certificado.
Certificados digitales
Por último, utilizando la consola del Java Plug-in
importamos el certificado:
Certificados digitales
24
Certificados digitales
¿Cómo hacemos para que el Java Plug-in confíe
en nosotros como emisores del certificado?
El problema es que se trataba de un certificado auto-firmado.
Certificados digitales
Esto ya no es necesario a partir de Java SE 5.0
5.0
25
Para solventarlo podemos:
Obtener el certificado de una Autoridad Certificadora 
conocida por el Java Plug-in y usarlo en vez del nuestro.
Certificados digitales
Añadir nuestro certificado auto-firmado a la lista de
Autoridades Certificadoras en las que confía.
Todos los certificados de las Autoridades 
Certificadoras en las que confía el Java Plug-in se
encuentran en el repositorio (keystore):
Certificados digitales
C:\Program Files\Java\jre1.6.0\lib\security\cacerts
Una vez mas, usaremos la herramienta keytool
para importarlo:
-import: comando para importar el certificado.
-trustcacerts: indicando que se trata el certificado de una 
Autoridad Certificadora.
-keystore y –storepass: indicando el respositorio.
-alias: indicando el identificador para referirse al certificado.
-file: indicando el fichero con el certificado.
26
Ejemplo:
Certificados digitales
La contraseña del repositorio “cacerts” es: changeit.
Como la inserción de una nueva Autoridad Certificadora
es crítica, el proceso pide confirmación.
Lista de Autoridades Certificadoras después de
la importación:
Certificados digitales
27
El Java Plug-in ya confía en nosotros, como
emisores del certificado:
Certificados digitales
Bibliografía
HTML & XHTML (6th edition).
Chuck Musciano y Bill Kennedy.
O’Reilly.
Window Toolkit and Applets, Volume 2
James Gosling y Frank Yellin.
Addison-Wesley.
The Java tutorial (on-line)
http://java.sun.com/docs/books/tutorial/deployment/applet/
Developing professional Java Applets
K.C.Hopson, Stephen E. Ingram y Patrick Chan.
Sams Publishing.
AWT.zip
m3ch1.pdf
1
Java AvanzadoJava Avanzado
El t AWTEl paquete AWT
Copyright (c) 2004
J é M O d
Copyright
José M. Ordax
Este documento puede ser distribuido solo bajo los 
términos y condiciones de la Licencia de 
Documentación de javaHispano v1.0 o posterior.
La última versión se encuentra en 
http://www.javahispano.org/licencias/
2
AWT
AWT: Abstract Window Toolkit. 
Es una librería de clases Java para el desarrolloEs una librería de clases Java para el desarrollo
de interfaces de usuario gráficas (GUI).
Por tratarse de código Java, los aplicativos serán
independientes de plataforma. No así su
apariencia visual.p
Es la librería básica. Sobre ella se construyó a
posteriori otra mas flexible y potente: JFC/Swing
La AWT se encuentra en el paquete: java.awt.*
AWT
Dispone de la mayoría de controles visuales
estándar: 
Button (push, radio y check).
Canvas.
Frame, Dialog.
Label.
List ChoiceList, Choice.
ScrollBar, ScrollPane.
TextField, TextArea.
Menu.
3
Elementos
Los elementos básicos que componen la
librería AWT son: 
Los componentes (java.awt.Component) como Buttons,
Labels, TextFields, etc....
Los contenedores (java.awt.Container) como los Frames,
los Panels, etc.... que pueden contener componentes.
Los gestores de posición (java awt LayoutManager) queLos gestores de posición (java.awt.LayoutManager) que 
gestionan la disposición de los componentes dentro de
los contenedores.
Los eventos (java.awt.AWTEvent) que avisan de las 
acciones del usuario.
Jerarquía de clases
4
Jerarquía de clases
java.awt.Component
Se trata de una clase abstracta que implementa 
toda la funcionalidad básica de las clases visuales:
Mostrar y esconder.
Rendering.
Habilitar y deshabilitar, etc....
Métodos para:
Color del foreground y background.
Tamaño y posición.
Atributos como:
5
java.awt.Container
Se trata de una clase que implementa la
funcionalidad de contener a otros componentes.
Window.
Los contenedores son a su vez componentes.
Algunos contenedores:
Dialog y FileDialog.
Frame.
Panel: contenedor invisible.
java.awt.LayoutManager
Los contenedores sirven para agrupar
componentes visuales. Pero, ¿cómo se distribuyen
dichos componentes en su interior?dichos componentes en su interior? 
Para dicho cometido, se utilizan implementaciones
del interface java.awt.LayoutManager
Cada contenedor tiene
asociado un LayoutManagerCada contenedor tiene asociado un LayoutManager
que distribuye los componentes en el interior del
contenedor.
Por ejemplo, un Panel tiene asociado por defecto
una instancia de java.awt.FlowLayout.
6
Coordenadas y posicionamiento
La posición de los componentes visuales es
relativa al contenedor en el que se encuentra. 
La coordenada 0,0 es la esquina superior izquierda
del contenedor.
La clase java.awt.Component implementa varios
métodos para la gestión del tamaño y 
posicionamiento como por ejemplo:posicionamiento como por ejemplo:
Rectangle getBounds(); Dimension getSize();
void setLocation(int x, int y); void setSize(Dimension d);
Point getLocation(); Container getParent();
void setBounds(int x, int y, int width, int height);
Coordenadas y posicionamiento
La clase java.awt.Container posee varios métodos
para acceder a los componentes que contienen
como por ejemplo:como por ejemplo:
add(Component c); o add(Component c, Object o);
Inserta el componente c en el contenedor referenciado.
remove(Component c);
Elimina el componente c del contenedor referenciadoElimina el componente c del contenedor referenciado.
Component[] getComponents();
Devuelve un array con los componentes del contenedor
referenciado.
7
Pasos a seguir
Crear el componente:
Button b = new Button();
unContenedor.add(b);
Añadir el componente al contenedor:
Button b = new Button();
b.setText(“Ok”);
Invocar métodos sobre el componente y manejar
sus eventos:
Ejemplo
import java.awt.*;
public class EjemploAWT
{
public static void main(String[] args)(0,0)
{
Frame frame = new Frame();
frame.setLayout(null);
frame.setBounds(0,0,400,300);
frame.setTitle("Ejemplo AWT");
Panel panel = new Panel();
panel.setLayout(null);
panel.setBounds(50,40,250,220);
panel.setBackground(Color.LIGHT_GRAY);
300250100
20100
80
50
40
Button boton = new Button("Aceptar");
boton.setBounds(100,80,100,20);
panel.add(boton);
frame.add(panel);
frame.setVisible(true);
}
}
400
250
8
java.awt.Frame
import java.awt.Frame;
public class FrameTest
{
public static void main(String[] args)
{
Frame f = new Frame();
f.setTitle("FrameTest");
f setSize(200 150);f.setSize(200,150);
f.setVisible(true);
}
}
java.awt.Button
import java.awt.Button;
import java.awt.FlowLayout;
i t j t Fimport java.awt.Frame;
public class ButtonTest
{
public static void main(String[] args)
{
Frame f = new Frame();
f.setTitle("ButtonTest");
f setSize(200 150);f.setSize(200,150);
f.setLayout(new FlowLayout());
Button b = new Button("Ok");
f.add(b);
f.setVisible(true);
}
}
9
java.awt.Checkbox
import java.awt.Checkbox;
import java.awt.FlowLayout;
i t j t Fimport java.awt.Frame;
public class CheckboxTest
{
public static void main(String[] args)
{
Frame f = new Frame();
f.setTitle("CheckboxTest");
f setSize(200 150);f.setSize(200,150);
f.setLayout(new FlowLayout());
Checkbox c = new Checkbox("Mayor de 18 años");
f.add(c);
f.setVisible(true);
}
}
java.awt.CheckboxGroup
import java.awt.*;
bli l Ch kb G T tpublic class CheckboxGroupTest
{
public static void main(String[] args)
{
Frame f = new Frame();
f.setTitle("CheckboxGroupTest");
f.setSize(200,150);
f.setLayout(new FlowLayout());
CheckboxGroup cbg = new CheckboxGroup();CheckboxGroup cbg new CheckboxGroup();
Checkbox c1 = new Checkbox("Hombre",cbg,true);
Checkbox c2 = new Checkbox("Mujer",cbg,false);
f.add(c1);
f.add(c2);
f.setVisible(true);
}
}
10
java.awt.Choice
import java.awt.*;
public class ChoiceTestpublic class ChoiceTest
{
public static void main(String[] args)
{
Frame f = new Frame();
f.setTitle("ChoiceTest");
f.setSize(200,150);
f.setLayout(new FlowLayout());
Choice cbg = new Choice();g ()
cbg.add("Rojo");
cbg.add("Amarillo");
cbg.add("Blanco");
f.add(cbg);
f.setVisible(true);
}
}
java.awt.Label
import java.awt.*;
public class LabelTestpublic class LabelTest
{
public static void main(String[] args)
{
Frame f = new Frame();
f.setTitle("LabelTest");
f.setSize(200,150);
f.setLayout(new FlowLayout());
Label l1 = new Label("Una etiqueta");( q )
Label l2 = new Label();
l2.setText("Otra etiqueta");
f.add(l1);
f.add(l2);
f.setVisible(true);
}
}
11
java.awt.List
import java.awt.*;
public class ListTest
{
public static void main(String[] args)
{
Frame f = new Frame();
f.setTitle("ListTest");
f.setSize(200,150);
f.setLayout(new FlowLayout());
List l = new List(3);
l add("Primero");l.add("Primero");
l.add("Segundo");
l.add("Tercero");
l.add("Cuarto");
f.add(l);
f.setVisible(true);
}
}
import java.awt.FlowLayout;
import java.awt.Frame;
import java awt Scrollbar;
java.awt.Scrollbar
import java.awt.Scrollbar;
public class ScrollbarTest
{
public static void main(String[] args)
{
Frame f = new Frame();
f.setTitle("ScrollbarTest");
f.setSize(200,150);f.setSize(200,150);
f.setLayout(new FlowLayout());
Scrollbar sb = new Scrollbar(Scrollbar.HORIZONTAL,0,5,-100,100);
f.add(sb);
f.setVisible(true);
}
}
12
import java.awt.FlowLayout;
import java.awt.Frame;
import java awt TextField;
java.awt.TextField
import java.awt.TextField;
public class TextFieldTest
{
public static void main(String[] args)
{
Frame f = new Frame();
f.setTitle("TextFieldTest");
f.setSize(200,150);f.setSize(200,150);
f.setLayout(new FlowLayout());
TextField tf = new TextField("Escribe aquí...");
f.add(tf);
f.setVisible(true);
}
}
java.awt.TextArea
import java.awt.FlowLayout;
import java.awt.Frame;
import java awt TextArea;import java.awt.TextArea;
public class TextAreaTest
{
public static void main(String[] args)
{
Frame f = new Frame();
f.setTitle("TextAreaTest");
f.setSize(200,150);f.setSize(200,150);
f.setLayout(new FlowLayout());
TextArea ta = new TextArea("Escribe aquí...",5,15);
f.add(ta);
f.setVisible(true);
}
}
13
java.awt.Menuimport java.awt.*;
public class MenuTest
{
public static void main(String[] args)
{{
Frame f = new Frame();
f.setTitle("MenuTest");
MenuBar mb = new MenuBar();
Menu m1 = new Menu("Menu 1");
m1.add(new MenuItem("Opción 1"));
m1.add(new MenuItem("Opción 2"));
Menu m2 = new Menu("Menu 2");
m2.add(new CheckboxMenuItem("Opción 1", true));
m2.add(new CheckboxMenuItem("Opción 2"));
mb.add(m1);
mb.add(m2);
f.setMenuBar(mb);
f.setSize(200,150);
f.setVisible(true);
}
}
java.awt.Dialog
import java.awt.Dialog;
import java.awt.Frame;
public class DialogTest
{
public static void main(String[] args)
{
Frame f = new Frame();
f.setTitle("FrameTest");
f.setSize(200,150);
f setVisible(true);f.setVisible(true);
Dialog d = new Dialog(f);
d.setTitle("DialogTest");
d.setBounds(50,50,70,50);
d.setVisible(true);
}
}
14
java.awt.FileDialog
import java.awt.FileDialog;
import java.awt.Frame;
public class DialogTestpub c c ass a og est
{
public static void main(String[] args)
{
Frame f = new Frame();
f.setTitle("FrameTest");
f.setSize(200,150);
f.setVisible(true);
FileDialog d = new FileDialog(f);
d.setTitle("FileDialogTest");
d.setBounds(50,50,70,50);
d.setVisible(true);
System.out.println(d.getFile()); // Recibir el nombre del fichero seleccionado.
}
}
Layout Managers
Todos los contenedores AWT tienen asociado un
LayoutManager para coordinar el tamaño y la
situación de sus componentessituación de sus componentes.
Panel -> FlowLayout
Frame -> BorderLayout
Cada Layout se caracteriza por el estilo que 
emplea para situar los componentes en su
Alineación de izquierda a derecha.
emplea para situar los componentes en su
interior:
Alineación en rejilla.
Alineación del frente a atrás.
15
¿Por qué usar Layout Managers?
Determinan el tamaño y la posición de los
componentes en un contenedor.componentes en un contenedor.
Tiene un API que permite al contenedor y al
LayoutManager gestionar el cambio de tamaño del
contenedor de manera transparente.
Consiguen que la aplicación sea independiente
de la resolución de las máquinas donde se ejecuta.
Implementan el interface java.awt.LayoutManager.
FlowLayout: sitúa los componentes de izquierda a derecha.
Layout Managers
Les modifica la posición pero no les modifica el tamaño.
CardLayout: permite al desarrollador intercambiar distintas
vistas como si se tratase de una baraja. Modifica tanto la
BorderLayout: se basa en los puntos cardinales. Modifica
tanto la posición como el tamaño de los componentes.
posición como el tamaño de los componentes.
GridLayout: usa una matriz en la que sitúa cada uno de los
componentes. El tamaño de todas las celdas es igual.
GridBagLayout: similar al anterior, pero no fuerza a que 
todos los componentes tengan el mismo tamaño.
16
import java.awt.*;
public class FlowLayoutTest
{
java.awt.FlowLayout
{
public static void main(String[] args)
{
Frame f = new Frame();
f.setTitle("FlowLayoutTest");
f.setSize(300,150);
f.setLayout(new FlowLayout());
Button b1 = new Button("Button 1");
f.add(b1);( )
Button b2 = new Button("Button 2");
f.add(b2);
Button b3 = new Button("Button 3");
f.add(b3);
f.setVisible(true);
}
}
import java.awt.*;
public class BorderLayoutTest
{
public static void main(String[] args)
java.awt.BorderLayout
public static void main(String[] args)
{
Frame f = new Frame();
f.setTitle("BorderLayoutTest");
f.setLayout(new BorderLayout());
Button b1 = new Button("Button 1 (NORTH)");
f.add(b1,BorderLayout.NORTH);
Button b2 = new Button("Button 2 (WEST)");
f.add(b2,BorderLayout.WEST);
Button b3 = new Button("Button 3 (CENTER)");( ( ) );
f.add(b3,BorderLayout.CENTER);
Button b4 = new Button("Button 4 (EAST)");
f.add(b4,BorderLayout.EAST);
Button b5 = new Button("Button 5 (SOUTH)");
f.add(b5,BorderLayout.SOUTH);
f.pack(); // El método pack, hace que el contenedor pregunte a su
f.setVisible(true); // LayoutManager el tamaño mínimo para que todos sus
} // componentes se puedan ver. Y se ajusta a ese tamaño.
}
17
import java.awt.*;
public class CardLayoutTest
{
public static void main(String[] args)
java.awt.CardLayout
public static void main(String[] args)
{
Frame f = new Frame();
f.setTitle("CardLayoutTest");
f.setSize(300,150);
CardLayout cl = new CardLayout();
f.setLayout(cl);
Button b1 = new Button("Button 1");
f.add(b1,"uno");( )
Button b2 = new Button("Button 2");
f.add(b2,"dos");
Button b3 = new Button("Button 3");
f.add(b3,"tres");
f.setVisible(true);
cl.show(f,"dos"); // Otras posibilidades: cl.first(f), cl.last(f) y cl.next(f);
}
}
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
java.awt.GridLayout
public class GridLayoutTest
{
public static void main(String[] args)
{
Frame f = new Frame();
f.setTitle("GridLayoutTest");
f.setSize(300,150);
f.setLayout(new GridLayout(2,3,2,2));
f dd( B tt ("B tt 1"))f.add(new Button("Button 1"));
f.add(new Button("Button 2"));
f.add(new Button("Button 3"));
f.add(new Button("Button 4"));
f.add(new Button("Button 5"));
f.setVisible(true);
}
}
18
java.awt.GridBagLayout
import java.awt.*;
public class GridBagLayoutTest 
{
public static void main(String[] args) 
button = new Button("Button 4");
c.ipady = 40;
c.weightx = 0.0;
c.gridwidth = 3;
c.gridx = 0;
{
Frame frame = new Frame("GridBagLayoutTest");
frame.setLayout(new GridBagLayout());
Button button = new Button("Button 1");
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0.5;
c.gridx = 0;
c.gridy = 0;
frame.add(button, c);
c.gridy = 1;
frame.add(button, c);
button = new Button("Button 5");
c.ipady = 0;
c.weighty = 1.0;
c.anchor = GridBagConstraints.PAGE_END;
c.insets = new Insets(10,0,0,0);
c.gridx = 1;
c.gridwidth = 2;
c.gridy = 2;frame.add(button, c);
button = new Button("Button 2");
c.gridx = 1;
c.gridy = 0;
frame.add(button, c);
button = new Button("Button 3");
c.gridx = 2;
c.gridy = 0;
frame.add(button, c);
c.gridy 2;
frame.add(button, c);
frame.pack();
frame.setVisible(true);
}
}
import java.awt.Button;
import java.awt.Frame;
public class NullLayoutTest
null LayoutManager
{
public static void main(String[] args)
{
Frame f = new Frame();
f.setTitle("NullLayoutTest");
f.setSize(300,150);
f.setLayout(null);
Button b1 = new Button("Button 1");
b1 tB d (50 25 100 50)b1.setBounds(50,25,100,50);
f.add(b1);
Button b2 = new Button("Button 2");
b2.setBounds(125,85,100,50);
f.add(b2);
f.setVisible(true);
}
}
19
Eventos
Un evento es una encapsulación de una 
información que puede ser enviada a la aplicacióninformación que puede ser enviada a la aplicación
de manera asíncrona.
Los eventos pueden corresponder a acciones 
físicas (ratón y teclado) y a acciones lógicas.
java.util.EventObject es la clase padre de todos los 
eventos. Su subclase java.awt.AWTEvent es la 
clase padre de todos los eventos AWT.
Esquema general
Interface xxxListener
method1(xxxEvent e);
method2(xxxEvent e);
Clase Notifier Clase Listener
.......
method1(xxxEvent e)
{
.....
}
addXxxListener(xxxListener l)
{
.....
}
addxxxListener(?)
xxxEvent
method1(?)
}
method2(xxxEvent e)
{
.....
}
.......
}
removeXxxListener(xxxListener l)
{
.....
}
....... removexxxListener(?)
getID()
getSource()
.....
20
Manejo de eventos
Los eventos contienen un id (int que describe el
tipo de evento) También contiene informacióntipo de evento). También contiene información 
sobre el origen del evento (getSource();).
El manejo de eventos se consigue mediante el uso
de interfaces definidos en el paquete java.awt.event
ActionListener.
WindowListener.
KeyListener.
MouseListener.
etc....
Tipos de eventos
ComponentEvent Esconder, mover, redimensionar, mostrar.
Físicos:
ContainerEvent Añadir o eliminar un componente.
FocusEvent Obtener o perder foco.
KeyEvent Pulsar, liberar o teclear (ambos) una tecla.
MouseEvent Entrar salir pulsar soltar o clicar (ambos)MouseEvent Entrar, salir, pulsar, soltar o clicar (ambos).
MouseMotionEvent Arrastrar o mover.
WindowEvent Maximizar, minimizar, abrir, cerrar, activar o 
desactivar.
21
Tipos de eventos
Semánticos
ActionEvent Una acción se ha ejecutado.
AdjustmentEvent Un valor se ha ajustado.
ItemEvent Un estado ha cambiado.
TextEvent Un texto ha cambiadoTextEvent Un texto ha cambiado.
Componente
AWT
Tipos de eventos que pueden generar
Origen de eventos
Action Adjustment Component Container Focus Item Key Mouse Mouse
Motion
Text Window
Button X X X X X X
Canvas X X X X X
Checkbox X X X X X X
Choice X X X X X X
Component X X X X X
Container X X X X X X
Dialog X X X X X X X
Frame X X X X X X X
Label X X X X X
22
Componente
AWT
Tipos de eventos que pueden generar
Origen de eventos
AWT
Action Adjustment Component Container Focus Item Key Mouse Mouse
Motion
Text Window
List X X X X X X X
MenuItem X
Panel X X X X X X
Scrollbar X X X X X X
ScrollPane X X X X X X
TextArea X X X X X X
TextField X X X X X X X
Window X X X X X X X
Listener interface Adapter class Métodos
ActionListener actionPerformed
Métodos de los interfaces
AdjustmentListener adjustmentValueChanged
ComponentListener ComponentAdapter componentHidden
componentMoved
componentResized
componentShown
ContainerListener ContainerAdapter componentAddedp p
componentRemoved
FocusListener FocusAdapter focusGained
focusLost
ItemListener itemStateChanged
23
Listener interface Adapter class Métodos
KeyListener KeyAdapter keyPressed
Métodos de los interfaces
y y p y
keyReleased
keyTyped
MouseListener MouseAdapter mouseClicked
mouseEntered
mouseExited
mousePressed
mouseReleased
MouseMotionListener MouseMotionAdapter mouseDragged
mouseMoved
TextListener textValueChanged
Listener interface Adapter class Métodos
WindowListener WindowAdapter windowActivated
Métodos de los interfaces
p
windowClosed
windowClosing
windowDeactivated
windowDeiconified
windowIconified
windowOpened
24
Adapters
Son clases que tienen definidos todos los métodos
de un interface concreto.
La implementación de dichos métodos está vacía.
Heredando de un Adapter, y sobrescribiendo los
métodos necesarios conseguimos el mismo
resultado que implementar directamente elresultado que implementar directamente el 
interface.
Problema: en Java no existe la herencia múltiple,
por ello se suelen usar con las Clases Anónimas.
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class WindowListenerTest extends WindowAdapter
{
public void windowClosing(WindowEvent ev)
Ejemplo 1
public void windowClosing(WindowEvent ev)
{
System.exit(0);
}
}
import java.awt.Frame;
public class WindowEventTest1
{
public static void main(String[] args)public static void main(String[] args)
{
Frame f = new Frame();
f.setTitle("FrameTest");
f.setSize(200,150);
f.addWindowListener(new WindowListenerTest());
f.setVisible(true);
}
}
25
Ejemplo 2
import java.awt.*;
import java.awt.event.*;
public class WindowEventTest2 implements WindowListener
{
public static void main(String[] args)
{{
WindowEventTest2 w = new WindowEventTest2();
}
public WindowEventTest2()
{
Frame f = new Frame();
f.setTitle("FrameTest");
f.setSize(200,150);
f.addWindowListener(this);
f.setVisible(true);
}
public void windowActivated(WindowEvent ev) {}
public void windowClosed(WindowEvent ev) {}
public void windowClosing(WindowEvent ev) { System.exit(0); }
public void windowDeactivated(WindowEvent ev) {}
public void windowDeiconified(WindowEvent ev) {}
public void windowIconified(WindowEvent ev) {}
public void windowOpened(WindowEvent ev) {}
}
Ejemplo 3
import java.awt.*;
import java.awt.event.*;
public class WindowEventTest3
{
public static void main(String[] args)
{{
WindowEventTest3 w = new WindowEventTest3();
}
public WindowEventTest3()
{
Frame f = new Frame();
f.setTitle("FrameTest");
f.setSize(200,150);
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent ev)
{
System.exit(0); 
}
}
);
f.setVisible(true);
}
}
Clase anónima
26
Registro a la notificación de eventos
Cuando invocamos el método addWindowListener,
estamos estableciendo un ‘callback’.
Como parámetro se manda un escuchador, el cual
debe implementar el interfaz correspondiente.
Cuando se genera un WindowEvent como
consecuencia de pulsar el botón con la X, elp
método windowClosing() del escuchador es
invocado.
Se pueden añadir varios escuchadores a un
mismo notificador de eventos.
Ejemplo
import java.awt.*;
public class ButtonEventTest
{
public static void main(String[] args)
{
Frame f = new Frame();
f.setTitle("ButtonEventTest");
f.setSize(200,150);
f.setLayout(new FlowLayout());
Button b1 = new Button("Aceptar");
b1 addActionListener(new ActionListenerTest());b1.addActionListener(new ActionListenerTest());
f.add(b1);
Button b2 = new Button("Cancelar");
b2.addActionListener(new ActionListenerTest());
f.add(b2);
f.setVisible(true);
}
}
27
Ejemplo (cont.)
import java.awt.Button;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ActionListenerTest implements ActionListener
{
public void actionPerformed(ActionEvent ev)
{
if(((Button)ev.getSource()).getLabel().equals("Aceptar"))
System.out.println("Has pulsado Aceptar.");
else
System.out.println("Has pulsado Cancelar.");
}}
}
Implementa un color descrito según el RGB.
RGB: Red-Green-Blue es un sistema de definición de 
Otras clases: java.awt.Color
colores, donde se especifica el nivel de saturación de cada
uno de esos tres colores mediante valores entre 0 y 255.
Color amarillo = new Color(255,255,0);
Se puede construir mediante un valor RGB:
O ili l d fi id di
Color amarillo = Color.YELLOW;
O utilizar colores predefinidos mediante constantes:
Soporta transparencias (alpha) mediante un valor
entre 0.0 y 1.0
28
Ejemplo
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
f.addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseMoved(MouseEvent ev)
{
public class ColorTest
{
Frame f = null;
public static void main(String[] args)
{
new Test();
}
{
int r = f.getBackground().getRed();
if(r < 255)
f.setBackground(new Color(r+1,0,0));
else
f.setBackground(Color.BLACK);
}
});
}
}
public Test()
{
f = new Frame();
f.setTitle("ColorTest");
f.setSize(300,150);
f.setBackground(Color.BLACK);
f.setVisible(true);
Implementa la representación gráfica de una letra.
Otras clases: java.awt.Font
Se define mediante:
Familia: nombre del tipo de letra.
Existen dos clases de nombres de familia:
Estilo: normal o negrita y/o cursiva.
Tamaño: pixels del punto utilizado para pintar la letra.
Lógico: Serif, SansSerif, Monospaced, Dialog y DialogInput.
La JVM se encarga de mapear el nombre lógico con un
nombre físico.
Físico: cualquier familia instalada en el sistema.
29
Para definir el estilo se utilizan estas constantes:
Font PLAIN: normal
Otras clases: java.awt.Font
Font.PLAIN: normal.
Para combinar varios estilos se utiliza el OR lógico
a nivel de bit:
Font.BOLD: negrita.
Font.ITALIC: cursiva.
Font.BOLD | Font.ITALIC
Ejemplo
import java.awt.*;
public class FontTest
{
public static void main(String[] args)
{
Frame f = new Frame();
f.setTitle("FontTest");( );
f.setSize(200,200);
f.setLayout(new FlowLayout());
Label l1 = new Label("Serif");
l1.setFont(new Font("Serif", Font.PLAIN, 20));
Label l2 = new Label("SansSerif");
l2.setFont(new Font("SansSerif", Font.PLAIN, 20));
Label l3 = new Label("Monospaced");
l3.setFont(new Font("Monospaced", Font.ITALIC, 20));
L b l l4 L b l("Di l ")Label l4 = new Label("Dialog");
l4.setFont(new Font("Dialog", Font.BOLD,20));
Label l5 = new Label("DialogInput");
l5.setFont(new Font("DialogInput", Font.BOLD | Font.ITALIC, 20));
f.add(l1); f.add(l2); f.add(l3); f.add(l4); f.add(l5);
f.setVisible(true);
}
}
30
Implementa la representación gráfica del cursor.
Otras clases: java.awt.Cursor
Existen varios predefinidos, que se pueden usarp q p
mediante el uso de constantes. Algunos cursores:
Cruz: Cursor.CROSSHAIR_CURSOR
Mano: Cursor.HAND_CURSOR
Mover: Cursor.MOVE_CURSOR
Texto: Cursor.TEXT_CURSOR
Espera: Cursor.WAIT_CURSOR
La clase java.awt.Component tiene el método:
public void setCursor(Cursor cursor);
Ejemplo
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class CursorTest
b1.addMouseListener(new MouseAdapter()
{
public void mouseEntered(MouseEvent ev)
{
f setCursor(Cursor HAND CURSOR);public class CursorTest
{
Frame f = null;
public static void main(String[] args)
{
new Test();
}
public Test()
f.setCursor(Cursor.HAND_CURSOR);
}
public void mouseExited(MouseEvent ev)
{
f.setCursor(Cursor.DEFAULT_CURSOR);
}
});
f.add(b1);
f.setVisible(true);p ()
{
f = new Frame();
f.setTitle("CursorTest");
f.setSize(300,150);
f.setLayout(new FlowLayout());
Button b1 = new Button("Aceptar");
( );
}
}
31
Sirve para dibujar (se suele usar con los Canvas).
Otras clases: java.awt.Graphics
Todos los componentes AWT son dibujados enp j
pantalla a través del método de la clase
java.awt.Component:
public void paint(Graphics g);
La clase Graphics permite:
Trabajar con primitivas gráficas: figuras, colores, textos, …
Trabajar con imágenes: GIF y JPEG.
Un componente puede pedir que sea repintado
mediante el método: public void repaint();
Dibujando figuras:
Otras clases: java.awt.Graphics
Líneas: drawLine().
Rectángulos: drawRect(),
fillRect(), clearRect().
Rectángulos 3D: draw3DRect(), fill3DRect().
Rectáng. redondeados: drawRoundRect(), fillRoundRect().
Óvalos: drawOval(), fillOval().
Arcos: drawArc fillArc()
Polígonos: drawPolygon(), fillPolygon().
Escribiendo texto:
Arcos: drawArc, fillArc().
drawBytes(), drawChars(), drawString().
32
Ejemplo
import java.awt.*;
public class GraphicsTest extends Frame
{
public static void main(String[] args)
public void paint(Graphics g)
{
g.setColor(Color.LIGHT_GRAY);
g.draw3DRect(10,30,this.getWidth()-20,this.getHeight()-40,true);
g.setColor(Color.BLACK);
g.drawLine(15,35,65,65);
g.drawRect(70,35,50,30);
g.drawRoundRect(125,35,50,30,10,10);
g.drawOval(180,35,50,30);
d A (235 35 50 30 25 200)public static void main(String[] args)
{
new Test().setVisible(true);
}
public Test()
{
this.setTitle("GraphicsTest");
this.setBackground(Color.LIGHT_GRAY);
this.setSize(300,150);
}
g.drawArc(235,35,50,30,25,200);
int[] x = {15,65,15,65};
int[] y = {90,90,120,120};
g.drawPolygon(x,y,x.length);
g.setColor(Color.RED);
g.fillRect(70,90,50,30);
g.fillRoundRect(125,90,50,30,10,10);
g.fillOval(180,90,50,30);
g.fillArc(235,90,50,30,25,200);
g.setColor(Color.BLACK);
g.setFont(new Font("SansSerif",Font.PLAIN,9));
g.drawString("Línea",30,80);
g.drawString("Rectángulos",95,80);
g.drawString("Óvalo",192,80);
g.drawString("Arco",250,80);
g.drawString("Polígono",22,135);
g.drawString("Rectángulos",95,135);
g.drawString("Óvalo",192,135);
g.drawString("Arco",250,135);
}
}
También permite trabajar con imágenes,
representadas por la clase java.awt.Image
Otras clases: java.awt.Graphics
Toolkit getDefaultToolkit() getImage( );
Para cargar una imagen se utiliza la clase
java.awt.Toolkit:
Soporta los formatos: GIF y JPEG.
drawImage();
Toolkit.getDefaultToolkit().getImage(…);
Para pintar una imagen:
33
Ejemplo
import java.awt.*;
public class ImageTest extends Frame
{
public static void main(String[] args)
{{
new Test().setVisible(true);
}
public Test()
{
this.setTitle("ImageTest");
this.setSize(150,110);
}}
public void paint(Graphics g)
{
Image img = Toolkit.getDefaultToolkit().getImage("duke.gif");
g.drawImage(img,45,25,this);
}
}
Bibliografía
Java AWT Reference.
John Zukowski.
O’Reilly
Graphic Java 1.1: Mastering the AWT
David M. Geary y Allan McClellan.
Prentice Hall.
Graphic Java 2, Volume 1: AWT (3rd edition)
David M. Geary.
Prentice Hall.
The Java tutorial
http://java.sun.com/docs/books/tutorial/information/download.html#OLDui
34
Existe un editor visual AWT/Swing para Eclipse:
Apéndice A: Editor Visual
http://www.eclipse.org/vep
Para realizar la instalación, utilizaremos el
“Update Manager” de Eclipse.
Apéndice A: Editor Visual
p g p
Aunque también podemos descargar los plugins necesarios
de la web e instalarlos desconectados.
35
Añadimos un ”site” nuevo:
Apéndice A: Editor Visual
http://download.eclipse.org/tools/ve/updates/1.4/
Apéndice A: Editor Visual
El editor visual tiene algunas dependencias con
otros subproyectos de Eclipse.org: EMF.
Seleccionar las siguientes “features”:
Java EMF Model 1.4.0 o superior.
Visual Editor 1.4.0
36
Aceptar los detalles.
Apéndice A: Editor Visual
Aceptar los términos de la licencia.
Apéndice A: Editor Visual
37
Comenzará a descargar el código al disco local.
Apéndice A: Editor Visual
Por último, nos pedirá rearrancar Eclipse.
Apéndice A: Editor Visual
Podemos chequear las “features” existentes en
nuestra instalación a través del “Update Manager”.
38
Deberíamos ver activadas todas las “features” que 
acabamos de instalar.
Apéndice A: Editor Visual
Crear una clase nueva mediante el nuevo
asistente:
Apéndice B: Usando el Editor Visual
O abrir una ya existente con la nueva opción del
menú de contexto:
39
Apariencia del nuevo asistente:
Apéndice B: Usando el Editor Visual
Apariencia del editor:
Apéndice B: Usando el Editor Visual
Editor gráfico
Paleta de 
controles
Editor de
código fuente
Editor de 
propiedades
40
Editando:
Apéndice B: Usando el Editor Visual
Probando el código visual (en caso de que no
tenga un método main):
Apéndice B: Usando el Editor Visual
BasicoPOO.zip
m1ch2.pdf
1
Conceptos básicos de la
Orientación a Objetos
Principios de la
Tecnología de Objetos
Copyright (c) 2004
José M. Ordax
Copyright
Este documento puede ser distribuido solo bajo los 
términos y condiciones de la Licencia de 
Documentación de javaHispano v1.0 o posterior.
La última versión se encuentra en 
http://www.javahispano.org/licencias/
2
Un objeto es:
Definición de objeto
Algo que puede comprenderse intelectualmente.
Una entidad software.
Una cosa tangible y/o visible.
(camión)
(proceso)
(lista)
Un objeto tiene:
Características de un objeto
Estado: un conjunto de propiedades (atributos).
Comportamiento: un conjunto de operaciones (métodos).
Identidad: un identificador unívoco.
Los términos objeto e instancia son
intercambiables.
3
Un objeto se caracteriza por un número de
operaciones y un estado que recuerda el efecto
de estas operaciones.
Otras definiciones
Ivar Jacobson
Un objeto tiene un estado, comportamiento e 
identidad; la estructura y comportamiento de
objetos similares se definen en sus clases
comunes.
Grady Booch
Un objeto es una entidad que tiene un estado
(cuya representación está oculta) y un conjunto 
definido de operaciones que operan sobre ese 
estado.
Otras definiciones
Ian Sommerville
Un objeto es una identidad con unos límites bien
definidos que encapsulan estado y 
comportamiento. El estado se representa por 
atributos y relaciones, el comportamiento es 
representado por operaciones y métodos.
Object Managemente Group
4
Ejemplo práctico
unReloj
Atributos Métodos
getHora
getDia
incrementarHora
incrementarDia
limpiarPantalla
hora (horas, min, seg)
dia (dia, mes, año)
modelo
numSerie
Botón para mostrar la Hora
Botón para mostrar el Día
Modelo físico:
Modelo informático.
Estructura de un objeto
Métodos Atributos
atributoUno
atributoDos
….
atributoN
métodoUno ...
métodoN
métodoDos
Estructura 
encapsulada 
de los datos.
Operaciones 
permitidas. 
Pueden estar o 
no ocultas para 
el usuario.
5
Ejemplo práctico
unReloj
hora
día
numSerie
modelo
getDía
incrementarHora
getHora
incrementarDía
limpiarPantalla
traducirFrecuencia
Es una característica fundamental de cada objeto
de una clase.
Definición de atributo
Una clase puede definir un cierto número de
atributos estáticos.
Todos los atributos tienen algún valor. Este
valor puede ser una cantidad, una relación con
otro objeto, etc…
6
Es una acción que se realiza sobre un objeto
para consultar o modificar su estado.
Definición de método
Tipos de operaciones:
Modificador (setter): altera el estado de un objeto.
Selector (getter): accede al estado de un objeto sin alterarlo.
Iterador: permite acceder a todas las partes de un objeto.
Constructor: crea un objeto e inicializa su estado.
Destructor: limpia el estado de un objeto y lo destruye.
Propósito general: la lógica del programa.
El aspecto de los objetos
I
N
T
E
R
F
A
Z
variableUno
.
.
.
.
.
.
variableX
metodoUno
metodoDos
metodoTres
metodoN
Objeto
Aspecto 
INTERNO
Aspecto 
EXTERNO
(interfaz)
7
Interfaz
Es el aspecto externo del objeto. La parte visible
y accesible para el resto de objetos.
También se le define como el protocolo de 
comunicación de un objeto.
Puede estar formado por uno o varios métodos.
No todos los métodos de un objeto tienen porque
formar parte del interfaz.
hora
día
Objeto
Origen
I
N
T
E
R
F
A
Z
variableUno
.
.
.
.
.
.
variableX
metodoUno
metodoDos
metodoTres
metodoN
Objeto 
Destino
Una clase es la representación de la
estructura y comportamiento de un objeto
Definición de clase
Es un patrón para la definición de atributos y 
métodos para un tipo particular de objetos.
Todos los objetos de una clase dada son
idénticos en estructura y comportamiento pero
son únicos (aunque tengan los mismos valores en
sus atributos).
Instancia es el término utilizado para referirse a
un objeto que pertenece a una clase concreta.
8
Estructura de una clase
Métodos
Atributos
Nombre
Ejemplo práctico
Métodos
Atributos
Nombre
9
Clase:
Clases vs. Objetos
Todos los objetos de una clase dada son idénticos en 
estructura y comportamiento, pero tienen identidad única.
Un patrón para la definición del estado y el comportamiento
de un tipo particular de objetos.
Objeto (instancia):
Los objetos son creados y destruidos en tiempo de
ejecución. Residen en el espacio de memoria.
Pertenece a una clase en particular.
Ejemplo práctico
10
La clasificación es el medio por el que ordenamos
el conocimiento:
Clasificación
Al clasificar buscamos grupos de cosas que tengan una 
misma estructura o exhiban un comportamiento común.
Es fundamentalmente un problema de búsqueda de 
similitudes.
Clasificación y desarrollo O.O.:
Esta es una de las tareas fundamentales en el análisis y
diseño O.O.
Clasificación significa que los objetos con la misma 
estructura de datos y con el mismo comportamiento se
agrupan para formar una clase.
¿Quién dice qué?: Clase, Objeto, Atributo, Método
Ejercicio
El valor de mis atributos puede ser distinto al de los de 
mi semejante:______________.
Yo estoy en los objetos:_________________.
Yo represento el estado:________________.
Yo me comporto como una plantilla:________.
A mi me gusta hacer cosas:______________.
Yo puedo tener muchos métodos:_________.
Yo represento el comportamiento:_________.
11
¿Quién dice qué?: Clase, Objeto, Atributo, Método
Ejercicio (solución)
El valor de mis atributos puede ser distinto al de los de 
mi semejante: Objeto.
Yo estoy en los objetos: Atributo, método.
Yo represento el estado: Atributo.
Yo me comporto como una plantilla: Clase.
A mi me gusta hacer cosas: Objeto, método.
Yo puedo tener muchos métodos: Clase, objeto.
Yo represento el comportamiento: Método.
¿Quién dice qué?: Clase, Objeto, Atributo, Método
Ejercicio
Yo vivo en memoria:____________________.
Yo puedo cambiar en ejecución:___________.
Yo soy usado para crear instancias:________.
Mi estado puede cambiar:________________.
Yo declaro métodos:____________________.
12
¿Quién dice qué?: Clase, Objeto, Atributo, Método
Ejercicio
Yo vivo en memoria: Objeto.
Yo puedo cambiar en ejecución: Objeto, atributo.
Yo soy usado para crear instancias: Clase.
Mi estado puede cambiar: Objeto.
Yo declaro métodos: Clase.
Bibliografía
Object-Oriented Analysis and Design
Grady Booch.
Addison-Wesley.
Head First Object-Oriented Analysis and Design
Brett McLaughlin, Gary Pollice, David West
O’Reilly
Design patterns
Erich Gamma, Richard Helm, Ralph Johnson, John M. Vlissides
Addison-Wesley.
ClasesObjetos.zip
m2ch4.pdf
1
Java Básico
Clases y Objetos
Copyright (c) 2004
José M. Ordax
Copyright
Este documento puede ser distribuido solo bajo los 
términos y condiciones de la Licencia de 
Documentación de javaHispano v1.0 o posterior.
La última versión se encuentra en 
http://www.javahispano.org/licencias/
2
La implementación de una clase Java debe ir en
un fichero en formato texto con la extensión *.java
y nombre idéntico a la clase implementada.
Clases
La declaración de una clase Java se realiza 
mediante la keyword: class seguida de su nombre.
La clase MiClase debe ir en un fichero: MiClase.java
La keyword siempre va precedida por un modificador
de acceso: public, protected, private o default (nada).
Clases
Declaración de una clase:
Ejemplo:
modificador_acceso class nombre_clase
{
}
public class MiClase
{
}
La implementación de la clase irá contenida en un
bloque { } justo después de la declaración.
3
La implementación de una clase consiste en una
serie de:
Atributos y métodos
Declaración de un atributo:
Atributos.
Métodos.
modificador_acceso tipo nombre [= valor_inicial];
private boolean sw = true;
private int i;
Ejemplo:
Atributos y métodos
Declaración de un método:
modificador_acceso tipo_retorno nombre([tipo parametro,..])
{
}
public int suma(int param1, int param2)
{
return param1 + param2;
}
Ejemplo:
La implementación del método irá contenida en un
bloque { } justo después de la declaración.
4
Java SE 5.0 añade una novedad a la definición de
un método mediante la característica: varargs
Se permite definir un número indefinido de 
parámetros del mismo tipo mediante: ...
Ejemplo:
public int suma(int… params)
{
int acum = 0;
for(int num: params) // He usado también el nuevo for/in
acum = acum + num;
return acum;
}
5.0
Atributos y métodos
Lo que recibimos es un array del tipo definido.
Tiene algunas restricciones:
public int metodo(String param1, int param2, int… params)
{
}
Atributos y métodos
Solo puede usarse una vez por método.
Siempre debe ser el último de todos en la definición.
Hay que tener en cuenta que podemos recibir,
cero, uno o varios valores en dicho parámetro.
Ejemplo:
Veremos como trabajar con esta característica en
el capítulo dedicado a Java SE 5.0
5.0
5
Existe un tipo de método especial en Java
llamado constructor.
Constructores
Sirve para la construcción (instanciación) de 
objetos (instancias) a partir de esa clase.
En su implementación se suele dar valores a los 
atributos para ese objeto.
Su declaración es idéntica a la de los métodos
convencionales con dos salvedades:
No tienen tipo de retorno.
Se tiene que llamar igual que la clase.
Constructores
Declaración de un constructor:
Ejemplo:
modificador_acceso nombre([tipo parametro,..])
{
}
public MiClase(int param1, boolean param2)
{
}
Si nuestra clase no tiene constructores, el 
compilador añade por defecto uno sin parámetros.
6
Se dice que un método está sobrecargado cuando
existen dos métodos con el mismo nombre y tipo
de retorno pero con parámetros distintos.
Sobrecarga de métodos
De esta manera podemos tener en una clase
varios constructores.
Ejemplo:
public MiClase()
{
}
public MiClase(int param1, boolean param2)
{
}
Java SE 5.0 añade una novedad al respecto.
Sobrecarga de métodos
Se permite la sobrecarga de métodos cambiando 
también el tipo de retorno, pero siempre que:
5.0
El método que se está sobrecargando sea de una clase
padre (de la que heredamos directa o indirectamente).
El nuevo tipo de retorno sea hijo del tipo de retorno del
método original (es decir, que herede de él directa o
indirectamente).
Veremos con mas detalle esta nueva característica
en el capítulo dedicado a Java SE 5.0
Por tanto, no es válido para tipos primitivos.
7
El nombre de las clases comenzará con
mayúsculas:
Convenciones en Java
El nombre de los atributos comenzará con
minúsculas:
MiClase, String, Circulo, Cuenta, CuentaCorriente,…..
contador, sw, i, segundoContador,…..
El nombre de los métodos comenzará con
minúsculas (a excepción de los constructores):
ingresar, miMetodo, sumar,…..
Ejemplo
8
public class Cuenta
{
// Atributos
private double saldo;
// Constructores
public Cuenta()
{
saldo = 0.0;
}
public Cuenta(double param)
{
saldo = param;
}
// Métodos
public void reintegro(double param)
{
saldo = saldo - param;
}
public void ingreso(double param)
{
saldo = saldo + param;
}
public double getSaldo()
{
return saldo;
}
public void setSaldo(double param)
{
saldo = param;
}
}
Ejemplo
Objetos
El tipo de un objeto es la clase de la que se ha
instanciado.
Los objetos en Java no son mas que variables de
tipo complejo, frente a las de tipo primitivo.
La declaración de un objeto es idéntica a la
declaración de una variable de tipo primitivo:
tipo identificador;
Cuenta miCuenta;
9
Objetos
La inicialización de un objeto si que es algo
distinta a la inicialización de las variables de tipo
primitivo:
El valor por defecto de un objeto sin inicializar es:
tipo identificador = new tipo([parametro,…]);
Cuenta miCuenta = new Cuenta(1200.75); 
null
Se utiliza el operador new.
Se llama a un constructor de la clase de la que queremos
instanciar.
Es decir:
Una variable de tipo complejo contiene una 
referencia (puntero) a la zona de memoria donde
está el objeto:
Una variable de tipo primitivo contiene el dato
directamente:
Variables primitivas vs. complejas
a
byte a = 10;
000
010
10
sString s = new String(“Hola”); Hola
referencia
10
Ejemplo
public class Punto
{
private int x = 0;
private int y = 0;
public Punto(int param1, int param2)
{
x = param1;
y = param2;
}
}
public class Circulo
{
private Punto centro = null;
private int radio = 0;
public Circulo(Punto param1, int param2)
{
centro = param1;
radio = param2;
}
}
public class Test
{
public static void main(String[] args)
{
Punto pun = new Punto(2,2);
Circulo cir = new Circulo(pun,3);
}
}
cir
referencia
pun
referencia
referencia
x
y
centro
radio
El trabajo con un objeto consiste en acceder:
Manejo de objetos
En ambos casos utilizaremos el operador . (punto).
A sus métodos.
Acceso a un atributo:
miCuenta.saldo = 0;
A sus atributos.
objeto.atributo
11
Acceso a un método (lo que en Orientación a 
Objetos se denominaba mensaje):
Manejo de objetos
La posibilidad de acceso a un atributo o a un
método de un objeto dependerá del modificador
de acceso que exista en su definición.
miCuenta.reintegro(13.7);
objeto.metodo([parametro,..])
public class Cuenta
{
// Atributos
private double saldo;
// Constructores
public Cuenta()
{
saldo = 0.0;
}
public Cuenta(double param)
{
saldo = param;
}
// Métodos
public void reintegro(double param)
{
saldo = saldo - param;
}
public void ingreso(double param)
{
saldo = saldo + param;
}
public double getSaldo()
{
return saldo;
}
public void setSaldo(double param)
{
saldo = param;
}
}
Ejemplo
12
Ejemplopublic class Test
{
public static void main(String[] args)
{
double aux = 0;
Cuenta a = new Cuenta();
Cuenta b = new Cuenta(10.5);
aux = a.getSaldo();
System.out.println("El saldo de a es: " + aux);
aux = b.getSaldo();
System.out.println("El saldo de b es: " + b.getSaldo());
a.ingreso(2.3);
b.reintegro(3.5);
System.out.println("El saldo de a es: " + a.getSaldo());
System.out.println("El saldo de b es: " + b.getSaldo());
}
}
Las llamadas a métodos se pueden encadenar:
Manejo de objetos
Equivaldría a:
String s1 = new String(“abc");
char c = s1.toUpperCase().charAt(0);
String s1 = new String(“abc");
String s2 = s1.toUpperCase();
char c = s2.charAt(0);
13
Existe un método especial en Java llamado main:
El método main y la clase “truco”
Las clases representaban entidades que 
participaban en la resolución de un problema. ¿En
qué entidad tiene sentido incluir el método main?
public static void main(String[] args)
Es el método donde comienza la ejecución de un
programa Java.
En ninguna. Por eso crearemos siempre una clase
a parte, que solo tenga el método main.
Los destructores son unos métodos encargados de
eliminar los objetos de memoria.
Destructores
En Java no existe este tipo de métodos.
En Java lo que existe es un proceso que se ejecuta
en la JVM a la vez que nuestra aplicación y que se 
encarga de buscar todos aquellos objetos en
memoria no utilizados y limpiarlos.
Este proceso se llama Garbage Collector.
14
¿Cómo sabe el Garbage Collector que un objeto
ya no está siendo utilizado por la aplicación y que
por tanto puede ser eliminado?
Garbage Collector
Porque no está referenciado por ninguna variable.
Existen tres motivos por los que una variable deja
de referenciar a un objeto:
Se iguala a null.
Se iguala a otro objeto.
Se termina su ámbito.
Ejemplo
public class Punto
{
private int x = 0;
private int y = 0;
public Punto(int param1, int param2)
{
x = param1;
y = param2;
}
}
public class Circulo
{
private Punto centro = null;
private int radio = 0;
public Circulo(Punto param1, int param2)
{
centro = param1;
radio = param2;
}
}
public class Test
{
public static void main(String[] args)
{
Punto pun = new Punto(2,2);
Circulo cir = new Circulo(pun,3);
pun = null;
}
}
cir
referencia
pun
referencia
referencia
x
y
centro
radio
15
Ejemplo
cir
referencia
pun
referencia
referencia
x
y
centro
radio
Pero ¡ojo!, el objeto
referenciado por pun
no se puede limpiar 
porque sigue referenciado
por centro desde el
objeto referenciado por
cir.
Ejercicio
Identificar si hay algo mal en este código:
public class RadioCasette
{
boolean puedeGrabar = false;
void escucharCinta()
{
System.out.println("Escuchándose cinta");
}
void grabarCinta()
{
System.out.println("Grabándose cinta");
}
}
public class Test
{
public static void main(String[] args)
{
r.escucharCinta();
if(r.puedeGrabar)
r.grabarCinta();
}
}
16
Ejercicio (solución)
Estaba mal. No habíamos creado el objeto r.
public class RadioCasette
{
boolean puedeGrabar = false;
void escucharCinta()
{
System.out.println("Escuchándose cinta");
}
void grabarCinta()
{
System.out.println("Grabándose cinta");
}
}
public class Test
{
public static void main(String[] args)
{
RadioCasette r = new RadioCasette();
r.escucharCinta();
if(r.puedeGrabar)
r.grabarCinta();
}
}
Ejercicio
Identificar si hay algo mal en este código:
public class ReproductorDVD
{
boolean puedeGrabar = false;
void grabarDVD()
{
System.out.println("Grabándose");
}
}
public class Test
{
public static void main(String[] args)
{
ReproductorDVD r = new ReproductorDVD();
r.verDVD();
if(r.puedeGrabar)
r.grabarDVD();
}
}
17
Ejercicio
Estaba mal. Se estaba llamando a un método
inexistente.
public class ReproductorDVD
{
boolean puedeGrabar = false;
void verDVD()
{
System.out.println("Viéndose");
}
void grabarDVD()
{
System.out.println("Grabándose");
}
}
public class Test
{
public static void main(String[] args)
{
ReproductorDVD r = new ReproductorDVD();
r.verDVD();
if(r.puedeGrabar)
r.grabarDVD();
}
}
Ejercicio
Identificar si hay algo mal en este código,
suponiendo que la clase Rectangulo existe.
public class Temp
{
public static void main(String[] args) 
{
Rectangulo miRect;
miRect.ancho = 40;
miRect.alto = 50;
System.out.println("El área del rectángulo es" + miRect.area());
}
}
18
Ejercicio (solución)
Estaba mal. El objeto miRect no está inicializado, 
por tanto vale null. Con null no podemos hablarnos.
public class Temp
{
public static void main(String[] args) 
{
Rectangulo miRect = new Rectangulo();
miRect.ancho = 40;
miRect.alto = 50;
System.out.println("El área del rectángulo es" + miRect.area());
}
}
Bibliografía
Head First Java (2nd edition)
Kathy Sierra y Bert Bates.
O’Reilly
Learning Java (2nd edition)
Patrick Niemeyer y Jonathan Knudsen.
O’Reilly.
Thinking in Java (4th edition) 
Bruce Eckel.
Prentice Hall.
The Java tutorial
http://java.sun.com/docs/books/tutorial/
Comunicaciones.zip
m3ch8.pdf
1
Java Avanzado
Comunicaciones TCP/IP
Copyright (c) 2004
José M. Ordax
Copyright
Este documento puede ser distribuido solo bajo los 
términos y condiciones de la Licencia de 
Documentación de javaHispano v1.0 o posterior.
La última versión se encuentra en 
http://www.javahispano.org/licencias/
2
Un sistema de comunicaciones se compone de
una pila de niveles encargados de distintas tareas.
Introducción
A este modelo teórico se le llama el Modelo de 
Referencia OSI.
Enlace
Físico
Transporte
Aplicación
Sesión
Presentación
Red
Nivel 7
Nivel 6
Nivel 5
Nivel 4
Nivel 3
Nivel 2
Nivel 1
En una red TCP/IP (por ejemplo Internet) algunos
niveles se fusionan quedando la siguiente pila:
Introducción (cont.)
Enlace
Transporte
(TCP,UDP,...)
Aplicación
(HTTP,FTP, Telnet,...)
Red
(IP,...)
Cuando programamos en Java, solo nos 
preocupamos del nivel de Aplicación. Java y el
Sistema Operativo ya se encargan del resto.
3
Las máquinas tienen habitualmente una conexión
a la red por la que le van a llegar todos los datos.
Introducción (cont.)
Pero en una misma máquina puede haber n 
aplicaciones esperando datos.
¿Cómo se sabe para que aplicación son los datos?
Gracias a los puertos.
Para enviar algo por una red TCP/IP se direcciona
mediante una dirección y un puerto:
Dirección: especifica la máquina destino.
Puerto: especifica la aplicación destino.
Gráficamente:
Introducción (cont.)
4
Algunas direcciones especiales:
Introducción (cont.)
21: Servidores FTP.
127.0.0.1: Conocida con el nombre de LoopBack. Apunta a 
la propia máquina.
192.168.x.x (hay más): Utilizadas para las redes locales 
privadas conectadas a Internet (por ejemplo vía ADSL).
Algunos puertos conocidos:
23: Servidores Telnet.
25: Servidores SMTP.
80: Servidores Web.
Siglas:
Introducción (cont.)
Todas las clases referentes a la comunicación en
redes TCP/IP se encuentran en java.net.*
IP: Internet Protocol.
URL: Uniform Resource Locator.
HTTP: HiperText Transport Protocol.
FTP: File Transport Protocol.
TCP: Transmission Control Protocol.
UDP: User Datagram Protocol.
5
Una URL es el identificador unívoco de un recurso
en Internet.
URL
Una URL consta de las siguientes partes:
Por ejemplo:
Dirección de la máquina (host).
Path.
Protocolo.
Puerto.
http://download.eclipse.org:80/downloads/index.php
En Java, la URL está implementada por la clase
java.net.URL
Creando una URL
Lo mas sencillo es utilizar el constructor donde se
le pasa la URL como un String:
Pero también podemos crear URLs relativas 
mediante otro constructor:
URL aURL = new URL(“http://www.ibm.com/index.html”);
Esta es una URL absoluta.
URL base = new URL(“http://www.ibm.com/”); 
URL final = new URL(base,“index.html”);
6
Existen mas constructores donde se puede 
especificar por separado el puerto, el path, etc.... 
Creando una URL (cont.)
Todos los constructores de la clase java.net.URL
tienen la siguiente cláusula throws:
public URL(String spec) throws MalformedURLException;
Por tanto, siempre tendremos que construir las 
URLs en un bloque try & catch donde recojamos
la excepción java.net.MalformedURLException
Podemos acceder a los atributos de una URL 
mediante los siguientes métodos:
Atributos de una URL
getFile(): Devuelve el path del recurso.
getRef(): Devuelve la referencia dentro del recurso.
getProtocol(): Devuelve el protocolo de la URL.
getHost(): Devuelve el host (dirección) de la URL.
getPort(): Devuelve el puerto de la URL.
7
Ejemplo
import java.net.MalformedURLException;
import java.net.URL;
public class URLTest
{
public static void main(String[] args)
{
try
{
URL aURL = new URL("http://www.eclipse.org:80/eclipse/faq/eclipse-faq.html#about_8");
System.out.println("Protocol = " + aURL.getProtocol());
System.out.println("Host = " + aURL.getHost());
System.out.println("FileName = " + aURL.getFile());
System.out.println("Port = " + aURL.getPort());
System.out.println("Ref = " + aURL.getRef());
}
catch(MalformedURLException ex)
{
ex.printStackTrace();
}
}
}
Ejemplo
La clase java.net.URL tiene un método para poder
acceder a su stream de entrada.
Leyendo de una URL
Este stream es una instancia de la clase
java.io.InputStream
El método es:
A partir del stream ya podremos leer directamente 
o usar cualquier tipo de filtro sobre este stream.
public final java.io.InputStream openStream() throws java.io.IOExcpetion;
8
Ejemploimport java.io.*;
import java.net.*;
public class LeerURLTest
{
public static void main(String[] args)
{
try
{
URL yahoo = new URL("http://www.yahoo.com/");
BufferedReader in = new BufferedReader(new InputStreamReader(yahoo.openStream()));
String aux;
while ((aux = in.readLine()) != null)
System.out.println(aux);
in.close();
}
catch(MalformedURLException ex)
{
}
catch(IOException ex)
{
}
}
}
Ejemplo
Una vez que hemos creado una URL, podemos
establecer una conexión con ella a través del
método:
Conectando con una URL
Mediante una conexión podremos establecer un
diálogo con la URL: escribir y leer.
Lo lograremos mediante los métodos 
getOutputStream y getInputStream.
Nota: Una URL no tiene porque ser solo un recurso estático como una
página HTML o una imagen. También puede ser un programa CGI, un 
script PHP, un Servlet Java, una Java Server Page (JSP), etc......
public java.net.URLConnection openConnection()
throws java.io.IOExcpetion;
9
Habitualmente, tenemos una aplicación servidora
esperando conexiones de un cliente en un puerto.
Socket
Y tenemos una aplicación cliente que quiere 
conectar con ese servidor en ese puerto.
Un socket es el link entre una aplicación servidora 
y un puerto.
Cuando un cliente conecta con el servidor se crea
un nuevo socket a un nuevo puerto.
Socket (cont.)
De esta forma, el servidor puede seguir esperando
conexiones en el socket principal y comunicarse
con el cliente conectado.
De igual forma se establece un socket en el cliente
en un puerto local.
Por tanto, la comunicación se establece entre dos
sockets.
10
Las URLs son un caso específico del trabajo con
sockets. Las clases Java relacionadas con las
URLs utilizan por debajo sockets.
Socket vs URL
Para el desarrollador es más fácil usar las clases
URL, URLConnection, etc.... que los sockets
directamente.
Pero hay muchos casos donde se requieren clases
de comunicación de bajo nivel. Por ejemplo, la 
implementación de un servidor, el uso de un 
protocolo propietario, etc....
Las clases Java que implementan los sockets son:
Socket (cont.)
java.net.Socket sirve para establecer un socket
en un cliente. Establecer la conexión con un socket
servidor.
java.net.SocketServer sirve para establecer un
socket en un servidor. Poder escuchar posibles
conexiones desde sockets cliente.
java.net.Socket
java.net.SocketServer
11
Trabajar con un socket cliente comprende los 
siguientes pasos:
java.net.Socket
Abrir el socket: mediante uno de sus constructores, 
habitualmente dándole la dirección y el puerto destino.
Abrir el stream de entrada y/o de salida: mediante los 
métodos getInputStream() y getOutputStream().
Leer y/o escribir al socket: mediante los métodos de los
streams o los filtros que hayamos creado.
Cerrar los streams: mediante el método close().
Cerrar el socket: mediante el método close().
Podemos acceder a los atributos de un socket
mediante los siguientes métodos:
Atributos de un socket
getLocalPort(): Devuelve el puerto origen (local).
getInetAddress(): Devuelve la dirección destino (remota).
getPort(): Devuelve el puerto destino (remoto).
getLocalAddress(): Devuelve la dirección origen (local).
12
Ejemplo
import java.io.*;
import java.net.*;
public class EchoClient
{
public static void main(String[]

Otros materiales