Está en la página 1de 99

Diplomado Java Servlets

NDICE
Introduccin a Java .....................................................................................................................4 Qu es JAVA?............................................................................................................................4 La Simplicidad de Java ...............................................................................................................4 Java posee bibliotecas de clases estndares.................................................................................5 Java es multiplataforma...............................................................................................................5 El Look-and-Feel.........................................................................................................................6 C es poco robusto.........................................................................................................................6 Java s es robusto.........................................................................................................................7 Java es flexible.............................................................................................................................7 Java administra automticamente la memoria ............................................................................8 Programacin Orientada a Objetos..............................................................................................9 Mecanismos bsicos de la POO.................................................................................................10 Resumen.....................................................................................................................................11 Programando JAVA...................................................................................................................13 El compilador y el intrprete de Java ........................................................................................13 ...................................................................................................................................................13 Estructura de un programa bsico en java.................................................................................13 Tu Primera Aplicacin de Java en Windows.............................................................................14 Crear tu Primer Applet...............................................................................................................15 Variables y Tipos.......................................................................................................................16 Tipos primitivos.............................................................................................................18 Expresiones y operadores..........................................................................................................19 Aritmtica......................................................................................................................20 Operadores unarios sobre expresiones numricas.........................................................22 Incremento y decrementos.............................................................................................22 Operadores de comparaciones.......................................................................................23 Operadores entre valores booleanos (operadores lgicos).............................................24 Conversiones: cast.........................................................................................................25 Precedencia de Operadores............................................................................................25 Declaracin de variables............................................................................................................25 Arreglos, condicionales y ciclos................................................................................................28 Arreglos......................................................................................................................................28 Condicionales.............................................................................................................................30 Condicionales if.........................................................................................................................30 Condicionales switch.................................................................................................................31 Ciclos.........................................................................................................................................33 Ciclo for.....................................................................................................................................33 Ciclo while...do..........................................................................................................................34 Ciclo do...while..........................................................................................................................34 Trabajando con objetos..............................................................................................................35 El cuerpo de una Clase Java.......................................................................................................39 Implementar Mtodos Java........................................................................................................40 Control de acceso los componentes de la Clase.........................................................................43 Applets.......................................................................................................................................45 1

Ing. Joel Gonzlez Estrada

Diplomado Java Servlets Grficos......................................................................................................................................49 Componentes bsicos de la intercaz de usuario AWT .............................................................52 Botones......................................................................................................................................53 Etiquetas ....................................................................................................................................57 Listas..........................................................................................................................................58 Campo de Texto.........................................................................................................................60 reas de Texto...........................................................................................................................62 Canvas........................................................................................................................................63 Barras de desplazamiento..........................................................................................................65 Practicas.....................................................................................................................................67 Servlets.......................................................................................................................................76 Introduccin a los Servlets.........................................................................................................76 Porqu se afirma que los servlets podrn sustituir a los CGI's? ..............................................77 Ventajas de los Servlets.............................................................................................................78 Ejemplos de aplicacin de los servlets.......................................................................................79 Arquitectura del paquete Servlets..............................................................................................80 Un Servlet Sencillo....................................................................................................................82 Interactuar con los Clientes........................................................................................................83 Peticiones y Respuestas.............................................................................................................84 Manejo de peticiones GET y POST...........................................................................................85 Inicializar un Servlet..................................................................................................................87 Destruir un Servlet....................................................................................................................89 Acceso a bases de datos mediante servlets y jdbc.....................................................................90 Ejemplo 1: Acceso a una base de datos Microsoft ...................................................................91 Ejecucin de la aplicacin.........................................................................................................92 Cdigo del Servlet ServletOpinion2. java.................................................................................93 Pagina Web ..............................................................................................................................97 Practicas.....................................................................................................................................97

Ing. Joel Gonzlez Estrada

Diplomado Java Servlets

Diplomado Java Servlets


1. Introduccin a Java
Al final del capitulo el alumno ser capaz de... Comprender con exactitud que es Java Ventajas ante otros lenguajes de programacin Sus caractersticas de Java Manejo de los conceptos de la Programacin Orientada a Objetos (POO) Familiarizarse con la filosofa de POO. Comprueba tu avance y marca con una los objetivos alcanzados.

Ing. Joel Gonzlez Estrada

Diplomado Java Servlets

Introduccin a Java
Qu es JAVA?
Java es solo es otro lenguaje de programacin con el que se pueden escribir programas que corran en Internet. Java es ms parecido a lenguajes de programacin como C, C++, Visual Basic o Pascal que a lenguajes de descripcin como HTML o lenguajes para escribir guiones como JavaScript. Java es un lenguaje de programacin orientado a objetos desarrollado por Sun Microsystems. Fundamentado en C++, el lenguaje Java se diseo para ser pequeo, sencillo y porttil a travs de las plataformas y sistemas operativos. Java se menciona frecuentemente en el contexto del WWW, donde los Navegadores, reclaman ser autorizados por Java esto significa que el navegador puede en cuestin bajar y ejecutar programas en Java. Java se escribi como un lenguaje de programacin de propsito general con el que se pueden abordar los mismos tipos de tarea o resolver el mismo tipo de problemas que con otros lenguajes de programacin como C o C++.

La Simplicidad de Java
Java ha sido diseado de modo de eliminar las complejidades de otros lenguajes como C y C++. Si bien Java posee una sintaxis similar a C, con el objeto de facilitar la migracin de C hacia a Java, Java es semnticamente muy distinto a C: Java no posee aritmtica de punteros: La aritmtica de punteros es el origen de muchos errores de programacin que no se manifiestan durante la depuracin y que una vez que el usuario los detecta son difciles de resolver. No se necesita hacer delete: Determinar el momento en que se debe liberar el espacio ocupado por un objeto es un problema difcil de resolver correctamente. Esto tambin es el origen a errores difciles de detectar y solucionar. No hay herencia mltiple: En C++ esta caracterstica da origen a muchas situaciones de borde en donde es difcil predecir cul ser el resultado. Por esta razn en Java se opta por herencia simple que es mucho ms simple de aprender y dominar.

Ing. Joel Gonzlez Estrada

Diplomado Java Servlets

Java posee bibliotecas de clases estndares


Toda implementacin de Java debe tener las siguientes bibliotecas de clases: Manejo de archivos Comunicacin de datos Acceso a la red Internet Acceso a bases de datos Interfaces grficas La interfaz de programacin de estas clases es estndar, es decir en todas ellas las operaciones se invocan con el mismo nombre y los mismos argumentos.

Java es multiplataforma
La independencia de plataforma es una de las ventas significativas que tiene Java sobre otros lenguajes de programacin. Esto significa que un programa puede ejecutarse en cualquier sistema operativo. Los programas pueden ejecutarse en cualquier sistema que tenga instalado una maquina virtual. Si esta escribiendo software para el WWW, la posibilidad de correr el mismo programa en sistemas diferentes es crucial para el xito del programa. Los programas en Java pueden ejecutarse en cualquiera de las siguientes plataformas, sin necesidad de hacer cambios: Windows/95 y /NT Power/Mac Unix (Solaris, Silicon Graphics, ...) La compatibilidad es total: A nivel de fuentes: El lenguaje es exactamente el mismo en todas las plataformas. A nivel de bibliotecas: En todas las plataformas estn presentes las mismas bibliotecas estndares. A nivel del cdigo compilado: el cdigo intermedio que genera el compilador es el mismo para todas las plataformas. Lo que cambia es el intrprete del cdigo intermedio.

Ing. Joel Gonzlez Estrada

Diplomado Java Servlets

El Look-and-Feel
Lo nico que varia de acuerdo a la plataforma es el look-and-feel. Un programa en Windows/95 tendr el aspecto caracterstico de esta plataforma (en cuanto a la forma de los botones, barras de deslizamiento, mens, etc.). El mismo programa en Unix tendr el aspecto caracterstico de Motif. Y en Power/Mac se ver como un programa para Macintosh. Sin embargo el cdigo que escriben los programadores no tiene que tener presente las caractersticas de ninguna de estas plataformas. Es la implementacin de la interfaz grfica estndar de Java la que se encarga de desplegar las ventanas con el look-and-feel de la plataforma local.

C es poco robusto
Se dice que el lenguaje C es un lenguaje poco robusto porque a menudo un error de programacin se traduce en un mensaje crptico del estilo segmentation fault. Este tipo de mensajes se origina en 4 errores clsicos: Se accesa un elemento de un arreglo con un ndice fuera de rango. Ejemplo: a[-3]=5; Se usa un puntero como si referenciara a una estructura de tipo A, cuando en realidad en esa rea de memoria hay una estructura de tipo B, incompatible con A. En C esto ocurre debido al uso de casts. Ejemplo: *(int*)pdistance Se usa un puntero a una estructura cuyo espacio ya se liber. Luego volveremos a hablar de este punto. Ejemplo: free(p); *p= 1; Al usar aritmtica de punteros se comete un error. Ejemplo: *(p+i*sizeof(*p)) Todos estos errores conducen a que tarde o temprano se use un puntero que direcciona un rea de memoria no asignada por el sistema operativo. Esto es lo que detiene la ejecucin con el mensaje segmentation fault. Lo ms desagradable de este tipo de errores es que es muy difcil determinar en qu lnea del cdigo est la verdadera fuente del error. Podra ser en cualquier parte del programa. Encontrar la lnea puede llevar varios das y hasta semanas, incluso en el caso de programadores expertos.

Ing. Joel Gonzlez Estrada

Diplomado Java Servlets

Java s es robusto
En Java no se pueden cometer los 4 errores mencionados: Java siempre chequea los ndices al accesar un arreglo. Java realiza chequeo de tipos durante la compilacin (al igual que C). En una asignacin entre punteros el compilador verifica que los tipos sean compatibles. Adems, Java realiza chequeo de tipos durante la ejecucin (cosa que C y C++ no hacen). Cuando un programa usa un cast para accesar un objeto como si fuese de un tipo especfico, se verifica durante la ejecucin que el objeto en cuestin sea compatible con el cast que se le aplica. Si el objeto no es compatible, entonces se levanta una excepcin que informa al programador la lnea exacta en donde est la fuente del error. Java posee un recolector de basuras que administra automticamente la memoria. Es el recolector el que determina cuando se puede liberar el espacio ocupado por un objeto. El programador no puede liberar explcitamente el espacio ocupado por un objeto. Java no posee aritmtica de punteros, porque es una propiedad que no se necesita para programar aplicaciones. En C slo se necesita la aritmtica de punteros para programa malloc/free o para programar el ncleo del sistema operativo. Por lo tanto Java no es un lenguaje para hacer sistemas operativos o administradores de memoria, pero s es un excelente lenguaje para programar aplicaciones.

Java es flexible
Pascal tambin es un lenguaje robusto, pero logra su robustez prohibiendo tener punteros a objetos de tipo desconocido. Lamentablemente esta prohibicin es demasiado rgida. Aunque son pocos los casos en que se necesita tener punteros a objetos de tipo desconocido, las contorsiones que estn obligados a realizar los programadores cuando necesitan estos punteros dan origen a programas ilegibles. Lisp por su parte es un lenguaje flexible y robusto. Todas las variables son punteros a objetos de cualquier tipo (un arreglo, un elemento de lista, etc.). El tipo del objeto se encuentra almacenado en el mismo objeto. Durante la ejecucin, en cada operacin se chequea que el tipo del objeto manipulado sea del tipo apropiado. Esto da flexibilidad a los programadores sin sacrificar la robustez. Lamentablemente, esto hace que los programas en Lisp sean poco legibles debido a que al estudiar su cdigo es difcil determinar cul es el tipo del objeto que referencia una variable. Ing. Joel Gonzlez Estrada 7

Diplomado Java Servlets Java combina flexibilidad, robustez y legibilidad gracias a una mezcla de chequeo de tipos durante la compilacin y durante la ejecucin. En Java se pueden tener punteros a objetos de un tipo especfico y tambin se pueden tener punteros a objetos de cualquier tipo. Estos punteros se pueden convertir a punteros de un tipo especfico aplicando un cast, en cuyo caso se chequea en tiempo de ejecucin de que el objeto sea de un tipo compatible. El programador usa entonces punteros de tipo especfico en la mayora de los casos con el fin de ganar legibilidad y en unos pocos casos usa punteros a tipos desconocidos cuando necesita tener flexibilidad. Por lo tanto Java combina la robustez de Pascal con la flexibilidad de Lisp, sin que lo programas pierdan legibilidad en ningn caso.

Java administra automticamente la memoria


En Java los programadores no necesitan preocuparse de liberar un trozo de memoria cuando ya no lo necesitan. Es el recolector de basuras el que determina cuando se puede liberar la memoria ocupada por un objeto. Un recolector de basuras es un gran aporte a la productividad. Se ha estudiado en casos concretos que los programadores han dedicado un 40% del tiempo de desarrollo a determinar en qu momento se puede liberar un trozo de memoria. Adems este porcentaje de tiempo aumenta a medida que aumenta la complejidad del software en desarrollo. Es relativamente sencillo liberar correctamente la memoria en un programa de 1000 lneas. Sin embargo, es difcil hacerlo en un programa de 10000 lneas. Y se puede postular que es imposible liberar correctamente la memoria en un programa de 100000 lneas. Para entender mejor esta afirmacin, supongamos que hicimos un programa de 1000 lneas hace un par de meses y ahora necesitamos hacer algunas modificaciones. Ahora hemos olvidado gran parte de los detalles de la lgica de este programa y ya no es sencillo determinar si un puntero referencia un objeto que todava existe, o si ya fue liberado. Peor an, suponga que el programa fue hecho por otra persona y evale cuan probable es cometer errores de memoria al tratar de modificar ese programa. Ahora volvamos al caso de un programa de 100000 lneas. Este tipo de programas los desarrolla un grupo de programadores que pueden tomar aos en terminarlo. Cada programador desarrolla un mdulo que eventualmente utiliza objetos de otros mdulos desarrollados por otros programadores. Quin libera la memoria de estos objetos? Cmo se 8

Ing. Joel Gonzlez Estrada

Diplomado Java Servlets ponen de acuerdo los programadores sobre cundo y quin libera un objeto compartido? Como probar el programa completo ante las infinitas condiciones de borde que pueden existir en un programa de 100000 lneas? Es inevitable que la fase de prueba dejar pasar errores en el manejo de memoria que slo sern detectados ms tarde por el usuario final. Probablemente se incorporan otros errores en la fase de mantencin. Se puede concluir: Todo programa de 100000 lneas que libera explcitamente la memoria tiene errores latentes. Sin un recolector de basuras no hay verdadera modularidad. Un recolector de basuras resuelve todos los problemas de manejo de memoria en forma trivial. La pregunta es: Cul es el impacto de un recolector de basura en el desempeo de un programa? El sobrecosto de la recoleccin de basuras no es superior al 100%. Es decir si se tiene un programa que libera explcitamente la memoria y que toma tiempo X, el mismo programa modificado de modo que utilice un recolector de basuras para liberar la memoria tomar un tiempo no superior a 2X. Este sobrecosto no es importante si se considera el peridico incremento en la velocidad de los procesadores. El impacto que un recolector de basura en el tiempo de desarrollo y en la confiabilidad del software resultante es muchos ms importante que la prdida en eficiencia.

Programacin Orientada a Objetos


La programacin orientada a objetos (POO) se distingue por pensar en los problemas y sus soluciones a travs de la implementacin de objetos y sus comportamientos. Las caractersticas fundamentales de la Programacin Orientada a objetos son: abstraccin, encapsulamiento, herencia y polimorfismo. Abstraccin. Por medio de la abstraccin se consigue no detenerse en los detalles concretos de implementacin en cada momento, sino generalizar y centrarse en los aspectos que permiten tener una visin del problema. Encapsulamiento. Permite ver un objeto como una caja negra en la que se ha introducido de alguna manera tosa la informacin relacionada con dicho objeto. Ing. Joel Gonzlez Estrada 9

Diplomado Java Servlets Esto permite manipular los objetos como permaneciendo ocultar su estructura interna. unidades bsicas,

Herencia. Permite el acceso automtico a la informacin contenida en otras clases. De esta forma, la reutilizacin de cdigo est garantizada. Con la herencia todas las clases estn clasificadas en una jerarqua estricta. Polimorfismo. Esta caracterstica permite implementar a una variedad de mtodos (todos con el mismo nombre), utilizando el mismo medio de acceso. Constructores y destructores. Un constructor es un procedimiento especial de una clase que es llamada automticamente siempre que crea un objeto de esa clase. Su funcin es iniciar esa clase. Un destructor es un procedimiento especial de una clase que es llamado automticamente siempre que se destruye una de esta clase. Su funcin es realizar cualquier tarea final en el momento de destruir cualquier objeto.

Mecanismos bsicos de la POO


Los mecanismos (trminos) )bsicos son: objetos, mensajes, mtodos y clases. Objetos Un programa orientado a objetos se compone nicamente de objetos, es decir, un objeto es una entidad que tiene atributos particulares (propiedades), y una forma de operar sobre de ellos es como los mtodos (el comportamiento). Por ejemplo. Una ventana de Windows es un objeto. El color de fondo, la anchura, la altura, etc. son propiedades. Las rutinas que permiten maximizar, minimizar, etc. son los mtodos. Mtodos Un mtodo se implementa en una clase de objetos y determina como tiene que actuar el objeto cuando recibe el mensaje vinculado con ese mtodo. La estructura mas interna del objeto se oculta a los usuarios que lo vayan a utilizar, manteniendo como nica conexin con el exterior, los mensajes.

Ing. Joel Gonzlez Estrada

10

Diplomado Java Servlets Clase Una clase es una platilla genrica para un conjunto de objetos con caractersticas similares.

Resumen
Java es un lenguaje que ha sido diseado para producir software: Confiable: Minimiza los errores que se escapan a la fase de prueba. Multiplataforma: Los mismos binarios funcionan correctamente en Windows/95 y /NT, Unix/Motif y Power/Mac. Seguro: Applets recuperados por medio de la red no pueden causar dao a los usuarios. Orientado a objetos: Beneficioso tanto para el proveedor de bibliotecas de clases como para el programador de aplicaciones. Robusto: Los errores se detectan en el momento de producirse, lo que facilita la depuracin.

Ing. Joel Gonzlez Estrada

11

Diplomado Java Servlets

Diplomado Java Servlets


