Descarga la aplicación para disfrutar aún más
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[]
Compartir