Está en la página 1de 191

Diplomado Webmaster Avanzado

NDICE
1 Introduccin a Java.............................................................................................................. 5 1.1 Qu es JAVA? ............................................................................................................... 5 1.2 La Simplicidad de Java ................................................................................................... 5 1.3 Java posee bibliotecas de clases estndares .................................................................... 6 1.4 Java es multiplataforma................................................................................................... 6 1.5 El Look-and-Feel............................................................................................................. 7 1.6 C es poco robusto ............................................................................................................ 7 1.7 Java s es robusto............................................................................................................. 8 1.8 Java es flexible ................................................................................................................ 8 1.9 Java administra automticamente la memoria ................................................................ 9 1.10 Programacin Orientada a Objetos ............................................................................... 10 1.11 Mecanismos bsicos de la POO .................................................................................... 11 1.12 Resumen ........................................................................................................................ 12 2 Programando JAVA .......................................................................................................... 14 2.1 El compilador y el intrprete de Java ............................................................................ 14 2.2 Estructura de un programa bsico en java..................................................................... 14 2.2.1 Tu Primera Aplicacin de Java en Windows ............................................................ 15 2.2.2 Crear tu Primer Applet .............................................................................................. 16 2.3 Variables y Tipos .......................................................................................................... 17 Tipos primitivos ............................................................................................................ 19 2.4 Expresiones y operadores.............................................................................................. 20 Aritmtica...................................................................................................................... 20 Operadores unarios sobre expresiones numricas......................................................... 22 Incremento y decrementos ............................................................................................ 23 Operadores de comparaciones....................................................................................... 23 Operadores entre valores booleanos (operadores lgicos) ............................................ 24 Conversiones: cast......................................................................................................... 25 Precedencia de Operadores ........................................................................................... 26 2.5 Declaracin de variables ............................................................................................... 26 2.6 Arreglos, condicionales y ciclos.................................................................................... 28 2.6.1 Arreglos..................................................................................................................... 29 2.6.2 Condicionales ............................................................................................................ 30 2.6.2.1 Condicionales if......................................................................................................... 31 2.6.2.2 Condicionales switch................................................................................................. 32 2.6.3 Ciclos......................................................................................................................... 33 2.6.3.1 Ciclo for..................................................................................................................... 33 2.6.3.2 Ciclo while...do ......................................................................................................... 34 2.6.3.3 Ciclo do...while ......................................................................................................... 35 2.7 Trabajando con objetos ................................................................................................. 36 2.8 El cuerpo de una Clase Java.......................................................................................... 40 2.9 Implementar Mtodos Java ........................................................................................... 41 2.10 Control de acceso los componentes de la Clase............................................................ 43 2.11 Applets .......................................................................................................................... 46 2.12 Grficos ......................................................................................................................... 49 1

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado 2.13 Componentes bsicos de la intercaz de usuario AWT ................................................. 53 2.13.1 Botones...................................................................................................................... 53 2.13.2 Etiquetas .................................................................................................................... 58 2.13.3 Listas ......................................................................................................................... 59 2.13.4 Campo de Texto ........................................................................................................ 61 2.13.5 reas de Texto .......................................................................................................... 62 2.13.6 Canvas ....................................................................................................................... 64 2.13.7 Barras de desplazamiento.......................................................................................... 65 2.14 Practicas ........................................................................................................................ 68 3 Servlets .............................................................................................................................. 77 3.1 Introduccin a los Servlets ............................................................................................ 77 3.2 Porqu se afirma que los servlets podrn sustituir a los CGI's? .................................. 78 3.3 Ventajas de los Servlets................................................................................................. 79 3.4 Ejemplos de aplicacin de los servlets .......................................................................... 80 3.5 Arquitectura del paquete Servlets ................................................................................. 81 3.6 Un Servlet Sencillo........................................................................................................ 83 3.7 Interactuar con los Clientes ........................................................................................... 84 3.8 Peticiones y Respuestas................................................................................................. 85 3.9 Manejo de peticiones GET y POST .............................................................................. 86 3.10 Inicializar un Servlet ..................................................................................................... 88 3.11 Destruir un Servlet ........................................................................................................ 90 3.12 Acceso a bases de datos mediante servlets y jdbc......................................................... 91 3.13 Ejemplo 1: Acceso a una base de datos Microsoft........................................................ 92 3.13.1 Ejecucin de la aplicacin......................................................................................... 93 3.13.2 Cdigo del Servlet ServletOpinion2. java................................................................. 94 3.13.3 Pagina Web ............................................................................................................... 98 3.14 Practicas ........................................................................................................................ 98 4 Programando VBScript ................................................................................................... 100 4.1 Introduccin a VBScript.............................................................................................. 100 4.2 Variables y Tipo de variables...................................................................................... 100 4.3 Entrada y Salida de datos ............................................................................................ 106 4.4 Condicionales .............................................................................................................. 109 4.4.1 Sentencias IF... THEN... ELSE ............................................................................... 110 4.4.2 Condicionales Mltiples SELECT CASE............................................................... 114 4.5 Ciclos........................................................................................................................... 115 4.5.1 FOR.... NEXT ......................................................................................................... 115 4.5.2 DO WHILE... LOOP............................................................................................... 117 4.5.3 DO UNTIL... LOOP................................................................................................ 118 4.5.4 Rompiendo Bucles .................................................................................................. 119 4.6 Procedimientos yFunciones......................................................................................... 120 4.6.1 Funciones ................................................................................................................ 121 4.6.2 Procedimientos ........................................................................................................ 124 4.7 Funciones del Lenguaje............................................................................................... 126 4.7.1 Ejemplos.................................................................................................................. 134 4.8 Jerarqua de Objetos en POO ...................................................................................... 138 4.8.1 Propiedades y mtodos de los objeto ...................................................................... 142 4.8.2 Practicas .................................................................................................................. 147 Instituto de Computacin Activa de Mxico S.C. 2

Diplomado Webmaster Avanzado 5 ASP (Active Server Page) ............................................................................................... 153 5.1 Introduccin a ASP ..................................................................................................... 153 5.2 Iniciando la programacin de ASP.............................................................................. 153 5.3 Condicionales IF ......................................................................................................... 155 5.4 Ciclo FOR ................................................................................................................... 157 5.5 DO WHILE/LOOP...................................................................................................... 159 5.6 Objeto Request ............................................................................................................ 159 5.6.1 Transferir variables por URL .................................................................................. 160 5.6.2 Transferir variables por formulario ......................................................................... 161 5.7 Objeto Response.......................................................................................................... 162 5.8 Base de Datos con ASP............................................................................................... 164 5.8.1 Creacin de un Driver para la BD........................................................................... 165 5.8.2 Consultas ................................................................................................................. 165 5.8.3 Altas ........................................................................................................................ 168 5.8.4 Modificaciones ........................................................................................................ 170 5.8.5 Bajas ........................................................................................................................ 172 5.9 Practica ........................................................................................................................ 174

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado

www.icam.com.mx

Diplomado Webmaster Avanzado


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.

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado 1

Introduccin a Java
1.1 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++.

1.2 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.

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado

1.3 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.

1.4 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.

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado

1.5 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.

1.6 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.

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado

1.7 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.

1.8 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. 8

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado 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.

1.9 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

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado 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.

1.10

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. 10

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado 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.

1.11

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.

Instituto de Computacin Activa de Mxico S.C.

11

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

1.12

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.

Instituto de Computacin Activa de Mxico S.C.

12

Diplomado Webmaster Avanzado

www.icam.com.mx

Diplomado Webmaster Avanzado


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.

Instituto de Computacin Activa de Mxico S.C.

13

Diplomado Webmaster Avanzado

2 Programando JAVA
2.1 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 Java

Cdigo de bytes de Java (Independencia de plataforma)

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

Compilacin de programa JAVA

2.2 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> } }

Instituto de Computacin Activa de Mxico S.C.

14

Diplomado Webmaster Avanzado 2.2.1 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. 15

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado 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>

2.2.2

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); } }

Instituto de Computacin Activa de Mxico S.C.

16

Diplomado Webmaster Avanzado 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

2.3 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 identificador tipo

Instituto de Computacin Activa de Mxico S.C.

17

Diplomado Webmaster Avanzado 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 int, short, byte, long char, boolean float, double referencias a Objetos Strings Arreglos otros objetos

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.

Instituto de Computacin Activa de Mxico S.C.

18

Diplomado Webmaster Avanzado 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 boolean char float double Bits 32 16 8 64 1 16 32 64 Rango -2**31 .. 2**31-1 -2**15 .. 2**15-1 -2**7 .. 2**7-1 -2**63 .. 2**63-1 n/a n/a IEEE IEEE Ejemplos 0, 1, 5, -120, ... 0, 1, 5, -120, ... 0, 1, 5, -120, ... 0, 1, 5, -120, ... false, true 'a', 'A', '0', '*', ... 1.2 1.2

Instituto de Computacin Activa de Mxico S.C.

19

Diplomado Webmaster Avanzado 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

2.4 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. Aritmtica Java tiene 5 operadores para la aritmtica bsica como se muestra en la tabla siguiente.

Smbolo Instituto de Computacin Activa de Mxico S.C.

Operacin

Ejemplo 20

Diplomado Webmaster Avanzado

+ * / %

Suma Resta Multiplicacin Divisin Resto

3+4 57 5*5 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; 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 += -= Uso op1 += op2 op1 -= op2 Equivale a op1 = op1 + op2 op1 = op1 - op2 21

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado *= /= %= &= |= ^= &lt;&lt;= &gt;&gt;= &gt;&gt;&gt;= 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 float f= 1.0 + a; // a se convierte a float

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

Instituto de Computacin Activa de Mxico S.C.

22

Diplomado Webmaster Avanzado

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 postdecremento Argumento int | short | byte | long int | short | byte | long int | short | byte | long 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; 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

Instituto de Computacin Activa de Mxico S.C.

23

Diplomado Webmaster Avanzado != 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 op1 && op2 op1 || op2 ! op Devuelve true si op1 y op2 son verdaderos 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)

Instituto de Computacin Activa de Mxico S.C.

24

Diplomado Webmaster Avanzado Operacin exp && exp exp || exp ! exp Significado y-lgico 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

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

Instituto de Computacin Activa de Mxico S.C.

25

Diplomado Webmaster Avanzado 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) */% +< > <= >= == != ! || &&

2.5 Declaracin de variables


Declarar Variables Java 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.

Instituto de Computacin Activa de Mxico S.C.

26

Diplomado Webmaster Avanzado

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. 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 {

Instituto de Computacin Activa de Mxico S.C.

27

Diplomado Webmaster Avanzado 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 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; ... }

2.6 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.

Instituto de Computacin Activa de Mxico S.C.

28

Diplomado Webmaster Avanzado

2.6.1

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; 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

Instituto de Computacin Activa de Mxico S.C.

29

Diplomado Webmaster Avanzado 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(); a.printNames(); System.out.println("----------"); a.lastNames[0] = "Ritchie"; a.lastNames[1] = "Hopper"; a.lastNames[2] = "Stroustrup"; a.lastNames[3] = "Gosling"; a.printNames(); } }

2.6.2

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.

Instituto de Computacin Activa de Mxico S.C.

30

Diplomado Webmaster Avanzado void bloque { int x=0; { //inicio del bloque int y = 50; Sistem.out,print(dentro del bloque: x= +x+ y= +y); } // fin del bloque }

2.6.2.1 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...> } 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); Instituto de Computacin Activa de Mxico S.C. 31

Diplomado Webmaster Avanzado 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

2.6.2.2 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. 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 Instituto de Computacin Activa de Mxico S.C. 32

Diplomado Webmaster Avanzado 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); System.out.println("415 converts to " + num); } } +

2.6.3

Ciclos

2.6.3.1 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. 33

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado 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(); } }

2.6.3.2 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 };

Instituto de Computacin Activa de Mxico S.C.

34

Diplomado Webmaster Avanzado


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("]"); } }

2.6.3.3 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. 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); } }

Instituto de Computacin Activa de Mxico S.C.

35

Diplomado Webmaster Avanzado

2.7 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 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

Instituto de Computacin Activa de Mxico S.C.

36

Diplomado Webmaster Avanzado 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 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

Instituto de Computacin Activa de Mxico S.C.

37

Diplomado Webmaster Avanzado 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 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 Instituto de Computacin Activa de Mxico S.C. 38

Diplomado Webmaster Avanzado 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); 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.

Instituto de Computacin Activa de Mxico S.C.

39

Diplomado Webmaster Avanzado

2.8 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 { 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.

Instituto de Computacin Activa de Mxico S.C.

40

Diplomado Webmaster Avanzado

2.9 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 { ... 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

Instituto de Computacin Activa de Mxico S.C.

41

Diplomado Webmaster Avanzado 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 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 Instituto de Computacin Activa de Mxico S.C. 42

Diplomado Webmaster Avanzado 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) 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

2.10

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

Instituto de Computacin Activa de Mxico S.C.

43

Diplomado Webmaster Avanzado 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 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

Instituto de Computacin Activa de Mxico S.C.

44

Diplomado Webmaster Avanzado } } 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 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 Instituto de Computacin Activa de Mxico S.C. 45

Diplomado Webmaster Avanzado a.metodoPublico(); } } 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(). // legal

2.11

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 { .... }

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.

Instituto de Computacin Activa de Mxico S.C.

46

Diplomado Webmaster Avanzado

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) 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. "; } Instituto de Computacin Activa de Mxico S.C. 47

Diplomado Webmaster Avanzado 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. 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");

Instituto de Computacin Activa de Mxico S.C.

48

Diplomado Webmaster Avanzado } 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.

2.12

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)

Instituto de Computacin Activa de Mxico S.C.

49

Diplomado Webmaster Avanzado 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. 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

Instituto de Computacin Activa de Mxico S.C.

50

Diplomado Webmaster Avanzado


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); } }

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)

Instituto de Computacin Activa de Mxico S.C.

51

Diplomado Webmaster Avanzado 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() { 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);

Instituto de Computacin Activa de Mxico S.C.

52

Diplomado Webmaster Avanzado


// 150% x, 25% y g.drawImage(bugimg, 10, iheight + 30, (int)(iwidth * 1.5), iheight / 4, this); } }

Muestra la salida del applet.

2.13

Componentes bsicos de la intercaz de usuario AWT


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); }

2.13.1 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"); Instituto de Computacin Activa de Mxico S.C. 53

Diplomado Webmaster Avanzado

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" ); 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. Instituto de Computacin Activa de Mxico S.C. 54

Diplomado Webmaster Avanzado 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 ) { 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.

Instituto de Computacin Activa de Mxico S.C.

55

Diplomado Webmaster Avanzado

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() ); 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() { Instituto de Computacin Activa de Mxico S.C. 56

Diplomado Webmaster Avanzado 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; 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 ); } } Instituto de Computacin Activa de Mxico S.C. 57

Diplomado Webmaster Avanzado 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.

2.13.2 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:

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 ); } }

Instituto de Computacin Activa de Mxico S.C.

58

Diplomado Webmaster Avanzado 2.13.3 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() { 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; } }

Instituto de Computacin Activa de Mxico S.C.

59

Diplomado Webmaster Avanzado

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 ); 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 ) ) { Instituto de Computacin Activa de Mxico S.C. 60

Diplomado Webmaster Avanzado 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.

2.13.4 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. 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;

Instituto de Computacin Activa de Mxico S.C.

61

Diplomado Webmaster Avanzado 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 ) ) 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.

2.13.5 reas de Texto Java, a travs del AWT, permite incorporar texto multilnea dentro de zonas de texto (TextArea). Los objetos TextArea se utilizan para

Instituto de Computacin Activa de Mxico S.C.

62

Diplomado Webmaster Avanzado 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 ); } 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 Instituto de Computacin Activa de Mxico S.C. 63

Diplomado Webmaster Avanzado generar un evento al pulsarlo que har que se recoja el texto que haya escrito en el rea de texto que constituye el applet.

2.13.6 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; 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;

Instituto de Computacin Activa de Mxico S.C.

64

Diplomado Webmaster Avanzado } } 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; } }

2.13.7 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;

Instituto de Computacin Activa de Mxico S.C.

65

Diplomado Webmaster Avanzado 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.

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 Instituto de Computacin Activa de Mxico S.C. 66

Diplomado Webmaster Avanzado 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 ); 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 ); } } Instituto de Computacin Activa de Mxico S.C. 67

Diplomado Webmaster Avanzado

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.

2.14

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 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;

Instituto de Computacin Activa de Mxico S.C.

68

Diplomado Webmaster Avanzado 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);

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 Instituto de Computacin Activa de Mxico S.C. 69

Diplomado Webmaster Avanzado 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); 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: Instituto de Computacin Activa de Mxico S.C. 70

Diplomado Webmaster Avanzado 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 RENGLON System.in.read(); una tecla "); // NO SALTA

// 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 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.

Instituto de Computacin Activa de Mxico S.C.

71

Diplomado Webmaster Avanzado 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 ); // 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); }

Instituto de Computacin Activa de Mxico S.C.

72

Diplomado Webmaster Avanzado


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 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(":");

Instituto de Computacin Activa de Mxico S.C.

73

Diplomado Webmaster Avanzado


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 RECTANGULARES x_seg = radios * Math.cos( arco_seg / FACTOR ); y_seg = radios * Math.sin( arco_seg / FACTOR ); POLARES A

// 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 ); 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);

Instituto de Computacin Activa de Mxico S.C.

74

Diplomado Webmaster Avanzado


g.drawLine((int)x_centro, (int)y_centro, (int)(x_centro - x_hora) ,(int)(y_centro - y_hora)); } }

Instituto de Computacin Activa de Mxico S.C.

75

Diplomado Webmaster Avanzado

www.icam.com.mx

Diplomado Webmaster Avanzado


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.

Instituto de Computacin Activa de Mxico S.C.

76

Diplomado Webmaster Avanzado

3 Servlets
3.1 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.

Instituto de Computacin Activa de Mxico S.C.

77

Diplomado Webmaster Avanzado

3.2 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.

Instituto de Computacin Activa de Mxico S.C.

78

Diplomado Webmaster Avanzado

3.3 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

Instituto de Computacin Activa de Mxico S.C.

79

Diplomado Webmaster Avanzado 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.

3.4 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.

Instituto de Computacin Activa de Mxico S.C.

80

Diplomado Webmaster Avanzado

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.

3.5 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

Instituto de Computacin Activa de Mxico S.C.

81

Diplomado Webmaster Avanzado 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.

Instituto de Computacin Activa de Mxico S.C.

82

Diplomado Webmaster Avanzado 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.

3.6 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(); } }

Instituto de Computacin Activa de Mxico S.C.

83

Diplomado Webmaster Avanzado 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.

3.7 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.

Instituto de Computacin Activa de Mxico S.C.

84

Diplomado Webmaster Avanzado 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.

3.8 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.

Instituto de Computacin Activa de Mxico S.C.

85

Diplomado Webmaster Avanzado 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).