2. Programando Java
Al final del capitulo el alumno ser capaz de... Crear aplicaciones y Applets en Java, compilacin y ejecucin. Comprender y utilizar los fundamentos de Java: variables y tipo de datos, expresiones y operadores. Construccin y manejo de clases, objetos y mtodos Utilizar las estructuras: arreglos, condicionales y ciclos. Crear Applets y entender los principios de su funcionamiento. Utilizar las primitivas de grficos de Java y uso de imgenes Uso de los componentes de la interfaz de Usuario. Comprueba tu avance y marca con una los objetivos alcanzados.

Ing. Joel Gonzlez Estrada

12

Diplomado Java Servlets

Programando JAVA
El compilador y el intrprete de Java
El ambiente de desarrollo tiene dos partes: Un compilador y un intrprete. El compilador Java toma el programa fuente y, en vez de generar cdigo de maquina para archivos fuentes, genera un cdigo de bytes. Los cdigos de bytes son instrucciones muy similares al cdigo de maquina solo que no son especficos para un procesador en particular. Se corre un programa llamado interprete de cdigo de bytes tomando el archivo en formato de cdigo de bytes y lo ejecuta.. A este interprete se le conoce como maquina virtual de Java o interprete de tiempo de ejecucin Java.
Interprete de Java (Pentium)

Cdigo de bytes de Java (Independencia de plataforma) Cdigo Java

Interprete de Java (Power PC) Compilador Java Interprete de Java (Unix)

Compilacin de programa JAVA

Estructura de un programa bsico en java


Al desarrollar una aplicacin en java la sintaxis bsica es: import <paquete>; puclic class <nombre_clase> [throws <exception>] { public static void main(String arg[]) [throws <exception>] { <instrucciones> } }

Ing. Joel Gonzlez Estrada

13

Diplomado Java Servlets Tu Primera Aplicacin de Java en Windows Tu primer programa, HolaMundo, simplemente mostrar el saludo "Hello world!". Para crear este programa, debers. Para escribir tu primer programa, necesitars. 1. El ambiente de desarrollo estndar de la Plataforma Java 2. 2. Un Editor de texto. En este ejemplo, usaremos el Bloc de notas. Crear un fichero fuente Java. Un fichero fuente contiene texto, escrito en el lenguaje de programacin Java, que tu y otros programadores pueden entender. Se puede usar cualquier editor de texto para crear y editar ficheros fuente. Guarde el archivo HolaMundo.java en la carpeta donde esta instalado JDK dentro del directorio BIN (Ejemplo: c:\jdk1.2.2\bin). /* Programa: Mensaje de Hola Mundo. Profesor: Lic. Fernando Romn Vega. */ class HolaMundo { public static void main (String args[]) { System.out.println("Hello Mundo!"); } }
NOTA: Al momento de asignar nombre al archivo se debe seguir una regla muy importante: La lnea en el cdigo es el nombre de nuestra clase class HolaMundo { por lo tanto el archivo se nombrara HolaMundo.java

Compilar el fichero fuente en un fichero de bytecodes. El compilador de Java, javac, toma nuestro fichero fuente y lo traduce en instrucciones que la Mquina Virtual Java (Java VM) puede entender. El compilar pone estas instrucciones en un fichero de bytecodes. Desde la lnea de comando del MS-DOS realice lo que se muestra en la siguiente ventana. Microsoft Windows 2000 [Versin 5.00.2195] (C) Copyright 1985-1999 Microsoft Corp. C:\>cd jdk1.2.2 C:\jdk1.2.2>cd bin C:\jdk1.2.2\bin>javac HolaMundo.java Con ello se genera un archivo HolaMundo.class cuando al compilar no se genera algn error. Ing. Joel Gonzlez Estrada 14

Diplomado Java Servlets Ejecutar le programa contenido en el fichero de bytecodes. La mquina virtual Java est implementada por un intrprete Java, java. Este intrprete toma nuestro fichero de bytecodes y lleva a cabo las instrucciones traducindolas a instrucciones que nuestro ordenador pude entender. C:\jdk1.2.2\bin>java HolaMundo Hello Mundo! C:\jdk1.2.2\bin> Crear tu Primer Applet Ahora crears un applet Java, llamado HelloWorld, que tambin muestra el salido "Hello world!". Sin embargo, al contrario que HolaMundo, el applet se ejecuta sobre un navegador compatible con Java, como HotJava, Netscape Navigator, o Microsoft Internet Explorer. Para crear este applet, debes realizar los mismos pasos bsicos que antes: crear un archivo fuente Java; compilarlo y ejecutar el programa. Crear un Archivo Fuente Java. 1. Abrir NotePad y teclea el siguiente cdigo en un nuevo documento. Graba este cdigo como HelloWorld.java. /* Programa Esta clase es una implementacin de un applet que simplemente despliega el mensaje Hola mundo. Profesor: Fernando Romn Vega */ import java.applet.*; import java.awt.*; public class HelloWorld extends Applet { public void paint(Graphics g) { g.drawString("Hello world!", 50, 25); } }

Ing. Joel Gonzlez Estrada

15

Diplomado Java Servlets 2. Tambin necesitas un Archivo HTML que acompae a al applet. Teclea el siguiente cdigo en nuevo documento del NotePad. Graba este cdigo como holamundo.html.
<html> <head> <title>mostrar applet hola mundo</title> </head> <body bgcolor="#ffffff" text="#000000" link="#ff0000" vlink="#800000" alink="#ff00ff" background="?"> Este es mi primer applet.<br> <applet code="helloworld.class" width=180 height=35> </applet> </body> </html>

3. Compilar el Cdigo Fuente. En el prompt de MS-DOS: javac HelloWorld.java El compilador debera generar el fichero de bytecodes Java, HelloWorld.class. 4. Ejecutar el Programa. Abrir el archivo holamundo.html Aunque puedes ver tu applet usando un navegado, podras encontrar ms sencillo probarlos usando la aplicacin appletviewer que viene con la plataforma Java . Para ver el applet HelloWorld usando el appletviewer, teclea esto en la lnea de comandos. Appletviewer holamundo.html

Variables y Tipos
Una variable en Java es un identificador que representa una palabra de memoria que contiene informacin. El tipo de informacin almacenado en una variable slo puede ser del tipo con que se declar esa variable. Una variable se declara usando la misma sintaxis de C. Por ejemplo la siguiente tabla indica una declaracin, el nombre de la variable introducida y el tipo de informacin que almacena la variable: Declaracin Ing. Joel Gonzlez Estrada identificador tipo 16

Diplomado Java Servlets int i; String s; int a[ ]; int[ ] b; i s a b Entero referencia a string referencia a arreglo de enteros referencia a arreglo de enteros

public static void main()String arg[]) { ... int M edad; String titulo; Boolean EsMayor; ... } Se puede encadenar varios de nombres de variables, que sean del mismo tipo, en una sola lnea: int x,y,z; String nombre, apellido; Los nombres de las variables pueden comenzar por una letra un guin bajo o un signo de pesos ($) y despus del primer carcter puede llevar cualquier letra, numero o smbolo Java posee dos grandes categoras de tipos para las variables: Tipos Primitivos char, boolean float, double referencias a Objetos Arreglos otros objetos

int, short, byte, long Strings

Las variables de tipos primitivos almacenan directamente un valor que siempre pertenece al rango de ese tipo. Por ejemplo una variable int almacena un valor entero como 1, 2, 0, -1, etc. Esto significa que al asignar una variable entera a otra variable entera, se copia el valor de la primera en el espacio que ocupa la segunda variable. Las variables de tipo referencia a objetos en cambio almacenan direcciones y no valores directamente. Una referencia a un objeto es la direccin de un rea en memoria destinada a representar ese objeto. El rea de memoria se solicita con el operador new. Ing. Joel Gonzlez Estrada 17

Diplomado Java Servlets

Al asignar una variable de tipo referencia a objeto a otra variable se asigna la direccin y no el objeto referenciado por esa direccin. Esto significa que ambas variables quedan refenciando el mismo objeto. La diferencia entre ambas asignaciones se observa en la siguiente figura:

Esto tiene implicancias mayores ya que si se modifica el objeto referenciado por r, entonces tambin se modifica el objeto referenciado por s, puesto que son el mismo objeto. En Java una variable no puede almacenar directamente un objeto, como ocurre en C y C++. Por lo tanto cuando se dice en Java que una variable es un string, lo que se quiere decir en realidad es que la variable es una referencia a un string.

Tipos primitivos
En la siguiente tabla se indica para cada tipo primitivo el nmero de bits que se emplea en su representacin y el rango de valores que se puede almacenar en las variables de estos tipos. Tipo int short byte long Bits Rango 32 16 8 64 Ejemplos

-2**31 .. 2**31-1 0, 1, 5, -120, ... -2**15 .. 2**15-1 0, 1, 5, -120, ... -2**7 .. 2**7-1 n/a 0, 1, 5, -120, ... false, true -2**63 .. 2**63-1 0, 1, 5, -120, ...

boolean 1

Ing. Joel Gonzlez Estrada

18

Diplomado Java Servlets char float double 16 32 64 n/a IEEE IEEE 'a', 'A', '0', '*', ... 1.2 1.2

Se dice que un tipo A es de mayor rango que un tipo B si A es un superconjunto de B. Esto quiere decir que las variables de tipo B siempre se pueden asignar a variables de tipo A (eventualmente con prdida de significancia). Por ejemplo int es de mayor rango que short, que a su vez es de mayor rango que byte. Float y double son de mayor rango que int. Double es de mayor rango que float. Esto se puede resumir en: double > float > long > int > short > byte

Expresiones y operadores
En Java cada expresin tiene un tipo que se determina durante la compilacin, es decir es independiente del valor durante la ejecucin. Una expresin puede ser: Una constante: 1, 1.0, true, etc. El tipo de esta expresin es el tipo de la constante. En el ejemplo los tipos son int, double y boolean respectivamente. Una variable: i, s, a El tipo de esta expresin es el tipo con que se declar aquella variable. En el ejemplo los tipos son entero, referencia a string y referencia a arreglo. El resultado de una operacin: i+1, a[1], etc.

El tipo se determina en funcin de los tipos de las expresiones que se indican como argumentos de la operacin. Java tiene prcticamente los mismos operadores de C y C++. Cada operador acepta una, dos o tres expresiones de diversos tipos. A veces un operador no est definido para argumentos de ciertos tipos. Por ejemplo la resta entre strings no esta definida. Pero la suma de strings esta definida como la concatenacin. A continuacin veremos los operadores ms frecuentes en Java. El operador es un smbolo especial que por lo comn se utiliza con expresiones.

Ing. Joel Gonzlez Estrada

19

Diplomado Java Servlets Aritmtica Java tiene 5 operadores para la aritmtica bsica como se muestra en la tabla siguiente.

Smbolo + * / %

Operacin Suma Resta

Ejemplo 3+4 57

Multiplicacin 5 * 5 Divisin Resto 14 / 7 20 % 7

Ejemplo : El siguiente cdigo realiza operaciones aritmticas. class Aritmetica { public static void main (String args[]) { short x = 6; int y = 4; float a = 12.5f; float b = 7f; System.out.println("x es " + x + ", y es " + y); System.out.println("x + y = " + (x + y)); System.out.println("x - y = " + (x - y)); System.out.println("x / y = " + (x / y)); System.out.println("x % y = " + (x % y)); System.out.println("a es " + a + ", b es " + b); System.out.println("a / b = " + (a / b)); } } Operadores de asignacin Puedes utilizar el operador de asignacin =, para asignar un valor a otro. Adems del operador de asignacin bsico, Java proporciona varios operadores de asignacin que permiten realizar operaciones aritmticas, lgicas o de bits y una operacin de asignacin al mismo tiempo. Especficamente, supn que quieres aadir un nmero a una variable y asignar el resultado dentro de la misma variable, como esto: i = i + 2; Ing. Joel Gonzlez Estrada 20

Diplomado Java Servlets Puedes ordenar esta sentencia utilizando el operador +=. i += 2; Las dos lneas de cdigo anteriores son equivalentes. Esta tabla lista los operadores de asignacin y sus equivalentes. Operador += -= *= /= %= &= |= ^= &lt;&lt;= &gt;&gt;= &gt;&gt;&gt;= Uso Equivale a op1 += op2 op1 = op1 + op2 op1 -= op2 op1 = op1 - op2 op1 *= op2 op1 = op1 * op2 op1 /= op2 op1 = op1 / op2 op1 %= op2 op1 = op1 % op2 op1 &= op2 op1 = op1 & op2 op1 |= op2 op1 = op1 | op2 op1 ^= op2 op1 = op1 ^ op2 op1 &lt;&lt;= op2 op1 = op1 &lt;&lt; op2 op1 &gt;&gt;= op2 op1 = op1 &gt&gt; op2 op1 &gt;&gt;&gt;= op1 = op1 &gt;&gt;&gt; op2 op2

Los operandos y el resultado de estos operadores pueden ser: Dominio int*int long*long float*float double*double Rango int long float double

Al operar con byte y short, estos se convierten implcitamente a int. Cuando los tipos de los operandos no coinciden, el operando de menor rango se convierte implcitamente al tipo de mayor rango. El resultado de la operacin es del tipo de mayor rango.

Ejemplos: int a=1, b=2; int c= a + b; short s= 1; int d= s + c; // s se convierte a int 21

Ing. Joel Gonzlez Estrada

Diplomado Java Servlets

float f= 1.0 + a; // a se convierte a float

Operadores unarios sobre expresiones numricas Smbolo + exp - exp Operacin nada Argumento int | long | float | double

cambio de signo int | long | float | double

El resultado de estas operaciones es siempre del mismo tipo del operando. Si el operando es byte o short entonces se convierte a int, se realiza la operacin y el resultado es un int.

Incremento y decrementos
Los operadore ++ y se utilizan para aumentar o disminuir el valor de una variable. Por ejemplo el valor de var++ incrementa en 1, var decrementa el valor de var en 1 (A diferencia de C y C++, java permite que var sea de punto flotante) Smbolo ++ var -- var var ++ var -Operacin preincremento predecremento postincremento Argumento int | short | byte | long int | short | byte | long int | short | byte | long

postdecremento int | short | byte | long

El resultado de estas operaciones es siempre del mismo tipo del operando. Ejemplos: int a=1, b=2; int c= +a; int d= -(c+1); b= a++; // b= 1, a=2 a= --b; // a=b= 0 (a+1)++; // error a+1 no es una variable float f= a; 22

Ing. Joel Gonzlez Estrada

Diplomado Java Servlets f++; // error f no es entero

Operadores de comparaciones Java tiene varias expresiones para evaluar la igualdad y la magnitud. Todas estas expresiones devuelven un valor booleano (true o false). Smbolo > < >= <= == != Operacin mayor menor mayor igual menor igual igual distinto

Frecuentemente los operadores relacionales se utilizan con otro juego de operadores, los operadores condicionales, para construir expresiones de decisin ms complejas. Uno de estos operadores es && que realiza la operacin Y booleana . Por ejemplo puedes utilizar dos operadores relacionales diferentes junto con && para determinar si ambas relaciones son ciertas. La siguiente lnea de cdigo utiliza esta tcnica para determinar si un indice de un array est entre dos lmites- esto es, para determinar si el indice es mayor que 0 o menor que NUM_ENTRIES (que se ha definido previamente como un valor constante): 0 &lt; index && index &lt NUM_ENTRIES Observa que en algunas situaciones, el segundo operando de un operador relacional no ser evaluado. Consideremos esta sentencia: ((count &gt; NUM_ENTRIES) && (System.in.read() != -1)) Si count es menor que NUM_ENTRIES, la parte izquierda del operando de && evala a false. El operador && slo devuelve true si los dos operandos son verdaderos. Por eso, en esta situacin se puede determinar el valor de && sin evaluar el operador de la derecha. En un caso como este, Java no evala el operando de la derecha. As no se llamar a System.in.read() y no se leer un carcter de la entrada estandard. Aqu tienes tres operadores condicionales. Operador Uso Devuelve true si && op1 && op2 op1 y op2 son verdaderos Ing. Joel Gonzlez Estrada 23

Diplomado Java Servlets || ! op1 || op2 ! op uno de los dos es verdadero op es falso

Los operandos y el resultado de estos operadores pueden ser: Dominio int*int long*long float*float double*double Rango boolean boolean boolean boolean

Operadores entre valores booleanos (operadores lgicos) Operacin Significado

exp && exp y-lgico exp || exp ! exp o-lgico negacin

Los operandos y el resultado de estos operadores son siempre booleanos. Los operadores && y || evalan la expresin del lado derecho slo si es necesario. Ejemplos: int a=1, b=2; boolean v= ! a<=b && a==5 || b!=4; boolean w= ((! a<=b) && a==5) || b!=4; boolean w2= a<=b && a; // error a no es boolean Aritmtica de Cadenas Una expresin especial en java es el uso del operador suma (+)para crear y conectar cadenas. nombre = Fernando nombre = nombre + Roman Vega

Ing. Joel Gonzlez Estrada

24

Diplomado Java Servlets

Conversiones: cast Java realiza conversiones implcitas de menor a mayor rango. Eventualmente hay prdida de significacia al convertir enteros a punto flotante. Todas las conversiones de mayor a menor rango deben ser explcitas por medio del operador de cast: (tipo)expresin Ejemplos: int i= 1; short s= 2; int j= i+s; s= a; // error short < int s= (short)a; // Ok i= 1.0; // error int < double i= (int)1.0; // Ok f= 1.0; // error float < double f= (float)1.0; // Ok f= 1.0f; // Ok boolean v=(boolean)a; // error no existe conversin Precedencia de Operadores La procedencia de operadores determina el orden en el cual se evalan las expresiones, esta procedencia, en algunos casos, puede determinar el resultado general de la expresin. Operador . () [] unarios: - + (cast) */% +< > <= >= == != ! || &&

Declaracin de variables
Declarar Variables Java Ing. Joel Gonzlez Estrada 25

Diplomado Java Servlets Como mnimo, una declaracin de variable miembro tiene dos componentes: el tipo de dato y el nombre de la variable. tipo nombreVariable; Una declaracin mnima de variable miembro es como la declaracin de variables que se escribe en cualquier otro lugar de un programa Java, como las variables locales o los parmetros de los mtodos. El siguiente cdigo declara una variable miembro entera llamada unEntero dentro de la clase ClaseEnteros. class ClaseEnteros { int unEntero; ... // define los mtodos aqu ... } Observa que la declaracin de variables miembro aparece dentro de la implementacin del cuerpo de la clase pero no dentro de un mtodo. Este posicionamiento dentro del cuerpo de la clase determina que una variable es una variable miembro. Al igual que otras variables en Java, las variables miembro deben tener un tipo. Un tipo de variable determina los valores que pueden ser asignados a las variables y las operaciones que se pueden realizar con ellas. No se puede declarar ms de una variable con el mismo nombre en la misma clase. Por ejemplo, el siguiente cdigo es legal. class ClaseEnteros { int unEntero; int unEntero() { // un mtodo con el mismo nombre que una variable ... } } Junto con el nombre y el tipo, se pueden especificar varios atributos para las variables miembro cuando se las declara: incluyendo si los objetos pueden acceder a la variable, si la variable es una variable de clase o una variable de ejemplar, y si la variable es una constante. Una declaracin de variable se podra parecer a esto. [especificadordeAcceso] [static] [final] [transient] [volatile] tipo nombredeVaraible Una declaracin de variable miembro define los siguientes aspectos de la variable.

Ing. Joel Gonzlez Estrada

26

Diplomado Java Servlets especificadordeAcceso define si otras clases tienen acceso a la variable. Se puede controlar el acceso a los mtodos utilizando los mismos especificadores, por eso Controlar el Acceso a Variables Miembro de una Clase cubre cmo se puede controlar el acceso a las variables miembro o los mtodos. static indica que la variable es una variable miembro de la clase en oposicin a una variable miembro del ejemplar. Se puede utilizar static para declarar mtodos de clase. Miembros de Clase y de Ejemplar explica la declaracin de variables de clase y de ejemplar y escribir mtodos de ejemplar o de clase. final indica que la variable es una constante transient la variable no es una parte persistente del estado del objeto volatile significa que la variable es modificada de forma asncrona.

Declarar Constantes Para crear una variable miembro constante en Java se debe utilizar la palabra clave final en su declaracin de variable. La siguiente declaracin define una constante llamada AVOGADRO cuyo valor es el nmero de Avogadro (6.023 x 10^23) y no puede ser cambiado. class Avo { final double AVOGADRO = 6.023e23; } Por convencin, los nombres de los valores constantes se escriben completamente en maysculas. Si un programa intenta cambiar una variable, el compilador muestra un mensaje de error. Declarar Variables Transitorias Por defecto, las variables miembro son una parte persistente del estado de un objeto, Las variables que forman parte persistente del estado del objeto deben guardarse cuando el objeto se archiva. Se puede utilizar la palabra clave transient para indicar a la mquina virtual Java que la variable indicada no es una parte persistente del objeto. Al igual que otros modificadores de variables en el sistema Java, se puede utilizar transient en una clase o declaracin de variable de ejemplar como esta. class TransientExample { transient int hobo; ... } Este ejemplo declara una variable entera llamada hobo que no es una parte persistente del estado de la claseTransientExample. Declarar Variables Voltiles 27

Ing. Joel Gonzlez Estrada

Diplomado Java Servlets Si una clase contiene una variable miembro que es modificada de forma asncrona, mediante la ejecucin de threads concurrentes, se puede utilizar la palabra clave volatile de Java para notificar esto al sistema Java. La siguiente declaracin de variable es un ejemplo de como declarar que una variable va a ser modificada de forma asncrona por threads concurrentes. class VolatileExample { volatile int contador; ... }

Arreglos, condicionales y ciclos.


Muchas de las cosas interesantes de Java y en cualquier otro lenguaje de programacin aparecen cuando tienen arreglos para almacenar valores y estructuras de control de flujo (ciclos y condicionales) para ejecutar diferentes partes de un programa con base en pruebas. Arreglos. Los arreglos es una coleccin de elementos. En cada posicin en el arreglo puede contener un objeto o un valor privitivo. En Java los arreglos son objetos y pueden ser tratados como cualquier otro objeto del lenguaje. Declarar variables de tipo arreglo. Primeramente se debe de declarar una variable para guardar el arreglo. A continuacin se presenta variables de tipo arreglo validos. String nombres[]; int edades[] float estaturas[] Un mtodo alternativo de declaracin es colocar los corchetes despus del tipo, no despus de la variable. String[] nombres; int[] edades; float[] estaturas; Arreglos de objetos El segundo paso es crear un arreglo de objetos tipo y asignarlo a esa variable. Hay dos formas de hacerlo. Utilizar new String[] names; 28

Ing. Joel Gonzlez Estrada

Diplomado Java Servlets names = new String[10]; // crea un arreglo de objeto tipo cadena de 10 posiciones. Iniciar de manera directa el contenido del arreglo. Los elementos al ser inicializados se encierran entre llaves ({}). float estaturas = {1.56, 1.54, 1.64, 1,76}

Acceder a los elementos del arreglo Una vez que tenga el arreglo con valores inicializados para obtener el valor almacenado de un arreglo utilice la expresin: nombre_arreglo[subindice] estaturas[2]; estaturas[0]; el subndice inicia desde la posicin 0. Cambiar los valores de un arreglo Para asignar a una posicin del arreglo en particular, ponga una instruccin de asignacin despus de la expresin de acceso al arreglo. estaturas[0]=1.78; nombres[3]=Fernando Roman En la siguiente aplicacin se ejemplifica como crear, inicializar , modificar y examinar partes de un arreglo.
class ArrayTest { String[] firstNames = { "Dennis", "Grace", "Bjarne", "James" }; String[] lastNames = new String[firstNames.length]; void printNames() { int i = 0; System.out.println(firstNames[i] + " " + lastNames[i]); i++; System.out.println(firstNames[i] + " " + lastNames[i]); i++; System.out.println(firstNames[i] + " " + lastNames[i]); i++; System.out.println(firstNames[i] + " " + lastNames[i]); } public static void main (String args[]) { ArrayTest a = new ArrayTest();

Ing. Joel Gonzlez Estrada

29

Diplomado Java Servlets


a.printNames(); System.out.println("----------"); a.lastNames[0] = "Ritchie"; a.lastNames[1] = "Hopper"; a.lastNames[2] = "Stroustrup"; a.lastNames[3] = "Gosling"; a.printNames(); } }

Condicionales Los bloques de instrucciones es un grupo de instrucciones agrupadas entre llaves ({}). El bloque crea un nuevo espacio donde puede utilizar y crear variables locales dentro del bloque las cuales dejaran de existir cuando se termine de ejecutar ese bloque. void bloque { int x=0; { //inicio del bloque int y = 50; Sistem.out,print(dentro del bloque: x= +x+ y= +y); } // fin del bloque } Condicionales if Este tipo de condicin se utiliza cuando se desea ejecutar diferentes partes del cdigo con base en una simple prueba. if <condicin> { <instrucciones...> } la palabra reservada else ejecuta una instruccin alternativa si la condicin es false. If <condicin> { <instrucciones...> } else { <instrucciones...> }

Ing. Joel Gonzlez Estrada

30

Diplomado Java Servlets Ejercicio: se muestra un ejemplo sencillo de una forma de aplicacin completa. La case Peeper contiene un mtodo llamado peepMe(), el cual verifica si el valor es par. Si lo es imprime Peep! En pantalla. class Peeper { void peepMe(int val) { System.out.println("Value is " + val + ". "); if (val % 2 == 0) System.out.println("Peep!"); } public static void main (String args[]) { Peeper p = new Peeper(); p.peepMe(1); p.peepMe(2); p.peepMe(54); p.peepMe(77); p.peepMe(1346); } } El operador condicional El operador condicional es una expresin, lo cual significa que regresa un valor. Este operador es mas util para condicionales muy cortas o sencillas y tiene la siguiente sintaxis. prueba ? resultado_verdadero : resultado_falso prueba es una condicin booleana, si el resultado es verdadero realiza las instrucciones que se encuentren entre el signo de interrogacin (?) y los dos puntos (:). De lo contrario si el resultado de prueba es falso solo se ejecutan las instrucciones despus de los dos puntos (:). Ejemplo: Boolean = valor; Valor = a < z ? a : z Condicionales switch Muchos de los lenguajes tienen una versin corta de los if anidados ms fcil de leer y le permiten agrupar las condiciones y las acciones. En java se utiliza las instruccin switch y comporta como en C.

Ing. Joel Gonzlez Estrada

31

Diplomado Java Servlets Una limitacin significativa es esta instruccin en Java es que las pruebas y los valores solo pueden ser tipos primitivos, no pueden ser tipos primitivos mas grandes (long, float), cadenas u otros objetos dentro de un switch; tampoco puede probar otra relaciones la de igualdad. Los if anidados pueden funcionar para cualquier tipo de prueba en cualquier tipo de datos. switch (test) { case valor1: <instrucciones...>; break; case valor2: <instrucciones...>; break; case valor3: <instrucciones...>; break; ....... default resultado_defaul; } Las instruccin switch, test es comparada con cada uno de los valores del caso (case: valor:) en orden, si se encuentra alguna coincidencia las instrucciones se ejecutan solo las de ese caso. A continuacin se presenta una aplicacin en la cual se pasa un valor entero al mtodo convertNum() y este lo interpreta como en letra, para ser mostrado en letra el numero.
class NumberReader { String convertNum(int val) { switch (val) { case 0: return "zero "; case 1: return "one "; case 2: return "two "; case 3: return "three "; case 4: return "four "; case 5: return "five "; case 6: return "six "; case 7: return "seven "; case 8: return "eight "; case 9: return "nine "; default: return " "; } } public static void main (String args[]) { NumberReader n = new NumberReader(); String num = n.convertNum(4) + n.convertNum(1) n.convertNum(5); +

Ing. Joel Gonzlez Estrada

32

Diplomado Java Servlets


System.out.println("415 converts to " + num); } }

Ciclos Ciclo for El ciclo repite un bloque de instrucciones o una instruccin, hasta que una condicin se cumpla. Los ciclos for frecuentemente se utilizan para interacciones sencillas donde se repite las instrucciones un cierto numero de veces y despus se detiene. Sintaxis: for (inicializacin; condicin; incremento) { <instrucciones...> } inicializacin: Se inicia una variable que determinara el inicio del ciclo. incremento: incrementar la variable de inicializacin que ayudara hacer el numero de veces de repeticin. Tomando el ejemplo del arreglos se modifica para desplegar los nombres completos por medio del ciclo for.
class NamesLoop { String[] firstNames = { "Dennis", "Grace", "Bjarne", "James" }; String[] lastNames = new String[firstNames.length]; void printNames() { for (int i = 0; i < firstNames.length; i++) System.out.println(firstNames[i] + " " + lastNames[i]); } public static void main (String args[]) { ArrayTest a = new ArrayTest(); a.printNames(); System.out.println("----------"); a.lastNames[0] = "Ritchie"; a.lastNames[1] = "Hopper"; a.lastNames[2] = "Stroustrup"; a.lastNames[3] = "Gosling"; a.printNames(); } }

Ing. Joel Gonzlez Estrada

33

Diplomado Java Servlets

Ciclo while...do Este tipo de ciclo se repite un bloque de instrucciones, mientras alguna condicin sea verdadera. Su sintaxis es. while (condicin) { <instrucciones...> } si la condiciones verdadera el ciclo while se ejecuta y despus prueba la condicin de nuevo para verificar si es verdadera y volver a ejecutarse, repitindola hasta que sea falsa. Igual como en el ciclo for tambin puede emplear instrucciones individuales en lugar de bloques. Ejemplo: Copiar los elementos de un arreglo de enteros a un arreglo de valores de punto flotante, convirtiendo cada elemento mediante casting a punto flotante. El ciclo terminara inmediatamente si alguno de los elementos del primer arreglo es 0.
class CopyArrayWhile { public static void main (String args[]) { int[] array1 = { 5, 7, 3, 6, 0, 3, 2, 1 }; float[] array2 = new float[array1.length]; System.out.print("array1: [ "); for (int i = 0; i < array1.length; i++) { System.out.print(array1[i] + " "); } System.out.println("]"); System.out.print("array2: [ "); int count = 0; while ( count < array1.length && array1[count] != 0) { array2[count] = (float) array1[count]; System.out.print(array2[count++] + " "); } System.out.println("]"); } }

Ciclo do...while El ciclo do es como el ciclo while, excepto que do ejecuta una instruccin(es) hasta que la condicin sea falsa. La principal diferencia ente ambos consiste en que while prueba la condicin antes de entrar. Los ciclos do entrar por lo menos una vez antes de probar la condicin. Su sintaxis es. 34

Ing. Joel Gonzlez Estrada

Diplomado Java Servlets

do { <instrucciones...> } while (condicin) Para ejemplificar el funcionamiento de este se siglo, el cdigo imprime los valores del 1 al 10.
class DoTest{ public static void main (String args[]) { int x = 1; do { System.out.println("Looping, round " + x); x++; } while (x <= 10); } }

Trabajando con objetos


Crear Objetos en Java En Java, se crea un objeto mediante la creacin de un objeto de una clase o, en otras palabras, ejemplarizando una clase. Aprenders cmo crear una clase ms adelante en Crear Clases. Hasta entonces, los ejemplos contenidos aqu crean objetos a apartir de clases que ya existen en el entorno Java. Frecuentemente, se ver la creacin de un objeto Java con un sentencia como esta. Date hoy = new Date(); Esta sentencia crea un objeto Date (Date es una clase del paquete java,util). Esta sentencia realmente realiza tres acciones: declaracin, ejemplificacin e inicializacin. Date hoy es una declaracin de variable que slo le dice al compilador que el nombre hoy se va a utilizar para referirse a un objeto cuyo tipo es

Ing. Joel Gonzlez Estrada

35

Diplomado Java Servlets Date, el operador new ejemplariza la clase Date (creando un nuevo objeto Date), y Date() inicializa el objeto. Declarar un Objeto Ya que la declaracin de un objeto es una parte innecesaria de la creacin de un objeto, las declaraciones aparecen frecuentemente en la misma lnea que la creacin del objeto. Como cualquier otra declaracin de variable, las declaraciones de objetos pueden aparecer solitarias como esta. Date hoy; De la misma forma, declarar una variable para contener un objeto es exactamente igual que declarar una variable que va a contener un tipo primitivo. Las declaraciones notifican al compilador que se va a utilizar nombre para referirse a una variable cuyo tipo es tipo. Las declaraciones no crean nuevos objetos. Date hoy no crea un objeto Date, slo crea un nombre de variable para contener un objeto Date. Para ejemplarizar la clase Date, o cualquier otra clase, se utiliza el operador new. Ejemplarizar una Clase El operador new ejemplariza una clase mediante la asignacin de memoria para el objeto nuevo de ese tipo. new necesita un slo argumento: una llamada al mtodo constructor. Los mtodos constructores son mtodos especiales proporcionados por cada clase Java que son responsables de la inicializacin de los nuevos objetos de ese tipo. El operador new crea el objeto, el constructor lo inicializa. Aqu tienes un ejemplo del uso del operador new para crear un objeto Rectangle (Rectangle es una clase del paquete java.awt). new Rectangle(0, 0, 100, 200); En el ejemplo, Rectangle(0, 0, 100, 200) es una llamada al constructor de la clase Rectangle. El operador new devuelve una referencia al objeto recin creado. Esta referencia puede ser asignada a una variable del tipo apropiado. Rectangle rect = new Rectangle(0, 0, 100, 200); Inicializar un Objeto Como se menciono anteriormente, las clases proporcionan mtodos constructores para inicializar los nuevos objetos de ese tipo. Una clase podra proporcionar mltiples constructores para realizar diferentes tipos de inicializacin en los nuevos objetos. Cuando veas la implementacin de una clase, reconocers los constructores porque tienen el mismo nombre que la clase y no tienen Ing. Joel Gonzlez Estrada 36

Diplomado Java Servlets tipo de retorno. Recuerda la creacin del objeto Date en el seccin inicial. El constructor utilizado no tena ningn argumento. Date() Un constructor que no tiene ningn argumento, como el mostrado arriba, es conocido como constructor por defecto. Al igual que Date, la mayora de las clases tienen al menos un constructor, el constructor por defecto. Si una clase tiene varios constructores, todos ellos tienen el mismo nombre pero se deben diferenciar en el nmero o el tipo de sus argumentos. Cada constructor inicializa el nuevo objeto de una forma diferente. Junto al constructor por defecto, la clase Date proporciona otro constructor que inicializa el nuevo objeto con un nuevo ao, mes y da. Date cumpleaos = new Date(1963, 8, 30); El compilador puede diferenciar los constructores a travs del tipo y del nmero de sus argumentos. Usar Objetos Java Una vez que se ha creado un objeto, probablemente querrs hacer algo con l. Supn, por ejemplo, que despus de crear un nuevo rectngulo, quieres moverlo a una posicin diferente (es decir, el rectngulo es un objeto en un programa de dibujo y el usuario quiere moverlo a otra posicin de la pgina). La clase Rectangle proporciona dos formas equivalentes de mover el rectngulo. 1. Manipular directamente las variables x e y del objeto. 2. Llamar el mtodo move(). La opcin 2 se considera "ms orientada a objetos" y ms segura porque se manipulan las variables del objeto indirectamente a travs de una capa protectora de mtodos, en vez de manejarlas directamente. Manipular directamente las variables de un objeto se considera propenso a errores; se podra colocar el objeto en un estado de inconsistencia. Referencia a variables de un objeto Primero, enfoquemos cmo inspeccionar y modificar la posicin del rectngulo mediante la manipulacin directa de las variables x e y. La siguiente seccin mostrar como mover el rectngulo llamando al mtodo move(). Para acceder a las variables de un objeto, slo se tiene que aadir el nombre de la variable al del objeto referenciado introduciendo un punto en el medio ('.'). objetoReferenciado.variable

Ing. Joel Gonzlez Estrada

37

Diplomado Java Servlets Supn que tienes un rectngulo llamado rect en tu programa. puedes acceder a las variables x e y con rect.x y rect.y, respectivamente. Ahora que ya tienes un nombre para las variables de rect, puedes utilizar ese nombre en sentencias y expresiones Java como si fueran nombres de variables "normales". As, para mover el rectngulo a una nueva posicin podras escribir. rect.x = 15; // cambia la posicin x rect.y = 37; // cambia la posicin y La clase Rectangle tiene otras dos variables--width y height--que son accesibles para objetos fuera de Rectangle. Se puede utilizar la misma notacin con ellas: rect.width y rect.height. Entonces se puede calcular el rea del rectngulo utilizando esta sentencia. area = rect.height * rect.width; Cuando se accede a una variable a travs de un objeto, se est refiriendo a las variables de un objeto particular. Si cubo fuera tambin un rectngulo con una altura y anchura diferentes de rect, esta instruccin. area = cubo.height * cubo.width; calcula el rea de un rectngulo llamado cubo y dar un resultado diferente que la instruccin anterior (que calculaba el rea de un rectngulo llamado rect). Observa que la primera parte del nombre de una variable de un objeto (el objetoReferenciado en objetoReferenciado.variable) debe ser una referencia a un objeto. Como se puede utilizar un nombre de variable aqu, tambin se puede utilizar en cualquier expresin que devuelva una referencia a un objeto. Recuerda que el operador new devuelve una referencia a un objeto. Por eso, se puede utilizar el valor devuelto por new para acceder a las variables del nuevo objeto. height = new Rectangle().height; Llamar a Mtodos de un Objeto Llamar a un mtodo de un objeto es similar a obtener una variable del objeto. Para llamar a un mtodo del objeto, simplemente se aade al nombre del objeto referenciado el nombre del mtodo, separados por un punto ('.'), y se proporcionan los argumentos del mtodo entre parntesis. Si el mtodo no necesita argumentos, se utilizan los parntesis vacos. objetoReferenciado.nombreMtodo(listaArgumentos); o objetoReferenciado.nombreMtodo(); Veamos que significa esto en trminos de movimiento del rectngulo. Para mover rect a una nueva posicin utilizando el mtodo move() escribe esto. rect.move(15, 37); Ing. Joel Gonzlez Estrada 38

Diplomado Java Servlets

Esta sentencia Java llama al mtodo move() de rect con dos parmetros enteros, 15 y 37. Esta sentencia tiene el efecto de mover el objeto rect igual que se hizo en las sentencias anteriores en las que se moficaban directamente los valores x e y del objeto. rect.x = 15; rect.y = 37; Si se quiere mover un rectngulo diferente, uno llamado cubo, la nueva posicin se podra escribir. cubo.move(244, 47); Como se ha visto en estos ejemplos, las llamadas a mtodos se hacen directamente a un objeto especfico; el objeto especificado en la llamada al mtodo es el que responde a la instruccin. Las llamadas a mtodos tambin se conocen como mensajes. Como en la vida real, los mensajes se deben dirigir a un receptor particular.

El cuerpo de una Clase Java


Anteriormente se vio una descripcin general de la implementacin de una clase. El cuerpo de una clase toma la siguiente estructura. DeclaraciondeClase { CuerpodeClase } El cuerpo de la clase compone la implementacin de la propia clase y contiene dos secciones diferentes: la declaracin de variables y la de mtodos. Una variable miembro de la clase representa un estado de la clase y sus mtodos implementan el comportamiento de la clase. Dentro del cuerpo de la clase se definen todas las variables miembro y los mtodos soportados por la clase. Tpicamente, primero se declaran las variables miembro de la clase y luego se proporcionan las declaraciones e implementaciones de los mtodos, aunque este orden no es necesario. DeclaracindeClase { DeclaracionesdeVariablesMiembros DeclaracionesdeMtodos } Aqu tienes una pequea clase que declara tres variables miembro y un mtodo. class Ticket { Ing. Joel Gonzlez Estrada 39

Diplomado Java Servlets Float precio; String destino; Date fechaSalida; void firma(Float forPrecio, forDestino, Date forFecha) { precio = forPrecio; destino = forDestino; fechaSalida = forFecha; } }

String

Adems de las variables miembro y los mtodos que se declaran explcitamente dentro del cuerpo de la clase, una clase puede heredar algo de su superclase. Por ejemplo, todas las clases del entorno Java son una descendencia (directa o indirecta) de la clase Object. La clase Object define el estado bsico y el comportamiento que todos los objetos deben tener como habilidad para comparar unos objetos con otros, para convertir una cadena, para esperar una condicin variable, para notificar a otros objetos que una condicin variable ha cambiado, etc... As, como descendentes de esta clase, todos los objetos del entorno Java heredan sus comportamientos de la clase Object.

Implementar Mtodos Java


Similarmente a la implementacin de una clase, la implementacin de un mtodo consiste en dos partes, la declaracin y el cuerpo del mtodo. declaracindeMtodo { cuerpodeMtodo } La Declaracin de Mtodo Una declaracin de mtodo proporciona mucha informacin sobre el mtodo al compilador, al sistema en tiempo de ejecucin y a otras clases y objetos. Los nicos elementos necesarios para una declaracin de mtodo son el nombre y el tipo de retorno del mtodo. Por ejemplo, el cdigo siguiente declara un mtodo llamado estaVacio() en la clase Pila que devuelve un valor booleano (true o false). class Pila { ... Ing. Joel Gonzlez Estrada 40

Diplomado Java Servlets boolean estaVacio() { ... } } Devolver un Valor desde un Mtodo Java necesita que un mtodo declare el tipo de dato del valor que devuelve. Si un mtodo no devuelve ningn valor, debe ser declarado para devolver void (nulo). Los mtodos pueden devolver tipos de datos primitivos o tipos de datos de referencia. El mtodo estaVacio() de la clase Pila devuelve un tipo de dato primitivo, un valor booleano. class Pila { static final int PILA_VACIA = -1; Object[] stackelements; int topelement = PILA_VACIA; ... boolean estaVacio() { if (topelement == PILA_VACIA) return true; else return false; } } Sin embargo, el mtodo pop de la clase PILA devuelve un tipo de dato de referencia: un objeto. class Pila { static final int PILA_VACIA = -1; Object[] stackelements; int topelement = PILA_VACIA; ... Object pop() { if (topelement == PILA_VACIA) return null; else { return stackelements[topelement--]; } } } Los mtodos utilizan el operador return para devolver un valor. Todo mtodo que no sea declarado como void debe contener una sentencia return. El tipo de dato del valor devuelto por la sentencia return debe corresponder con el tipo de dato que el mtodo tiene que devolver; no Ing. Joel Gonzlez Estrada 41

Diplomado Java Servlets se puede devolver un objeto desde un mtodo que fue declarado para devolver un entero. Cuando se devuelva un objeto, el tipo de dato del objeto devuelto debe ser una subclase o la clase exacta indicada. Cuando se devuelva un tipo interface, el objeto retornado debe implementar el interface especificado. Un Nombre de Mtodo Un nombre de mtodo puede ser cualquier indentificador legal en Java. Existen tres casos especiales a tener en cuenta con los nombres de mtodos. 1. Java soporta la sobrecarga de mtodos, por eso varios mtodos pueden compartir el mismo nombre. Por ejemplo, supon que se ha escrito una clase que puede proporcionar varios tipos de datos (cadenas, enteros, etc...) en un rea de dibujo. Se podra escribir un mtodo que supiera como tratar a cada tipo de dato. En otros lenguajes, se tendra que pensar un nombre distinto para cada uno de los mtodos. dibujaCadena(), dibujaEntero, etc... En Java, se puede utilizar el mismo nombre para todos los mtodos pasndole un tipo de parmetro diferente a cada uno de los mtodos. Entonces en la clase de dibujo, se podrn declarar tres mtodos llamados draw() y que cada uno aceptara un tipo de parmetro diferente. class DibujodeDatos { void draw(String s) { ... } void draw(int i) { ... } void draw(float f) { ... } } Nota: La informacin que hay dentro de los parntesis de la declaracin son los argumentos del mtodo. Los argumentos se cubren en la siguiente pgina: Pasar Informacin a un Mtodo. Los mtodos son diferenciados por el compilador basndose en el nmero y tipo de sus argumentos. As draw(String s)y draw(int i) son mtodos distintos y nicos. No se puede declarar un mtodo con la misma firma: draw(String s)y draw(String t) son idnticos y darn un error del compilador. Habrs observado que los mtodos sobrecargados deben devolver el mismo tipo de dato, por eso void draw(String s) e int draw(String t)

Ing. Joel Gonzlez Estrada

42

Diplomado Java Servlets declarados en la misma clase producirn un error en tiempo de compilacin. 2. Todo mtodo cuyo nombre sea igual que el de su clase es un constructor y tiene una tarea especial que realizar. Los constructores se utilizan para inicializar un objeto nuevo del tipo de la clase. Los constructores slo pueden ser llamados con el operador new. Para aprender cmo escribir un constructor, puedes ver Escribir un Mtodo Constructor. 3. Una clase puede sobrescribir un mtodo de sus superclases. El mtodo que sobrescribe debe tener el mismo, nombre, tipo de retorno y lista de parmetros que el mtodo al que ha sobrescrito. Sobrescribir Mtodos te ensear como sobrescribir los mtodos de una superclase

Control de acceso los componentes de la Clase


Uno de los benficos de las clases es que pueden proteger sus variables y mtodos miembros frente al acceso de otros objetos. En Java se pueden utilizar los especificadores de acceso para proteger tanto las variables como los mtodos de la clase cuando se declaran. El lenguaje Java soporta cuatro niveles de acceso para las variables y mtodos miembros: private, protected, public, y, todava no especificado, acceso de paquete. La siguiente tabla le muestra los niveles de acceso permitidos por cada especificador. Especificador clase subclase paquete mundo private X protected X X X public X X X X package X X La primera columna indica si la propia clase tiene acceso al miembro definido por el especificador de acceso. La segunda columna indica si las subclases de la clase (sin importar dentro de que paquete se encuentren estas) tienen acceso a los miembros. La tercera columna indica si las clases del mismo paquete que la clase (sin importar su parentesco) tienen acceso a los miembros. La cuarta columna indica si todas las clases tienen acceso a los miembros. Private El nivel de acceso ms restringido es private. Un miembro privado es accesible slo para la clase en la que est definido. Se utiliza este acceso para declarar miembros que slo deben ser utilizados por la clase. Esto incluye las variables que contienen informacin que si se accede a ella 43

Ing. Joel Gonzlez Estrada

Diplomado Java Servlets desde el exterior podra colocar al objeto en un estado de inconsistencia, o los mtodos que llamados desde el exterior pueden poner en peligro el estado del objeto o del programa donde se est ejecutando. Los miembros privados son como secretos, nunca deben contrsele a nadie. Para declarar un miembro privado se utiliza la palabra clave private en su declaracin. La clase siguiente contiene una variable miembro y un mtodo privados. class Alpha { private int soyPrivado; private void metodoPrivado() { System.out.println("metodoPrivado"); } } Los objetos del tipo Alpha pueden inspeccionar y modificar la variable soyPrivado y pueden invocar el mtodo metodoPrivado(), pero los objetos de otros tipos no pueden acceder. Por ejemplo, la clase Beta definida aqu. class Beta { void metodoAccesor() { Alpha a = new Alpha(); a.soyPrivado = 10; // ilegal a.metodoPrivado(); // ilegal } } No puede acceder a la variable soyPrivado ni al mtodo metodoPrivado() de un objeto del tipo Alpha porque Beta no es del tipo Alpha. Protected El siguiente especificador de nivel de acceso es 'protected' que permite a la propia clase, las subclases (con la excepcin a la que nos referimos anteriormente), y todas las clases dentro del mismo paquete que accedan a los miembros. Este nivel de acceso se utiliza cuando es apropiado para una subclase de la clase tener acceso a los miembros, pero no las clases no relacionadas. Los miembros protegidos son como secretos familiares - no importa que toda la familia lo sepa, incluso algunos amigos allegados pero no se quiere que los extraos lo sepan. Para declarar un miembro protegido, se utiliza la palabra clave protected. Public El especificador de acceso ms sencillo es 'public'. Todas las clases, en todos los paquetes tienen acceso a los miembros pblicos de la clase. Los miembros pblicos se declaran slo si su acceso no produce Ing. Joel Gonzlez Estrada 44

Diplomado Java Servlets resultados indeseados si un extrao los utiliza. Aqu no hay secretos familiares; no importa que lo sepa todo el mundo. Para declarar un miembro pblico se utiliza la palabra clave public. Por ejemplo, package Griego; class Alpha { public int soyPublico; public void metodoPublico() { System.out.println("metodoPublico"); } } Rescribamos nuestra clase Beta una vez ms y la ponemos en un paquete diferente que la clase Alpha y nos aseguramos que no estn relacionadas (no es una subclase) de Alpha. import Griego.*; package Romano; class Beta { void metodoAccesor() { Alpha a = new Alpha(); a.soyPublico = 10; // legal a.metodoPublico(); // legal } } Como se puede ver en el ejemplo anterior, Beta puede inspeccionar y modificar legalmente la variable soyPublico en la clase Alpha y puede llamar legalmente al mtodo metodoPublico().

Applets
Un applet es una pequea aplicacin accesible en un servidor Internet, que se transporta por la red, se instala automticamente y se ejecuta in situ como parte de un documento web (definicin de Patrick Naughton). Dado que Java es multiplataforma y los applets son soportados por ambos navegadores, su uso se ha popularizado bastante. Para crear un applet , debe de crear una subclase de la clase Applet. Esta clase parte del paquete java.applet, proporciona el comportamiento que el applet necesita para funcionar dentro de un navegador compatible. Aunque su applet puede tener tantas clases adicionales como sean necesarias, la clase del applet es la que dispara su ejecucin. La clase applet inicial tendr una firma como la siguiente: public class mi_clase entands java.applet.Applet {

Ing. Joel Gonzlez Estrada

45

Diplomado Java Servlets .... } Ciclo de vida de un applet Como hemos visto, un applet se ejecuta en una pgina web y ese entorno en el que est va a determinar el ciclo de vida del mismo. La clase Applet dispone de varios mtodos sin cdigo dentro a los que llama en diversas fases de su ciclo de vida (al crearse el applet, al redibujarse, al destruirse...). Si deseamos que nuestro applet haga cosas especiales en esos momentos deberemos sobreescribir esos mtodos. Son stos: void init() Este mtodo se llama al crearse el applet y slo se ejecuta esa vez. Se suele utilizar para inicializar variables globales. void start() Se llama cuando hay que activar el applet. Esto sucede cuando el applet se ve en la pantalla. Se suele utilizar para comenzar las actividades de applet, ya que en general ste debe estar visible en la pantalla para poder realizar su funcin. void stop() Es el inverso del anterior. Es llamado cuando el applet deja de estar visible. Se suele utilizar para interrumpir las actividades activadas en start(). void destroy() Mtodo llamado al destruirse el applet. Normalmente no se suele sobreescribir, ya que la destruccin del applet conlleva la destruccin de todo lo que se ha creado en l. Puede ser til para mostrar una ventana de confirmacin que pregunte al usuario si de verdad debe cargrselo. void repaint() Este mtodo no debera ser sobrecargado y es llamado cuando se necesita redibujar el applet. Podemos llamarlo nosotros desde nuestro cdigo. Llama a update(Graphics). void update(Graphics) Llamado por repaint() cuando se necesita actualizar el applet. Su implementacin borra el rectngulo y llama a paint() para volver a pintarlo. void paint(Graphics)

Ing. Joel Gonzlez Estrada

46

Diplomado Java Servlets Mtodo en el que se dibuja el applet y el cual deberemos sobreescribir para poder dibujar lo que nosotros deseemos.. void print(Graphics) Equivalente a paint() pero es llamado cuando se va a imprimir el contenido del applet. El siguiente ejemplo conviene observarlo desde un navegador e ir viendo los distintos mensajes que nos muestra el applet, para comprender cuando son llamados los mtodos, antes de ejecutar el applet se tiene que crear un archivo HTML con la siguiente etiqueta: <APPLET CODE="CicloDeVida.class" WIDTH="100" HEIGHT="400"></APPLET> import java.applet.Applet; import java.awt.Graphics; public class CicloDeVida extends Applet { String mensajes; public void init() { mensajes = "Inicializando. "; } public void start() { escribirMensaje("Mtodo start. "); } public void stop() { escribirMensaje("Mtodo stop. "); } public void destroy() { escribirMensaje("Destruyendo Applet. "); } void escribirMensaje(String nuevoMensaje) { mensajes += nuevoMensaje; repaint(); } public void paint(Graphics g) { g.drawString(mensajes, 5, 15); } } Paso de parmetros Con las aplicaciones java, puede pasar parmetros su rutina main() utilizando argumentos en la lnea de comando, despus puede analizar esos argumentos dentro del cuerpo de su clase y la aplicacin actuara de acuerdo con los argumentos que se le dieron.

Ing. Joel Gonzlez Estrada

47

Diplomado Java Servlets Sin embargo los applets no tiene lnea de comando esto para que sea posible enviar argumentos a los applets se realiza esto, entre <APPLET> y </APPLET> podremos colocar etiquetas PARAM que nos permitirn pasar parmetros al applet. Tienen dos atributos: NAME Nombre del parmetro. VALUE Valor del parmetro. Los parmetros enviados el applet podr obtener esos valores por medio del mtodo getParameter(String), como se muestra en el siguiente ejemplo:
<APPLET CODE="MostrarMensaje.class" WIDTH="200" HEIGHT="70"> <PARAM NAME="Mensaje" VALUE="Mi mensaje pio"> </APPLET>

import java.applet.Applet; import java.awt.*; public class MostrarMensaje extends Applet { String mensaje; public void init() { mensaje = getParameter("Mensaje"); } public void paint(Graphics g) { g.drawString(mensaje,20,20); } } Hay que destacar que Java no distingue entre maysculas y minsculas en cuanto al nombre de los parmetros. En muchos casos, el usuario puede que no incluya parmetros que consideramos necesarios o que escriba mal el nombre de un parmetro. En ese caso, la llamada a getParameter() nos devolver null. Debemos tener cuidado con esto, ya que nos pueden saltar excepciones por esta clase de cosas. As pues, el cdigo correcto de init() ser: public void init() { mensaje = getParameter("Mensaje"); if (mensaje==null) mensaje = "Mensaje por defecto"; } De este modo, si nos equivocamos en la etiqueta PARAM, nos mostrar un mensaje y no lanzar ninguna excepcin.

Ing. Joel Gonzlez Estrada

48

Diplomado Java Servlets

Grficos
La clase Graphics Con las capacidad grficas bsicas que vienen con las bibliotecas de la clases java, proporciona un conjunto de grficos sencillos integrado para dibujar ciertas figuras geomtricas. Mtodos de dibujo Mientras no se especifique, consideraremos que todos los parmetros son enteros: drawString(String texto,x,y) Escribe un texto a partir de las coordenadas (x,y). drawLine(x1,y1,x2,y2) Dibuja una lnea entre las coordenadas (x1,y1) y (x2,y2). drawRect(x,y,ancho,alto) fillRect(x,y,ancho,alto) clearRect(x,y,ancho.alto) Son tres mtodos encargados de dibujar, rellenar y limpiar, respectivamente, un rectngulo cuya esquina superior izquierda est en las coordenadas (x,y) y tienen el ancho y alto especificados. drawRoundRect(x,y,ancho,alto,anchoArco,altoArco) fillRoundRect(x,y,ancho,alto,anchoArco,altoArco) Equivalentes a los anteriores, pero con las esquinas redondeadas. La forma y tamao de dichas esquinas viene dada por los dos ltimos parmetros. draw3DRect(x,y,ancho,alto,boolean elevado) fill3DRect(x,y,ancho,alto,boolean elevado) Equivalentes a los primeros, pero dibujan un borde para dar la sensacin de que est elevado o hundido (dependiendo del valor del ltimo parmetro). drawOval(x,y,ancho,alto) fillOval(x,y,ancho,alto) Dibujan una elipse con esquina izquierda superior en (x,y) y el ancho y alto especificados. Si son iguales dibujar un crculo. drawArc(x,y,ancho,alto,anguloInicio,anguloArco) fillArc(x,y,ancho,alto,anguloInicio,anguloArco) Dibuja una arco cuyo primer vrtice est en (x,y) y el segundo en (x+ancho,y+alto). La forma del mismo vendr dado por los dos ltimos parmetros.

Ing. Joel Gonzlez Estrada

49

Diplomado Java Servlets

drawPolygon(int[] coordenadasX,int[] coordenadasY,numCoordenadas) fillPolygon(int[] coordenadasX,int[] coordenadasY,numCoordenadas) Dibuja un polgono cerrado del nmero de puntos especificado en el ltimo parmetro. copyArea(xOrigen,yOrigen,ancho,alto,xDest,yDest) Copia el rea cuya esquina superior izquierda est en (xOrigen,yOrigen) y de ancho y alto especificados a la zona que comienza en (xDest, yDest). Un ejemplo sencillo de un applet que utiliza algunos mtodos para dibujar uan figura rudimentaria, es este caso es una lampara con una sombra de motas.
import java.awt.*; public class Lamp extends java.applet.Applet { public void paint(Graphics g) { // the lamp platform g.fillRect(0,250,290,290); // the base of the lamp g.drawLine(125,250,125,160); g.drawLine(175,250,175,160); // the lamp shade, top and bottom edges g.drawArc(85,157,130,50,-65,312); g.drawArc(85,87,130,50,62,58); // lamp shade, sides g.drawLine(85,177,119,89); g.drawLine(215,177,181,89); // dots on the shade g.fillArc(78,120,40,40,63,-174); g.fillOval(120,96,40,40); g.fillArc(173,100,40,40,110,180); } }

Ing. Joel Gonzlez Estrada

50

Diplomado Java Servlets

Recuperar y utilizar de imgenes An cuando podemos hacer cosas con figuras, no estara de ms poder hacer cosas con imgenes, que son bastante ms espectaculares. Para hacerlo deberemos utilizaremos el siguiente mtodo: drawImage( Image img,int x,int y,ImageObserver observador ) Image es un objeto que representa a la imagen. Normalmente crearemos un objeto Image por medio del mtodo de Applet getImage(): Image img = getImage(URL base, String fichero) Asigna la imagen contenida en la URL donde se encuentre el fichero que contiene la imagen que queremos presentar y el nombre de ese fichero. Normalmente obtendremos esa direccin a partir de la pgina donde est la pgina HTML o nuestro applet. Para averiguarlo disponemos de dos mtodos en la clase Applet: URL getDocumentBase(). Devuelve la URL donde est la pgina HTML (excluyendo el nombre del fichero). URL getCodeBase(). Devuelve la URL donde est el applet (excluyendo el nombre del fichero). Si deseamos obtener una URL distinta deberemos importar esa clase (java.net.URL) y crear uno pasndole una cadena como parmetro al constructor conteniendo la URL. Normalmente, se realiza el getImage() en el mtodo init() del applet, ya que en el momento en que ejecutemos este mtodo comenzar la carga de imgenes desde Internet y eso conviene hacerlo cuanto antes. Para mostrar la imagen se utiliza el mtodo paint(), al igual que hemos hecho para pintar cosas. Por ejemplo, suponiendo que tengamos un fichero llamado home.jpg:
import java.awt.Graphics; import java.awt.Image; public class LadyBug extends java.applet.Applet { Image bugimg; public void init() {

Ing. Joel Gonzlez Estrada

51

Diplomado Java Servlets


bugimg = getImage(getCodeBase(), "images/ladybug.gif"); } public void paint(Graphics g) { int iwidth = bugimg.getWidth(this); int iheight = bugimg.getHeight(this); int xpos = 10; // 25 % g.drawImage(bugimg, xpos, 10, iwidth / 4, iheight / 4, this); // 50 % xpos += (iwidth / 4) + 10; g.drawImage(bugimg, xpos , 10, iwidth / 2, iheight / 2, this); // 100% xpos += (iwidth / 2) + 10; g.drawImage(bugimg, xpos, 10, this); // 150% x, 25% y g.drawImage(bugimg, 10, iheight + 30, (int)(iwidth * 1.5), iheight / 4, this); } }

Muestra la salida del applet.

Componentes bsicos de la intercaz de usuario AWT

Ing. Joel Gonzlez Estrada

52

Diplomado Java Servlets Una de las cosas bien hechas sobre los applets es que debido a que ya son contenedores AWT, puede comenzar a aadir otros componentes AWT inmediatamente. Para cualquiera de los componentes que se vern, el procedimiento para crear el componente es: primero lo crea, luego lo aade al applet o panel. Para agregar el componente utilice el mtodo add(). puclic void init() { Button b = new Button(OK); add(b); }

Botones
Veremos ejemplos de cmo se aaden botones a un panel para la interaccin del usuario con la aplicacin, pero antes vamos a ver la creacin de botones como objetos. Se pueden crear objetos Button con el operador new: Button boton; boton = new Button( "Botn"); La cadena utilizada en la creacin del botn aparecer en el botn cuando se visualice en pantalla. Esta cadena tambin se devolver para utilizarla como identificacin del botn cuando ocurra un evento. Eventos Button Cada vez que el usuario pulsa un botn, se produce un evento, de la misma forma que se produce un evento cuando se aprieta el botn del ratn. Los eventos de pulsacin de un botn se pueden capturar sobrecargando el mtodo action(): public boolean action( Event evt,Object obj ) { if( evt.target instanceof Button ) System.out.println( (String)obj ); else System.out.println( "Evento No-Button" ); } La distincin entre todos los botones existentes se puede hacer utilizando el objeto destino pasado por el objeto Event y comparndolo con los objetos botn que hemos dispuesto en nuestro interface:
import java.awt.*; import java.applet.Applet; public class Botones extends Applet { Button b1,b2,b3; public void init() { b1 = new Button( "Botn B1" );

Ing. Joel Gonzlez Estrada

53

Diplomado Java Servlets


b2 = new Button( "Botn B2" ); b3 = new Button( "Botn B3" ); this.add( b1 ); this.add( b2 ); this.add( b3 ); } public boolean action( Event evt,Object obj ) { if( evt.target.equals( b1 ) ) System.out.println( "Se ha pulsado el boton B1" ); if( evt.target.equals( b2 ) ) System.out.println( "Se ha pulsado el boton B2" ); if( evt.target.equals( b3 ) ) System.out.println( "Se ha pulsado el boton B3" ); return true; } }

En el applet anterior, observamos que se imprime el texto asociado al botn que hayamos pulsado. Botones de Pulsacin Los botones presentados en el applet son los botones de pulsacin estndar; no obstante, para variar la representacin en pantalla y para conseguir una interfaz ms limpia, AWT ofrece a los programadores otros tipos de botones. Botones de Lista Los botones de seleccin en una lista (Choice) permiten el rpido acceso a una lista de elementos. Por ejemplo, podramos implementar una seleccin de colores y mantenerla en un botn Choice:
import java.awt.*; import java.applet.Applet; public class BotonSeleccion extends Applet { Choice Selector; public void init() { Selector = new Choice(); Selector.addItem( "Rojo" ); Selector.addItem( "Verde" ); Selector.addItem( "Azul" ); add( Selector ); } public boolean action( Event evt,Object obj ) { if( evt.target instanceof Choice )

Ing. Joel Gonzlez Estrada

54

Diplomado Java Servlets


{ String color = (String)obj; System.out.println( "El color elegido es el " + color ); } return true; } }

En este ejemplo, la cadena proporcionada al mtodo addItem() ser devuelta en el argumento Object de un evento Choice, por ello en el manejador del botn de seleccin, comprobamos en primer lugar que se trate efectivamente de un evento generado en un botn de tipo Choice.

Botones de Marcacin Los botones de comprobacin (Checkbox) se utilizan frecuentemente como botones de estado. Proporcionan informacin del tipo S o No (true o false). El estado del botn se devuelve en el argumento Object de los eventos Checkbox; el argumento es de tipo booleano: verdadero (true) si la caja se ha seleccionado y falso (false) en otro caso. Tanto el nombre como el estado se devuelven en el argumento del evento, aunque se pueden obtener a travs de los mtodos getLabel() y getState() del objeto Checkbox. import java.awt.*; import java.applet.Applet; public class BotonComprobacion extends Applet { Checkbox Relleno; public void init() { Relleno = new Checkbox( "Relleno"); add( Relleno ); } public boolean action( Event evt,Object obj ) { if( evt.target instanceof Checkbox ) System.out.println( "CheckBox: " + evt.arg.toString() );

Ing. Joel Gonzlez Estrada

55

Diplomado Java Servlets

return true; } } El sencillo ejemplo anterior, muestra los cambios que se producen en el estado del botn cuando la caja est o no seleccionada.

Botones de Seleccin Los botones de comprobacin se pueden agrupar para formar una interfaz de botn de radio (CheckboxGroup), que son agrupaciones de botones Checkbox en las que siempre hay un nico botn activo. import java.awt.*; import java.applet.Applet; public class BotonRadio extends Applet { CheckboxGroup Radio; public void init() { Radio = new CheckboxGroup(); add( new Checkbox( "Primero",Radio,true) ); add( new Checkbox( "Segundo",Radio,false) ); add( new Checkbox( "Tercero",Radio,false) ); } } En el ejemplo anterior, BotonRadio.java, observamos que siempre hay un botn activo entre los que conforman el interfaz de comprobacin que se ha implementado.

Botones Autocontenidos La naturaleza orientada a objetos de Java nos da la posibilidad de crear botones completamente autocontenidos. En este tipo de botn, se construye el manejador de eventos dentro de la propia clase extendida de botn. Se pueden aadir estos botones a la aplicacin, sin tener que preocuparse de los eventos que pudieran generar. En el ejemplo siguiente, creamos el botn que muestra la figura, un botn que genera el texto "Boton Aceptar" por la salida estndar: import java.awt.*; import java.applet.Applet; Ing. Joel Gonzlez Estrada 56

Diplomado Java Servlets

class BotonAceptar extends Button { public BotonAceptar() { setLabel( "Aceptar" ); } public boolean action( Event evt,Object obj ) { System.out.println( "Boton Aceptar" ); return true; } } public class BotonAuto extends Applet { BotonAceptar boton; public void init() { boton = new BotonAceptar(); add( boton ); } } Es de hacer notar que no hay un mtodo action() en la clase applet BotonAuto, la clase BotonAceptar manejar sus eventos. Si se hubiesen colocado otros objetos en el applet, se podra haber usado un mtodo action() para tratar los eventos de esos objetos.

Etiquetas
Las etiquetas (Label) proporcionan una forma de colocar texto esttico en un panel, para mostrar informacin que no vara, normalmente, al usuario. El applet presenta dos textos en pantalla, tal como aparece en la figura siguiente:

Ing. Joel Gonzlez Estrada

57

Diplomado Java Servlets

import java.awt.*; import java.applet.Applet; public class Etiqueta extends Applet { public void init() { Label etiq1 = new Label( "Hola Java!" ); Label etiq2 = new Label( "Otra Etiqueta" ); setLayout( new FlowLayout( FlowLayout.CENTER,10,10) ); add( etiq1 ); add( etiq2 ); } }

Listas
Las listas (List) aparecen en los interfaces de usuario para facilitar a los operadores la manipulacin de muchos elementos. Se crean utilizando mtodos similares a los de los botones Choice. La lista es visible todo el tiempo, utilizndose una barra de desplazamiento para visualizar los elementos que no caben en el rea que aparece en la pantalla. El ejemplo siguiente, crea una lista que muestra cuatro lneas a la vez y no permite seleccin mltiple.

import java.awt.*; import java.applet.Applet; public class Lista extends Applet { public void init() {

Ing. Joel Gonzlez Estrada

58

Diplomado Java Servlets List l = new List( 4,false ); l.addItem( "Mercurio" ); l.addItem( "Venus" ); l.addItem( "Tierra" ); l.addItem( "Marte" ); l.addItem( "Jupiter" ); l.addItem( "Saturno" ); l.addItem( "Neptuno" ); l.addItem( "Urano" ); l.addItem( "Pluton" ); add( l ); } public boolean action( Event evt,Object obj ) { if( evt.target instanceof List ) System.out.println( "Entrada de la Lista: " + obj ); return true; } } Para acceder a los elementos seleccionados se utilizan los mtodos getSelectedItem() o getSelectedItems(). Para listas de seleccin simple, cualquier seleccin con doble-click en la lista disparar el mtodo action() de la misma forma que con los eventos de seleccin en mens. En el applet siguiente, se permite al usuario seleccionar varios elementos de los que constituyen la lista. En la figura se muestra la apariencia de una seleccin mltiple en este applet.

import java.awt.*; import java.applet.Applet; public class ListaMult extends Applet { List lm = new List( 6,true );

Ing. Joel Gonzlez Estrada

59

Diplomado Java Servlets public void init() { Button boton = new Button( "Aceptar" ); lm.addItem( "Mercurio" ); lm.addItem( "Venus" ); lm.addItem( "Tierra" ); lm.addItem( "Marte" ); lm.addItem( "Jupiter" ); lm.addItem( "Saturno" ); lm.addItem( "Neptuno" ); lm.addItem( "Urano" ); lm.addItem( "Pluton" ); add( lm ); add( boton ); } public boolean action( Event evt,Object obj ) { if( evt.target instanceof Button ) { if( "Aceptar".equals( obj ) ) { String seleccion[]; seleccion = lm.getSelectedItems(); for( int i=0; i < seleccion.length; i++ ) System.out.println( seleccion[i] ); } } return true; } } En este caso de la seleccin mltiple en una lista, utilizamos un evento externo para disparar las acciones asociadas a la lista. En el ejemplo, hemos incluido un botn para generar el evento que hace que el applet recoja los elementos que hay seleccionados en la lista.

Campo de Texto
Para la entrada directa de datos se suelen utilizar los campos de texto, que aparecen en pantalla como pequeas cajas que permiten al usuario la entrada por teclado.

Ing. Joel Gonzlez Estrada

60

Diplomado Java Servlets Los campos de texto (TextField) se pueden crear vacos, vacos con una longitud determinada, rellenos con texto predefinido y rellenos con texto predefinido y una longitud determinada. El applet siguiente, genera cuatro campos de texto con cada una de las caractersticas anteriores. La imagen muestra los distintos tipos de campos.

import java.awt.*; import java.applet.Applet; public class CampoTexto extends Applet { TextField tf1,tf2,tf3,tf4; public void init() { // Campo de texto vaco tf1 = new TextField(); // Campo de texto vaco con 20 columnas tf2 = new TextField( 20 ); // Texto predefinido tf3 = new TextField( "Hola" ); // Texto predefinido en 30 columnas tf4 = new TextField( "Hola",30 ); add( tf1 ); add( tf2 ); add( tf3 ); add( tf4 ); } public boolean action( Event evt,Object obj ) { if( evt.target instanceof TextField ) { if( evt.target.equals( tf1 ) ) System.out.println( "Campo de Texto 1: " + evt.arg.toString() ); if( evt.target.equals( tf1 ) ) System.out.println( "Campo de Texto 2: " + evt.arg.toString() ); if( evt.target.equals( tf1 ) ) Ing. Joel Gonzlez Estrada 61

Diplomado Java Servlets System.out.println( "Campo de Texto 3: " + evt.arg.toString() ); if( evt.target.equals( tf1 ) ) System.out.println( "Campo de Texto 4: " + evt.arg.toString() ); } return true; } } Cuando el usuario teclea un retorno de carro en un campo de texto, se genera un evento TextField, que al igual que con los otros Componentes del AWT podemos capturar con el mtodo action(), tal como se demuestra en el ejemplo.

reas de Texto
Java, a travs del AWT, permite incorporar texto multilnea dentro de zonas de texto (TextArea). Los objetos TextArea se utilizan para elementos de texto que ocupan ms de una lnea, como puede ser la presentacin tanto de texto editable como de slo lectura. Para crear una rea de texto se pueden utilizar cuatro formas anlogas a las que se han descrito en la creacin de Campos de Texto. Pero adems, para las reas de texto hay que especificar el nmero de columnas. Se puede permitir que el usuario edite el texto con el mtodo setEditable() de la misma forma que se haca en el TextField. En la figura aparece la representacin del applet que presenta dos reas de texto, una vaca y editable y otra con un texto predefinido y no editable. import java.awt.*; import java.applet.Applet; public class AreaTexto extends Applet { TextArea t1,t2; public void init() { Button boton = new Button( "Aceptar" ); t1 = new TextArea(); t2 = new TextArea( "Tutorial de Java",5,40 ); t2.setEditable( false ); add( t1 ); add( t2 ); add( boton ); }

Ing. Joel Gonzlez Estrada

62

Diplomado Java Servlets

public boolean action( Event evt,Object obj ) { if( evt.target instanceof Button ) { if( "Aceptar".equals( obj ) ) { String texto = t1.getText(); System.out.println( texto ); } } return true; } } Para acceder al texto actual de una zona de texto se utiliza el mtodo getText(), tal como muestra el cdigo anterior. Las reas de texto no generan eventos por s solas, por lo que hay que utilizar eventos externos, para saber cuando tenemos que acceder a la informacin contenida en el TextArea. En este caso hemos utilizado un botn que generar un evento al pulsarlo que har que se recoja el texto que haya escrito en el rea de texto que constituye el applet.

Canvas
Si tenemos un applet que trabaja con imgenes directamente, ya sea un applet grfico o de dibujo, los lienzos o zonas de dibujo (Canvas) resultan muy tiles. Los Canvas son un Componente bsico que captura eventos de exposicin (expose), de ratn y dems eventos relacionados. La clase base Canvas no responde a estos eventos, pero se puede extender esa clase base creando subclases en las que controlemos esos eventos. Al permitir saltarse el manejo normal de eventos, y junto con los mtodos de representacin grfica, los calvas simplifican la produccin de applets que necesitan una nica funcionalidad para distintas reas. Por ejemplo, el applet Lienzo.java, contiene un manejador de eventos que controla el evento mouseDown en el canvas. Si el evento no se genera en el canvas, se le pasa al applet que lo tratar como un evento de ratn normal. import java.awt.*; import java.applet.Applet;

Ing. Joel Gonzlez Estrada

63

Diplomado Java Servlets

public class Lienzo extends Applet { Button boton; public void init() { setLayout( new BorderLayout( 15,15 ) ); boton = new Button( "Test" ); MiCanvas canv = new MiCanvas( 100,100 ); add( "Center",canv ); add( "South",boton ); } public boolean action( Event evt,Object obj ) { System.out.println( "Evento: " + obj ); return true; } public boolean mouseDown( Event evt,int x, int y ) { System.out.println( "Raton: ("+x+","+y+")" ); return true; } } class MiCanvas extends Canvas { private int ancho; private int alto; public MiCanvas( int anc,int alt ) { ancho = anc; alto = alt; reshape( 0,0,anc,alt ); } public void paint( Graphics g ) { g.setColor( Color.blue ); g.fillRect( 0,0,ancho,alto ); } public boolean mouseDown( Event evt,int x, int y ) { if( x < ancho && y < alto ) { System.out.println( "Raton en Canvas: ("+x+","+y+")" ); return true; } return false; Ing. Joel Gonzlez Estrada 64

Diplomado Java Servlets } }

Barras de desplazamiento
En determinados applets que necesiten realizar el ajuste de valores lineales en pantalla, resulta til el uso de barras de desplazamiento (Scrollbar). Las barras de desplazamiento proporcionan una forma de trabajar con rangos de valores o de reas como el Componente TextArea, que proporciona dos barras de desplazamiento automticamente. Si queremos implementar un selector de color, como en el applet Slider.java, podemos utilizar una barra de desplazamiento para cada uno de los colores primarios. import java.awt.*; import java.applet.Applet; public class Slider extends Applet { Scrollbar rojo,verde,azul; public void init() { rojo = new Scrollbar( Scrollbar.VERTICAL,0,1,0,255 ); verde = new Scrollbar( Scrollbar.VERTICAL,0,1,0,255 ); azul = new Scrollbar( Scrollbar.VERTICAL,0,1,0,255 ); add( rojo ); add( verde ); add( azul ); } } Este tipo de interfaz proporciona al usuario un punto de referencia visual de un rango y al mismo tiempo la forma de cambiar los valores. Por ello, las barras de desplazamiento son Componentes un poco ms complejos que los dems, reflejndose esta complejidad en sus constructores. Al crearlos hay que indicar su orientacin, su valor inicial, los valores mnimo y mximo que puede alcanzar y el porcentaje de rango que estar visible. Tambin podramos utilizar una barra de desplazamiento para un rango de valores de color, tal como se muestra en el ejemplo.

Ing. Joel Gonzlez Estrada

65

Diplomado Java Servlets

import java.awt.*; import java.applet.Applet; public class Ranger extends Applet { Scrollbar rango; public void init() { rango = new Scrollbar( Scrollbar.HORIZONTAL,0,64,0,255 ); add( rango ); } } Como se puede ver, el ancho de la barra es mayor, en relacin al Scrollbar. En este caso, maxValue representa el valor mximo para el lado izquierdo de la barra. Si se quieren representar 64 colores simultneamente, es decir [0-63] a [192-255], maxValue debera ser 192. Igual que otros Componentes, las barras de desplazamiento generan eventos; pero al contrario que en el resto, se tiene que utilizar el mtodo handleEvent() directamente, en lugar del mtodo action(). El destino del evento ser un objeto de la clase Scrollbar, a partir de ste se obtiene la posicin de la barra de desplazamiento. Como se habr podido observar en los applets anteriores, las barras de desplazamiento no disponen de un display o zona donde se muestren directamente los valores asociados a los desplazamientos. Al contrario, si se desea eso, es necesario aadir explcitamente una caja de texto, tal como se muestra en el ejemplo.

import java.awt.*; import java.applet.Applet; public class RangoRojo extends Applet { Scrollbar rango; TextField valor; Label etiqueta; public void init() { rango = new Scrollbar( Scrollbar.HORIZONTAL,0,1,0,255 ); valor = new TextField( "0",5 ); Ing. Joel Gonzlez Estrada 66

Diplomado Java Servlets etiqueta = new Label( "Rojo (0-255)" ); setLayout( new GridLayout( 1,3 ) ); valor.setEditable( false ); add( etiqueta ); add( rango ); add( valor ); } public boolean handleEvent( Event evt ) { if( evt.target instanceof Scrollbar ) { valor.setText( Integer.toString( ((Scrollbar)evt.target).getValue() ) ); return true; } return super.handleEvent( evt ); } } Ese era el cdigo del applet que construye la ventana de la figura y actualiza el campo de texto asociado. No implementa ninguna otra accin o evento.

Practicas
Practica 1 Tipo de variables En esta prctica se ilustran los diferentes tipos bsicos de datos que se manejan en el lenguaje Java y que son int, char, short, float, boolean, double. Adems de estos se pueden utilizar algunos objetos. Las estructuras de control para el control del flujo del programa son if, switch, while, do-while, for. Copie el programa variable.java que sigue, observe el resultado y haga algunas modificaciones. class variable { public static void main(String args[]) throws java.io.IOException { // TIPOS DE VARIABLES long lx = 0, ly = 0, lz = 0; // 64 bits -9,233,372,036,854,775,808 int x = 0, y=0, z=0; // 32 bits -2,147,483,648.. +2,147,483,647 short sx, sy, sz; // 16 bits -32768 .. +32767

Ing. Joel Gonzlez Estrada

67

Diplomado Java Servlets byte bx, by, bz; // 8 bits -128 .. +127

float radio, area, fz; // 32 bits IEEE 754 double dox, doy, doz; // 64 bits IEEE 754 int cuenta ; StringBuffer cadena = new StringBuffer(50) ; char ch ; Float f; // OBJETO FLOAT, ES DIFERENTE DEL TIPO float System.out.println("VARIABLES Y OPERADORES EN JAVA"); // ENTERAS x = 50; z = 1000; z *= x; // EQUIVALE A: z = z * x; // CASTING=DISFRAZ SI SE ASIGNA UN (tipo) CAMBIA SU TIPO LA VARIABLE sz = 5; for(sx = 1; sx < 10; sx++ ) sz = (short)(sz * (short)10); sx = 50; // enteras cortas sz = 1000; sz *= sx; // sz = sz * sx; sz = (short)50000; z = 50000; // DESPLEGADO DE VARIABLES \n INDICA SALTO DE RENGLON System.out.println("50,000 con short: " + sz + "\n50,000 con int: " + z + "\n"); // CALCULO DEL REA DE UN CIRCULO radio = (float)5.0; area = (float)3.1416 * (radio * radio); System.out.println("El rea de un circulo de radio: " + radio + " es: " + area) ; // MANEJO DE BITS bx = 0x7; // 00000111 bx <<= 4; // 01110000 bx += (byte)15; // 01111111 System.out.println("\nValor maximo positivo de un byte: " + bx);

Ing. Joel Gonzlez Estrada

68

Diplomado Java Servlets

x = 1; // 1 x <<= 2; // 100 System.out.println("\n1 con 2 corrimientos (100): " + x); x <<= 1; // 1000 System.out.println("\n1 con 3 corrimientos (1000): " + x); // OPERACIONES ARITMTICAS x = 23; y = x % 4; z = x / 4; System.out.println("\n23 % 4= " + y + "\n23 / 4= " + z + "\n"); // OPERACIONES Lgicas x = 0x7; // 111 y = 0x3; // 011 z = x & y; System.out.println("\nx: " + x + " & y: " + y + " = z: " + z); // LECTURA DEL TECLADO System.out.println("DIGITA UNA CADENA: "); cuenta = 0; while( (ch = (char)System.in.read()) != '\n' ) { cadena.append(ch); cuenta++; } System.out.println("\nDigitaste una cadena de " + cuenta + " caracteres: " + cadena); // INICIALIZA LA VARIABLE QUE CONTIENE LO QUE ESCRIBAS cadena = new StringBuffer(10); System.out.println("\n\nESCRIBE UN NUMERO ENTRE 0 Y 10: "); cuenta = 0; while( (ch = (char)System.in.read()) != '\n' ) { cadena.append(ch); cuenta++; } f = (Float)Float.valueOf(cadena.toString()); fz = f.floatValue(); System.out.print("\nEl nmero es: " + fz); Ing. Joel Gonzlez Estrada 69

Diplomado Java Servlets if( fz > 5 ) System.out.println(" es mayor que 5"); else System.out.println(" es menor que 5"); x = (int)fz; switch(x) { case 2: System.out.println("el numero es dos"); break; case 4: System.out.println("el numero es cuatro"); break; case 6: System.out.println("el numero es seis"); break; case 8: System.out.println("el numero es ocho"); break; case 10: System.out.println("el numero es diez"); break; default: System.out.println("el numero es impar o fuera de 1-10"); break; } System.out.print("Presiona una tecla "); // NO SALTA RENGLON System.in.read(); // ITERACION USANDO WHILE cuenta = 0; while( cuenta < 20 ) { System.out.print(cuenta + " "); cuenta++; // EQUIVALE A: cuenta = cuenta + 1; } System.out.println(""); // ITERACIN USANDO FOR for( cuenta = 0; cuenta < 20; cuenta++ ) System.out.print(cuenta + " "); System.out.print("\n"); // ITERACIN USANDO DO-WHILE Ing. Joel Gonzlez Estrada 70

Diplomado Java Servlets cuenta = 0; do { System.out.print(cuenta + " "); cuenta++; // cuenta = cuenta + 1; } while( cuenta < 20); System.out.println("\n...es todo"); } }

Practica 2 Applet Reloj Aplicando la conversin de coordenadas polares a rectangulares y obteniendo los datos del reloj de la mquina local se puede construir un reloj analgico, motivo de esta prctica. Para controlar el click del reloj se utiliza un hilo de ejecucin conocido como Thread, el cual se arranca en el mtodo start y se pausa 999 milsimas de segundo equivalente a un segundo en el mtodo run. En esta prctica queremos que combines este programa con el que despliega rboles para que un sol que aparece por la derecha se mueva en forma curva y al tiempo que cruza de derecha a izquierda un rbol en el centro va creciendo y el da cambia de color azul claro hasta el anaranjado y luego azul marino al final del da. El cdigo fuente de reloj.java se muestra a continuacin:
import java.awt.Graphics; import java.awt.Font; import java.util.Date; import java.lang.Math; import java.awt.Color; public class reloj extends java.applet.Applet implements Runnable { Font tipo = new Font("Impact" ,Font.BOLD ,20); // TIEMPO DEL RELOJ INTERNO DE LA MQUINA Date tiempo; double segundo, minuto, hora; // HEBRA DE Ejecucin Thread hilo ; // VARIABLES DEL RELOJ double FACTOR = (180 / 3.141592 );

Ing. Joel Gonzlez Estrada

71

Diplomado Java Servlets


// LONGITUD DE CADA MANECILLA double radios=50.0, radiom=40.0 ,radioh=30.0; // ARCO DE CADA MANECILLA RESPECTO A CERO = 12:00 double arco_hora,arco_minuto, arco_seg; double incremento, incremento_hora; // COORDENADAS FINALES DE CADA MANECILLA double x_seg, y_seg, x_minuto, y_minuto, x_hora,y_hora; // CENTRO DEL RELOJ double x_centro = 100 ,y_centro = 100; public void run() { while(true) { tiempo = new Date(); repaint(); try { Thread.sleep(999); } catch(InterruptedException e) { } } } public void init(Graphics g) { } public void start() { if( hilo == null ) { hilo = new Thread(this); hilo.start(); } } public void stop() { if( hilo != null ) { hilo.stop(); hilo = null; } } public void paint(Graphics g) { StringBuffer desplega = new StringBuffer(30); // PARTE INTERNA DEL RELOJ

Ing. Joel Gonzlez Estrada

72

Diplomado Java Servlets


g.setColor(Color.white); g.fillOval( (int)(x_centro - radios), (int)(y_centro - radios), (int)(radios * 2), (int)(radios * 2)); // CONTORNO DEL RELOJ EN FUNCIN DEL SEGUNDERO g.setColor(Color.blue); g.drawOval((int)(x_centro - radios), (int)(y_centro - radios), (int)(radios * 2), (int)(radios * 2)); // TOMA EL TIEMPO ACTUAL: HORAS MINUTOS SEGUNDOS hora = tiempo.getHours(); minuto = tiempo.getMinutes(); segundo = tiempo.getSeconds(); // FORMATEA LA HORA QUE SE DESPLIEGA g.setFont(tipo); desplega.append((int)(hora % 12)); desplega.append(":"); if( minuto > 9 ) desplega.append((int)minuto); else desplega.append("0").append((int)minuto); desplega.append(":"); if( segundo > 9 ) desplega.append((int)segundo); else desplega.append("0").append((int)segundo); desplega.append(" "); if( hora > 12.0 ) desplega.append(" PM"); else desplega.append(" AM"); g.drawString(" " + desplega.toString() ,35 ,20); // POSICIONA EL SEGUNDERO incremento = 360.0 / 60.0; // ANGULO POR SEGUNDO arco_seg = 90.0 + (segundo * incremento); // A PARTIR DE 0 SEGUNDOS arco_seg = arco_seg > 360.0 ? (arco_seg - 360.0) : arco_seg; // CONVIERTE DE COORDENADAS POLARES A RECTANGULARES x_seg = radios * Math.cos( arco_seg / FACTOR ); y_seg = radios * Math.sin( arco_seg / FACTOR ); // POSICIONA EL MINUTERO arco_minuto = 90.0 + (minuto * incremento + segundo * incremento / 60.0); arco_minuto = arco_minuto > 360.0 ? (arco_minuto - 360.0) : arco_minuto; x_minuto = radiom * Math.cos( arco_minuto / FACTOR );

Ing. Joel Gonzlez Estrada

73

Diplomado Java Servlets


y_minuto = radiom * Math.sin( arco_minuto / FACTOR ); // POSICIONA LAS HORAS incremento_hora = 360.0 / 12.0; arco_hora = 90.0 + (hora * incremento_hora + minuto * incremento_hora / 60.0 + segundo * incremento_hora / 3600.0); arco_hora = arco_hora > 360.0 ? (arco_hora - 360.0) : arco_hora; x_hora = radioh * Math.cos( arco_hora / FACTOR ); y_hora = radioh * Math.sin( arco_hora / FACTOR ); // MANECILLA SEGUNDERO g.setColor(Color.black); g.drawLine((int)x_centro, (int)y_centro, (int)(x_centro - x_seg), (int)(y_centro - y_seg)); // MANECILLA MINUTERO g.setColor(Color.red); g.drawLine((int)x_centro, (int)y_centro, (int)(x_centro - x_minuto) ,(int)(y_centro - y_minuto)); // MANECILLA HORAS g.setColor(Color.blue); g.drawLine((int)x_centro, (int)y_centro, (int)(x_centro - x_hora) ,(int)(y_centro - y_hora)); } }

Ing. Joel Gonzlez Estrada

74

Diplomado Java Servlets

Diplomado Java Servlets


3. Servlets
Al final del capitulo el alumno ser capaz de... Comprender la tecnologa de los Servlets y diferencia entre los CGIs Caractersticas, estructura y arquitectura de los Servlets Manejo de los mtodos del la clase HttpServlet Configuracin del entorno de Java Web Server Accesos a base de datos por el Web Comprueba tu avance y marca con una los objetivos alcanzados.

Ing. Joel Gonzlez Estrada

75

Diplomado Java Servlets

Servlets
Introduccin a los Servlets
Cuando se habla de aplicaciones para Web comnmente escuchamos hablar de JAVA, y con ello sus aplicaciones mas conocidas, los Applets, que son programas que se pueden cargar a travs de una red y que se ejecutan de igual forma en cualquier plataforma, todo ello gracias a las potentes caractersticas de JAVA. Hasta hace poco, JAVA se utilizaba bsicamente para dotar a las pginas WEB de una mayor interactividad mediante los Applets, y por tanto solo actuaba sobre el lado cliente. Pero el lado servidor tambin puede beneficiarse de todas las ventajas que ofrece JAVA, gracias a los Servlets. Los Servlets se diferencian de los Applets bsicamente en que se ejecutan en el servidor y en que no presentan ningn tipo de interfaz grfica puesto que se encargan de hacer el trabajo oculto, un aspecto interesante por lo que muchos programadores que hasta ahora utilizaban CGIs, estn utilizando Servlets. De hecho, los CGI's eran el nico medio de proporcionar interaccin entre el cliente y el servidor. Un ejemplo muy comn de uso de los CGI's son los tpicos formularios que el usuario llena con sus datos que posteriormente pasan a formar parte de una base de datos. Los servlets son programas que funcionan como los CGIs convencionales atendiendo peticiones de un cliente teniendo al servidor como el encargado, pero escritos en Java y con la ventaja de explotar todas las bondades de java. Por ejemplo, un servlet puede ser responsable de tomar los datos de un formulario HTML y enviarlos a una base de datos para actualizacin de la misma. La API Servlet, usada para escribir servlets, no incluye nada acerca de cmo son cargados los servlets, ni el ambiente en el cual corren los servlets, ni el protocolo usado para transmitir los datos del usuario. Esto permite a los servlets poder ser usados por diferentes servidores Web. Los Servlets son un sustituto eficaz de los CGIs: proveen la forma de generar documentos dinmicos que son fciles de escribir y ejecutar. Tambin evitan el problema de desarrollar la programacin segn la plataforma utilizada. Los servlets son desarrollados con su propia API, una extensin estndar de Java.

Ing. Joel Gonzlez Estrada

76

Diplomado Java Servlets

Porqu se afirma que los servlets podrn sustituir a los CGI's?


Al comparar a los CGIs con los servlets tambin nos preguntamos quin es mejor si Perl o Java. Ambos son excelentes herramientas de desarrollo y su respuesta estar dada en funcin de lo que se desee realizar. Perl usa el concepto de mdulos para agregar nuevas capacidades, por ejemplo el mdulo DBI (Database Independent) que permite a los scripts de Perl acceder a las bases de datos (ODBC, Oracle, Sybase, Ingres, e Informix). Los mdulos CGI incluyen funciones de ayuda para el desarrollo de CGI, incluyen rutinas para ser utilizadas dentro de los programas. Java utiliza paquetes en lugar de mdulos. El paquete API de servlets provee de muchas de las herramientas con las que cuentan los mdulos de Perl. Para el acceso a base de datos puede usarse los respectivos drivers de conexin. Algunas de las razones por las que se dice que los CGI's pueden ser sustituidos por servlets son : Se programan utilizando un API estandarizada JAVA, y por tanto se benefician de todas las ventajas de este potente lenguaje. Se pueden cargar indiferentemente y de forma transparente tanto desde un disco local como desde una direccin remota, de forma totalmente transparente. Los Servlets pueden comunicarse entre s, y por tanto, es posible una reasignacin dinmica de la carga de proceso entre diversas mquinas. Es decir, un servlet podra pasarle trabajo a otro servlet residente en otra mquina. Se pueden reutilizar CGI's ya hechos, incrustndolos en Servlets. Es posible utilizarlos en servidores tan populares como el Apache, el FastTrack el Internet Information Server. Los Servlets son la mejor opcin a partir de ahora para desarrollar aplicaciones para servidores WEB. Trabajan de forma transparente con las filosofas GET y POST de los formularios HTML, y tambin, se entienden perfectamente con los Applets, pero tambin se pueden entender con clientes programados en cualquier otro lenguaje.

Ing. Joel Gonzlez Estrada

77

Diplomado Java Servlets

Ventajas de los Servlets


Desempeo Los servlets son ms rpidos que los CGI debido a que utilizan threads en lugar de procesos. Una de las quejas ms comunes de los CGI/Perl es el desperdicio de los recursos del sistema. En un ambiente tpico CGI, cada peticin crea un nuevo proceso el cual carga el interprete de Perl. El interprete de Perl carga el script CGI, lo compila, y lo ejecuta. Adems, si la aplicacin se comunica con la BD, una nueva conexin ser necesaria para ser hecha por cada CGI. Los Servlets inician un nuevo thread, hilo, (mas que un nuevo proceso) con cada peticin. Cada servlet es cargado una vez y usado ms y ms. Nota que a diferencia de los CGI, los servlets requieren que se cuente con una Mquina Virtual de Java (JVM) corriendo sobre el servidor todo el tiempo. Para sitios ocupados, sta permite a los servlets usar mucho menos los recursos del sistema e incrementar el desempeo. Portabilidad Los servlets son tan portables como cualquier otra aplicacin de Java. Muchos sitios estn buscando una solucin de portabilidad. Tal vez desearan para su desarrollo usar Linux o Windows NT mientras su servidor de produccin corra bajo Solaris. Ellos pueden querer vender su aplicacin Web para muchos clientes como para plataformas sea posible. Hay versiones de Perl para muchas variantes de Unix como para Windows 95 y NT. Mientras que Perl para Unix no es ciento por ciento compatible con el Perl para NT, los CGIs escritos en Perl pueden ser escritos para trabajar sobre ambos. El llevar CGIs a Windows NT no es difcil de hacer, pero nunca funcionarn sin realizar al menos una modificacin. Por otro lado, los CGI pueden contener comandos de Unix que no trabajarn sobre Windows NT. La portabilidad con los servlets de Java es mas simple. Java fue diseado para ser portable a travs de todas las plataformas, permitiendo que las aplicaciones sean movidas fcilmente de un sistema operativo a otro. Seguridad La seguridad puede ser un problema cuando se desarrollan CGIs. El rea de mas preocupacin es el proceso de estrada del usuario. Este podra ser desde formas o desde datos dentro de un URL. Muchos CGIs escritos en Perl son vulnerables a ataques donde la finalidad del usuario

Ing. Joel Gonzlez Estrada

78

Diplomado Java Servlets es trucar el CGI ejecutando algn comando sobre el servidor. Los Servlets no estn en riesgo de correr comando de shell no planeados. Los lenguajes compilados como Java (o C) proveen mejor seguridad que los lenguajes que interpretan scripts. Los Servlets son archivos de clases compilados mientras que un CGI/Perl es manipulado en su forma de cdigo fuente. Dependiendo quien tenga acceso al servidor Web, se puede elegir entre instalar o no el cdigo fuente. Desarrollo El desarrollo con Perl es simple. Lo nico que se necesita es un editor y mucha documentacin de Perl.. Mientras que a muchos desarrolladores les agrada este ambiente, hay una creciente proliferacin de herramientas IDE (Integrated Development Environment) para desarrollo. En ese campo, Java por encima de Perl. Hay IDEs disponibles desde Sun, Microsoft, Symantec y muchas otras, proporcionando simples entornos GUI. Las IDEs pueden proveer tiles herramientas fciles de aprender para nuevos desarrolladores. Compartiendo el trabajo entre los desarrolladores es adems es ms fcil con Java, o puede asignarse en paquetes individuales. Cuando se trabaja con una aplicacin CGI/Perl donde dos o mas desarrolladores estuvieron trabajando simultneamente, la aplicacin normalmente es manejada de un desarrollador a otro. El desarrollo de aplicaciones Java es mucho mejor para proyectos largos.

Ejemplos de aplicacin de los servlets


Algunas de las aplicaciones de servlets incluyen: Procesamiento de datos enviados con HTTPS a partir de una forma HTML, incluyendo la orden de compra o datos de una tarjeta de crdito. Un servlet como este podra ser parte de una orden de entrada al sistema de procesamiento de datos, haciendo la respectiva actualizacin en la base de datos, y quiz hasta un sistema de pago en lnea. Interaccin mltiple entre personas. Un servlet puede manipular mltiples peticiones al mismo tiempo; podran sincronizar dichas solicitudes de sistemas que dan soporte, por ejemplo conferencias en lnea. Redireccionamiento de peticiones. Los servlets pueden reenviar las peticiones a otros servidores y servlets. Esto permite que al ser usados se balancee la carga entre varios servidores que atiendan al misma tarea, segn el tipo de proceso que deban atender.

Ing. Joel Gonzlez Estrada

79

Diplomado Java Servlets

Aplicaciones ms especficas implementadas con servlets Con los Servlets se puede implementar por ejemplo: Tpicos sistemas middleware que hasta ahora nicamente se implementaban con CGI's. Para consultar las bases de batos, los Servlets pueden utilizar JDBC (Java Data Base Connection), lo que les permite extraer informacin de cualquier sistema de Base de Datos. Automatizacin de un sistema de recepcin y publicacin de informacin. Por ejemplo podramos montarnos una simple estacin meteorolgica que permitiese acceso a su informacin mediante una pgina WEB. Por un lado tendramos un servlet que recolectara la informacin de los diversos tipos de censores y la almacenara en bases de datos, y por otro lado, un servlet que se encargara de presentar esta informacin en funcin de las peticiones del cliente basndose en estas mismas bases de datos. Control de la recepcin de correo electrnico, y de sistemas de news, chats, etc. Conviene recordar que Java est especialmente indicado para la programacin utilizando los protocolos TCP/IP. Dado que pueden manejar mltiples peticiones en forma concurrente, es posible implementar aplicaciones de colaboracin, como por ejemplo una aplicacin de videoconferencia.

Arquitectura del paquete Servlets


El paquete javax.servlet proporciona clases e interfaces para escribir servlets. La arquitectura de este paquete se describe a continuacin. El Interface Servlet La abstraccin central en el API Servlet es el interface Servlet. Todos los servlets implementan este interface, bien directamente o, ms comnmente, extendiendo una clase que lo implemente como HttpServlet

Ing. Joel Gonzlez Estrada

80

Diplomado Java Servlets El interface Servlet declara, pero no implementa, mtodos que manejan el Servlet y su comunicacin con los clientes. Los escritores de Servlets proporcionan algunos de esos mtodos cuando desarrollan un servlet. Interaccin con el Cliente Cuando un servlet acepta una llamada de un cliente, recibe dos objetos. Un ServletRequest, que encapsula la comunicacin desde el cliente al servidor. Un ServletResponse, que encapsula la comunicacin de vuelta desde el servlet hacia el cliente. ServletRequest y ServletResponse son interfaces definidos en el paquete javax.servlet. El Interface ServletRequest El Interface ServletRequest permite al servlet acceder a: Informacin como los nombres de los parmetros pasados por el cliente, el protocolo (esquema) que est siendo utilizado por el cliente, y los nombres del host remote que ha realizado la peticin y la del server que la ha recibido. El stream de entrada, ServletInputStream. Los Servlets utilizan este stream para obtener los datos desde los clientes que utilizan protocolos como los mtodos POST y PUT del HTTP. Los interfaces que extienden el interface ServletRequest permiten al servlet recibir ms datos especficos del protocolo. Por ejemplo, el interface HttpServletRequest contiene mtodos para acceder a informacin de cabecera especfica HTTP. El Interface ServletResponse El Interface ServletResponse le da al servlet los mtodos para responder al cliente. Permite al servlet seleccionar la longitud del contenido y el tipo MIME de la respuesta. Proporciona un stream de salida, ServletOutputStream, y un Writer a travs del cual el servlet puede responder datos. Los interfaces que extienden el interface ServletResponse le dan a los servlets ms capacidades especficas del protocolo. Por ejemplo, el interface HttpServletResponse contiene mtodos que permiten al servlet manipular informacin de cabecera especfica HTTP.

Ing. Joel Gonzlez Estrada

81

Diplomado Java Servlets

Capacidades Adicionales de los Servlets HTTP Las clases e interfaces descritos anteriormente construyen un servlet bsico. Los servlets HTTP tienen algunos objetos adicionales que proporcionan capacidades de seguimiento de sesin. El escritor se servlets pueden utilizar esos APIs para mantener el estado entre el servlet y el cliente persiste a travs de mltiples conexiones durante un periodo de tiempo. Los servlets HTTP tambin tienen objetos que proporcionan cookies. El API cookie se utiliza para guardar datos dentro del cliente y recuperar esos datos.

Un Servlet Sencillo
Un Servlet Sencillo La siguiente clase define completamente un servlet.
public class SimpleServlet extends HttpServlet { /** * Maneja el mtodo GET de HTPP para construir una sencilla pgina Web. */ public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out; String title = "Simple Servlet Output"; // Primero selecciona el tipo de contenidos y otros campos de cabecera de la respuesta response.setContentType("text/html"); // Luego escribe los datos de la respuesta out = response.getWriter(); out.println("<HTML><HEAD><TITLE>"); out.println(title); out.println("</TITLE></HEAD><BODY>"); out.println("<H1>" + title + "</H1>"); out.println("<P>This is output from SimpleServlet."); out.println("</BODY></HTML>"); out.close(); } }

Ing. Joel Gonzlez Estrada

82

Diplomado Java Servlets

SimpleServlet extiende la clase HttpServlet, que implementa el interface Servlet. SimpleServlet sobreescribe el mtodo doGet de la clase HttpServlet. Este mtodo es llamado cuando un cliente hace un peticin GET (el mtodo de peticin por defecto de HTTP), y resulta en una sencilla pgina HTML devuelta al cliente. Dentro del mtodo doGet o La peticin del usuario est representada por un objeto HttpServletRequest. o La respuesta al usuario esta representada por un objeto HttpServletResponse. o Como el texto es devuelto al cliente, el respuesta se enva utilizando el objeto Writer obtenido desde el objeto HttpServletResponse.

Interactuar con los Clientes


Un Servlet HTTP maneja peticiones del cliente a travs de su mtodo service. Este mtodo soporta peticiones estndar de cliente HTTP despachando cada peticin a un mtodo designado para manejar esa peticin. Por ejemplo, el mtodo service llama al mtodo doGet mostrado anteriormente en el ejemplo del servlet sencillo. Peticiones y Respuestas Esta pgina explica la utilizacin de los objetos que representan peticiones de clientes (un objeto HttpServletRequest) y las respuestas del servlet (un objeto HttpServletResponse). Estos objetos se proporcionan al mtodo service y a los mtodos que service llama para menejar peticiones HTTP. Manejar Peticiones GET y POST Los mtodos en los que delega el mtodo service las peticiones HTTP, incluyen doGet, para manejar GET, GET condicional, y peticiones de HEAD doPost, para menajar peticiones POST doPut, para manejar peticiones PUT doDelete, para manejar peticiones DELETE Por defecto, estos mtodos devuelven un error BAD_REQUEST (400). Nuestro servlet debera sobrescribir el mtodo o mtodos diseados para manejar las interacciones HTTP que soporta. Esta seccin muestra cmo implementar mtodo para manejar las peticiones HTTP ms comunes: GET y POST. Ing. Joel Gonzlez Estrada 83

Diplomado Java Servlets

El mtodo service de HttpServlet tambin llama al mtodo doOptions cuando el servlet recibe una peticin OPTIONS, y a doTrace cuando recibe una peticin TRACE. La implementacin por defecto de doOptions determina automticamente que opciones HTTP son soportadas y devuelve esa informacin. La implementacin por defecto de doTrace realiza una respuesta con un mensaje que contiene todas las cabeceras enviadas en la peticin trace. Estos mtodos no se sobreescriben normalmente.

Peticiones y Respuestas
Los mtodos de la clase HttpServlet que manejan peticiones de cliente toman dos argumentos. 1. Un objeto HttpServletRequest, que encapsula los datos desde el cliente. 2. Un objeto HttpServletResponse, que encapsula la respuesta hacia el cliente. Objetos HttpServletRequest Un objeto HttpServletRequest proporciona acceso a los datos de cabecera HTTP, como cualquier cookie encontrada en la peticin, y el mtodo HTTP con el que se ha realizado la peticin. El objeto HttpServletRequest tambin permite obtener los argumentos que el cliente enva como parte de la peticin. Para acceder a los datos del cliente El mtodo getParameter devuelve el valor de un parmetro nombrado. Si nuestro parmetro pudiera tener ms de un valor, deberamos utilizar getParameterValues en su lugar. El mtodo getParameterValues devuelve un array de valores del parmetro nombrado. (El mtodo getParameterNames proporciona los nombres de los parmetros. Para peticiones GET de HTTP, el mtodo getQueryString devuelve en un String una lnea de datos desde el cliente. Debemos analizar estos datos nosotros mismos para obtener los parmetros y los valores. Para peticones POST, PUT, y DELETE de HTTP. Si esperamos los datos en formato texto, el mtodo getReader devuelve un BufferedReader utilizado para leer la lnea de datos. Si esperamos datos binarios, el mtodo getInputStream devuelve un ServletInputStream utilizado para leer la lnea de datos.

Ing. Joel Gonzlez Estrada

84

Diplomado Java Servlets

Objetos HttpServletResponse Un objeto HttpServletResponse proporciona dos formas de devolver datos al usuario. El mtodo getWriter devuelve un Writer El mtodo getOutputStream devuelve un ServletOutputStream Se utiliza el mtodo getWriter para devolver datos en formato texto al usuario y el mtodo getOutputStream para devolver datos binarios. Si cerramos el Writer o el ServletOutputStream despus de haber enviado la respuesta, permitimos al servidor saber cuando la respuesta se ha completado. Cabecera de Datos HTTP Debemos seleccionar la cabecera de datos HTTP antes de acceder a Writer o a OutputStream. La clase HttpServletResponse proporciona mtodos para acceder a los datos de la cabecera. Por ejemplo, el mtodo setContentType selecciona el tipo del contenido. (Normalmente esta es la nica cabecera que se selecciona manualmente).

Manejo de peticiones GET y POST


Para manejar peticiones HTTP en un servlet, extendemos la clase HttpServlet y sobreescribimos los mtodos del servlet que manejan las peticiones HTTP que queremos soportar. Esta pgina ilustra el manejo de peticiones GET y POST. Los mtodos que manejan estas peticiones son doGet y doPost. Manejar Peticiones GET Manejar peticiones GET implica sobreescribir el mtodo doGet. El siguiente ejemplo muestra a BookDetailServlet haciendo esto. Los mtodos explicados en Peticiones y Respuestas se muestran en negrita. public class BookDetailServlet extends HttpServlet { public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

Ing. Joel Gonzlez Estrada

85

Diplomado Java Servlets ... // selecciona el tipo de contenido en la cabecera antes de acceder a Writer response.setContentType("text/html"); PrintWriter out = response.getWriter(); // Luego escribe la respuesta out.println("<html>" + "<head><title>Book Description</title></head>" + ...); //Obtiene el identificador del libro a mostrar String bookId = request.getParameter("bookId"); if (bookId != null) { // Y la informacin sobre el libro y la imprime ... } out.println("</body></html>"); out.close(); } ... } El servlet extiende la clase HttpServlet y sobrescribe el mtodo doGet. Dentro del mtodo doGet, el mtodo getParameter obtiene los argumentos esperados por el servlet. Para responder al cliente, el mtodo doGet utiliza un Writer del objeto HttpServletResponse para devolver datos en formato texto al cliente. Antes de acceder al writer, el ejemplo selecciona la cabecera del tipo del contenido. Al final del mtodo doGet, despus de haber enviado la respuesta, el Writer se cierra. Manejar Peticiones POST Manejar peticiones POST implica sobreescribir el mtodo doPost. El siguiente ejemplo muestra a ReceiptServlet haciendo esto. De nuevo, los mtodos explicados en Peticiones y Respuestas se muestran en negrita. public class ReceiptServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ... Ing. Joel Gonzlez Estrada 86

Diplomado Java Servlets // selecciona la cabecera de tipo de contenido antes de acceder a Writer response.setContentType("text/html"); PrintWriter out = response.getWriter(); // Luego escribe la respuesta out.println("<html>" + "<head><title> Receipt </title>" + ...); out.println("<h3>Thank you for purchasing your books from us " + request.getParameter("cardname") + ...); out.close(); } ... } El servlet extiende la clase HttpServlet y sobreescribe el mtodo doPost. Dentro del mtodo doPost, el mtodo getParameter obtiene los argumentos esperados por el servlet. Para responder al cliente, el mtodo doPost utiliza un Writer del objeto HttpServletResponse para devolver datos en formato texto al cliente. Antes de acceder al writer, el ejemplo selecciona la cabecera del tipo de contenido. Al final del mtodo doPost, despus de haber enviado la respuesta, el Writer se cierra.

Inicializar un Servlet
El mtodo init proporcionado por la clase HttpServlet inicializa el servlet y graba la inicializacin. Para hacer una inicializacin especfica de nuestro servlet, debemos sobreescribir el mtodo init siguiendo estas reglas. Si ocurre un error que haga que el servlet no pueda manejar peticiones de cliente, lanzar una UnavailableException. Un jemplo de este tipo de error es la imposibilidad de establecer una conexin requerida. No llamar al mtodo System.exit. Guardar el parmetro ServletConfig para que el mtodo getServletConfig pueda devolver su valor.

La forma ms sencilla de hacer esto es hacer que el nuevo mtodo init llame a super.init. Si grabamos el objeto nosotros mismos, debemos

Ing. Joel Gonzlez Estrada

87

Diplomado Java Servlets sobreescribir el mtodo getServletConfig para devolver el objeto desde su nueva posicin. Aqu hay un ejemplo del mtodo init. public class BookDBServlet ... { private BookstoreDB books; public void init(ServletConfig config) throws ServletException { // Store the ServletConfig object and log the initialization super.init(config); // Load the database to prepare for requests books = new BookstoreDB(); } ... } El mtodo init es bastante sencillo: llama al mtodo super.init para manejar el objeto ServletConfig y grabar la inicializacin, y seleccionar un campo privado. Si el BookDBServlet utilizar una base de datos real, en vez de simularla con un objeto, el mtodo init sera ms complejo. Aqu puedes ver el pseudo-cdigo de como podra ser ese mtodo init. public class BookDBServlet ... { public void init(ServletConfig config) throws ServletException { // Store the ServletConfig object and log the initialization super.init(config); // Open a database connection to prepare for requests try { databaseUrl = getInitParameter("databaseUrl"); ... // get user and password parameters the same way connection = DriverManager.getConnection(databaseUrl, user, password); } catch(Exception e) { throw new UnavailableException (this, "Could not open a connection to the database"); } } ... }

Ing. Joel Gonzlez Estrada

88

Diplomado Java Servlets Parmetros de Inicializacin Le segunda versin del mtodo init llama al mtodo getInitParameter. Este mtodo toma el nombre del parmetro como argumento y devuelve un String que representa su valor. (La especificacin de parmetros de inicializacin es especfica del servidor. Por ejemplo, los parmetros son especficados como una propiedad cuando un servlet se ejecuta con el ServletRunner. La pgina La Utilidad servletrunner contiene una explicacin general de las propiedades y cmo crearlas). Si por alguna razn, necesitamos obtener los nombres de los parmetros, podemos utilizar el mtodo getParameterNames.

Destruir un Servlet
El mtodo destroy proporcionado por la clase HttpServlet destruye el servlet y graba su destruccin. Para destruir cualquier recurso especfico de nuestro servlet, debemos sobreescribir el mtodo destroy. Este mtodo debera deshacer cualquier trabajo de inicializacin y cualquier estado de persistencia sincronizado con el estado de memoria actual. El siguiente ejemplo muestra el mtodo destroy que acompaa el mtodo init de la pgina anterior. public class BookDBServlet extends GenericServlet { private BookstoreDB books; ... // the init method public void destroy() { // Allow the database to be garbage collected books = null; } } Un servidor llama al mtodo destroy despus de que se hayan completado todas las llamadas de servidor, o en un servidor especfico hayan pasado un nmero de segundos, lo que ocurra primero. Si nuestro servlet manejar operaciones de larga ejecucin, los mtodos service se podran estar ejecutando cuando el servidor llame al mtodo destroy. Somos responsables de asegurarnos de que todos los threads han terminado. El mtodo destroy mostrado arriba espera a que todas las interacciones de cliente se hayan completado cuando se llama al mtodo destroy, porque el servlet no tiene operaciones de larga ejecucin.

Ing. Joel Gonzlez Estrada

89

Diplomado Java Servlets

Acceso a bases de datos mediante servlets y jdbc


Una de las tareas ms importantes y ms frecuentemente realizadas por los servlets es la conexin a bases de datos mediante JDBC. Esto es debido a que los servlets son un componente ideal para hacer las funciones de capa media en un sistema con una arquitectura de tres capas como la mostrada a continuacin.
Maquina Cliente
Applet / aplicacin Java / Formulario HTTP

Maquina Servidor

Servidor Web (+Servlet) Controlador JDBC

Capa intermedia

Servidor de Base de Datos

Protocolo de comunicacin con la Base de Datos

Controlador de Base de Datos

Este modelo presenta la ventaja de que el nivel intermedio mantiene en todo momento el control del tipo de operaciones que se realizan contra la base de datos, y adems, est la ventaja adicional de que los drivers JDBC no tienen que residir en la mquina cliente, lo cual libera al usuario de la instalacin de cualquier tipo de driver. En cualquier caso, tanto el Servidor http como el Servidor de Base de Datos pueden estar en la misma mquina, aunque en sistemas empresariales de cierta importancia esto no suele ocurrir con frecuencia. JDBC (Java DataBase Connectivity) es una parte del API de Java que proporciona clases para conectarse con bases de datos. Dichas clases forman parte del package java.sql, disponible en el jdk. El nombre JDBC es fonticamente similar a ODBC (Open DataBase Connectivity), que es el estndar ms extendido para conectar PCs con bases de datos.

Ing. Joel Gonzlez Estrada

90

Diplomado Java Servlets SQL (Structured Query Language) es un lenguaje estndar de alto nivel que permite leer, escribir y en general gestionar bases de datos. Los ejemplos que se presentan en este apartado hacen uso de estos conceptos de una forma muy simple, pero perfectamente vlida para lo que se pretende de los servlets en este documento. La arquitectura de los servlets hace que la escritura de aplicaciones que se ejecuten en el servidor sea relativamente sencilla y que sean aplicaciones muy robustas. La principal ventaja de utilizar servlets es que se puede programar sin dificultad la informacin que va a proporcionar entre peticiones del cliente. Es decir, se puede tener constancia de lo que el usuario ha hecho en peticiones anteriores. Adems, cada objeto del servlet se ejecuta dentro de un thread de Java, por lo que se pueden controlar las interacciones entre mltiples objetos; y al utilizar el identificador de sincronizacin, se puede asegurar que los servlets del mismo tipo esperan a que se produzca la misma transaccin, antes de procesar la peticin; esto puede ser especialmente til cuando mucha gente intenta actualizar al mismo tiempo la base de datos, o si hay mucha gente pendiente de consultas a la base de datos cuando est en pleno proceso de actualizacin.

Ejemplo 1: Acceso a una base de datos Microsoft


El siguiente ejemplo muestra cmo compartir una nica conexin entre todas las peticiones de servicio. Antes de comenzar es necesario realizar los siguientes pasos para construir nuestra base de datos, el cdigo fuente Servlet y la pgina Web que recolectara la informacin: Se deber disponer de Microsoft Access. Con dicho programa se debe crear una nueva base de datos, llamada por ejemplo ServletOpinion2.mdb. En dicho archivo habr que crear una tabla vaca llamada Opiniones_Recogidas cuyos campos se llamen nombre, apellidos, opinion y comentarios, que sean respectivamente de tipo text, text, text y memo. A continuacin se debe configurar un driver para que pueda conectarse con dicha base de datos. Esto se hace a travs del ODBC. Para ello se abre el Panel de Control ODBC y se elige la carpeta System DSN. A continuacin se preiona el botn Add y se selecciona el driver de Microsoft Access. Despus clic en el botn Finish. En este momento aparece un nuevo cuadro de dilogo con un campo llamado Data Source Name en el que se debe indicar el nombre con el que se quiere hacer referencia a la base de datos, en este caso sera el nombre de 91

Ing. Joel Gonzlez Estrada

Diplomado Java Servlets opinion. El campo Description permite introducir un breve texto descriptivo. presionado en el botn Select se debe elegir el fichero ServletOpinion2.mdb. Con esto queda configurado el ODBC. Ya realizado lo anterior es necesario configurar las variables de entorno, que al momento de compilar el Servlet sean encontradas las clases del paquete de Java Web Server esto de se hace de la siguiente forma: o En Windows 2000: Las propiedades del sistema, en la ficha avanzado clic en el botn Variables de entorno. La sesin variables de usuario para administrador agregara una nueva, nombre de la variable ser classpath y en valor de la variable introducir la siguiente ruta C:\jws\lib\servlet.jar (jws es el directorio donde esta instalo cambiara dependiendo durante la instalacin el destino cual eligi usted). o Windows98, Mellenium: modificara el archivo autoexec.bat colocando en la variable classpath la ruta c:\jws\lib\servlet.jar Los archivos empleados que realizaran la conexin son la clase ServletOpinion2 que se conectar con la base de datos mencionada escribiendo en ella las opiniones de los usuarios. Dichas opiniones pueden ser recogidas con el fichero MiServlet2.htm que se incluye a continuacin de ServletOpinion2.java. Es importante prestar atencin a las lneas en negrita, en las que se concentran los conceptos fundamentales de este ejemplo.

Al momento de guardar los archivos deber de hacerlos de la siguiente forma: El Servlet compilado (ServletOpinion2. class) lo guardara dentro del directorio de Java Web Server en el directorio servlets. C:\jws\servlets La pagina Web dentro del directorio public_html de la carpeta de Java Web Server.

Ejecucin de la aplicacin
Al compilador su Servlet ser en JDK, cuando ya a guardo sus archivos en su respectivo lugar como se describi anteriormente, es momento de iniciar el servidor ejecutando el demonio de Java Web Server, este demonio se encuentra en la carpeta bin y es el archivo cuyo nombre tiene httpd.exe. Deber mantener la ventana de este programa abierto que proporcionara el servicio. Desde el navegador de Internet tecleara la siguiente direccin: Ing. Joel Gonzlez Estrada 92

Diplomado Java Servlets http://nombre_servidor:8080/MiServlet2.htm Se abrir la pgina del formulario que enviara los datos que tecleo al Servlet ServletOpinion2. En este ejemplo cabe resaltar lo siguiente: La conexin con la base de datos se hace por medio de un driver que convierte de JDBC a ODBC. La carga de dicho driver JDBC-ODBC tiene lugar durante la inicializacin del servlet, al igual que la conexin con la base de datos. Basta pues con una nica conexin a la base de datos para satisfacer todas las peticiones de los clientes (a priori, ya que puede ser necesario tener ms conexiones abiertas si se espera un trfico intenso). Adems, se ha supuesto que el DSN del Sistema de ODBC de 32 bits contena la entrada opinion. A su vez, en el mtodo destroy() se ha implementado la desconexin de la base de datos, de forma que no quede recurso alguno ocupado una vez que el servlet haya sido descargado. En el mtodo doPost() se ha comprobado que la adquisicin de los parmetros del formulario era correcta, enviando un error al cliente en caso contrario. Tambin podra haberse comprobado que ningn campo estuviera vaco. El mtodo actualizarBaseDeDatos() es el que se encarga de la introduccin de los valores en la base de datos, mientras que el mtodo devolverPaginaHTML() se encarga de la presentacin en pantalla de los valores ledos. En la ejecucin del query en actualizarBaseDeDatos() se tienen muy en cuenta posibles excepciones que pudieran surgir y se devuelve como valor de retorno un cdigo de error distinto de cero para esos casos. Asimismo, mediante el bloque finally se consigue cerrar siempre el Statement tanto si se produce el error como si no, liberando recursos del sistema de esa manera. Tngase especial cuidado con la sintaxis del query, y en especial con las comillas simples en que debe ir envuelto cada String. Tras mostrar en pantalla los datos recogidos, se comprueba si se ha producido alguna actualizacin. Si este es el caso, se informa al cliente de esta circunstancia, mostrando un mensaje de error en caso contrario.

Cdigo del Servlet ServletOpinion2. java


import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.sql.*; public class ServletOpinion2 extends HttpServlet {

Ing. Joel Gonzlez Estrada

93

Diplomado Java Servlets


// Declaracin de variables miembro private String nombre = null; private String apellidos = null; private String opinion = null; private String comentarios = null; // Referencia a un objeto de la interface java.sql.Connection Connection conn = null; // El siguiente mtodo se ejecuta una nica vez (al ser inicializado el servlet // por primera vez) // Se suelen inicializar variables y ejecutar operaciones costosas en tiempo // de ejecucin (abrir ficheros, conectar con bases de datos, etc) public void init (ServletConfig config) throws ServletException { // Llamada al mtodo init() de la superclase (GenericServlet) // As se asegura una correcta inicializacin del servlet super.init(config); // dsn (Data Source Name) de la base de datos String dsn = new String("jdbc:odbc:opinion"); // Carga del Driver del puente JDBC-ODBC try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch(ClassNotFoundException ex) { System.out.println("Error al cargar el driver"); System.out.println(ex.getMessage()); } // Establecimiento de la conexin con la base de datos try { conn = DriverManager.getConnection(dsn, "", ""); } catch (SQLException sqlEx) { System.out.println("Se ha producido un error al" + " establecer la conexin con: " + dsn); System.out.println(sqlEx.getMessage()); } System.out.println("Iniciando ServletOpinion (version BD)..."); } // fin del mtodo init() // Este mtodo es llamado por el servidor web al // "apagarse" (al hacer shut down). // Sirve para proporcionar una correcta desconexin de una base de datos, // cerrar ficheros abiertos, etc. public void destroy () { super.destroy(); System.out.println("Cerrando conexion..."); try { conn.close(); } catch(SQLException ex){ System.out.println("No se pudo cerrar la conexion"); System.out.println(ex.getMessage()); } } // fin del mtodo destroy()

Ing. Joel Gonzlez Estrada

94

Diplomado Java Servlets


// Mtodo de llamada mediante un HTTP POST public void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { boolean hayError = false; // adquisicin de los valores del formulario if(req.getParameter("nombre")!=null) nombre = req.getParameter("nombre"); else hayError=true; if(req.getParameter("apellidos")!=null) apellidos = req.getParameter("apellidos"); else hayError = true; if(req.getParameter("opinion")!=null) opinion = req.getParameter("opinion"); else hayError = true; if(req.getParameter("comentarios")!=null) comentarios = req.getParameter("comentarios"); else hayError = true; // Mandar al usuario los valores adquiridos // (Si no se ha producido error) if(!hayError) { if (actualizarBaseDeDatos() == 0) devolverPaginaHTML(resp); else resp.sendError(500, "Se ha producido un error"+ " al actualizar la base de datos"); } else resp.sendError(500, "Se ha producido un error"+ " en la adquisicin de parmetros"); } // fin doPost() public int actualizarBaseDeDatos() { // crear un statement de SQL Statement stmt=null; int numeroFilasActualizadas=0; // Ejecucin del query de actualizacin de la base de datos try { stmt = conn.createStatement(); numeroFilasActualizadas = stmt.executeUpdate("INSERT INTO"+ " Opiniones_Recogidas VALUES"+ "('"+nombre+"','"+apellidos+"','"+opinion+ "','"+comentarios+"')"); if(numeroFilasActualizadas!=1) return -1; } catch (SQLException sql) { System.out.println("Se produjo un error creando Statement");

Ing. Joel Gonzlez Estrada

95

Diplomado Java Servlets


System.out.println(sql.getMessage()); return -2; } // Se cierra el Statement if(stmt!=null) { try { stmt.close(); } catch(SQLException e){ System.out.println("Error cerrando Statement"); System.out.println(e.getMessage()); return -3; } } return 0; } // fin finally } // fin mtodo actualizarBaseDeDatos() public void devolverPaginaHTML(HttpServletResponse resp) { // Se obtiene un PrintWriter donde escribir (slo para mandar texto) PrintWriter out=null; try { out=resp.getWriter(); } catch (IOException io) { System.out.println("Se ha producido una excepcion"); } // Se establece el tipo de contenido MIME de la respuesta resp.setContentType("text/html"); // Se mandan los valores out.println("<html>"); out.println("<head>"); out.println("<title>Valores recogidos en el formulario</title>"); out.println("</head>"); out.println("<body>"); out.println("<b><font size=+2>Valores recogidos del"); out.println("formulario: </font></b>"); out.println("<p><font size=+1><b>Nombre: </b>"+nombre+"</font>"); out.println("<br><fontsize=+1><b>Apellido : </b>" +apellidos+"</font><b><font size=+1></font></b>"); out.println("<p><font size=+1><b>Opini&oacute;n: "+ "</b><i>"+opinion+"</i></font>"); out.println("<br><font size=+1><b>Comentarios: </b>" +comentarios+"</font>"); out.println("<P><HR><CENTER><H2>Valores actualizados "+ "con xito</CENTER>"); out.println("</body>"); out.println("</html>"); // Se fuerza la descarga del buffer y se cierra el PrintWriter out.flush(); out.close();

Ing. Joel Gonzlez Estrada

96

Diplomado Java Servlets


} // fin de devolverPaginaHTML() // Funcin que permite al servidor web obtener una // pequea descripcin del servlet, qu // cometido tiene, nombre del autor, comentarios adicionales, etc. public String getServletInfo() { return "Este servlet lee los datos de un formulario "+ "y los introduce en una base da datos"; } // fin de getServletInfo() } // fin de la clase servletOpinion2

Pagina Web
<!-- MiServlet2.htm --> <HTML> <HEAD><TITLE>Enve su opinin</TITLE></HEAD> <BODY> <H2>Por favor, envenos su opinin acerca de este sitio web</H2> <FORM ACTION="http://localhost:8080/servlet/ServletOpinion2" METHOD="POST"> Nombre: <INPUT TYPE="TEXT" NAME="nombre" SIZE=15><BR> Apellidos: <INPUT TYPE="TEXT" NAME="apellidos" SIZE=30><P> Opinin que le ha merecido este sitio web<BR> <INPUT TYPE="RADIO" CHECKED NAME="opinion"VALUE="Buena">Buena<BR> <INPUT TYPE="RADIO" NAME="opinion" VALUE="Regular">Regular<BR> <INPUT TYPE="RADIO" NAME="opinion" VALUE="Mala">Mala<P> Comentarios <BR> <TEXTAREA NAME="comentarios" ROWS=6 COLS=40> </TEXTAREA><P> <INPUT TYPE="SUBMIT" NAME="botonEnviar" VALUE="Enviar"> <INPUT TYPE="RESET" NAME="botonLimpiar" VALUE="Limpiar"> </FORM> </BODY> </HTML>

Practicas
Tomando las mismas bases del cdigo del Servlet. Ccodifique 3 servlets mas que realicen las operaciones de consulta, actualizacin y eliminacin de registros a la misma base de datos que se ha empleando. La metodologa al realizar esas operaciones a la base de datos se dejaran a su criterio. Disear e implementar un sistema de base de datos de un control escolar a travs del web. Que manejar las siguientes tablas: Ing. Joel Gonzlez Estrada 97

Diplomado Java Servlets - Alumnos (id_alum, nombre, apellido, direccion) - Profesor (id_prof, nombre, apellido, grado, fecha_ingreso, domicilio) - Materias (id_mat, nombre, creditos) - Kardex(id_alum, id_prof, id_mat, calificacion) Realizar los Servlets necesarios para realizar las operaciones bsicas a la base de datos.

Ing. Joel Gonzlez Estrada

98

Diplomado Java Servlets

Autor: Ing. Joel Gonzlez Estrada Maestra en Tecnologas de la Informacin

Ing. Joel Gonzlez Estrada

99

También podría gustarte