3.9 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 { ... // selecciona el tipo de contenido en la cabecera antes de acceder a Writer response.setContentType("text/html"); PrintWriter out = response.getWriter();

Instituto de Computacin Activa de Mxico S.C.

86

Diplomado Webmaster Avanzado

// 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 { ... // selecciona la cabecera de tipo de contenido antes de acceder a Writer response.setContentType("text/html"); PrintWriter out = response.getWriter();

Instituto de Computacin Activa de Mxico S.C.

87

Diplomado Webmaster Avanzado // 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.

3.10

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 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;

Instituto de Computacin Activa de Mxico S.C.

88

Diplomado Webmaster Avanzado

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"); } } ... }

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 Instituto de Computacin Activa de Mxico S.C. 89

Diplomado Webmaster Avanzado 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.

3.11

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.

Instituto de Computacin Activa de Mxico S.C.

90

Diplomado Webmaster Avanzado

3.12

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. 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.

Instituto de Computacin Activa de Mxico S.C.

91

Diplomado Webmaster Avanzado 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.

3.13

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 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:

Instituto de Computacin Activa de Mxico S.C.

92

Diplomado Webmaster Avanzado 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.

3.13.1 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: 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

Instituto de Computacin Activa de Mxico S.C.

93

Diplomado Webmaster Avanzado 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.

3.13.2 Cdigo del Servlet ServletOpinion2. java


import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.sql.*; public class ServletOpinion2 extends HttpServlet { // 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)

Instituto de Computacin Activa de Mxico S.C.

94

Diplomado Webmaster Avanzado


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() // 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)

Instituto de Computacin Activa de Mxico S.C.

95

Diplomado Webmaster Avanzado


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"); 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());

Instituto de Computacin Activa de Mxico S.C.

96

Diplomado Webmaster Avanzado


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(); } // 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

Instituto de Computacin Activa de Mxico S.C.

97

Diplomado Webmaster Avanzado 3.13.3 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>

3.14

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: - 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.

Instituto de Computacin Activa de Mxico S.C.

98

Diplomado Webmaster Avanzado

www.icam.com.mx

Diplomado Webmaster Avanzado


4. Programando VBScript
Al final del capitulo el alumno ser capaz de... Diseo y estructura de VBScript Manejo de estructuras condicionales y ciclos Creacin de Funciones y procedimientos Uso y empleo de objetos. Uso de funciones de VBScrip Construccin de paginas Web dinmicas mediante Scripts

Comprueba tu avance y marca con una los objetivos alcanzados.

Instituto de Computacin Activa de Mxico S.C.

99

Diplomado Webmaster Avanzado

4 Programando VBScript
4.1 Introduccin a VBScript
El Visual Basic Script (en adelante VBScript) es un lenguaje de script, directamente derivado de Visual Basic. Los lenguajes de script son versiones recortadas de otros lenguajes. Estas versiones se usan para su integracin en pginas web. Un cdigo escrito en un lenguaje de script se incorpora directamente dentro de un cdigo HTML y se ejecuta interpretado, no compilado. Para incorporar un fragmento de cdigo script en una pgina HTML se introduce el script entre los tags <SCRIPT> y <SCRIPT> . Dos son los lenguajes de script que hay en la actualidad: el VBScript (derivado de Visual Basic) y el JavaScript (derivado de Java. Para insertar cdigo VBScript en una pgina HTML aadiremos al tag <SCRIPT> el parmetro LANGUAGE="VBScript" , que determina cual de los lenguajes de script utilizamos. Cuando llega el momento de la ejecucin, se ejecuta el cdigo compilado, no el cdigo original del programa (llamado cdigo nativo o cdigo fuente). Cada sistema tiene sus ventajas e inconvenientes. Vemoslos: El cdigo en VBScript puede, adems, estar diseado para su ejecucin en el lado del cliente o en el del servidor. La diferencia es que un cdigo que se ejecuta en el lado del servidor no es visible en el lado del cliente. Este recibe los resultados, pero no el cdigo. El cdigo que se debe de ejecutar en el lado del servidor estar incluido en la pgina web correspondiente entre los tags <% y %>. Adems habr que renombrar la pgina para aplicarle la extensin .asp (Active Server Page -pgina activa en servidor-). El funcionamiento intrnseco de la ASP's est fuera de los objetivos de ste temario, aunque lo comentaremos por encima al final. Este texto se refiere, por tanto, al lenguaje VBScript en el lado del cliente. El lenguaje VBScript solo funciona correctamente con el navegador Internet Explorer 4.0 y superiores, por lo que ser necesario disponer del mismo. Los usuarios de otros navegadores no podrn disfrutar de la potencia y versatilidad del VBScript.

4.2 Variables y Tipo de variables


VBscript slo considera en su forma general un nico tipo de datos, denominado VARIANT. Es esta una clase especial de datos, que puede contener diferentes tipos de informacin. As, se comporta como un 100

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado nmero cuando se utiliza en un contexto numrico, y como una cadena cuando se usa en este tipo de contextos. No obstante, podemos forzar a los nmeros a comportarse como cadenas ponindolos entre comillas ("54"). Aunque pueda parecer una fuerte limitacin el hecho de que slo exista un tipo general de datos, nada ms lejos de la realidad, ya que el tipo VARIANT se subdivide en una serie de subtipos que cubren todas nuestras necesidades. Los principales subtipos de datos son: subtipo Empty Null Boolean Byte Integer Currency Long Single Double Date String Object Error Descripcin varty pe 0 1

variable sin inicializar (0 si nmero - "" si cadena) variable intencionadamente vaca variable booleana >> dos valores posibles: true / false (11 1 / 0) entero entre 0 y 255 (es un octeto) 17 entero entre -32.768 y 32.768 2 real entre -922.337.203.685.477,5808 y 6 922.337.203.685.477,580 entero entre -2.147.483.648 y .147.483.648 3 real coma flotante de precisin simple 4 real de precisin doble 5 fecha entre 1/1/100 y 31/12/9999 7 cadena de longitud hasta 2.000.000.000 de caracteres 8 variable que contiene un objeto 9 variable que contiene un nmero de error 10

Een la ltima columna un valor asociado con VARTYPE; es sta una funcin que nos devuelve el tipo concreto de una variable. De ste modo, si aplicamos VarType(variable) , donde variable es una variable definida en nuestra pgina, obtendremos el subtipo al que pertenece el dato que contiene dicha variable por medio de su cdigo asociado. Una tabla ms completa de los cdigos devueltos por la funcin VarType es la siguiente: Tambin podemos conocer de forma ms clara el tipo de datos que contiene en cada momento una variable mediante la funcin TypeName(variable), que nos devuelve una cadena que identifica el tipo de dato, por ejemplo "string". Aunque hayamos definido una variable para contener un tipo de datos determinado, VBScript nos permite cambiar sobre la marcha el tipo

Instituto de Computacin Activa de Mxico S.C.

101

Diplomado Webmaster Avanzado asociado a la variable, y pone a nuestra disposicin las siguientes funciones para ello: funcin Accin Cbool convierte un dato a tipo Bolean Cbyte convierte un dato a tipo Byte CInt convierte un dato a tipo Integer CLng convierte un dato a tipo Long CSng convierte un dato a tipo Single Cdbl convierte un dato a tipo Double CCur convierte un dato a tipo Currency Cdate convierte un dato a tipo Date Cstr convierte un dato a tipo String Es ms, VBScript permite cambiar el subtipo de dato asociado a una varriable con tan slo asignarle directamente un nuevo valor de otro tipo, por ejemplo: miVariable = 35 ...sentecias de cdigo... miVariable = "Hola Amigos" y con esto hemops cambiado directamente el tipo de dato que contena la variable. Es sta una fuerte ventaja de VBScript frente a otros lenguajes de alto nivel. Esto en cuanto al tipo de datos que podemos manejar. Vamos a ver ahora cmo se declaran variables.

Declarando variables.Se puede definir una variable como un dato que cambia o puede cambiar a lo largo de la ejecucin de un programa. Para poder referirnos a ese dato cambiante hace falta un nombre que lo identifique, que va a ser el nombre que le demos a la variable que lo contiene. Es decir, una variable es como un contenedor de datos con nombre asignado. En realidad un puntero a una posicin de la memoria donde un programa (el script) puede almacenar, leer y modificar valores durante su ejecucin. En VBScript no necesitamos hacer una declaracin explcita de las variables que vamos a usar, pero s es conveniente hacerlo, para evitar posibles errores. Si queremos, podemos forzar la declaracin de las variables incluyendo al principio de la pgina ASP la sentencia: <% Option Explicit %>

Instituto de Computacin Activa de Mxico S.C.

102

Diplomado Webmaster Avanzado Para declarar una variable en VBScript se utilizan 3 tipos de instrucciones: DIM, que declara una variable general. Esta variable es accesible en todo momento slo si se declara fuera de cualquier funcin. Si se ha declarado dentro de una funcin, slo ser asequible por ella. Es decir, una variable declarada con DIM puede ser pblica o privada, dependiendo de dnde se ha declarado. PUBLIC, que declara una variable pblica, accesible por todas las funciones del cdigo. PRIVATE, que declara una variable privada, slo accesible por la funcin que la maneja o contiene, y dentro de la cual se ha declarado. Si se declara fuera de toda funcin, no ser asequible por ninguna de ellas. Ejemplo: <% DIM contador %> Se pueden declarar varias variables en una misma sentencia, separndolas por comas: Dim miCadena, miVariable, miContador Si inicializamos una variable sin haberla declarado previamente, adoptar por defecto el caracter DIM, por lo que si se inicializa dentro de una funcin, slo ser asequible por ella. El mbito o alcance de una variable es la zona donde se declara. Si declaramos la variable miVariable al principio de la pgina, no podemos declararla otra vez a no ser que sea dentro de una funcin o un procedimiento. La primera tiene mbito de pgina y la segunda de procedimiento: la primera se destruye cuando termina la ejecucin de la pgina o el script y la segunda cuando termina la funcin. Una variable declarada fuera de una funcin es asequible para todas las funciones de la pgina (se dice que es de mbito global); una variable declarada tan slo dentro de una funcin es asequible slo para esa funcin (se dice que es de mbito local). Una vez declarada una variable, hay que inicializarla, asignndole un valor; si no se hace as, se le asignar por defecto un valor de tipo null. Para asignar a una variable un valor numrico, se especifica ste valor sin comillas: contador = 10 Mientras que para asignar a una variable un valor de cadena hay que incluir ste valor entre comillas: mitexto = "hola amigo"

Instituto de Computacin Activa de Mxico S.C.

103

Diplomado Webmaster Avanzado Las variables alfanumricas pueden contener nmeros, letras o nmeros y letras, considerndose los nmeros como caracteres, como si fuesen letras (no podremos realizar operaciones numricas con ellos directamente). Los valores se asignan en este caso entre comillas: mialfanumerica = "100unidades" Las variables Booleanas slo pueden tomar dos valores: true (-1) o false (0). Un caso especial son las variables de tipo Date, que contienen fechas. Para darles valor hay que hacerlo entre almohadillas: mifecha = #12-1-1999# Una variable no se puede usar como perteneciente a dos clases diferentes. As, si asignamos a una variable un valor numrico, en el mismo cdigo no podremos usarla directamente para valores de cadena, ya que entonces el compilador nos lanzara un mensaje de error, al no coincidir los tipos. Visual Basic Script no distingue entre maysculas y minsculas, por lo que las variables: HOLA, Hola y hola son la misma a todos los efectos. Las variables del mismo tipo pueden interoperar entre ellas: podemos sumarlas, mezclarlas, etc. Ejemplos: Todas las variables que vayan a ser usadas en una pgina conviene declararlas al principio del cdigo, asignndoles el valor que vayan a tener, si lo conocemos, y si no es as, inicializaremos las variables numricas con un valor 0, y las alfanumricas y las de cadena con un valor vaco ( "" ).

Matrices.Las matrices se declaran en VBScript lo mismo que las variables escalares (simples o de una sla dimensin), utilizando un parntesis a continuacin del nombre de la variable y poniendo dentro de ste el nmero de elementos de que consta la matriz. Dim miMatriz(6) Hay que tener en cuanta que los elementos componentes de una matriz comienzan a partir del ndice 0, por lo que existe el elemento miMatriz(0), y por lo tanto miMatriz(3) representa al cuarto elemento de la matriz. Para asignar un valor a un elemento cualquiera de la matriz, smplemente debemos referirnos a l y asignrselo: miMatriz(2) = 20

Instituto de Computacin Activa de Mxico S.C.

104

Diplomado Webmaster Avanzado Y lo mismo haremos para recuperar el valor actual de un elemento de la matriz: miVariable = miMatriz(5) * Podemos definir matrices de n filas y m columnas, es decir, definir una matriz de 2 dimensiones. Por ejemplo: Dim miMatriz(2,3) define una matriz de 2 filas y 3 columnas. VBScript permite definir matrices de hasta 60 dimensiones. * Tambin es posible cambiar dinmicamente el nmero de elementos de una matriz, definiendo lo que se conoce como matrices dinmicas. Para ello podemos declarar la matriz sin asignarle un nmero inicial de elementos: Dim miMatriz( ) y posteriormente le asignamos el tamao mediante la sentencia Redim: Redim miMatriz(4) Si deseamos conservar los valores almacenados en la matriz cuando cambiamos su tamao debemos especificarlo mediante la sentencia Preserve: Redim Preserve miMatriz(4) * En el caso de usar matrices dinmicas, tendremos el inconveniente de no saber en cada momento cul es la longitud actual de la misma, es decir, cuntos forman la matriz en un momento dado. Para solventar sto, VBScript nos facilita dos mtodos asociados a stas matrices: LBound y UBound, que nos van a dar respectivamente el menor y el mayor ndice actual de una matriz, comenzando siempre por el ndice 0, claro. Su sintaxis es: LBound(miMatriz) UBound(miMatriz) * Otra forma de declarar una matriz sin declarar previamente su nmero de elementos es mediante la funcin Array(). Para ello debemos declarar primero una variable normal, no como matriz: Dim miVector Y posteriormente pasamos sta variable vector a tipo matriz, mediante la sentencia: miVector = Array(valor1,valor2,valor3,...,valorn) Con lo que hemos convertido miVector en una matriz de n elementos, cuyos ndices van desde 0 hasta (n-1), y cuyos valores osn los dados por valor1,...,valorn.

Constantes.-

Instituto de Computacin Activa de Mxico S.C.

105

Diplomado Webmaster Avanzado Las constantes son variables que nunca cambian de valor, por lo que una vez definidas no es posible modificarlas directamente. Pueden contener datos de cualquiera de los tipos vistos antes. Para declararlas se usa la sentencia Const: Const PI = 3,1416 Const miConstante = " Bienvenidos " En el caso de declarar constantes que contengan una fecha, sta declaracin debe hacerse colocando la fecha entre almohadillas: Const miFecha = #12-5-01#

Comentarios.Los comentarios son fragmentos de texto que podemos incluir en el script y que no se ejecuta, de forma que slo son visibles cuando leemos el cdigo del script. Por esto, el servidor no procesa el contenido de los comentarios, ni los enva al navegador cliente. Son muy tiles y recomendables, puesto que pueden ayudar a clarificar ciertas partes de cdigo que no es muy clara. Para escribir comentarios utilizamos la apstrofe (') o comilla simple al comienzo de la lnea. Otra forma de establecer comentarios es mediante la palabra reservada Rem.

Objetos Un objeto es un conjunto de variables y subprogramas que modifican dichas variables. Un ejemplo de objeto es la ventana de nuestro navegador. Entre sus variables puede estar una que tenga el texto que contiene la ventana y entre sus subprogramas algunos que permitan cambiar, aadir o borrar dicho texto. Dependiendo del lugar donde se est ejecutando VBScript, se tendr acceso a unos objetos u otros. Si ese lugar es el Internet Explorer, existirn objetos para referirse a la ventana, al documento, a los botones de los formularios, a los grficos includos en la pgina, etc.. Para acceder a ellos debemos usar referencias. Mientras que la mayora de los subtipos se pueden asignar a un valor directamente, en este caso deberemos usar una sentencia Set: Dim referencia Set referencia = objeto A partir de ese momento podemos usar referencia como si del objeto final se tratara.

4.3 Entrada y Salida de datos

Instituto de Computacin Activa de Mxico S.C.

106

Diplomado Webmaster Avanzado Uno de los aspectos mas importantes y llamativos de un lenguaje de programacin es la comunicacin con el usuario. Esta comunicacin se establece en dos direcciones fundamentales: la salida de datos por pantalla y la introduccin de datos por teclado. En este parte vamos a ver los aspectos ms bsicos de ambas, de forma que ya podremos establecer unos canales de comunicacin con el usuario.

1. SALIDA POR PANTALLA Hemos visto hasta ahora una manera de obtener en pantalla algunos resultados. La instruccin MSGBOX () Nos permite sacar una cadena alfanumrica, el contenido de una variable o combinaciones de ambas en un cuadro don el aspecto tpico de Windows. Este cuadro est dotado de un botn Aceptar que el usuario debe pulsar para que prosiga la ejecucin. Adems, como sin duda has podido comprobar, al pulsar el botn el cuadro desaparece. Bien. Supongamos que lo que queremos ahora es obtener un texto en la pantalla, sin necesidad de ningn botn, ni cuadro, ni detencin de la ejecucin, y adems que no desaparezca. Hemos dicho que VBScript es un lenguaje orientado a objetos. Y el documento activo (programa en ejecucin) es un objeto llamado, precisamente, document. Este objeto tiene un mtodo de escritura, llamado write (), que nos permite escribir en la pantalla. Si esto te resulta un poco arcano, revisa la primera parte de este temario que versa sobre programacin orientada a objetos y mira el Apndice A. Bien; veamos un ejemplo de lo que acabamos de comentar. Uso de Document.Write <HTML> <HEAD> <TITLE>Prueba de document.write ()</TITLE> </HEAD> <BODY> <SCRIPT LANGUAGE = "VBScript"> DOCUMENT.WRITE ("Hola desde VBScript") </SCRIPT> </BODY> </HTML> El resultado de este cdigo sera ver en pantalla la frase Hola desde VBScript. Como en el caso de MSGBOX, la impresin puede ser una combinacin de cadena /s alfanumrica /s y/o variable /s, y las concatenaciones se rigen por las mismas normas que ya conocemos.

2. ENTRADA POR TECLADO

Instituto de Computacin Activa de Mxico S.C.

107

Diplomado Webmaster Avanzado Una de las formas mas atractivas de introducir datos simples por teclado es la instruccin INPUTBOX (). Esta instruccin abre una caja de dilogo, con el siguiente aspecto:

En esta caja distinguimos lo siguiente: La pregunta que se le hace al usuario. Cuando se espera que el usuario introduzca algo por teclado, suele ser la respuesta a alguna pregunta. En este caso la pregunta es "Es usted espaol?". Una lnea en blanco (normalmente llamada "Caja de texto" donde el usuario introduce su respuesta. Esta caja de texto puede aparecer vaca o con una posible respuesta por defecto. En este ltimo caso la respuesta por defecto aparece seleccionada (texto blanco sobre fondo azul). Un botn de Aceptar. Una vez introducida la respuesta el usuario pulsa la tecla INTRO del teclado o el botn Aceptar para validarla. Llegados a este punto conviene aclarar que, de forma similar a como ocurre con MSGBOX, la ejecucin del programa queda detenida hasta que el usuario responde a la pregunta. Un botn Cancelar. Este es nuevo. No lo habamos visto hasta ahora. Se usa el botn si el usuario quiere dejar la pregunta sin responder y continuar adelante con la ejecucin del programa. En la parte superior de la ventana, y a todo lo ancho de la misma, aparece una banda azul con texto blanco. Esta banda es la barra de ttulo. Bien. Conozcamos la sintaxis de INPUTBOX (). Es la siguiente: INPUTBOX (Pregunta, Ttulo, Respuesta, pos x, pos y) Como vemos esta instruccin puede recibir varios parmetros separados por comas. Son los siguientes: Pregunta. Es la pregunta que se le formula al usuario y a la que deber responder. Ttulo. Es un literal que aparecer en la barra de ttulo.

Instituto de Computacin Activa de Mxico S.C.

108

Diplomado Webmaster Avanzado Respuesta. Es la respuesta por defecto que queremos ofrecerle al usuario. pos x - pos y. Son las coordenadas donde queremos que se site la esquina superior izquierda de la caja de dilogo. Estas coordenada se expresan en twips, que es una unidad de medida propia de Windows. Para coger soltura con esta medida lo mejor es que practiques con distintos valores.

En el caso de la caja de dilogo que hemos visto al principio de esta pgina, la instruccin que la genera es: resp = INPUTBOX ("Es usted espaol?", "Nacionalidad", "Si", 1500,1500) En esta instruccin vemos que la respuesta del usuario se almacena en una variable llamada resp para su posterior uso. El nico parmetro obligatorio es el primero, es decir, el enunciado de la pregunta. Los dems son opcionales. Supongamos que no queremos, por ejemplo, que aparezca el titulo Nacionalidad. En ese caso teclearemos la instruccin de la siguiente manera: resp = INPUTBOX ("Es usted espaol?", , "Si", 1500, 1500) El resultado ser:

Si el usuario pincha el botn cancelar, la variable a la que se asigna la repuesta quedar con el valor Null. En principio, todas las respuestas que el usuario introduzca por este sistema son procesadas como cadenas alfanumricas. Mas adelante veremos que ocurre si se espera del usuario una respuesta numrica, de fecha, etc.

4.4 Condicionales
Cuando se introduce una respuesta a una pregunta, o cuando se obtiene un valor como resultado de una operacin, o en otras muchas situaciones, es necesario que el cdigo "decida" si va a hacer una cosa u otra (o ninguna) con lo que se ha obtenido. Por ejemplo. Si a la pregunta de si el usuario es espaol ste respondi afirmativamente, habr que preguntarle cual es su nmero del DNI. En caso contrario habr que

Instituto de Computacin Activa de Mxico S.C.

109

Diplomado Webmaster Avanzado preguntarle por su nmero de pasaporte. Hay varias posibilidades de establecer condicionales durante la ejecucin de un programa. Vemoslas: 4.4.1

Sentencias IF... THEN... ELSE


Cuando queremos que el programa realice una o mas operaciones si se cumple una condicin, podemos usar una estructura bsica como la del siguiente ejemplo: <HTML> <HEAD> <TITLE>Prueba bsica de condicional</TITLE> </HEAD> <BODY> <SCRIPT LANGUAGE = "VBScript"> edad = INPUTBOX ("Es usted mayor de edad?",,"Si") IF (edad = "Si") THEN MSGBOX ("Usted ya puede votar") END IF </SCRIPT> </BODY> </HTML> Este cdigo muestra la siguiente ventana en la pantalla:

Si el usuario responde Si (Aceptando la respuesta por defecto), el programa muestra el siguiente resultado:

Instituto de Computacin Activa de Mxico S.C.

110

Diplomado Webmaster Avanzado En caso de que el usuario responda otra cosa o en cancelar el programa no muestra ningn resultado. Como hemos visto, la condicin va entre parntesis. Esto no es obligatorio en VBScript, pero facilita la legibilidad del cdigo. Vamos a sofisticar un poco mas nuestro programa: <HTML> <HEAD> <TITLE>Prueba bsica de condicional</TITLE> </HEAD> <BODY> <SCRIPT LANGUAGE = "VBScript"> edad = INPUTBOX ("Es usted mayor de edad?",,"Si") IF (edad = "Si") THEN MSGBOX ("Usted ya puede votar") ELSE MSGBOX ("Usted an no puede votar") END IF </SCRIPT> </BODY> </HTML> En caso de una respuesta diferente a Si por parte del usuario, ahora veremos en pantalla lo siguiente:

Como vemos, un condicional va encerrado entre las instrucciones IF y END IF. A continuacin de la palabra clave IF, en la misma lnea de cdigo aparece la condicin que determina la ejecucin de unas instrucciones o de otras. Despus de la palabra clave THEN aparecen las instrucciones que han de ejecutarse si se cumple la condicin. A continuacin de la palabra clave ELSE aparecen las instrucciones que han de ejecutarse si la condicin no se cumple. Todo el bloque del condicional termina con las palabras clave END IF. Por lo tanto, la estructura general de este tipo de condicionales es la siguiente: IF (condicin) THEN BLOQUE DE INSTRUCCIONES 1 ELSE BLOQUE DE INSTRUCCIONES 2 END IF

Instituto de Computacin Activa de Mxico S.C.

111

Diplomado Webmaster Avanzado CONDICIONALES ANIDADOS El ejemplo anterior evala una condicin. Si se cumple la condicin hace una cosa y si no se cumple hace otra. Ahora supongamos la siguiente estructura: IF (condicin_1) THEN BLOQUE DE INSTRUCCIONES 1 ELSE IF (condicin_2) THEN BLOQUE DE INSTRUCCIONES 2 ELSE BLOQUE DE INSTRUCCIONES 3 END IF END IF Esta estructura es un poco ms compleja. Si se cumple la condicin_1 ejecutar el BLOQUE DE INSTRUCCIONES 1. Si no se cumple evala la condicin_2. En caso de cumplirse sta, ejecuta el BLOQUE DE INSTRUCCIONES 2. Solo en caso de que las dos condiciones sean falsas se ejecutar el BLOQUE DE INSTRUCCIONES 3. Veamos un ejemplo: <HTML> <HEAD> <TITLE>Prueba bsica de condicional</TITLE> </HEAD> <BODY> <SCRIPT LANGUAGE = "VBScript"> edad = INPUTBOX ("Cul es su edad?",,"0") IF (edad < 18) THEN MSGBOX ("Eres un jovenzuelo") ELSE IF (edad > 65) THEN MSGBOX ("Usted ya est jubilado") ELSE MSGBOX ("Usted es adulto") END IF END IF </SCRIPT> </BODY> </HTML> En primer lugar una observacin. Anterior decamos que INPUTBOX () reciba un valor alfanumrico, aunque aqu recibe un valor numrico (la edad) y lo procesa sin problemas como un nmero. Esto es posible gracias a la propia estructura de datos del lenguaje.

Instituto de Computacin Activa de Mxico S.C.

112

Diplomado Webmaster Avanzado Bien. Veamos lo que ocurre al ejecutar el cdigo anterior. En primer lugar se le pide al usuario que introduzca su edad. La respuesta por defecto es 0. Una vez que la ha introducido y ha pulsado en Aceptar, se comprueba si la edad es menor que 18. Para ello se usa el operador < (mira el Apndice C: Operadores en VBScript). En caso de que sea as, se muestra el siguiente mensaje:

En caso de no cumplirse la condicin, se comprueba si la edad es mayor que 65. Si se cumple esta condicin se muestra el siguiente mensaje:

Solo en caso de no cumplirse ninguna de las dos condiciones anteriores se muestra el ltimo mensaje:

Hay que resaltar que las condiciones son excluyentes entre s. Es decir. En el momento que alguna de ellas resulte ser cierta, se ejecuta el bloque de instrucciones correspondiente y se abandona el condicional. Por ejemplo. Si la primera condicin es cierta, ya no se evaluar la segunda, como es lgico.

CONDICIONES COMPUESTAS Supongamos que solo queremos evaluar si la edad del usuario est entre 18 y 65 aos. Solo nos interesa saber si est o no en ese rango de edad. Veamos un ejemplo: <HTML> <HEAD> <TITLE>Prueba bsica de condicional</TITLE> </HEAD> Instituto de Computacin Activa de Mxico S.C. 113

Diplomado Webmaster Avanzado <BODY> <SCRIPT LANGUAGE = "VBScript"> edad = INPUTBOX ("Cul es su edad?",,"0") IF (edad > 18 AND edad < 65) THEN MSGBOX ("Usted es un adulto en edad laboral") ELSE MSGBOX ("Usted no est en edad laboral") END IF </SCRIPT> </BODY> </HTML> Aqu vemos que la condicin son, en realidad dos condiciones unidas por el operador lgico AND. Esta lnea se podra leer como "Si la edad es menor que 18 y la edad es menor que 65 entonces...". De esta forma se evalan condiciones mltiples.

4.4.2

Condicionales Mltiples SELECT CASE


Cuando hay que evaluar muchas condiciones no se deben utilizar condicionales anidados: resulta antiesttico, por no decir chapucero. Para ello se utilizan las sentencias SELECT CASE y END SELECT. Veamos un ejemplo:
<HTML> <HEAD> <TITLE>Prueba de Select</TITLE> </HEAD> <BODY> <SCRIPT LANGUAGE = "VBScript"> OPTION EXPLICIT DIM cantidad cantidad = 3 SELECT CASE cantidad CASE 1: MSGBOX ("La cantidad vale 1") CASE 2: MSGBOX ("La cantidad vale 2") CASE 3: MSGBOX ("La cantidad vale 3") CASE 4: MSGBOX ("La cantidad vale 4") CASE 5: MSGBOX ("La cantidad vale 5") CASE 6: MSGBOX ("La cantidad vale 6") CASE ELSE: MSGBOX ("La cantidad no est entre 1 y 6") END SELECT </SCRIPT> </BODY> </HTML>

Instituto de Computacin Activa de Mxico S.C.

114

Diplomado Webmaster Avanzado El resultado ser el siguiente:

Supongamos que la lnea cantidad = 3 la sustituimos por cantidad = 7. El resultado sera el siguiente.

4.5 Ciclos
En cualquier lenguaje de programacin se nos plantea, en muchas ocasiones, la necesidad de realizar una operacin mas de una vez, en un proceso reiterativo. Esa operacin puede realizarse un nmero determinado o indeterminado de veces. En VBScript tenemos varias estructuras que nos lo permiten. Vamos a conocerlas todas y as sabremos como elegir una u otra segn las circunstancias.

4.5.1

FOR.... NEXT
Esta estructura se emplea cuando es necesario repetir un bloque de operaciones un nmero determinado de veces. Un bucle FOR ... Next emplea para ello un variable de control que acta como contador de las veces que se ha procesado el bucle. La variable que acta como contador parte de un valor_inicial. Cada vez que se ejecuta el BLOQUE DE SENTENCIAS incluido en el bucle la variable de contador se incrementa en una unidad. Opcionalmente el incremento puede ser diferente de la unidad, incluyendo el parmetro STEP seguido del ndice de incremento que deseemos. Cuando el contador alcanza el valor_final se deja de ejecutar el bucle y se sigue ejecutando el programa a partir de la instruccin que va detrs de NEXT. La estructura general es la siguiente: FOR contador = valor_inicial TO valor_final STEP incremento BLOQUE DE SENTENCIAS NEXT

Instituto de Computacin Activa de Mxico S.C.

115

Diplomado Webmaster Avanzado Veamos unos ejemplos de uso. <HTML> <HEAD> <TITLE>Prueba de bucle FOR...NEXT</TITLE> </HEAD> <BODY> <SCRIPT LANGUAGE = "VBScript"> OPTION EXPLICIT DIM contador FOR contador = 0 TO 5 DOCUMENT.WRITE (contador & "<BR>") NEXT DOCUMENT.WRITE ("Se acab la cuenta") </SCRIPT> </BODY> </HTML> El resultado de la ejecucin de ste cdigo ser el siguiente: 0 1 2 3 4 5 Se acab la cuenta Bien. Ahora supongamos el siguiente ejemplo de cdigo: <HTML> <HEAD> <TITLE>Prueba de bucle FOR...NEXT</TITLE> </HEAD> <BODY> <SCRIPT LANGUAGE = "VBScript"> OPTION EXPLICIT DIM contador FOR contador = 0 TO 10 STEP 2 DOCUMENT.WRITE (contador & "<BR>") NEXT DOCUMENT.WRITE ("Se acab la cuenta") </SCRIPT> </BODY> </HTML>

Instituto de Computacin Activa de Mxico S.C.

116

Diplomado Webmaster Avanzado El resultado ser: 0 2 4 6 8 10 Se acab la cuenta Como vemos en el ltimo ejemplo, la cuenta se ha realizado de dos en dos por la coletilla STEP 2 que hemos aadido a la instruccin FOR.

4.5.2

DO WHILE... LOOP
Este tipo de bucles se emplean para efectuar (DO) una operacin un nmero indeterminado de veces mientras (WHILE) se cumpla una condicin. Su estructura general es la siguiente: DO WHILE (condicin) BLOQUE DE INSTRUCCIONES LOOP El BLOQUE DE INSTRUCCIONES, contenido entre las lneas DO y LOOP se ejecutar mientras se cumpla la condicin. Supongamos que ha llegado la hora de pedirle al usuario una palabra clave para continuar ejecutando un programa. Esta palabra ser, por ejemplo, AUTORIZADO. Veamos como lo haramos: <HTML> <HEAD> <TITLE>Prueba de DO WHILE ... LOOP</TITLE> </HEAD> <BODY> <SCRIPT LANGUAGE = "VBScript"> OPTION EXPLICIT DIM clave clave = "" DO WHILE (clave <> "AUTORIZADO") ' Ejecuta mientras la clave no es igual a <> AUTORIZADO clave = INPUTBOX ("Teclea la clave:") LOOP MSGBOX ("La clave ya es correcta") </SCRIPT> </BODY> </HTML>

Instituto de Computacin Activa de Mxico S.C.

117

Diplomado Webmaster Avanzado Este ejemplo mostrar el siguiente cuadro de dilogo y no seguir adelante hasta que se introduzca la palabra AUTORIZADO. Si se introduce mal la clave, seguir mostrando la pregunta indefinidamente.

Una vez introducida la clave correctamente el programa continuar su ejecucin mostrando lo siguiente:

4.5.3

DO UNTIL... LOOP
Este bucle funciona de manera muy similar al anterior, con la salvedad de que el BLOQUE DE INSTRUCCIONES se ejecuta hasta que (UNTIL) se cumple la condicin. Cuando se cumple la condicin deja de ejecutarse el bucle. La estructura general es la siguiente: DO UNTIL (condicin) BLOQUE DE INSTRUCCIONES LOOP Como siempre, la mejor manera de entender el funcionamiento es con un ejemplo. Supongamos el mismo caso de antes. Se tiene que pedir la clave mientras no se introduzca correctamente. Veamos como hacerlo. <HTML> <HEAD> <TITLE>Prueba de DO WHILE ... LOOP</TITLE> </HEAD> <BODY> <SCRIPT LANGUAGE = "VBScript"> OPTION EXPLICIT DIM clave

Instituto de Computacin Activa de Mxico S.C.

118

Diplomado Webmaster Avanzado clave = "" DO UNTIL (clave = "AUTORIZADO") ' Ejecuta hasta que la clave es igual a AUTORIZADO clave = INPUTBOX ("Teclea la clave:") LOOP MSGBOX ("La clave ya es correcta") </SCRIPT> </BODY> </HTML> El resultado es idntico al del ejemplo anterior. 4.5.4

Rompiendo Bucles
En ocasiones es necesario interrumpir de manera forzada la ejecucin de un bucle, por ejemplo si se produce una situacin que aconseje la continuacin del programa ignorando el resto del proceso del bucle. Para ello se emplea la instruccin EXIT. Esta instruccin presenta tres formatos distintos, segn el tipo de bucle en que se implemente. Si queremos causar la ruptura de un bucle FOR... NEXT, utilizaremos EXIT FOR. Para romper un bucle DO WHILE ... LOOP o un bucle DO UNTIL ... LOOP utilizaremos la instruccin EXIT DO. Si lo que queremos es romper un bucle WHILE ... WEND usaremos EXIT WHILE. Veamos un ejemplo prctico. Vamos a suponer que estamos contando nmeros y queremos que la cuenta se interrumpa cuando el cuadrado del nmero por el que vamos sea mayor que 99. Veamos el siguiente cdigo: <HTML> <HEAD> <TITLE>Prueba de EXIT</TITLE> </HEAD> <BODY> <SCRIPT LANGUAGE = "VBScript"> OPTION EXPLICIT DIM num DIM cuad num = 0 cuad = 0 DO WHILE (num < 1000) num = num + 1 cuad = num * num IF (cuad > 99) THEN EXIT DO END IF

Instituto de Computacin Activa de Mxico S.C.

119

Diplomado Webmaster Avanzado DOCUMENT.WRITE("El cuadrado de " & num & " es " & cuad & "<BR>") LOOP DOCUMENT.WRITE ("Se acab el bucle.") </SCRIPT> </BODY> </HTML> El resultado del cdigo anterior es el siguiente: El cuadrado de 1 es 1 El cuadrado de 2 es 4 El cuadrado de 3 es 9 El cuadrado de 4 es 16 El cuadrado de 5 es 25 El cuadrado de 6 es 36 El cuadrado de 7 es 49 El cuadrado de 8 es 64 El cuadrado de 9 es 81 Se acab el bucle. Este ejemplo ilustra el funcionamiento de la instruccin EXIT DO. Los otros dos formatos actan de manera similar. La instruccin EXIT no es de uso muy frecuente, ya que casi siempre se pueden encontrar soluciones ms elegantes, pero conviene conocerla.

4.6 Procedimientos yFunciones


En VBScript existen tres formas bsicas de ejecucin. La primera de ellas se conoce con el nombre de ejecucin inmediata. Es un cdigo VBScript insertado dentro de un cdigo HTML y que se ejecuta all donde est insertado. Es la forma de ejecucin de todos los ejemplos que hemos visto hasta ahora en este temario. Hay otras dos formas de ejecucin en las que el cdigo se carga en memoria en segundo plano, sin ejecutarse hasta que es invocado en algn punto concreto de la pgina. Estas dos formas de ejecucin se conocen con el nombre de funciones y procedimientos. Dada su propia naturaleza, el cdigo de las funciones y los procedimientos suele ir al principio de la pgina, normalmente dentro de la cabecera. Ah se cargan en memoria pero no se ejecutarn hasta que sean invocados desde algn punto de la pgina. Esto se hace as porque es importante haberlas definido (cargado en memoria) antes de invocarlas. Vamos a ver como funcionan ambos sistemas de ejecucin.

Instituto de Computacin Activa de Mxico S.C.

120

Diplomado Webmaster Avanzado 4.6.1

Funciones
Una funcin es un fragmento de cdigo que recoge unos parmetros (valores que se le pasan para su ejecucin) y devuelve un resultado. El cdigo de la funcin se incluye entre las palabras clave FUNCTION y END FUNCTION. Todo lo que haya entre estas dos lneas ser considerado como parte de la funcin. Adems, a la funcin se le asigna un nombre, por el que se la invocar desde el cdigo y ser el nombre del resultado que devuelva. As pues, en VBScript una funcin slo puede devolver un resultado. Veamos un ejemplo que lo dejar todo mas claro. Vamos a escribir un programa que pida dos nmeros por teclado y los sume entre s: <HTML> <HEAD> <TITLE>Ejemplo del uso de funciones</TITLE> <SCRIPT LANGUAGE = "VBScript"> ' En la siguiente lnea empieza la funcin. FUNCTION sumar (sumando_1, sumando_2) sumar = (CLNG(sumando_1) + CLNG(sumando_2)) END FUNCTION ' Ya se ha acabado la funcin. </SCRIPT> </HEAD> <BODY> <SCRIPT LANGUAGE = "VBScript"> OPTION EXPLICIT ' A continuacin se definen las tres variables que se usarn. ' La variable resultado almacenar el resultado que devuelva la funcin. ' Las variables sum1 y sum2 almacenan los valores que se pasarn ' como parmetros a la funcin. DIM sum1 DIM sum2 DIM resultado sum1 = 0 sum2 = 0 resultado = 0 ' El siguiente bloque pide por teclado el primer sumando, comprobando que ' se trate de un numero positivo. DO UNTIL (sum1 > 0) sum1 = INPUTBOX ("Introduzca el primer sumando:")

Instituto de Computacin Activa de Mxico S.C.

121

Diplomado Webmaster Avanzado LOOP ' El siguiente bloque pide por teclado el segundo sumando, comprobando que ' sea tambin un nmero positivo. DO UNTIL (sum2 > 0) sum2 = INPUTBOX ("Introduzca el segundo sumando:") LOOP resultado = sumar (sum1, sum2) MSGBOX ("El resultado es " & resultado) </SCRIPT> </BODY> </HTML>

El resultado de este cdigo es que pide al usuario que introduzca que introduzca un nmero que ser el primer sumando de la suma, como ya conocemos: En este caso hemos introducido un 5. A continuacin se nos pide de igual modo el segundo sumando:

Como ves hemos introducido un 7. El programa invoca entonces a la funcin de la suma a la que hemos llamado sumar. Esta funcin devuelve un resultado que es mostrado en la siguiente forma:

Instituto de Computacin Activa de Mxico S.C.

122

Diplomado Webmaster Avanzado

Vamos a entrar en detalle en el funcionamiento de este proceso. En primer lugar deberemos reparar en que el nombre de las variables que se pasan a la funcin como parmetros (tambin llamados argumentos de la funcin) no tiene por que coincidir con los nombres que se le dieron a los parmetros en el momento de definirla. Si te fijas vers que, en la definicin de la funcin se han incluido como parmetros sumando_1 y sumando_2, tal como vemos en la correspondiente lnea de cdigo: FUNCTION sumar (sumando_1, sumando_2) Sin embargo en la invocacin se usan las variables sum1 y sum2: resultado = sumar (sum1, sum2) Esto es as porque el sistema coge la primera variable de la invocacin y la asigna al primer argumento de la funcin; la segunda variable de la invocacin la asigna al segundo argumento de la funcin, y as sucesivamente si hubiera que pasar mas parmetros. De esta forma, para invocar una funcin nos basta con saber el nmero de parmetros que es necesario pasarle. Los parmetros deben estar encerrados entre parntesis y separados por comas, tanto los de la definicin como los de la invocacin. Dentro de la definicin de la funcin vemos tambin la siguiente lnea: sumar = (CLNG(sumando_1) + CLNG(sumando_2)) En ella apreciamos que el resultado que devolver la funcin, sale de sta con el mismo nombre que la funcin (sumar) , aunque luego se alojar en la variable resultado, que es la que invoca a la funcin. Adems observamos la palabra clave CLNG (). Tiene todo el aspecto de ser una funcin que se aplica a sumando_1 y a sumando_2. Sin embargo en nuestro cdigo no aparece definida en ninguna parte. Esto es as porque CLNG ()no es una funcin de usuario, sino una funcin del lenguaje y, por lo tanto, su comportamiento est definido en el intrprete. Hablaremos de las funciones del lenguaje en el apartado del mismo nombre, dentro de ste captulo. De momento nos basta saber que si no aplicamos esta funcin, el resultado no es el que esperamos (la suma aritmtica de los parmetros), si no la concatenacin de ambos como si fueran cadenas alfanumricas. Una ltima consideracin acerca de las funciones. Es posible definir y utilizar funciones que no reciban ningn argumento, pero siempre devuelven un resultado.

Instituto de Computacin Activa de Mxico S.C.

123

Diplomado Webmaster Avanzado 4.6.2

Procedimientos
Un procedimiento se parece muchsimo en su concepcin y uso a una funcin, con la diferencia fundamental de que no devuelve ningn resultado y algunas otras diferencias menores. Los procedimientos se incluyen entre las palabras clave SUB y END SUB. Para invocar al procedimiento, simplemente teclearemos su nombre en una lnea de comando, como si fuera una instruccin. Veamos un ejemplo: <HTML> <HEAD> <TITLE>Ejemplo del uso de procedimientos</TITLE> <SCRIPT LANGUAGE = "VBScript"> SUB doble_mensaje() MSGBOX ("Este es el primer mensaje.") MSGBOX ("Este es el segundo mensaje.") END SUB </SCRIPT> </HEAD> <BODY> <SCRIPT LANGUAGE = "VBScript"> doble_mensaje </SCRIPT> </BODY> </HTML>

El resultado sera, como cabe esperar, que primero visualizaremos el mensaje:

Y a continuacin, tras pulsar el botn ACEPTAR, veremos:

Tras pulsar el botn aceptar, finaliza la ejecucin. Como vemos, el procedimiento no devuelve ningn resultado. Simplemente ejecuta una

Instituto de Computacin Activa de Mxico S.C.

124

Diplomado Webmaster Avanzado accin. En este caso, adems hemos visto que se trata de un procedimiento que no recibe ningn parmetro. Por eso, en la definicin aparece el nombre del procedimiento con dos parntesis sin nada en medio y en la invocacin aparece, simplemente, el nombre del procedimiento. Si hubiera que pasar parmetros al procedimiento, existen dos formas de realizar la invocacin. La primera es la ms sencilla. El nombre del procedimiento seguido de los parmetros necesarios, separados por comas y sin parntesis. As: procedimiento parm1, parm2, parm3, ... , parmN La segunda forma es ms elegante y mas adecuada al concepto de programacin estructurada. Consiste en anteponer al nombre de procedimiento la palabra reservada CALL y encerrar la lista de parmetros, separados por comas, entre parntesis. As: CALL procedimiento (parm1, parm2, parm3, ... , parmN)

<HTML> <HEAD> <TITLE>Ejemplo de llamadas a procedimiento</TITLE> <SCRIPT LANGUAGE = "VBScript"> SUB cuento (final) IF (final = "Bonito") THEN MSGBOX ("...y fueron felices y comieron perdices.") END IF IF (final = "Feo") THEN MSGBOX ("... les echaron del trabajo y les embargaron el piso.") END IF END SUB </SCRIPT> </HEAD> <BODY> <SCRIPT LANGUAGE = "VBScript"> cuento "Bonito" CALL cuento ("Feo") </SCRIPT> </BODY> </HTML> El resultado de la ejecucin de este programa es el siguiente:

Instituto de Computacin Activa de Mxico S.C.

125

Diplomado Webmaster Avanzado

Y, al pulsar Aceptar veremos lo siguiente:

Con lo que termina la ejecucin del programa. Con esto hemos visto como operan las funciones de usuario y los procedimientos.

RUPTURAS Al igual que suceda con los bucles, es posible interrumpir la ejecucin de una funcin de usuario o de un procedimiento y devolver el control de la ejecucin al cdigo llamante. Para ello se utiliza, una vez ms, la instruccin EXIT. Si se trata de una funcin de usuario emplearemos EXIT FUNCTION. Si se trata de un procedimiento, emplearemos EXIT SUB. De todas formas no es bueno acostumbrarse a usar estas rupturas forzadas, porque se acaba abusando de ellas y escribiendo cdigos chapuceros. En realidad se puede resolver casi cualquier problema sin necesidad de rupturas. Solo deben incluirse como solucin de emergencia si se genera algn error indeseado, por ejemplo. Aclarado esto, es el momento adecuado para hablar de funciones del lenguaje.

4.7 Funciones del Lenguaje


En VBScript existe una librera de funciones predefinidas que el usuario puede emplear si lo considera conveniente. Al estar predefinidas no es necesario hacer nada para cargarlas en memoria. Se cargan, automticamente, con el intrprete. Solo es necesario invocarlas donde se necesiten. Estas funciones se clasifican en grupos en base al tipo de datos con el que se emplean. Veamos cuales son y que hacen: ABS (nmero) Recibe como argumento un nmero (o variable que lo contiene) y devuelve el mismo nmero sin signo. No produce ningn efecto con nmeros positivos y elimina el signo en los negativos. ARRAY (Elemento1, Elemento2, ... , Elemento N) Devuelve una matriz con los elementos que recibe, separados por comas, como argumento. Si no se le pasan argumentos, devuelve una matriz de cero elementos.

Instituto de Computacin Activa de Mxico S.C.

126

Diplomado Webmaster Avanzado ASC (carcter) Devuelve el valor ASCII del carcter que recibe como argumento. Si recibe una cadena, devuelve el cdigo ASCII del primer carcter de la misma. Si recibe un dato Null, devuelve un valor Null. ATN (nmero) Recibe un nmero (o variable que lo contiene) que representa a un ngulo en radianes y devuelve el arco tangente de ese ngulo. CBOOL (nmero) Recibe como argumento un nmero (o variable que lo contiene y devuelve un valor lgico. Falso si el nmero es 0 y verdadero en otro caso. CBYTE (nmero) Recibe como argumento un nmero (o variable que lo contiene) y lo convierte a un nmero en formato Byte. CCUR (nmero) Recibe como argumento un nmero (o variable que lo contiene) y lo convierte a un nmero en formato Currency. CDATE (cadena) Recibe como argumento una cadena alfanumrica representando una fecha y la convierte en un dato se subtipo DATE. CDBL (nmero) Recibe como argumento un nmero (o variable que lo contiene) y lo transforma a un nmero en formato Double. CHR (nmero) Devuelve el carcter asociado al cdigo ASCII pasado como argumento. El nmero deber estar comprendido entre 0 y 255. CINT (nmero) Recibe como argumento un nmero (o variable que lo contiene) y lo transforma en un dato con formato Int. CLNG (nmero) Recibe como argumento un nmero (o variable que lo contiene) y lo transforma en un dato con formato Long. COS (nmero) Recibe un nmero (o variable que lo contiene) que representa a un ngulo en radianes y devuelve el coseno de ese ngulo. CSNG (nmero) Instituto de Computacin Activa de Mxico S.C. 127

Diplomado Webmaster Avanzado Recibe como argumento un nmero (o variable que lo contiene) y lo transforma en un dato con formato Single. CSTR (argumento) Recibe como argumento un dato (o variable que lo contiene) que no sea una cadena alfanumrica y lo devuelve transformado en una cadena. DATE () No recibe ningn argumento y devuelve la fecha del sistema. DATEADD (intervalo, cantidad, fecha) Esta funcin devuelve el resultado de sumarle un periodo de tiempo a una fecha determinada. Recibe tres parmetros obligatorios: El intervalo es una cadena de texto que indica la unidad de tiempo que queremos aadir a la fecha (horas, das, etc). Los posibles valores estn indicados a continuacin. Cadena Significado yyyy ao completo q trimestre m mes d da w semana h hora m minuto s segundo La cantidad es el nmero de unidades del intervalo especificado que se le sumar a la fecha indicada. Este valor puede ser positivo, para referirse a fechas futuras o negativo para referirse a fechas pasadas. La fecha es aquella a la que se le suman los intervalos especificados para que la funcin devuelva una nueva fecha como resultado de la operacin. Por ejemplo. Si tecleamos la siguiente lnea de cdigo: nueva = DATEADD ("yyyy",1,10-02-1996) resultado ser 10-02-1997. Esta funcin tiene en cuenta incluso los aos bisiestos. DATEDIFF (intervalo, fecha 1, fecha2) Calcula la diferencia entre las dos fechas especificadas y la devuelve expresada en los periodos indicados en intervalo. Por lo tanto devuelve un resultado numrico. Los posibles intervalos a especificar son los mismos que en el caso anterior.

DAY (fecha)

Instituto de Computacin Activa de Mxico S.C.

128

Diplomado Webmaster Avanzado Esta funcin recibe como argumento una fecha y devuelve un nmero que corresponde al da del mes de la fecha indicada. EXP (nmero) Recibe como argumento un nmero (o variable que lo contiene) y devuelve el nmero e elevado a la potencia indicada. FIX (nmero) Recibe un nmero (o variable que lo contiene). Devuelve la parte entera de un nmero, truncando los decimales. Si el argumento es un nmero negativo, esta funcin devuelve el primer negativo igual o mayor que encuentre. FORMATCURRENCY (nmero, dgitos_decimales, cero_decimal, negativos_parntesis, agrupar_dgitos) Esta funcin se usa para representar nmeros en formato de moneda, es decir, con la apariencia de valores econmicos. Recibe cuatro argumentos. El primero de ellos es el nmero (o variable que lo contiene) que hay que representar como cifra econmica. Los otros tres son opcionales. El parmetro dgitos_decimales especifica cuantos dgitos se quiere que aparezcan a la derecha de la coma digital. El parmetro cero_decimal indica si se quiere completar el nmero con ceros a la derecha de los decimales. P.e. Si se especificaron dos decimales en el parmetro anterior y un nmero tiene un solo decimal Queremos un cero a la derecha de ese decimal? Si lo queremos, este parmetro ser un -1. Si no lo queremos, el parmetro ser 0. El parmetro negativos_parntesis especifica si queremos que los nmeros negativos aparezcan entre parntesis. Si lo queremos, pondremos -1. Si no, un 0. El parmetro agrupar_dgitos indica si queremos que los dgitos aparezcan agrupados de tres en tres, en millares, millones, etc. Si lo queremos pondremos un -1. Si no lo deseamos as, pondremos un 0. Estos tres ltimos parmetros pueden recibir como valor, en lugar de -1 o 0, un -2. En ste ltimo caso se toman las caractersticas establecidas en la configuracin regional del sistema, en el panel de control de Windows. FORMATNUMBER (nmero, dgitos_decimales, cero_decimal, negativos_parntesis, agrupar_dgitos) Esta funcin opera igual que la anterior, solo que se refiere a un formato genrico, sin asociar a ninguna moneda. HEX (nmero) Recibe como argumento un nmero decimal (o variable que lo contiene) y lo convierte en hexadecimal.

Instituto de Computacin Activa de Mxico S.C.

129

Diplomado Webmaster Avanzado HOUR (hora) Esta funcin recibe como argumento una variable que contiene una hora en formato hh:mm:ss y devuelve la hora como un nmero de 0 a 23. INSTR (comienzo, cadena 1, cadena 2) Busca la primera aparicin de la cadena 2 dentro de la cadena 1. Los parmetros comienzo y comparacin son opcionales. El parmetro comienzo indica a partir de que carcter de la cadena 1 se empieza a buscar la cadena 2. Si se omite, la bsqueda se inicia desde el primer carcter. INSTRREV (cadena 1, cadena 2, comienzo) Esta funcin es similar a la anterior, solo que empieza la bsqueda por el final de la cadena. INT (nmero) Recibe un nmero (o variable que lo contiene). Devuelve la parte entera de un nmero, truncando los decimales. Si el argumento es un nmero negativo, esta funcin devuelve el primer negativo igual o menor que encuentre. ISARRAY (variable) Esta funcin recibe como argumento un nombre de una variable y comprueba si es una matriz. Devuelve un valor booleano. ISDATE (variable) Esta funcin recibe como argumento el nombre de una variable y comprueba si es una fecha. Devuelve un valor booleano. ISEMPTY (variable) Esta funcin recibe como argumento el nombre de una variable. Devuelve un valor booleano. Es verdadero si la variable no est inicializada y falso si lo est ISNULL (variable) Esta funcin recibe como argumento un nombre de variable y devuelve un valor lgico. Verdadero si la variable contiene un Null. Falso si no lo contiene. ISNUMERIC (variable) Recibe una variable, supuestamente numrica. Devuelve un valor lgico verdadero si el parmetro que ha recibido es una variable que contiene un nmero y un valor lgico falso en caso contrario.

LCASE (cadena) Instituto de Computacin Activa de Mxico S.C. 130

Diplomado Webmaster Avanzado Recibe como argumento una cadena (o una variable que contiene una cadena) y la convierte a minsculas. LEFT (cadena, longitud) Devuelve una sub-cadena compuesta por los caracteres que hay a la izquierda de una cadena. Los argumentos que recibe son una cadena (o variable que la contiene) y la longitud (cantidad de caracteres) de la sub-cadena. LEN (cadena) Recibe como argumento una cadena (o variable que la contiene) y devuelve la cantidad de caracteres que componen dicha cadena. LOG (nmero) Esta funcin recibe como argumento un nmero (o una variable que lo contenga) que deber ser mayor de 0 y devuelve el logaritmo en base e de dicho nmero. LTRIM (cadena) Recibe como argumento una cadena o variable que la contiene. Devuelve la cadena sin los espacios en blanco que hay a la izquierda de la misma. MID (cadena, inicio, longitud) Recibe como argumentos una cadena (o variable que la contiene), una posicin de inicio (o variable numrica que la contiene) y una longitud (o variable numrica que la contiene). Devuelve una sub-cadena extrada de una cadena original. La sub cadena tiene los caracteres expresados en longitud, contados a partir del carcter inicio. Por lo tanto, el primer argumento es alfanumrico y los otros dos son numricos. MINUTE (hora) Esta funcin recibe como argumento una variable que contiene una hora en formato hh:mm:ss y devuelve los minutos como un nmero de 0 a 59. MONTH (fecha) Esta funcin recibe como argumento una fecha o una variable de fecha y devuelve un nmero del 1 al 12 que indica el mes de la fecha. MONTHNAME (mes, abreviado) Esta funcin recibe como argumento un nmero del 1 al 12 (o una variable que lo contiene) y devuelve el nombre del mes correspondiente. El otro parmetro que recibe es un valor lgico para indicar si el nombre debe aparecer abreviado o no. OCT (nmero) Instituto de Computacin Activa de Mxico S.C. 131

Diplomado Webmaster Avanzado Recibe como argumento un nmero decimal (o variable que lo contiene) y lo convierte en octal. REPLACE (cadena 1, cadena 2, cambia_por, comienzo, veces) Esta funcin encuentra la cadena 2 dentro de la cadena 1 y la sustituye por cambia_por. Comienza a buscar a partir del carcter cuyo nmero de orden es el indicado en comienzo y, si la cadena_2 aparece mas de una vez en la cadena 1 la cambia el nmero de veces indicado. RIGHT (cadena, longitud) Devuelve una sub-cadena compuesta por los caracteres que hay a la derecha de una cadena. Los argumentos que recibe son una cadena (o variable que la contiene) y la longitud (cantidad de caracteres) de la sub-cadena. RND() Recibe un argumento vaco y devuelve un nmero aleatorio. Para que funcione correctamente, es necesario incluir en el cdigo VBScript una lnea con la instruccin RANDOMIZE. ROUND (nmero, decimales) Esta funcin redondea el nmero (o variable que lo contiene) y lo devuelve con el nmero de decimales expresado en decimales. RTRIM (cadena) Recibe como argumento una cadena o variable que la contiene. Devuelve la cadena sin los espacios en blanco que hay a la derecha de la misma. SCRIPTENGINEBUILDVERSION () Esta funcin no recibe ningn argumento y devuelve el nmero de versin del motor de Script que se est utilizando. SECOND (hora) Esta funcin recibe una expresin de hora en formato hh:mm:ss y devuelve el nmero de segundos correspondiente. SGN (numero) Recibe un argumento numrico y devuelve un 1 si el nmero es positivo, un -1 si es negativo y un 0 si es 0. SIN (nmero) Recibe un nmero (o variable que lo contiene) que representa a un ngulo en radianes y devuelve el seno de ese ngulo.

SPACE (numero) Instituto de Computacin Activa de Mxico S.C. 132

Diplomado Webmaster Avanzado Recibe como argumento un nmero (o variable que lo contiene) y devuelve una cadena formada por espacios en blanco; tantos como especifica el nmero. SQR (nmero) Devuelve la raz cuadrada del nmero (o variable numrica) que recibe como argumento. STRCOMP (cadena 1, cadena 2) Recibe como argumentos dos cadenas alfanumricas (o variables que las contienen) separadas por comas. Si ambas cadenas son iguales devuelve un 0. Si la primera es mayor que la segunda, devuelve un 1. Si la segunda es mayor que la primera devuelve un -1. Si alguna cadena tiene un valor Null, devuelve Null. En este sentido debemos recordar que un carcter es mayor o menor que otro en funcin de sus cdigos ASCII. As, p.e., la a es mayor que la A, porque el cdigo ASCII de la A es 65 y el de la a es 97. STRING (nmero, carcter) Recibe como argumentos un nmero (o variable que lo contiene) y un carcter (o variable que lo contiene). Devuelve una cadena compuesta por el carcter especificado, repetido las veces que indica el nmero. STRREVERSE (cadena) Recibe como argumento una cadena (o variable que la contiene) y devuelve la cadena tras invertir el orden de todos los caracteres que la componen. As pues, el primero de la cadena original ser el ltimo de la cadena resultante. TAN (nmero) Recibe un nmero (o variable que lo contiene) que representa a un ngulo en radianes y devuelve la tangente de ese ngulo. TIME () Esta funcin no recibe ningn argumento y devuelve una expresin que representa la hora del sistema en formato hh:mm:ss. TIMESERIAL (nmero 1, nmero 2, nmero 3) Esta funcin recibe tres parmetros numricos y los convierte a una hora en formato hh:mm:ss. El nmero 1 debe estar comprendido entre 0 y 23; el nmero 2 debe estar comprendido entre 0 y 59 y el nmero 3 tambin. TIMEVALUE (fecha) Esta funcin recibe una variable de fecha y extrae y devuelve la parte de la hora.

Instituto de Computacin Activa de Mxico S.C.

133

Diplomado Webmaster Avanzado TRIM (cadena) Recibe como argumento una cadena o variable que la contiene. Devuelve la cadena sin los espacios en blanco que hay a la izquierda y a la derecha de la misma. TYPENAME (variable) Esta funcin recibe un nombre de variable y devuelve el nombre de subtipo del dato que contiene. UCASE (cadena) Recibe como argumento una cadena (o una variable que contiene una cadena) y la convierte a maysculas. WEEKDAY (fecha, primer_da) Esta funcin recibe dos parmetros. Es primero es una fecha o variable que la contiene; el segundo es una constante que indica el que es el primer da de la semana en nuestro pas. Devuelve un nmero correspondiente al da de la semana de la fecha introducida. Las constantes para identificar que da de la semana es el primero en nuestro pas son: Constante Corresponde a VBSUNDAY Domingo VBMONDAY Lunes VBTUESDAY Martes VBWEDNESDAY Mircoles VBTHURSDAY Jueves VBFRIDAY Viernes VBSATURDAY Sbado WEEKDAYNAME (da_semana, abreviado, primer_dia) Esta funcin recibe un nmero de da de la semana, un valor lgico y una constante que indica cual es el primer da de la semana en nuestro pas. Devuelve como resultado el nombre del da de la semana que corresponde al nmero introducido. Si el valor lgico es verdadero, el nombre que devuelve aparece en abreviatura. Las constantes que identifican el da de la semana son las mismas que en el caso anterior.

4.7.1

Ejemplos
134

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado Uso de la funcin CBOOL <HTML> <HEAD> <TITLE> Prueba de funciones de conversin. </TITLE> </HEAD> <BODY> <SCRIPT LANGUAGE = "VBScript"> OPTION EXPLICIT DIM variable variable = 1 MSGBOX (CBOOL (variable)) </SCRIPT> </BODY> </HTML> El resultado de este cdigo ser el siguiente:

La funcin CBOOL en particular devuelve un valor falso si el argumento es 0 y un valor verdadero si el argumento es cualquier otro nmero. Una observacin acerca de las conversiones entre subtipos numricos. Si un nmero que convertimos, p.e., a Byte es muy grande para caber en este subtipo, se truncar. Supongamos la siguiente sentencia: numero = CBYTE (567.384.896.456,29) . Esto es claramente una irregularidad, ya que el nmero es demasiado grande para ser di subtipo Byte. Veamos mas ejemplos: Uso de Funciones de cadena: Instr y Mid <HTML> <HEAD> <TITLE>Prueba de funciones de cadena.</TITLE> </HEAD> <BODY> <SCRIPT LANGUAGE = "VBScript"> OPTION EXPLICIT DIM variable DIM parte_central Instituto de Computacin Activa de Mxico S.C. 135

Diplomado Webmaster Avanzado

variable = CHR (65) DOCUMENT.WRITE ("Valor de CHR (65): " & variable & "<BR>") variable = "Alfa" parte_central = INSTR (variable,"l") DOCUMENT.WRITE (parte_central & "<BR>") Variable = "Manzana" Parte_central = MID (variable, 3, 2) DOCUMENT.WRITE (parte_central) </SCRIPT> </BODY> </HTML> Como resultado nos aparece en pantalla lo siguiente: Valor de CHR (65): A 2 nz Fjate en la segunda lnea. Es el resultado de la funcin INSTR. Si analizamos la correspondiente lnea de cdigo veremos que esta funcin recibe dos argumentos. El primero es la cadena (o variable que la contiene) donde hay que buscar algo. El segundo es la cadena (o variable que la contiene) que hay que buscar dentro. El nmero que devuelve como resultado (en este caso el 2) es la posicin que ocupa la segunda cadena dentro de la primera. Ahora observa la ltima lnea, con el texto nz. Es el resultado de aplicar la funcin MID. Observa la correspondiente lnea de cdigo. Ves que esta funcin recibe tres argumentos. El primero es una cadena (o la variable que la contiene) de la que se extraer una sub-cadena. El segundo es un nmero (o una variable que contiene un nmero), que indica que lugar de la cadena iniciar la sub-cadena. El tercero es un nmero (o una variable que contiene un nmero) que indica cuantos caracteres se cogern para la sub-cadena. Hay que puntualizar que la cadena original no sufre amputacin ni transformacin de ningn tipo.

Otro ejemplo: Funciones matemticas <HTML> Instituto de Computacin Activa de Mxico S.C. 136

Diplomado Webmaster Avanzado <HEAD> <TITLE>Prueba de funciones matemticas.</TITLE> </HEAD> <BODY> <SCRIPT LANGUAGE = "VBScript"> OPTION EXPLICIT RANDOMIZE DIM numero numero = 0 DO UNTIL numero > 0 numero = INPUTBOX ("Introduzca un nmero") IF (NOT ISNUMERIC (numero)) THEN numero = 0 END IF LOOP DOCUMENT.WRITE ("El nmero es: " & numero & "<BR>") numero = INT (numero) DOCUMENT.WRITE ("La parte entera es: " & numero & "<BR>") DOCUMENT.WRITE ("El valor hexa es: " & HEX (numero) & "<BR>") DOCUMENT.WRITE ("Un nmero aleatorio es: " & RND() & "<BR>") </SCRIPT> </BODY> </HTML> Este programa nos pide un nmero por teclado como ya conocemos. Supongamos que introducimos 45,7. Los resultados sern los siguientes: El nmero es: 45,7 La parte entera es: 45 El valor hexa es: 2D Un nmero aleatorio es: 0,1896936 La primera lnea nos muestra el nmero que hemos introducido. La segunda nos muestra el resultado de obtener la parte entera con la funcin INT. La tercera lnea nos muestra el valor hexa de 45. La cuarta lnea es un nmero aleatorio generado con RND(). Esta funcin siempre genera un nmero aleatorio que est entre 0 y 1. Observa que el cdigo incluye la instruccin RANDOMIZE. Observa tambin que se ha usado la funcin ISNUMERIC para anular la entrada por teclado si lo que se introdujo no es un nmero. En este caso se ha precedido la funcin del operador lgico NOT..

Instituto de Computacin Activa de Mxico S.C.

137

Diplomado Webmaster Avanzado Otro ejemplo ms: Funciones de fecha <HTML> <HEAD> <TITLE>Prueba de una funcin de fecha</TITLE> </HEAD> <BODY> <SCRIPT LANGUAGE = "VBScript"> OPTION EXPLICIT DIM fecha fecha = DATE () IF (WEEKDAY (fecha, VBMONDAY) = 7) THEN DOCUMENT.WRITE ("Hoy es domingo.") ELSE DOCUMENT.WRITE ("Hoy se trabaja.") END IF </SCRIPT> </BODY> </HTML> Este cdigo recoge, en primer lugar, la fecha del sistema. Si la fecha corresponde a un domingo, muestra: Hoy es domingo. En caso contrario, muestra: Hoy se trabaja. Para hacer esto, utiliza la funcin WEEKDAY, indicando, como primer da de la semana, el Lunes. GENERALIDADES FINALES Recuerda. Las tres diferencias bsicas entre funciones de usuario y procedimientos son: La funcin de usuario se define entre las instrucciones FUNCTION y END FUNCTION. El procedimiento se define entre SUB y END SUB. Las funciones (de usuario y del lenguaje) devuelven un resultado. Los procedimientos, no. La forma de invocar una funcin es con su nombre seguido de parntesis. Si la funcin recibe argumentos, stos van entre los parntesis. Para invocar un procedimiento hay dos formas. La primera es el nombre del procedimiento seguido de los argumentos, si los hay, separados por comas. La segunda es la palabra clave CALL, seguida del nombre del procedimiento, seguido ste, a su vez de parntesis. Si hay argumentos, stos van entre los parntesis, seguidos por comas.

4.8 Jerarqua de Objetos en POO

Instituto de Computacin Activa de Mxico S.C.

138

Diplomado Webmaster Avanzado Se enlistaran los objetos de que disponemos en VBScript, as como sus distintas propiedades, mtodos y eventos. Esta dedicado a los objetos en el lado del Cliente. En el lado del servidor, la lista se ampla bastante. Vamos a puntualizar cuatro conceptos cuya comprensin es vital para entender el funcionamiento de la POO y la jerarqua de objetos. OBJETO: Es cada una de los elementos que se gestionan en una pgina web o en cualquier aplicacin informtica que tienen una identidad propia. Un objeto podra ser la ventana de navegacin, o el documento activo, o un campo de un formulario, o una tabla, etc. La lista de los objetos que podemos manejar en VBScript de Cliente se incluye aqu. PROPIEDAD: Es cada una de las caractersticas de un objeto. Una propiedad sera el color de fondo de una tabla, la barra de estado de la ventana de navegacin, etc. Tambin llamamos propiedad a un objeto derivado de otro. Se dice que el objeto derivado es propiedad del objeto padre. MTODO: Es una operacin que se puede realizar dentro de un objeto. Por ejemplo. Cerrar una ventana sera un mtodo del objeto ventana. Poner el foco en un campo de formulario sera un mtodo del objeto que representa a ese campo en concreto. EVENTO: Un evento es la previsin de que el usuario realice una determinada accin. En realidad el usuario puede realizar la accin o no realizarla, pero se deja prevista en la programacin la posibilidad de que la realice. De esta forma, si la realiza suceder algo (lo que hayamos programado) como respuesta a esa accin. Un evento sera pasar el ratn sobre una imagen determinada, hacer clic en una parte de la pantalla, pulsar una tecla, etc. Tambin existe la posibilidad de prever eventos del sistema. Un evento de sistema es, por ejemplo, la carga de una pgina, o un error en un proceso. Resumiendo: un evento se dispara cuando ocurre la accin prevista por el mismo. Supongamos el siguiente cdigo. Utiliza el evento ONMOUSEOVER, asociado al hiperenlace. Cuando el usuario va a pulsar el enlace y coloca el puntero del ratn sobre el mismo, se dispara el evento, que llama a la funcin mensaje(). Esta genera un cuadro de aviso en la pantalla y obliga al usuario a pulsar el botn Aceptar. Con lo que nunca podr usar el enlace.

Evento onMouseOver <HTML> <HEAD> <TITLE>Prueba de evento ONMOUSEOVER</TITLE> Instituto de Computacin Activa de Mxico S.C. 139

Diplomado Webmaster Avanzado <SCRIPT LANGUAGE = "VBScript"> FUNCTION mensaje() MSGBOX ("Nunca podrs pulsarlo") END FUNCTION </SCRIPT> </HEAD> <BODY> <H1> Intenta pulsar el enlace... <BR> si puedes. </H1> <A HREF = "http://www.gratisweb.com/infomegacine" ONMOUSEOVER = "mensaje()"> Acceder a la pgina de Latinmail </A> </BODY> </HTML> Para referirse a una propiedad o un mtodo de un objeto usamos una notacin de puntos. As: OBJETO.PROPIEDAD O bien: OBJETO.METODO() Observa que el mtodo lleva unos parntesis y la propiedad no. Esto es as porque, en definitiva, los mtodos son casos particulares de funciones, asociadas a objetos. Y, como cabra esperar, algunos mtodos reciben argumentos y otros no. Bien. Veamos la lista de objetos de VBScript de Cliente. Veamos otro ejemplo, para afianzar conceptos: VBScript en el navegador <HTML> <HEAD> <TITLE>Otra prueba de POO</TITLE> </HEAD> <BODY> <A HREF = "http://www.gratisweb.com/infomegacine" ONMOUSEOVER = "window.status = 'El mejor site de cine';return true"> Pulsa aqu para ver infomegacine </A> </BODY> </HTML> Aqu podemos ver varias cosas que van mas all de todo lo estudiado hasta ahora. En primer lugar vamos a aclarar lo que hace el cdigo. Muestra un hiperenlace y, cuando el usuario pasa el ratn por encima, Instituto de Computacin Activa de Mxico S.C. 140

Diplomado Webmaster Avanzado muestra un mensaje en la barra de estado, que ya permanece ah. Bien. Analicemos el cdigo para ver como funciona. Realmente toda la gracia est en esta lnea: <A HREF = "http://www.gratisweb.com/infomegacine" ONMOUSEOVER ="window.status = 'El mejor site de cine';return true"> La primera parte es un hiperenlace normal de HTML sin mas. Lo primero que nos interesa ahora es la palabra ONMOUSEOVER, que indica al navegador que detecte la presencia del cursor del ratn sobre el texto que constituye el hiperenlace. ONMOUSEOVER es el evento que queremos detectar. A la derecha el signo igual aparece la accin que queremos desencadenar si se produce el evento especificado. Esta accin aparece entre comillas dobles. En concreto se trata de establecer un valor para la propiedad status del objeto window; es decir, el contenido de la barra de estado de la ventana de navegacin. En este caso hemos programado que aparezca en la barra de estado una cadena literal (el mejor site de cine). Fjate que la cadena de texto aparece encerrada entre comillas simples. A continuacin aparece un signo de punto y coma y la instruccin return true. Esta ltima sirve, en este caso, para que el cambio de la barra de estado se produzca de forma inmediata. De no usarla, al poner el ratn sobre el enlace veremos la direccin de la pgina especificada y, solo al quitar el ratn, veremos el mensaje que habamos programado. Evidentemente sto ltimo no es lo que perseguamos. Bien. Casi tenemos completo el estudio de esta lnea, salvo por un pequeo detalle. Palabras reservadas del lenguaje, como son window, status, return y true aparecen en minsculas en este ejemplo, cuando hemos dicho que en este temario las palabras reservadas las ponamos en maysculas. Esto es as porque en este caso las instrucciones no han sido programadas dentro de VBScript, sino directamente en HTML. Existen algunas instrucciones de los lenguajes de Script que pueden programarse de esta manera (de hecho, algunas veces DEBEN programarse de esta manera). En estos casos, el navegador no interpreta las instrucciones como de VBScript, sino como de JavaScript. Y JavaScript (ya lo veremos en el correspondiente temario) es, al contrario que VBScript, muy exigente con el tema de las maysculas y minsculas. Cada palabra debe escribirse de un modo exacto, y no de otro, o no funcionar. En la lista que incluyo en ste Apndice de objetos, propiedades, mtodos y eventos he seguido este ltimo criterio, a fin de familiarizar al lector con la sintaxis mas adecuada.

La lista de los principales objetos de VBScript es: Objeto window Objeto location Objeto document Instituto de Computacin Activa de Mxico S.C. 141

Diplomado Webmaster Avanzado Objeto navigator Objeto frame Objeto history Objeto link Objeto anchor Objeto form

4.8.1

Propiedades y mtodos de los objeto


Como ya hemos mencionado en este temario, los objetos siguen una jerarqua. El de mas alto nivel es el objeto WINDOW, que representa a la ventana activa. Todos los dems, son objetos derivados de ste. Veamos cuales son las propiedades y mtodos que acepta cada uno, as como los eventos que les afectan. Objeto window Representa la ventana activa del navegador y es el mas alto de la jerarqua. Propiedades: se refiere al mensaje que aparecer por defecto en la barra defaultStatus de estado. representa al documento HTML en ejecucin en ese document momento. frames [] es una matriz que contiene los frames de la ventana. representa un registro histrico de las pginas visitadas en history la actual sesin de uso de Internet. length contiene el nmero total de frames de la ventana. location representa a la direccin (URL) actual de Internet. name contiene el nombre de la ventana activa. navigator representa al navegador que estamos utilizando. se refiere a la propia ventana. Es el mismo objeto self window. es el mensaje que aparece en la barra de estado en un status momento determinado. representa a la ventana activa o a otra ventana o subwindow ventana de navegacin. Mtodos: close () open ()

permite cerrar la ventana activa. Su sintaxis es self.close() permite abrir una nueva ventana, como sub ventana de la actual. Su sintaxis es: nueva_ventana = window.open ("URL", "Target", "Opciones")

Instituto de Computacin Activa de Mxico S.C.

142

Diplomado Webmaster Avanzado

En la sintaxis expresada, nueva_ventana es el nombre que queremos darle a la sub-ventana. URL es la direccin de la pgina que queremos que se cargue en la sub-ventana. Target es la direccin del frame donde queremos que se abra la nueva ventana (caso de existir frames) como hacemos en HTML con los hiperenlaces. Opciones son las propiedades de la nueva ventana, de acuerdo a la siguiente tabla. propiedad Tipo de dato Explicacin toolbar booleano Ventana con barra de herramientas. location booleano Ventana con barra de direcciones. directories booleano Ventana con directorios. Status booleano Ventana con barra de estado menubar booleano Ventana con barra de mens. scrollbars booleano Ventana con barras de desplazamiento. resizable booleano Ventana de tamao redefinible por el usuario. width pxeles Anchura de la ventana height pxeles Altura de la ventana. top pxeles Posicin Y de la ventana left pxeles Posicin x de la ventana Eventos: onLoad onUnload

Se ejecuta cuando se carga la pgina. Se ejecuta cuando se descarga (se cierra) la pgina.

Objeto document Representa el documento activo. Propiedades: alinkColor Representa el color de los enlaces activos. bgColor Representa el color de fondo del documento. fgColor Representa el color del texto

Instituto de Computacin Activa de Mxico S.C.

143

Diplomado Webmaster Avanzado lastModified linkColor location title vlinkColor Representa la fecha de la ltima modificacin. Representa el color de los enlaces. Representa la URL del documento. Representa el ttulo del documento. Representa el color de los enlaces visitados.

Mtodos: Write () Escribe un texto. Writeln() Escribe una lnea de texto. Eventos: Ninguno

Objeto form Este objeto se refiere a un formulario empleado en el documento. Se accede a cada formulario mediante un ndice: document.form [ndice] El nmero de ndice se corresponde con el orden de creacin de formulario en el documento. Propiedades: Representa la URL donde est el programa encargado de action procesar un formulario (al que se llama al activar el botn Submit). length Es el nmero de elementos del formulario. method Es el mtodo de envo (GET o POST). Mtodos: submit Se usa para forzar el envo. Eventos: onSubmit Se produce cuando se pulsa el botn Submit del formulario.

Objeto location Contiene la URL de la pgina actual Propiedades: href Representa la propia URL. Representa la ruta del disco del servidor donde se aloja la pathname pgina.

Instituto de Computacin Activa de Mxico S.C.

144

Diplomado Webmaster Avanzado Mtodos: Ninguno. Eventos: Ninguno.

Objeto navigator Representa al navegador actual. Propiedades: appName Es el nombre del navegador. appVersion Se refiere a la versin del navegador.

Objeto history Representa el historial de las pginas visitadas en la sesin actual de uso de Internet Propiedades: length Representa la cantidad total de pginas visitadas. Mtodos: back () navega a la pgina anterior. forward() navega a la pgina siguiente. navega n pginas hacia delante (o hacia atrs, si n es go (n) negativo).

Tipos de eventos Aqu se listan los principales eventos que se pueden asociar a una imagen, hipervnculo, cadena de texto, etc. A continuacin aparecen agrupados segn donde se originen (ratn teclado, etc). Estos eventos son los mas usados. Existen otros, pero no siempre funcionan bien con los dos navegadores, y adems son bastantes exticos, acadmicos y de uso poco prctico. No los veremos aqu. Eventos de ratn

Instituto de Computacin Activa de Mxico S.C.

145

Diplomado Webmaster Avanzado ONCLICK ONDBLCLICK ONMOUSEDOWN ONMOUSEMOVE ONMOUSEOVER ONMOUSEOUT ONMOUSEUP ONDRAGSTART ONSELECTSTART ONSELECT Eventos de teclado ONKEYDOWN ONKEYPRESS ONKEYUP ONHELP Eventos de enfoque ONFOCUS ONBLUR Se activa cuando se entra en el mbito de un elemento al que est asociado el evento. Se activa al abandonar el mbito del elemento al que est asociado. Se activa con un botn del ratn. Se activa si se hace un doble click. Se activa si se pulsa el botn izquierdo del mouse. Se activa si se mueve el mouse. Se activa cuando el puntero se sita sobre el objeto que incluye al evento. Se activa cuando el puntero sale del objeto que incluye al evento. Se activa si se suelta un botn pulsado en el mouse (es contrario a ONCLICK). Se activa cuando se inicia un arrastre. Se activa cuando se inicia una seleccin con el ratn. Se activa cuando se ha realizado una seleccin con el ratn.

Se activa si se pulsa una tecla cualquiera. Se activa si se pulsa y suelta una tecla. Se activa cuando se suelta una tecla pulsada. Se activa si se pulsa la tecla de ayuda (normalmente F1).

Eventos de formulario ONRESET ONSUBMIT Se activa al pulsar un botn de reset de un formulario. Se activa al enviar un formulario.

Eventos de carga de pgina Se activa cuando se aborta la carga de la ONABORT pgina. ONERROR Se activa cuando se produce un error

Instituto de Computacin Activa de Mxico S.C.

146

Diplomado Webmaster Avanzado inesperado durante la carga de la pgina. Se activa cuando se carga la pgina. Se activa cuando el usuario descarga la pgina (es decir, carga otra o pretende salir del navegador). Se activa si se actualiza o recarga la pgina.

ONLOAD ONUNLOAD ONAFTERUPDATE

4.8.2

Practicas
Capture los siguientes codigos HTML que intergran VBScript, analise y comente las funciones que realizan.

<HTML> <HEAD> <TITLE>Prueba de una funcin de fecha</TITLE> </HEAD> <BODY> <SCRIPT LANGUAGE = "VBScript"> OPTION EXPLICIT DIM fecha fecha = DATE () IF (WEEKDAY (fecha, VBMONDAY) = 7) THEN DOCUMENT.WRITE ("Hoy es domingo.") ELSE DOCUMENT.WRITE ("Hoy se trabaja.") END IF </SCRIPT> <pre> </pre> </BODY> </HTML> <HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY> * linkColor : configura el color de los enlaces normales en el documento.<br> * alinkColor: configura el color de los enlaces activos en el documento.<br> * vlinkColor: configura el color de los enlaces visitados en el documento.<br> 147

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado Ejemplo:<br> <script language="VBScript"> window.document.linkColor="green" window.document.alinkColor="red" window.document.vlinkColor="#330099" </script> <center> <a href="#">enlace 1</a><br> <a href="#">enlace 2</a><br> <a href="#">enlace 3</a><br> <a href="#">enlace 4</a><br> </center> </BODY> </HTML>

<HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY> <script language="VBScript"> Function MiTitulo() window.document.title="Este es el titulo cambiado" End Function Function MiModificacion() MsgBox("Ultima modificacion: " & window.document.lastModified) End Function Function MiLocation() MsgBox("URL de este documento: " & window.document.location) End Function </script> * title: contiene el ttulo del documento, que ser el mostrado en la barra superior de ttulo del navegador. Como ejemplo, vamos a cambiar este ttulo en una pgina: <form> <center><input type="button" value="pulsame" onClick="MiTitulo()"></center> </form> * lastModified : contiene la fecha de la ltima actualizacin de la pgina. Ejemplo: <form> <center><input type="button" value="pulsame" onClick="MiModificacion()"></center> </form> Instituto de Computacin Activa de Mxico S.C. 148

Diplomado Webmaster Avanzado * location: contiene la URL del documento actual. Ejemplo: <form> <center><input type="button" value="pulsame" onClick="MiLocation()"></center> </form> </body> </HTML>

<HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY> * defaultStatus: configura el mensaje que aparecer por defecto en la barra de estado del navegador. Ejemplo: <BR> <script language="VBScript"> window.defaultStatus="Bienvenidos a HTMLWeb" </script> * status: configura el mensaje que aparece en la barra de estado en un momento dado, generalmente en respuesta a un evento concreto. Ejemplo: <script language="VBScript"> Function MiStatus() window.status="Ejemplo de propiedad status" End Function </script> <form> <input type="button" value="pulsame" onClick="MiStatus()"> </form> </BODY> </HTML>

<head> <script language="VBScript"> Function MiLoad() msgBox "Evento onLoad" End Function Function MiUnload() msgBox "Evento Unload" End Function </script>

Instituto de Computacin Activa de Mxico S.C.

149

Diplomado Webmaster Avanzado </head> <body onLoad="MiLoad()" onUnload="MiUnload"> <script language="VBScript"> Function MiVentana() window.open"../../index.html","una","toolbar=0,location=0,width=780, height=400,top=0,left=5" End Function </script> <form> <center><input type="button" value="pulsame" onClick="MiVentana()"></center> </form> </body>

<HTML> <HEAD> <TITLE></TITLE> </HEAD> <script language="VBS"> Sub Validar If Not IsNumeric(frmPuntuacio.Punts.Value) Then Alert "La puntuacin ha de ser numrica!" ElseIf frmPuntuacio.Punts.Value <0 Or frmPuntuacio.Punts.Value>10 Then Alert "La puntuaci ha de estar entre 0 y 10!" Else frmPuntuacio.Submit End If End Sub </script> <body> Vota por esta pelicula entre 0 y 10 <form name="frmPuntuacio" Action="HaVotat.asp" Method="Post"> <input type="text" name="Punts" maxlength="2"> <input type="button" Value="Votar" onClick="Validar" language="VBS"> </form> </BODY> </HTML>

Instituto de Computacin Activa de Mxico S.C.

150

Diplomado Webmaster Avanzado <HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY> <script language="JavaScript"> mensaje="|====| " function hora() { var h = new Date(); window.status=" |====| " + h.getHours() +":"+ h.getMinutes() +"" +mensaje ; window.setTimeout('hora()',100); } hora() </script> </BODY> </HTML>

Instituto de Computacin Activa de Mxico S.C.

151

Diplomado Webmaster Avanzado

www.icam.com.mx

Diplomado Webmaster Avanzado


5. ASP
Al final del capitulo el alumno ser capaz de... Introduccin Active Server Page Sentencia condicionales y ciclos Envo y recepcin de datos Conexin y operaciones a Base de Datos en el web

Comprueba tu avance y marca con una los objetivos alcanzados.

Instituto de Computacin Activa de Mxico S.C.

152

Diplomado Webmaster Avanzado

5 ASP (Active Server Page)


5.1 Introduccin a ASP
ASP (Active Server Pages) es la tecnologa para la creacin de pginas dinmicas del lado del servidor desarrollada por Microsoft.

El tipo de servidores que emplean este lenguaje son aquellos que funcionan con sistema operativo de la familia de Windows NT. Afortunadamente, tambin podemos visualizar pginas ASP sobre Windows 95/98. Para escribir pginas ASP utilizamos un lenguaje de scripts, que se colocan en la misma pgina web junto con el cdigo HTML. Comnmente este lenguaje de scripts es Visual Basic Script, que deriva del conocido Visual Basic, aunque tambin se pueden escribir los scripts ASP en otro lenguaje: JScript, que deriva a su vez del conocido Javascript. Existe una versin de Visual Basic Script en el lado cliente y otra en el lado del servidor. En los dos casos, como su nombre indica, el lenguaje de base es Visual Basic por lo que su aprendizaje puede ser perfectamente coordinado, ya que las sentencias y las sintaxis son prcticamente las mismas. En ASP, al estar programando pginas del lado del servidor, utlizaremos Visual Basic Script del lado del servidor y en este manual nos centraremos en este punto. El lector interesado por la sintaxis de Visual Basic Script y su programacin del lado del cliente puede encontrar en este mismo sitio otro manual para tratar exclusivamente Visual Basic Script. Si te interesa trabajar con un editor especfico de ASP te recomendamos el MS Visual Interdev. Otra posibilidad es el Drumbeat de Macromedia aunque para empezar ninguno de los dos resulta absolutamente indispensable. Tambin podemos elegir Homesite, un editor que no es especfico para las ASP, pero que se comporta bastante bien y ofrece ayudas interesantes.

5.2 Iniciando la programacin de ASP


ASP es un lenguaje orientado a las aplicaciones en red creado por Microsoft que funciona del lado servidor. Es en efecto el servidor quien se ocupa de ejecutarlo, interpretarlo y enviarlo al cliente (navegador) en forma de cdigo HTML.

Instituto de Computacin Activa de Mxico S.C.

153

Diplomado Webmaster Avanzado

ASP es principalmente utilizado sirvindose del lenguaje Visual Basic Script que no es ms que una versin light del Visual Basic. Sin embargo, es posible programar pginas ASP en Java Script. Lo nico que hay que hacer es especificar en la propia pgina qu tipo de lenguaje estamos utilizando. Dado que el lenguaje ASP est muy frecuentemente embebido dentro del cdigo HTML, es importante poder marcar al servidor qu partes estn escritas en un lenguaje y cules en otro. Es por ello que todas las partes del archivo que estn escritas en ASP estarn siempre delimitadas por los smbolos: <% y %>. De este modo, cuando realicemos nuestros scripts, lo primero que debemos definir es el tipo de lenguaje utilizado, lo cual se hace del siguiente modo: <% @ LANGUAGE="VBSCRIPT" %> Para el caso en el que programemos en Visual Basic Script

<% @ LANGUAGE="JSCRIPT" %> Si nos servimos del Java Script en servidor para programar en ASP

Los scripts que sern presentados estn basados en el VBS, el cual presenta toda una serie de prestaciones que lo hacen sin duda ms accesible y apto para ASP. No es por nada que es el propio Microsoft quien ha creado ambos. Con los elementos que hemos presentado hasta ahora, ya estamos en situacin de poder escribir nuestro primer programa en ASP. Vamos a crear un programa que calcule el 20% de impuestos que habra que aadir a una serie de artculos. Para plasmar el concepto de funcin, explicado en el manual de pginas dinmicas, vamos a definir una funcin "impuesto" que emplearemos sucesivas veces. El programa podra resultar algo as: <% @ LANGUAGE="VBSCRIPT" %> <HTML> <HEAD> <TITLE>Funcion impuesto</TITLE> </HEAD> <BODY> <%Function impuesto(precio_articulo) precio_final=precio_articulo+precio_articulo*20/100 Response.Write precio_final

Instituto de Computacin Activa de Mxico S.C.

154

Diplomado Webmaster Avanzado End Function%> Un libro de 3500 ptas. se quedar en un precio de <% impuesto(3500) %> <br> Una camisa de 6000 ptas. tendr un precio final de <% impuesto(6000) %> <br> Un CD de msica de 2000 ptas. costara <% impuesto(2000) %> ptas. </BODY> </HTML> Como puede verse, el script contiene dos partes fundamentales: Una primera en la que definimos la funcin que llamamos impuesto que depende nicamente de una variable (precio_articulo). Impuesto permite aadir un 20% al precio del artculo e imprimir el resultado en pantalla (Response.Write). En la segunda parte nos servimos de la funcin para realizar los clculos necesarios y mostrarlos en pantalla acompaados de texto. Resulta muy interesante, una vez ejecutado el script, ver el cdigo fuente. Como puede verse, el cdigo HTML que muestra el browser no coincide con el que nosotros hemos escrito. Algo que no debe sorprendernos ya que, como ya hemos explicado, el servidor se encarga de procesarlo y hacerlo comprensible al navegador.

5.3 Condicionales IF
Cuando queremos que el programa, llegado a un cierto punto, tome un camino determinado en determinados casos y otro diferente si las condiciones de ejecucin difieren, nos servimos del conjunto de instrucciones If, Then y Else. La estructura de base de este tipo de instrucciones es la siguiente: IF condicin THEN Instruccin 1 Instruccin 2 ... ELSE Instruccin A Instruccin B ... END IF Llegados a este punto, el programa verificar el cumplimiento o no de la condicin. Si la condicin es cierta las instrucciones 1 y 2 sern 155

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado ejecutadas. De lo contrario (Else), las instrucciones A y B sern llevadas a cabo. Una vez finalizada la estructura, deberemos cerrar con un End If. Esta estructura de base puede complicarse un poco ms si tenemos cuenta que no necesariamente todo es blanco o negro y que muchas posibilidades pueden darse. Es por ello que otras condiciones pueden plantearse dentro de la condicin principal. Hablamos por lo tanto de condiciones anidadas que tendran una estructura del siguiente tipo: IF condicin THEN Instruccin 1 Instruccin 2 ... ELSE IF condicin2 THEN Instruccin A Instruccin B ... ELSE Instruccin X ... END IF END IF De este modo podramos introducir tantas condiciones como queramos dentro de una condicin principal. En este tipo de estructuras es importante cerrar correctamente cada uno de los IF con sus END IF correspondientes. De gran ayuda es la instruccin ELSE IF que permite en una sola lnea y sin necesidad de aadir un END IF introducir una condicin anidada. El uso de esta herramienta resultar claro con un poco de prctica. Pongamos un ejemplo sencillo de utilizacin de condiciones. El siguiente programa permitira detectar la lengua empleada por el navegador y visualizar un mensaje en dicha lengua. <% @ LANGUAGE="VBSCRIPT" %> <HTML> <HEAD> <TITLE>Detector de Lengua</TITLE> </HEAD> <BODY> <% 'Antes de nada introducimos mensajes en forma de variables espanol="Hola" ingles="Hello"

Instituto de Computacin Activa de Mxico S.C.

156

Diplomado Webmaster Avanzado frances="Bonjour" 'Ahora leemos del navegador cul es su lengua oficial idioma=Left(Request.ServerVariables("HTTP_ACCEPT_LANGUAGE"),2) 'Formulamos las posibilidades que se pueden dar If idioma="es" Then Response.Write espanol ElseIf idioma="fr" Then Response.Write frances Else Response.Write ingles End If %> </BODY> </HTML>

Para poder ver el funcionamiento de este script es necesario cambiar el idioma preferido lo cual puede ser realizado a partir del men de opciones del navegador. Como puede verse, las variables que contienen texto son almacenadas entre comillas. Para leer la lengua aceptada por el navegador lo que hacemos es definir una variable (idioma) que recoge las dos primeras letras empezando por la izquierda del idioma aceptado por el navegador ("HTTP_ACCEPT_LANGUAGE"). Este idioma aceptado puede ser requerido como una variable del objeto ServerVariables. Por el momento dejaremos esto tal cual, ya nos encargaremos de verlo ms detenidamente en otros captulos. La tercera parte de script se encarga de ver si el navegador est en espaol (es), francs (fr) o en cualquier otro idioma que no sea ninguno de estos dos y de imprimir cada uno de los mensajes que proceda en cada caso.

5.4 Ciclo FOR


En muchas ocasiones resulta necesario el ejecutar un conjunto de instrucciones un nmero definido de veces. Esto puede ser llevado a cabo a partir de la instruccin FOR/NEXT. La estructura clsica:

Instituto de Computacin Activa de Mxico S.C.

157

Diplomado Webmaster Avanzado FOR contador=nmero inicial to nmero final STEP incremento Instruccin 1 Instruccin 2 ... NEXT A partir de este tipo de estructuras ejecutamos las instrucciones contenidas entre el FOR y el NEXT un cierto nmero de veces definido por el nmero inicial, final y el incremento. El incremento resulta de 1 por defecto. Pongamos un ejemplo: <% @ LANGUAGE="VBSCRIPT" %> <HTML> <HEAD> <TITLE>Bucle for/next</TITLE> </HEAD> <BODY> <%For i=1 to 5%> <font size=<%Response.Write i%>>Vuelta nmero <%Response.Write i%></font><br> <%Next For i=5 to 1 Step -1%> <font size=<%Response.Write i%>>Contamos atrs: <%Response.Write i%></font><br> <%Next%> </BODY> </HTML> Este script compuesto de dos bucles cuenta primero de 1 a 5. La variable i toma por lo tanto todos los valores enteros comprendidos entre estos dos nmeros y puede ser utilizada dentro del bucle como lo hacemos en este caso para aumentar el tamao de la letra. El segundo bucle realiza el proceso inverso (el incremento es negativo) produciendo una disminucin del tamao de la letra. Lo que puede resultar interesante para ver hasta qu punto el programar pginas dinmicas puede ahorrarnos texto con respecto a la misma pgina programada en cdigo HTML, es mirar el cdigo fuente de la pgina a partir del navegador.

Instituto de Computacin Activa de Mxico S.C.

158

Diplomado Webmaster Avanzado

5.5 DO WHILE/LOOP
Otra forma de realizar este tipo de secuencias bucle es a partir de la instruccin DO WHILE. En este caso lo que especificamos para fijar la extensin del bucle no es el nmero de vueltas sino el que se cumpla o no una condicin. La estructura de este tipo de bucles es anloga a la de los bucles FOR/NEXT: DO WHILE condicin Instruccin 1 Instruccin 2 ... LOOP El bucle se dar mientras la condicin propuesta siga siendo vlida. Como se ver en ejemplos posteriores, este tipo de bucles resulta muy prctico para la lectura de bases de datos. Todo este tipo de controladores de flujo (condiciones y bucles) pueden ser matizados y optimizados a partir del uso de operadores lgicos. As, podemos exigir que sean dos las condiciones que se den para llevar a cabo un conjunto de instrucciones: IF condicin 1 AND condicin 2 THEN ... Tambin podemos requerir que sea una de las dos: IF condicin 1 OR condicin 2 THEN... Del mismo modo, es posible exigir que la condicin de un bucle DO sea la inversa a la enunciada: DO WHILE NOT condicin

5.6 Objeto Request


Bucles y condiciones son muy tiles para procesar los datos dentro de un mismo script. Sin embargo, en un sitio internet, las pginas vistas y los scripts utilizados son numerosos. Muy a menudo necesitamos que nuestros distintos scripts estn conectados unos con otros y que se sirvan de variables comunes. Por otro lado, el usuario interacciona por medio de formularios cuyos campos han de ser procesados para poder dar una respuesta. Todo este tipo de factores dinmicos han de ser eficazmente regulados por un lenguaje como el ASP.

Instituto de Computacin Activa de Mxico S.C.

159

Diplomado Webmaster Avanzado

Como veremos, todo este tipo de aspectos interactivos pueden ser gestionados a partir del objeto Request. El objeto Request nos devuelve informaciones del usuario que han sido enviadas por medio de formularios, por URL o a partir de cookies (veremos de qu se tratan seguidamente). Tambin nos informa sobre el estado de ciertas variables del sistema como pueden ser la lengua utilizada por el navegador, el nmero IP del cliente...

5.6.1

Transferir variables por URL Para pasar las variables de una pgina a otra lo podemos hacer introduciendo dicha variable en la direccin URL de la pgina destino dentro del enlace hipertexto. La sintaxis sera la siguiente: <a href="destino.asp?variable1=valor1&variable2=valor2&..."></a> Para recoger la variable en la pgina destino lo hacemos por medio del objeto Request con el mtodo Querystring: Request.querystring("variable1") Request.querystring("variable2") Las dos pginas seran as: <HTML> <HEAD> <TITLE>Pgina origen.asp</TITLE> </HEAD> <BODY> <a href="destino.asp?saludo=hola&texto=Esto es una variable texto">Paso variables saludo y texto a la pgina destino.asp</a> </BODY> </HTML> <HTML> <HEAD> <TITLE>destino.asp</TITLE> </HEAD> <BODY> Variable saludo: <%Response.Write Request.Querystring("saludo")%><br> Variable texto: <%Response.Write Request.Querystring("texto")%><br> </BODY> 160

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado </HTML>

5.6.2

Transferir variables por formulario El proceso es similar al explicado para las URLs. Primeramente, presentamos una primera pgina con el formulario a rellenar y las variables son recogidas en una segunda pgina que las procesa: <HTML> <HEAD> <TITLE>formulario.asp</TITLE> </HEAD> <BODY> <FORM METHOD="POST" ACTION="destino2.asp"> Nombre<br> <INPUT TYPE="TEXT" NAME="nombre"><br> Apellidos<br> <INPUT TYPE="TEXT" NAME="apellidos"><br> <INPUT TYPE="SUBMIT"> </FORM> </BODY> </HTML>

<HTML> <HEAD> <TITLE>destino2.asp</TITLE> </HEAD> <BODY> Variable nombre: <%=Request.Form("nombre")%><br> Variable apellidos: <%=Request.Form("apellidos")%> </BODY> </HTML>

Otras utilidades de Request: las ServerVariables El objeto Request nos da acceso a otras informaciones relativas al cliente y el servidor las cuales pueden resultar de una gran utilidad. Estas informaciones son almacenadas como variables las cuales son agrupadas en una coleccin llamada ServerVariables. Dentro de esta coleccin tenemos variables tan interesantes como: HTTP_ACCEPT_LANGUAGE Nos informa de la lengua preferida por

Instituto de Computacin Activa de Mxico S.C.

161

Diplomado Webmaster Avanzado el navegador Indica cul es el navegador utilizado. Nos devuelve el path fsico del disco duro del servidor en el que se encuentra nuestro script Nos dice qu tipo de software utiliza el servidor

HTTP_USER_AGENT PATH_TRANSLATED SERVER_SOFTWARE

Para visualizar en pantalla alguna de estas variables, debemos escribir algo como: Response.write request.servervariables("nombre de la variable") Una forma rpida de visualizar todas estas variables es a partir de un script con esta secuencia: <% For Each elemento in Request.ServerVariables Response.Write elemento&" : "&Request.ServerVariables(elemento)& "<br>" Next %> Esto nos dara por un lado el nombre de la variable y del otro su valor. Este tipo de bucle For Each/Next se parece a otros ya vistos. En este caso, el bucle se realiza tantas veces como elementos tiene la coleccin (ServerVariables) que no es ms que el conjunto de elementos comprendidos en la extensin del objeto (Request). Este tipo de bucle es aplicable a otras colecciones de ste y otros objetos como por ejemplo los Request.Form o Request.Querystring o las cookies. De esta forma seramos capaces de visualizar el nombre y contenido de tales colecciones sin necesidad de enunciarlas una por una.

5.7 Objeto Response


Tal y como se ha visto, el objeto Request gestiona todo lo relativo a entrada de datos al script por parte del usuario (formularios), provenientes de otra URL, del propio servidor o del browser. Nos queda pues por explicar cmo el script puede "responder" a estos estmulos, es decir, cmo, despus de procesar los debidamente los datos, podemos imprimir estos en pantalla, inscribirlos en las cookies o enviar al internauta a una u otra pagina. En definitiva, queda por definir la forma en la que ASP regula el contenido que es enviado al navegador. 162

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado

Esta funcin es tomada en cargo por el objeto Response el cual ha sido ligeramente mencionado mtodo Write. En efecto, sentencias del tipo: <%Response.Write "Una cadena de texto"%> o bien, <%Response.Write variable%> Tienen como cometido imprimir en el documento HTML generado un mensaje o valor de variable. Este mtodo es tan comnmente utilizado que existe una abreviacin del mismo de manera a facilitar su escritura: <% = variable %> es anlogo a <%response.write variable%> Es importante precisar el hecho que imprimir en el documento HTML no significa necesariamente visualizar en pantalla ya que podramos servirnos de estas etiquetas para crear determinadas etiquetas HTML. He aqu un ejemplo de lo que se pretende decir:

<% path="http://www.misitio.com/graficos/imagen.gif" src="<% =path %>">

%>

<img

Este fragmento de script nos generara un cdigo HTML que sera recibido en el navegador del siguiente modo: <img src="http://www.misitio.com/graficos/imagen.gif">

Otro elemento interesante de este objeto Response es el mtodo Redirect. Este mtodo nos permite el enviar automticamente al internauta a una pgina que nosotros decidamos. Esta funcin, a todas luces prctica, puede ser empleada en scripts en los que enviamos al visitante de nuestro sitio a una u otra pgina en funcin del navegador que utiliza o la lengua que prefiere. Tambin es muy til para realizar pginas "escondidas" que realizan una determinada funcin sin mostrar ni texto ni imgenes y nos envan a continuacin a otra pgina que es en realidad la que nosotros recibimos en el navegador. Aqu se puede ver una secuencia de script que nos permitira usar este mtodo para el caso en el que tengamos pginas diferentes para distintas versiones de navegadores. En ella emplearemos un objeto que nos debe parecer familiar ya que lo acabamos de ver (Request.ServerVariables):

<% Instituto de Computacin Activa de Mxico S.C. 163

Diplomado Webmaster Avanzado tipo_navegador = Request.ServerVariables("HTTP_USER_AGENT") If Instr(1, tipo_navegador, "MSIE 3", 1) <> 0 then Response.Redirect "MSIE3.asp" ElseIf Instr(1, tipo_navegador, "MSIE 4", 1) <> 0 then Response.Redirect "MSIE4.asp" ElseIf Instr(1, tipo_navegador, "MSIE 5", 1) <> 0 then Response.Redirect "MSIE5.asp" ElseIf Instr(1, tipo_navegador, "Mozilla/4", 1) <> 0 then Response.Redirect "Netscape4.asp" Else Response.Redirect "cualquiera.asp" %> Por supuesto, acompaando este script, debemos tener los correspondientes archivos MSIE3.asp, MSIE4.asp, MSIE5.asp... Cada uno de ellos con las particularidades necesarias para la buena visualizacin de nuestra pgina en tales navegadores.

5.8 Base de Datos con ASP


Una de las principales ventajas que presenta el trabajar con pginas dinmicas es el poder almacenar los contenidos en bases de datos. De esta forma, podemos organizarlos, actualizarlos y buscarlos de una manera mucho ms simple. ASP nos ofrece una forma muy eficaz de interaccionar con estas bases de datos gracias al uso del componente ADO (ActiveX Data Objects) el cual permite acceder a dichas bases de una forma sencilla. Este ADO no es ms que un conjunto de objetos que, utilizados en conjunto, nos permiten explotar de una forma muy verstil las bases de datos de nuestra aplicacin. No entraremos por el momento en consideraciones tericas al respecto. Por otra parte, lo scripts ASP deben establecer un dialogo con la base de datos. Este dialogo se lleva a cabo a partir de un idioma universal: el SQL (Structured Query Language) el cual es comn a todas las bases de datos. Este lenguaje resulta, como veremos en el manual de SQL, muy potente y fcil de aprender. Nos limitaremos a utilizar las instrucciones bsicas que sern aprendidas a medida que explicamos las diferentes formas de actuar sobre una base de datos a partir de pginas ASP.

Instituto de Computacin Activa de Mxico S.C.

164

Diplomado Webmaster Avanzado La base de datos que ha sido utilizada en estos ejemplos es MS Access. No es por supuesto la nica si bien es la ms corriente en pequeos PCs y resulta absolutamente operativa siempre que las tablas no sean astronmicamente grandes. Es necesario de cumplir los siguientes requisitos tcnicos: -Instalar el PWS -Enlazar la base de datos con ODBC -Instalar el MS Access (viene dentro del pack Office) -Disponer de un browser y un editor (MS IE y Home Site son nuestras humildes recomendaciones)

5.8.1

Creacin de un Driver para la BD


Para crear este dirver, nos servimos de los conectores ODBC (Open DataBase Connectivity) los cuales establecen el enlace con la base de datos. El primer paso para crear esta conexin es ir al panel de configuracin y abrir el icono ODBC 32bits. Dentro de l, deberemos crear un DSN (Data Source Name) de tipo sistema o usuario. Para ello nos colocamos en la ficha correspondiente (DSN sistema o DSN usuario) y seleccionamos "Aadir". A continuacin se nos pedir seleccionar los controladores de la aplicacin que hemos utilizado para crear la base de datos, el nombre que le queremos asignar (aquel que empleemos en nuestros scripts) y el camino para encontrarla en el disco duro. Este DSN permite en realidad definir la base de datos que ser interrogada sin necesidad de pasar por la aplicacin que hayamos utilizado para construirla, es decir, con simples llamadas y rdenes desde nuestros archivos ASP podremos obtener los datos que buscamos sin necesidad de ejecutar el Access o el MySQL los cuales, evidentemente, no tendrn por qu encontrarse en el servidor donde trabajemos.

5.8.2

Consultas
Dentro de una base de datos, organizada por tablas, la seleccin de una tabla entera o de un cierto nmero de registros resulta una operacin rutinaria. A partir de esta seleccin se puede posteriormente efectuar toda una serie de cambios o bien realizar una simple lectura.

Instituto de Computacin Activa de Mxico S.C.

165

Diplomado Webmaster Avanzado El siguiente script nos permite realizar la lectura de la tabla clientes contenida en nuestra base de datos. A primera vista todo nos puede parecer un poco complejo, pero nada ms lejos de la realidad. <HTML> <HEAD> <TITLE>Lectura de registros de una tabla</TITLE> </HEAD> <BODY> <h1><div align="center">Lectura de la tabla</div></h1> <br> <br> <% 'Antes de nada hay que instanciar el objeto Connection Set Conn = Server.CreateObject("ADODB.Connection") 'Una vez instanciado Connection lo podemos abrir y le asignamos la base de datos donde vamos a efectuar las operaciones Conn.Open "Mibase" 'Ahora creamos la sentencia SQL que nos servira para hablar a la BD sSQL="Select * From Clientes Order By nombre" 'Ejecutamos la orden set RS = Conn.Execute(sSQL) 'Mostramos los registros%> <table align="center"> <tr> <th>Nombre</th> <th>Telfono</th> </tr> <% Do While Not RS.Eof %> <tr> <td><%=RS("nombre")%></td> <td><%=RS("telefono")%></td> </tr> <% RS.MoveNext Loop 'Cerramos el sistema de conexion Conn.Close %>

Instituto de Computacin Activa de Mxico S.C.

166

Diplomado Webmaster Avanzado

</table> <div align="center"> <a href="insertar.html">Aadir un nuevo registro</a><br> <a href="actualizar1.asp">Actualizar un registro existente</a><br> <a href="borrar1.asp">Borrar un registro</a><br> </div> </BODY> </HTML>

Antes de nada, si lo que deseamos es interrogar una base de datos, lo primero que hay que hacer es obviamente establecer la conexin con ella. Esto se hace a partir del objeto Connection el cual es "invocado" o ms tcnicamente dicho instanciado por medio de la primera instruccin en la cual el objeto toma el nombre arbitrario de la variable Conn. El paso siguiente es abrir el objeto y asignarle la base de datos con la que debe contactar. En este caso, la base la hemos llamado Mibase. Este debe de ser el mismo nombre con el que la hemos asignado cuando hemos configurado los conectores ODCB, adems, este nombre no tiene por qu coincidir necesariamente con el nombre del archivo. Una vez creada la conexin a nuestra base de datos, el paso siguiente es hacer nuestra peticin. Esta peticin puede ser formulada primeramente y almacenada en una variable (sSQL) para, a continuacin, ser ejecutada por medio de la instruccin siguiente. La peticin que hemos realizado en este caso es la de seleccionar todos los campos que hay en la tabla clientes (* es un comodn) y ordenar los resultados por orden alfabtico con respecto al campo nombre. Podemos ver ms detalladamente este tipo de instrucciones SQL en nuestro manual de SQL. El resultado de nuestra seleccin es almacenado en la variable RS en forma de tabla. Para ver la tabla lo que hay que hacer ahora es "pasearse" por esta tabla "virtual" RS la cual posee una especie de cursor que, a menos que se especifique otra cosa, apunta al primer registro de la seleccin. El objetivo ahora es hacer desplazarse al cursor a lo largo de la tabla para poder leerla en su totalidad. La forma de hacerlo es a partir de un bucle Do While el cual ya ha sido explicado anteriormente y que lo nico que hace es ejecutar las instrucciones comprendidas entre el Do y el Loop siempre que la condicin propuesta (Not RS.Eof) sea verdadera. Esto se traduce como "Ejecutar este 167

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado conjunto de instrucciones mientras que la tabla de resultados (RS) no llegue al final (Eof, End of File). Las instrucciones incluidas en el bucle son, por un lado, la impresin en el documento de los valores de determinados campos ( =RS("nombre del campo")) y por otro, saltar de un registro al otro mediante la instruccin RS.MoveNext. Todo este conjunto de instrucciones ASP viene en combinacin con un cdigo HTML que permite su visualizacin en forma de tabla. Adems, se han incluido unos enlaces que apuntan hacia otra serie de scripts que veremos ms adelante y que formaran en conjunto una aplicacin. Es interesante ver el cdigo fuente resultante de este script. En este caso el cdigo que ve el cliente resulta sensiblemente ms sencillo. 5.8.3

Altas
En este caso lo que buscamos es crear, a partir de los datos recibidos de un formulario, un nuevo registro en nuestra tabla clientes. Tendremos pues dos archivos diferentes, uno que podra ser un HTML puro en el que introducimos el formulario a rellenar y que nos enva al segundo, un script muy parecido al previamente visto para realizar una seleccin. He aqu los dos scripts: <HTML> <HEAD> <TITLE>Insertar.html</TITLE> </HEAD> <BODY> <div align="center"> <h1>Insertar un registro</h1> <br> <FORM METHOD="POST" ACTION="insertar.asp"> Nombre<br> <INPUT TYPE="TEXT" NAME="nombre"><br> Telfono<br> <INPUT TYPE="TEXT" NAME="telefono"><br> <INPUT TYPE="SUBMIT" value="Insertar"> </FORM> </div> </BODY> </HTML> <HTML> <HEAD> <TITLE>Insertar.asp</TITLE>

Instituto de Computacin Activa de Mxico S.C.

168

Diplomado Webmaster Avanzado </HEAD> <BODY> <% 'Recogemos los valores del formulario nombre=Request.Form("nombre") telefono= Request.Form("telefono") 'Instanciamos y abrimos nuestro objeto conexion Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "Mibase" 'Ahora creamos la sentencia SQL sSQL="Insert Into Clientes (nombre,telefono) values ('" & nombre & "','" & telefono & "')" 'Ejecutamos la orden set RS = Conn.Execute(sSQL) %> <h1><div align="center">Registro Insertado</div></h1> <div align="center"><a href="lectura.asp">Visualizar el contenido de la base</a></div> <% 'Cerramos el sistema de conexion Conn.Close %> </BODY> </HTML>

Como puede verse, la forma de operar es idntica a la vista anteriormente para el display de una tabla. En este caso hemos introducido un enlace a este primer script de lectura para ver cmo los cambios se han hecho efectivos. La construccin de la sentencia SQL se hace por fusin de los distintos elementos constitutivos. La forma de fusionarlos mediante el smbolo &. Todo lo que sea texto tiene que ir entre comillas. Sera interesante introducir una lnea suplementaria en vuestro cdigo para imprimir la sSQL formada. La lnea sera del siguiente tipo: Response.Write sSQL Esta lnea ira situada evidentemente despus de haber construido la 169

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado sentencia.

5.8.4

Modificaciones
Para mostrar cmo se actualiza un registro presente en nuestra base de datos, vamos a hacerlo a partir de un caso un poco ms complejo para que empecemos a familiarizarnos con estas operaciones. Realizaremos un par de scripts que permitan cambiar el numero de telfono de las distintas personas presentes en nuestra base. El nombre de estas personas, as como el nuevo numero de telfono, sern recogidos por medio de un formulario. El archivo del formulario va a ser esta vez un script ASP en el que efectuaremos una llamada a nuestra base de datos para construir un men desplegable donde aparezcan todos los nombres. La cosa quedara as: <HTML> <HEAD> <TITLE>Actualizar1.asp</TITLE> </HEAD> <BODY> <div align="center"> <h1>Actualizar un registro</h1> <br> <% 'Instanciamos y abrimos nuestro objeto conexion Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "Mibase" %> <FORM METHOD="POST" ACTION="actualizar2.asp"> Nombre<br> <% 'Creamos la sentencia SQL y la ejecutamos sSQL="Select nombre From clientes Order By nombre" set RS = Conn.Execute(sSQL) %> <select name="nombre"> <% 'Generamos el menu desplegable Do While not RS.eof%> <option><%=RS("nombre")%> <%RS.movenext Loop 170

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado %> </select> <br> Telfono<br> <INPUT TYPE="TEXT" NAME="telefono"><br> <INPUT TYPE="SUBMIT" value="Actualizar"> </FORM> </div> </BODY> </HTML>

La manera de operar para construir el men desplegable es la misma que para visualizar la tabla. De nuevo empleamos un bucle Do While que nos permite mostrar cada una de las opciones.

El script de actualizacin ser muy parecido al de insercin: <TITLE>Actualizar2.asp</TITLE> </HEAD> <BODY> <% 'Recogemos los valores del formulario nombre=Request.Form("nombre") telefono= Request.Form("telefono") 'Instanciamos y abrimos nuestro objeto conexion Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "Mibase" 'Ahora creamos la sentencia SQL sSQL="Update Clientes Set telefono='" & telefono & "' Where nombre='" & nombre & "'" 'Ejecutamos la orden set RS = Conn.Execute(sSQL) %> <h1><div align="center">Registro Actualizado</div></h1> <div align="center"><a href="lectura.asp">Visualizar el contenido de la base</a></div> <% 'Cerramos el sistema de conexion 171

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado Conn.Close %> </BODY> </HTML>

Nada que comentar al respecto salvo la estructura de la sentencia SQL que en este caso realiza un Update en lugar de un Insert. Aconsejamos, como para el caso precedente imprimir el valor de sSQL de manera a ver cmo queda la sentencia una vez construida.

5.8.5

Bajas
Otra de las operaciones elementales que se pueden realizar sobre una base de datos es el borrar un registro. Para hacerlo, SQL nos propone sentencias del tipo Delete. Vemoslo con un ejemplo aplicado a nuestra agenda. Primero, crearemos un men desplegable dinmico como para el caso de las actualizaciones: <HTML> <HEAD> <TITLE>Borrar1.asp</TITLE> </HEAD> <BODY> <div align="center"> <h1>Borrar un registro</h1> <br> <% Instanciamos y abrimos nuestro objeto conexion Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "Mibase" %> <FORM METHOD="POST" ACTION="borrar2.asp"> Nombre<br> <% Creamos la sentencia SQL y la ejecutamos sSQL="Select nombre From clientes Order By nombre" set RS = conn.execute(sSQL) %> <select name="nombre"> <% Generamos el menu desplegable Do While not RS.eof%> <option><%=RS("nombre")%>

Instituto de Computacin Activa de Mxico S.C.

172

Diplomado Webmaster Avanzado <%RS.movenext Loop %> </select> <br> <INPUT TYPE="SUBMIT" value="Borrar"> </FORM> </div> </BODY> </HTML>

El siguiente paso es hacer efectiva la operacin a partir de la ejecucin de la sentencia SQL que construimos a partir de los datos del formulario: <HTML> <HEAD> <TITLE>Borrar2.asp</TITLE> </HEAD> <BODY> <% 'Recogemos los valores del formulario nombre=Request.Form("nombre") 'Instanciamos y abrimos nuestro objeto conexion Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "Mibase" 'Ahora creamos la sentencia SQL sSQL="Delete From Clientes Where nombre='" & nombre & "'" 'Ejecutamos la orden set RS = Conn.Execute(sSQL) %> <h1><div align="center">Registro Borrado</div></h1> <div align="center"><a href="lectura.asp">Visualizar el contenido de la base</a></div> <% 'Cerramos el sistema de conexion Conn.Close %> </BODY> 173

Instituto de Computacin Activa de Mxico S.C.

Diplomado Webmaster Avanzado </HTML>

5.9 Practica
Disear e implementar un sistema de base de datos en el web para una lnea area. Los requerimientos generales son: Horarios de salida, destinos, tipo de naves y horarios de llegada a los destinos. Costos y reservaciones de boletos. Esta informacin el usuario podr interactuar eligiendo y navegando en ella. Deber contener una interfaz cliente encargada de manipular (modificar, eliminar, almacenar informacin) los datos va remota y protegida. Los datos sern validaos en todo momento. Tenga en cuenta que un sitio debe ser entendible, consistente, seguro, eficiente y sobre todo un diseo grafico profesional. Emplee VBScript y ASP, haga uso de las tecnologas de desarrollo para sitios web.

Instituto de Computacin Activa de Mxico S.C.

174

Diplomado Webmaster Avanzado

www.icam.com.mx

Diplomado Webmaster Avanzado

APENDICE
Internet Information Server

Prestaciones clave de IIS: Soporte de Estandares de Internet: - WWW Service, soporta HTTP permitiendo a los usuarios publicar contenido en Internet, en HTML (Hypertext Markup Language)

Instituto de Computacin Activa de Mxico S.C.

175

Diplomado Webmaster Avanzado - FTP Service, se pueden crear un numero ilimitado de sites. - SMTP Service, es un e-mail server que usa SMTP y POP3. - NNTP Service, for hosting electronic discussion groups.

Setup y Administracin: - MMC Ms Management Console - HTMLA para administrar Web server o sites individuales remotamente usando Web browser. - Command Line Administration Scripting, para administrar Web sites desde el command prompt.

Web based Applications: IIS incluye prestaciones que ayudan a desarrollar aplicaciones basadas en Web: - Microsoft Transaction Server, soporta herramientas requeridas para hacer aplicaciones multiusuario para servidor Web. - Process isolation. - ASP Active Server Pages, es un entorno abierto de aplicacin libre de compilacin. Aprovecha las capacidades del MTS de process isolation, transaction y scalability. - Server-Side Java Virtual Machine, ejecuta componentes Java en servidor.

Seguridad y Autentificacin: - Certificate Authentification, provee a los usuarios con single logon servers to network resources usando certificados de clientes. - Certificate Wildcard Mapping, permite certificarse sin tener acceso al certificado actual. - Domain Blocking para regular el acceso al contenido en el servidor, selectivamente por dominio.

Web Publishing Tools: - Web Publishing Wizard, conecta con el ISP, determina el protocolo para copiar los ficheros y los descarga en la carpeta apropiada del ISP. - Posting Acceptor, habilita al IIS para aceptar contenido Web desde el Web Posting Wizard, el Navegador, etc. - FrontPage 98 server extensions.

IIS y los sistemas operativos Windows: - NT Server, funcionalidad total. - NT Workstation, se llama PWS Personal Web Server. Limitaciones: - No soporta multiple Web site hosting Instituto de Computacin Activa de Mxico S.C. 176

Diplomado Webmaster Avanzado - No ODBC logging - IP restrictions - Process isolation - W95, las limitaciones de PWS, ms: - Seguridad, no tiene la de NT. - Index Server.

Instalando IIS: Componentes requeridos: a. CD Instalacin de Windows En Alpha no existen los componentes de Visual Basic, Visual J++ y Java Virtual Machine. Es decir si sus aplicaciones requieren estos complementos hay que bajarlos de Internet. 486 50mhz., 16 mb. ram, 50 mb. Disco. P90, 32-64 mb. ram, 200 mb. Disco. (recomendado) En todas las plataformas: Internet Explorer 4.01 como Web browser. + SP3 TCP/IP + NTFS (sobre todo para SMTP) Seguridad: - Usar NTFS. - Usar un esquema de password complejo. - Mantener politicas de cuentas, limitando a Guest a carpetas especificar en el servidor. - Limitar los miembros del grupo Administrador. - Ejecutar solo los protocolos y servicios requeridos. - Controlar los permisos en los recursos compartidos. - Habilitar auditoria. Opciones de instalacin: - Mnima: - Internet Information Server (Personal Web Server para Win. 9x). - Microsoft Transaction Server - ASP - Microsoft Data Access Components, soporte para ActiveX Data Objects, (ADO) con Remote Data Service y OLE DB. - Posting Acceptor. Para que otros cargen ficheros en el Web site. - FrontPage Extensions. - Ms Management Console. - Internet Service Manager snap-in. Para controlar los sites Web y Ftp. - Microsoft Transaction Server snap-in. Administra aplicaciones y componentes de transaccin grficamente. - Index Server. Instituto de Computacin Activa de Mxico S.C. 177

Diplomado Webmaster Avanzado - Context-sensitive Help. - Tipica: - FTP Service - Internet Service Manager (HTML) administra Web y Ftp con un browser. - Documentacin. - Programabilidad. Ms Script Debugger. - Servicios adicionales. Java Virtual Machine. - Personalizada: - Site Server Express - Windows Scripting Host - Web Publishing Wizard - Documentacion adicional. - SMTP Service - NNTP Service - Certificate Server. Qu se cambia en la instalacin del NT Server: - Se aade la metabase - Una cuenta nueva de usuario: IUSR_servidor. - Nuevos contadores al Performance Monitor. Microsoft Management Console: Proporciona un entorno comun para los snap-ins. Cuando se inicia el Internet Service Manager, MMC arranca y carga el Internet Service Manager snap-in. Componentes de la MMC interface: - Scope Pane. Es la ventana izquierda y lista los servicios. La jerarquia de servicios se llama tambien namespace. - Results Pane. La ventana derecha es el panel de resultados. Cuando se selecciona un nodo, el panel muestra la lista de los elementos y servicios que caen dentro del dominio del nodo seleccionado. - Rebar, MMC tiene tres barras de men. La Rebar consiste en Action y View mens. - Nodes. Son instancias de servicios individuales. Se pueden abrir multiples ventanas. Crear multiples ficheros de consola y compartirlos en grupo.

Internet Information Server Administrative Tools. Internet Service Manager Snap-in: Ayuda a configurar y monitorizar los servicios de IIS funcionando en NT. Instituto de Computacin Activa de Mxico S.C. 178

Diplomado Webmaster Avanzado Herramientas en la Rebar: - User Manager - Server Manager - Event Viewer - Performance Monitor - Key Manager, para administrar user authentication codes. Internet Service Manager (HTMLA): Para administrar su servidor remotamente usando HTMLA. El numero de puerto en una conexin HTMLA se asigna aleatoriamente. La herramienta HTMLA se basa en la arquitectura de los estandares COM y DCOM.

Windows Scripting Host: Habilita para ejecutar scripts directamente en el Escritorio o en la consola de comandos, sin incluir esas scripts en un documento HTML.

IIS Metabase: Configurando las entradas de Metabase: - IIS Admin Objects. Se pueden usar con VBScript. Han sido desarrollados para estandares COM. - IIS Admin Base Objects. Pata programas en C++ . Mejor rendimiento. Han sido desarrollados para estandares DCOM. Las propiedades configuradas en los niveles altos, pueden ser pasadas o heredadas por los niveles ms bajos, excepto si se cambian las de stos. Key Metabase Entries: - Computer and Web site properties. - Logging properties. - FTP-specific properties. - HTTP-specific properties. - Virtual directory and directory properties. - File properties. - Filter properties. - SSL key properties. (Secure Sockets Layer keys)

Protocolos que soporta IIS: - Protocolos Tcp/Ip - HTTP (Hypertext Transfer Protocol) - FTP (File Transfer Protocol) Instituto de Computacin Activa de Mxico S.C. 179

Diplomado Webmaster Avanzado - SMTP (Simple Mail Transfer Protocol) - NNTP (Network News Transfer Protocol) - POP3 (Post Office Protocol 3) - IMAP (Internet Messaging Access Protocol)

Arquitectura del servidor de IIS: - Inetinfo process / connectors - Ms Windows NT system services - Web services - Application services

Proceso de Inetinfo: Adems de servicios de Internet, Inetinfo contiene: - Shared thread pool - Cache (file handles, account inf..) - Logging (tracks users in Web site) log file o ODBC/DSN - SNMP services (usando MIBs)

Connectors: Son ISAPI DLL, que actan como pipe entre IIS y un servicio en particular: - Ms BackOffice connectors: - Ms Exchange Server/Web connector. - ODBC connector - CGI Common Gateway Interface (para Unix) - ISAPI filters - ASP active server pages

Windows NT system services: Es el nivel ms bajo de la arquitectura de servidor de IIS. Los datos entran a traves de Tcp/Ip y salen a travs de Windows Sockets.

Web services: Es el nivel medio. Alberga la funcionalidad central de IIS. - ATQ Asynchronous Thread Queue. Maneja el IIS bandwidth usado por el Web site. - Infocom.dll maneja las funciones: - File handling cache - Security - Autentificacion SSL - Soporte de Administracin Instituto de Computacin Activa de Mxico S.C. 180

Diplomado Webmaster Avanzado - Utilidades - Service Controller Interface - Meta cache (run time cache) - Instance support - FTP component - Isadmin. Almacena el DCOM (Distribute Component Object Model) para la metabase. Es la gateway para la administracin de los servicios IIS. - SMTP, NNTP y POP3, soportan e-mail y news services. - ISAPI como alternativa a CGI - ISAPI filter. - Custom authentification schemes. - Compression - Encryption - Customized logging - Traffic or other request analyses - CGI

Application Services: Es el nivel ms alto de la arquitectura de servidor. Toda la informacin entra y sale de este nivel a travs del WAM (Web Application Manager). - Wam provee a IIS con: - Housing components for ISAPI DLLs - Translation from ISV to core IIS features. - Soporte para multiples ISAPI DLLs - Recovery for application failure - A unit for proccess isolation - ISAPI, inicia software services que han sido preparados para el sistema operativo NT - ASP, proporciona funcionalidad ASP en el lado servidor. - INDEX Server, para indexing and querying files on IIS - IDC scripts, para generar pginas Web dinmicas desde datos almacenados en bases de datos ODBC. Es mejor usar ASP. - SSI, server-side includes directives component to include text, graphics or application info in a HTML page antes de enviarla al usuario. Arquitectura de Administracin: Toda la informacin de configuracin est en la metabase. La arquitectura de IIS se administra por la metabase y ADSI (Active Directory Service Interface) ADSI es una interface general para administrar servicios en NT. (tambien como una scripting interface) - MMC (Ms Management Console) proporciona snap-ins almacenados por ella para comunicarse con la metabase. - HTMLA comunica con la metabase sobre Internet o Intranet. Instituto de Computacin Activa de Mxico S.C. 181

Diplomado Webmaster Avanzado - WSH Windows Scripting Host, pequeas tareas via ActiveX scripting.

Un data request se enruta a travs de la arquitectura IIS, de esta forma: Entra en un server IIS a travs de los Windows NT system services, se pasa a los servicios Web y despus a los servicios de Aplicacin. La respuesta retoma la ruta de la peticin.

Configurando el servicio WWW: HTTP es un protocolo cliente-servidor orientado a objetos, situado en el nivel de Aplicacin del stack. Propiedades WWW: Cada sitio Web y cada fichero dentro de cada sitio Web, que se crea en el ordenador tiene su propio conjunto de hojas de propiedades almacenadas en la metabase. - Master, determina las propiedades por defecto de cada sitio web virtual que se cree. - Default, el proceso de instalacin crea un sitio web por defecto. - File, propiedades de los ficheros creados en un directorio virtual. Hojas de propiedades WWW: Se cambian usando el Internet Service Manager snap-in (ISM) para la MMC. - Web site - Operators - Performance - ISAPI filters - Home directory - Document - Directory security - HTTP headers - Custom errors

Directorios Virtuales: Se pueden establecer para los servicios Www y Ftp. Pueden crearse para carpetas situadas en: - El mismo disco que el Home directory, Wwwroot Ftproot. (Local Virtual Directory) Instituto de Computacin Activa de Mxico S.C. 182

Diplomado Webmaster Avanzado - Otro disco dentro del mismo ordenador. (Local Virtual Directory) - Otro ordenador en la red, en el mismo dominio NT. (Remote Virtual Directory) Se pueden crear directorios virtuales con cualquier herramienta de administracin de IIS, como ISM para la MMC, HTMLA y WSH windows scripting host, y usar FrontPage para administrarlos automticamente.

Servidores Virtuales: Usando un unico ordenador con IIS, se pueden almacenar multiples nombres de dominio, utilizando servidores virtuales. Se pueden almacenar multiples sitios Web y Ftp en un unico ordenador IIS. Se necesita una direccin IP para cada dominio, aunque para los sitios Www utilizando Host Headers se puede usar una sla direccin IP. Para usar Host Headers, se debe proveer resolucin de direccin IP a nombre de host, a travs del servicio DNS o de ficheros Hosts. Se pueden crear servidores virtuales con cualquier herramienta de administracin de IIS, como ISM para la MMC, HTMLA y WSH windows scripting host.

Configurando el servicio FTP: Ftp usa dos puertos para transmitir ficheros, uno para enviar y otro para recibir, por ello, es ms eficiente que el HTTP para transmisin de ficheros. Usa el TCP como transporte para las comunicaciones entre el cliente y el servidor. La sesin que establece TCP es fiable y tiene recuperacin de errores: - Flow control. - Acknowledgement. - Retransmission. - Sequencing - Checksum Propiedades FTP: Cada sitio Ftp y cada fichero dentro de cada sitio Ftp, que se crea en el ordenador tiene su propio conjunto de hojas de propiedades almacenadas en la metabase. - Master, determina las propiedades por defecto de cada sitio ftp virtual que se cree. - Default, el proceso de instalacin crea un sitio ftp por defecto. - File, propiedades de los ficheros creados en un directorio virtual. Instituto de Computacin Activa de Mxico S.C. 183

Diplomado Webmaster Avanzado

Hojas de propiedades FTP: Se cambian usando el Internet Service Manager snap-in (ISM) para la MMC. El servicio Ftp usa cinco hojas de propiedades: - Ftp site - Security accounts - Messages - Home directory - Directory security

Servicio SMTP: El servicio SMTP permite configurar el hardware para enviar y recibir mensajes por Internet. Usa el Internet Service Manager y el ISM HTML para administracin, adems de SNMP, performance monitor y event logs. Soporta Secure Sockets Layer SSL para encriptar las transmisiones. Para cada dominio configurado, el servicio SMTP soporta el poner todos los mensajes entrantes directamente en una carpeta Drop. SMTP Interface de Administracin: Todos los servicios de IIS establecidos para el ordenador son visualizados en el Internet Service Manager ISM. Un nodo en el panel izquierdo representa el servicio SMTP. Los nodos de ordenador y servicio SMTP: - Computer node. - Default SMTP Site node. Cuando se hace doble click en el nodo, se visualiza una lista de dominios y current sessions. - Domains node. Dominios de SMTP - Current Sessions node. El site SMTP en el ISM es un servidor virtual que se usa para ejecutar el servicio SMTP e IIS. Incluye un dominio por defecto, que se usa para marcar mensajes desde direcciones que no tienen un dominio. Hay un unico dominio por defecto y no puede borrarse. Se puede, sin embargo, crear un dominio alias. Todos los dominios alias usan el dominio por defecto para marcar (stamp) mensajes. Cuando se instala SMTP, se instalan 5 carpetas por defecto en la carpeta Mailroot para el servicio SMTP: - Badmail. Almacena los mensajes no repartidos y que no pueden devolverse al remitente. - Drop. Recibe todos los mensajes entrantes. - Pickup. Picks up los mensajes salientes que son creados manualmente como fichero de texto y situados en la carpeta. Instituto de Computacin Activa de Mxico S.C. 184

Diplomado Webmaster Avanzado - Queue. Almacena los mensajes para repartir. Proceso del servicio SMTP: El servicio usa el protocolo SMTP para transportar y repartir mensajes. Los mensajes son transferidos entre servidores de e-mail remotos y la carpeta Drop designada para el dominio por defecto. Cuando un mensaje se sita en la carpeta Pickup, o llega a travs del puerto Tcp designado, es situado en la carpeta Queue. Si se determina que el mensaje es para un recipiente local, es movido desde la carpeta Queue a la Drop designada para el dominio por defecto y se cierra el ciclo local. Si no es local, el mensaje es procesado para reparto remoto: - Sort messages and queue for delivery. Los mensajes permanecen en la carpeta Queue. Son clasificados por dominio para que el servicio SMTP los pueda enviar como un grupo. - Determine if the receiving server is ready to receive messages. Si no lo est, se reintenta. - Verify recipients. Se verifica cada recipiente, si no lo es, se genera un NDR non-delivery report para ese recipiente. - Send the message. El mensaje es enviado. Una vez que el receptor confirma la transmisin, el reparto SMTP est completo. Opciones de reparto: - Si est habilitado SSL para reparto remoto, el servicio SMTP encripta todos los mensajes salientes. - Todos los mensajes pueden enviarse a un smart host que los enva a los recipientes. - Mensajes destinados a un dominio remoto, pueden tambien ser repartidos usando una ruta especfica. Esta opcin tiene preferencia sobre smart host. Arrancando, poniendo en pausa y deteniendo el servicio: Se puede arrancar y parar el servicio SMTP manualmente. Todos los ordenadores IIS en la red de una organizacin pueden ser arrancados, pausados y parados remotamente desde cualquier ordenador en el que ISM est instalado. Para administrar un servicio remotamente, el usuario ejecutando ISM debe estar incluido en el grupo de Administradores de NT Server en el ordenador que ser administrado. Se puede pausar el servicio SMTP para actualizaciones y mantenimiento. Se impiden nuevas conexiones de clientes, pero permite que el servicio contine procesando las conexiones de cliente existentes y repartir el e-mail en cola. Configurando el servicio SMTP: El servicio tiene cinco hojas de propiedades: - SMTP Site. - SMTP Site Identification - Descripcin Instituto de Computacin Activa de Mxico S.C. 185

Diplomado Webmaster Avanzado - Direccin IP - Incoming and Outgoing Connections. - TCP Port - Limited to connections - Connection time-out (seconds) - Limit connections per domain. - Enable Logging - Active log format - Propiedades - Operators. No con HTMLA - SMTP Site Operators. - Messages. - Limite de mensajes. - Tamao mximo del mensaje. - Tamao mximo de la sesin. - Numero mximo de mensajes salientes por conexin. - Numero mximo de recipientes por mensaje. - Enviar una copia de non-delivery report a. - Badmail directory. - Delivery - Transmissions options, local o remote queue. - Reintentos mximos. - Intervalo de reintentos en minutos - Routing options - Maximum hop count. - Fully qualified domain name. Para el MX message exchanger - Security options. - Masquerade domain. - Perform reverse DNS lookup on incoming messages - Outbound security - No authentication - Clear-txt authentication - Windows NT Challenge/Response authentication and encryption - TLS Transport Layer Security encryption - Directory Security. Se usa para especificar los mtodos para acceso annimo y control de autenticacin, y para establecer el mtodo de comunicacin segura. Tambin se usa para establecer las restricciones de direccin IP y nombre de dominio, y para garantizar o denegar permisos para relay e-mail a travs del sitio SMTP. - Anonymous Access and Authentication Control: - Allow Anonymous Access. - Basic Authentication - Windows NT Challenge/response - Secure Communication establece el mtodo de comunicacin segura usado cuando se accede al sitio SMTP. - IP address and Domain Name Restrictions, para bloquear a grupos o individuos o garantizar su acceso al servidor. Instituto de Computacin Activa de Mxico S.C. 186

Diplomado Webmaster Avanzado - Relay Restrictions, determina si se da o no permiso para relay e-mail a travs del sitio SMTP. - Allowed to relay - Not allowed to relay - Allow any computer that successfully authenticates to relay.

Prestaciones de Seguridad: Hay dos hojas de propiedades disponibles para establecer las opciones de seguridad. La de Operadores y la Directory Security. Tambin incluye restricciones para acceso IP en ISM, pero no en ISM HTML. Los cambios en estas hojas de propiedades se aplican a todos los dominios. Se pueden designar qu cuentas de usuarios pueden tener permiso de operador para el sitio SMTP. Una vez que la cuentas de NT han sido establecidas, se pueden seleccionar desde la lista de operadores del sitio. Se puede requerir que todos los clientes usen SSL para conectarse al servidor administrado a travs del sitio SMTP por defecto. Esta opcin asegura la conexin, pero no se usa para autenticacin. Hay dos opciones SSL adicionales disponibles. Para usar SSL para todas las conexiones salientes, puede seleccionar Always Use SSL en la hoja Delivery. Si un servidor al que se conecta con frecuencia requiere el uso de SSL para todas las conexiones entrantes, puede crear un dominio remoto y seleccionar Use SSL en la hoja Domain. Monitorizando el servicio SMTP: Puede usar transaction logging para seguir transacciones de mensaje individuales, incluyendo hora de recepcin, reparto a un buzn local y acceso al recipiente. Logging format: - Microsoft logging. (defecto) - Extended logging. - NCSA logging.

Servicio NNTP: El servicio NNTP soporta numerosos formatos de contenido: - MIME, Multipurpose Internet Mail Extension - HTML, Hypertext Markup Language Instituto de Computacin Activa de Mxico S.C. 187

Diplomado Webmaster Avanzado - GIF, Graphics interchange format - JPEG, Joint Photographic Experts Group Para incluir grficos y web links. Se administra con Internet Service Manager y ISM HTML, con la Consola MMC para hacerlo en la misma LAN, o con HTML para la misma red o en Internet con un browser solo en el ordenador del administrador. Tambien escribe en los logs del IIS, as como que usa las herramientas para monitor de rendimiento y visor de eventos. Contadores en Performance Monitor. Incluye soporte para monitores SNMP. El servicio NNTP administra el acceso a los grupos de noticias usando las ACL, access control lists de NT. Estableciendo permisos a las carpetas que contienen los grupos de noticias, se puede controlar quin accede a los mismos. Tambin se puede especificar acceso annimo para permitir a cualquiera el acceso a un grupo de noticias. Soporta full-text e indexacin del contenido del grupo de noticias usando Index Server. El Microsoft Content Replication System actualiza las ACL para el servicio NNTP automticamente a travs de varios servidores. NNTP soporta tres opciones de seguridad: - Acceso annimo. - Estandar NNTP security extension (AUTHINFO) - Windows NT Challenge/Response protocol. Este protocolo requiere el cliente Ms Internet Mail and News. Para proteger la informacin enviada a travs de una red pblica, NNTP soporta Secure Socket Layer SSL channel encryption. El soporte SSL incluye soporte de certificado para validar la identidad de los clientes y servidores. Cmo trabaja el servicio NNTP: El servicio NNTP implementa NNTP, que es un protocolo cliente/servidor. El servicio NNTP es el servidor; Ms Internet Mail and News es un cliente tpico.

Data Structures: Almacena los artculos en una o mas jerarquas de carpetas. Cada grupo de noticias tiene su propia carpeta y cada articulo se almacena como una fichero en esa carpeta.

Instituto de Computacin Activa de Mxico S.C.

188

Diplomado Webmaster Avanzado La carpeta por defecto es c:\Inetpub\Nntproot. Se pueden crear jerarquas de carpetas en otros discos u ordenadores definiendo directorios virtuales. La carpeta del grupo de noticias tiene en mismo nombre que el grupo. Se crean las carpetas automticamente al crear los grupos. Los ficheros de asuntos de los artculos tienen extensin .xix y se crean por cada 128 artculos en un grupo. Configurar y administrar el servicio: Se puede parar y arrancar. Cuando se pausa, no acepta nuevas conexiones pero da servicio a las existentes. Los directorios virtuales te habilitan para almacenar ficheros de grupos de noticias en mltiples discos duros y se mejora el rendimiento. Tambin permiten cambiar la situacin fsica de la carpeta sin cambiar el nombre del grupo de noticias. El servicio NNTP usa 6 hojas de propiedades: - News site. - Security accounts. Qu usuarios pueden acceder al servidor y qu cuenta se usa para las peticiones de logon annimas. - NNTP settings. Si se permite a los clientes poner mensajes, limitar el tamao o longitud de conexin. Tambin se especifica el protocolo SMTP server para los grupos moderados, establecer el moderador del dominio y la cuenta de e-mail del administrador del sitio. - Home Directory. Para especificar si el contenido debe venir desde una carpeta situada en este ordenador o de uno compartido por ah. Establecer restriccin de acceso al sitio, y el mtodo de comunicaciones seguras para el servidor. - Directory Security. Para establecer el mtodo de autenticacin del password para los accesos no annimos, y para establecer las restricciones de acceso Tcp/Ip. - Grupos. Para crear nuevos grupos, etc. Se puede establecer el tiempo mximo que los articulos se mantienen en el servicio NNTP y cuanto espacio en disco puede ocupar un grupo de noticias. Para restringir el acceso y proporcionar seguridad hay varios mtodos: restriccin del acceso al newsgroup, autenticar usuarios o limitar el acceso por la direccin IP. Se puede controlar el acceso a las carpetas con los permisos de NT. Se puede limitar el acceso a un rango de direcciones IP o usando un nombre de dominio, pero aade una sobrecarga por la bsqueda de un DNS por cada conexin. Para usar grupos moderados, se tiene que especificar un servidor de email SMTP que se usa para enviar artculos a los moderadores o a una carpeta donde se almacenan. Se puede especificar un moderador por Instituto de Computacin Activa de Mxico S.C. 189

Diplomado Webmaster Avanzado defecto para el dominio. Newsgroup_name @ default_domain. Si se especifica un servidor SMTP, est seguro de que la identificacin de usuario bajo la que el servicio NNTP est funcionando 8por defecto la cuenta System) est definida como una cuenta en el servidor SMTP. Aadiendo prestaciones de seguridad Windows NT y IIS: Permitir acceso annimo con Internet Guest Account: the Internet Guest Account es creada durante la instalacin de IIS. Todos los usuarios de IIS usan esta cuenta por defecto. En otras palabras, los usuarios son logged en el servidor usando la cuenta Internet Guest Account. Esta cuenta slo puede hacer login en local y no tiene derechos que pudieran permitir a un intruso usarla para daar el sistema. La Internet Guest se aade al grupo Guests. Si se d permiso de acceso remoto a travs de la cuenta Internet Guest solo, los usuarios remotos no dan nombre de usuario ni password y tienen solo los permisos asignados a la cuenta Guest. Requerir un nombre de usuario y password: la autenticacin bsica y la de password de NT fuerzan a los usuarios a proporcionar un nombre y clave para acceder al servidor. Windows NT autenticacin, soportada por el Explorer, encripta el nombre de usuario y la password. La autenticacin bsica los envia sin encriptar. Microsoft recomienda el mtodo Challenge/Response. Web server Permissions for files and folders: a diferencia de los permisos NTFS, los permisos del Web server se aplican a todos los usuarios accediendo al sitio Web. Esta distincin es muy importante, ya que en NTFS se aplican a usuarios o a grupos. Prima el ms restrictivo. Siempre que sea posible, seleccione la opcin Script en lugar de Execute, ya que la opcin script limita a los usuarios a ejecutar programas asociados con un motor de script instalado, no cualquier aplicacin ejecutable. Se puede deshabilitar el enlace del servicio Servidor a las tarjetas de red. Se puede parar el servicio servidor para prevenir que los usuarios vean los recursos compartidos que existen en el IIS.

Instituto de Computacin Activa de Mxico S.C.

190

Diplomado Webmaster Avanzado

Autor: Ing. Joel Gonzlez Estrada

Instituto de Computacin Activa de Mxico S.C.

191