Está en la página 1de 201

Universidad de Navarra

Escuela Superior de Ingenieros

Nafarroako Unibertsitatea

Ingeniarien Goi Mailako Eskola

INFORMTICA II

Fernando Alonso Blzquez


Dr. Ingeniero Industrial

Nicols Serrano Brcena

Dr. Ingeniero Industrial

Sonia Calzada Mnguez


Dra. Ingeniero Industrial

San Sebastin, Septiembre de 2007

CAMPUS TECNOLGICO DE LA UNIVERSIDAD DE NAVARRA. NAFARROAKO UNIBERTSITATEKO CAMPUS TEKNOLOGIKOA


Paseo de Manuel Lardizbal 13. 20018 Donostia-San Sebastin. Tel.: 943 219 877 Fax: 943 311 442 www.tecnun.es informacion@tecnun.es

ndice
1. Introduccin .......................................................................................................1
1.1. Internet en la actualidad.................................................................................... 1
1.1.1. Internet, revoluciona la manera de hacer negocios?.............................................. 1
1.1.1.1. Multinacionales .................................................................................... 2
1.1.1.2. Pequeas Y Medianas Empresas (PYMEs) ....................................................... 2
1.1.1.3. Las empresas puras de Internet ".com"......................................................... 2
1.2. Motivacin y Objetivos de la asignatura................................................................... 2
1.2.1. Papel dentro de la Intensificacin en Tecnologas de la Informacin (Ingeniera Industrial) . 3
1.2.2. Papel dentro de la Intensificacin en Telemtica (Ingeniera de Telecomunicacin) ......... 3
1.3. Estructura de la asignatura ................................................................................. 3
1.4. Software necesario para la asignatura .................................................................... 4
2. Generalidades de Internet ......................................................................................7
2.1. Protocolo TCP/IP ............................................................................................. 7
2.2. Protocolo HTTP y lenguaje HTML .......................................................................... 7
2.3. URL (Uniform Resource Locator) ........................................................................... 7
2.3.1. URLs del protocolo HTTP .............................................................................. 9
2.3.2. URLs del protocolo FTP ................................................................................ 9
2.3.3. URLs del protocolo correo electrnico (mailto) .................................................... 9
2.3.4. URLs del protocolo Telnet ............................................................................. 9
2.3.5. Nombres especficos de ficheros ...................................................................... 9
3. Lenguaje HTML.................................................................................................. 11
3.1. Introduccin..................................................................................................11
3.2. Tags generales ...............................................................................................11
3.3. Formato de texto ............................................................................................12
3.3.1. TAGs generales de un documento. ..................................................................12
3.3.2. Comentarios en HTML .................................................................................13
3.3.3. Caracteres de separacin en HTML..................................................................13
3.3.4. TAGs de organizacin o particin de un documento ..............................................13
3.3.5. Formateo de textos sin particiones..................................................................13
3.3.6. Centrado de prrafos y cabeceras con <CENTER> .................................................14
3.3.7. Efectos de formato en texto .........................................................................14
3.3.8. Caracteres especiales .................................................................................15

CAMPUS TECNOLGICO DE LA UNIVERSIDAD DE NAVARRA. NAFARROAKO UNIBERTSITATEKO CAMPUS TEKNOLOGIKOA


Paseo de Manuel Lardizbal 13. 20018 Donostia-San Sebastin. Tel.: 943 219 877 Fax: 943 311 442 www.tecnun.es informacion@tecnun.es

ii

Indice

3.4. Listas ..........................................................................................................15


3.4.1. Listas desordenadas ...................................................................................15
3.4.2. Listas ordenadas .......................................................................................15
3.4.3. Listas de definiciones .................................................................................16
3.5. Imgenes .....................................................................................................16
3.6. Links...........................................................................................................17
3.7. Tablas .........................................................................................................17
3.8. Frames ........................................................................................................18
3.8.1. Introduccin a los frames .............................................................................18
3.8.2. Salida a ventanas o frames concretas de un browser. ............................................20
3.8.3. Nombres de TARGET...................................................................................21
3.9. Mapas de imgenes o imgenes sensibles ................................................................21
3.9.1. Cmo funciona un mapa de imgenes...............................................................21
3.9.2. Mapas de imgenes procesados por el browser ....................................................21
3.10. Editores y conversores HTML .............................................................................22
4. Formularios y CGIs.............................................................................................. 23
4.1. Formularios (Forms).........................................................................................23
4.2. Programas CGI ...............................................................................................28
5. JavaScript........................................................................................................ 29
5.1. Introduccin..................................................................................................29
5.1.1. Propiedades del Lenguaje JavaScript ...............................................................29
5.1.2. El lenguaje JavaScript.................................................................................29
5.1.3. Variables y valores .....................................................................................30
5.1.4. Sentencias, Expresiones y Operadores ..............................................................30
5.1.5. Estructuras de Control. ...............................................................................30
5.1.6. Funciones y Objetos ...................................................................................30
5.1.6.1. Funciones ..........................................................................................30
5.1.6.2. Objetos ............................................................................................31
5.1.7. La TAG Script. .......................................................................................31
5.2. Activacin de JavaScript: Eventos (Events)..............................................................32
5.2.1. Eventos y acciones .....................................................................................32
5.2.1.1. Acciones de Navegacin y Eventos .............................................................33
5.2.2. Gestores de Eventos (Event Handlers) ..............................................................33
5.2.2.1. Declaracin .......................................................................................33
5.2.2.2. Uso .................................................................................................34
5.2.2.2.1. Gestores a nivel de documento ...........................................................34
5.2.2.2.2. Gestores a nivel de formulario............................................................35
5.2.2.2.3. Gestores a nivel de elementos de formulario...........................................35
5.3. Clases en JavaScript ........................................................................................35
5.3.1. Clases Predefinidas (Built-In Objects)...............................................................36
5.3.1.1. Clase String .......................................................................................36
5.3.1.2. Clase Math.........................................................................................37

ndice

iii

5.3.1.3. Clase Date .........................................................................................38


5.3.2. Funciones Predefinidas (Built-in Functions): eval, parseFloat, parseInt. ......................39
5.3.2.1. eval(string)........................................................................................39
5.3.2.2. parseFloat(string) ................................................................................39
5.3.2.3. parseInt(string, base)............................................................................39
5.3.3. Clases del browser .....................................................................................39
5.3.3.1. Clase Window .....................................................................................40
5.3.3.2. Clase Document ..................................................................................40
5.3.3.3. Clase Location ....................................................................................41
5.3.3.4. Clase History ......................................................................................41
5.3.4. Clases del documento HTML (anchors, forms, links)..............................................41
5.4. Clases y Funciones definidas por el usuario..............................................................43
5.4.1. Funciones (mtodos) ..................................................................................44
5.4.2. Objetos como Arrays (Vectores) .....................................................................44
5.4.3. Extender Objetos ......................................................................................44
5.4.4. Funciones con un nmero variable de argumentos................................................45
5.5. Expresiones y operadores de JavaScript..................................................................45
5.5.1. Expresiones .............................................................................................45
5.5.1.1. Expresiones Condicionales ......................................................................46
5.5.2. Operadores de asignacin (=, +=, -=, *=, /=).......................................................46
5.5.3. Operadores aritmticos ...............................................................................46
5.5.4. Operadores lgicos ....................................................................................46
5.5.5. Operadores de Comparacin (= =, >, >=, <, <=, !=) ...............................................47
5.5.6. Operadores de String ..................................................................................47
5.5.7. Prioridad de los operadores ..........................................................................47
5.6. Sentencias de control de JavaScript. .....................................................................48
5.6.1. La sentencia if..........................................................................................48
5.6.2. Bucles ...................................................................................................48
5.6.2.1. Bucle for...........................................................................................48
5.6.2.2. Bucle while ........................................................................................49
5.7. Comentarios ..................................................................................................49
6. Introduccin a Java............................................................................................. 53
6.1. Programacin Orientada a Objetos. Fundamentos......................................................53
6.2. El lenguaje de programacin Java ........................................................................54
6.3. Caractersticas generales de Java.........................................................................55
6.4. Entornos de desarrollo de Java ............................................................................56
6.4.1. Java Development Kit (JDK) ..........................................................................56
6.4.1.1. Instalacin.........................................................................................56
6.4.1.2. Documentacin ...................................................................................57
6.4.1.3. Manos a la obra ...................................................................................57
6.4.2. Entornos IDE (Integrated Development Environment) ............................................58
6.5. Estructura general de un programa en Java .............................................................59

iv

Indice

6.5.1. Concepto de Clase.....................................................................................59


6.5.2. Herencia ................................................................................................60
6.5.3. Concepto de Interface ................................................................................60
6.5.4. Concepto de Package..................................................................................60
6.5.5. La jerarqua de clases de Java (API) ................................................................60
7. GUI y otros elementos de Java ............................................................................... 61
7.1. Graphic User Interfaces (GUI) .............................................................................61
7.1.1. Componentes grficos: Abstract Window Toolkit (AWT) .........................................61
7.1.1.1. Widgets o componentes elementales ..........................................................61
7.1.1.2. Mtodos de organizacin: Contenedores ......................................................61
7.1.1.3. Diseo Visual: Layouts ...........................................................................61
7.1.2. Eventos ..................................................................................................63
7.1.3. Applets ..................................................................................................67
7.2. Otros elementos de Java ...................................................................................68
7.2.1. Manejo de Excepciones y Errores ....................................................................68
7.2.2. Entrada/Salida de Datos ..............................................................................69
7.2.3. Subprocesos.............................................................................................70
8. JDBC: acceso a bases de datos ............................................................................... 73
8.1. Introduccin..................................................................................................73
8.1.1. Qu es ODBC?..........................................................................................73
8.1.2. Qu es y que hace JDBC? ............................................................................73
8.1.3. JDBC versus ODBC y otras APIs.......................................................................74
8.1.4. Controladores JDBC ....................................................................................74
8.1.4.1. Tipos de controladores (Drivers) de JDBC .....................................................74
8.1.4.2. Cmo obtener los Drivers de JDBC .............................................................74
8.1.5. JDBC-ODBC Bridge .....................................................................................75
8.2. JDBC 3.0 API .................................................................................................75
8.2.1. Paquete java.sql....................................................................................75
Connection......................................................................................................76
8.2.2. DriverManager..........................................................................................76
8.2.3. Connection..............................................................................................77
8.2.4. Statement...............................................................................................78
8.2.5. ResultSet ................................................................................................78
8.3. Empezando con JDBC .......................................................................................78
8.3.1. Base de datos en formato Access....................................................................78
8.3.2. Creacin de un Data Source Name (DSN) ...........................................................79
8.3.3. Ejemplo de una aplicacin JDBC simple ............................................................79
8.3.4. Ejemplo de una aplicacin JDBC con excepciones y MetaData ..................................81
9. Servlets ........................................................................................................... 85
9.1. Clientes y Servidores ........................................................................................85
9.1.1. Clientes (clients).......................................................................................85
9.1.2. Servidores (servers)....................................................................................85

ndice

9.2. Tendencias Actuales para las aplicaciones en Internet ................................................86


9.3. Diferencias entre las tecnologas CGI y Servlet .........................................................88
9.4. Caractersticas de los servlets .............................................................................88
9.5. JSDK 2.0 ......................................................................................................88
9.5.1. Visin general del API de JSDK 2.0 ..................................................................89
9.5.2. La aplicacin servletrunner ..........................................................................90
9.5.3. Ficheros de propiedades ..............................................................................90
9.5.4. Ejecucin de la aplicacin servletrunner...........................................................91
9.6. Ejemplo Introductorio ......................................................................................91
9.6.1. Instalacin del Java Servlet Development Kit (JSDK 2.0) ........................................91
9.6.2. Formulario ..............................................................................................92
9.6.3. Cdigo del Servlet .....................................................................................93
9.7. El Servlet API 2.0 ............................................................................................96
9.7.1. El ciclo de vida de un servlet: clase GenericServlet ..............................................96
9.7.1.1. El mtodo init() en la clase GenericServlet...................................................97
9.7.1.2. El mtodo service() en la clase GenericServlet ..............................................98
9.7.1.3. El mtodo destroy() en la clase GenericServlet: .............................................98
9.7.2. El contexto del servlet (servlet context) ......................................................... 101
9.7.2.1. Informacin durante la inicializacin del servlet .......................................... 101
9.7.2.2. Informacin contextual acerca del servidor ................................................ 101
9.7.3. Clases de utilidades (Utility Classes).............................................................. 101
9.7.4. Clase HttpServlet: soporte especfico para el protocolo HTTP ................................ 102
9.7.4.1. Mtodo GET: codificacin de URLs........................................................... 102
9.7.4.2. Mtodo HEAD: informacin de ficheros ..................................................... 103
9.7.4.3. Mtodo POST: el ms utilizado ............................................................... 104
9.7.4.4. Clases de soporte HTTP ....................................................................... 104
9.7.4.5. Modo de empleo de la clase HttpServlet .................................................... 105
10. Servlets con acceso a bases de datos .....................................................................107
10.1. Acceso a bases de datos mediante servlets y JDBC ................................................. 107
10.2. Ejemplo 1: Escribir en una base de datos tipo Access .............................................. 108
10.3. Ejemplo 2: Consultar una base de datos Tipo Access ............................................... 112
11. Sesin en Servlets ............................................................................................119
11.1. Formas de seguir la trayectoria de los usuarios...................................................... 119
11.2. Cookies .................................................................................................... 119
11.2.1. Crear un objeto Cookie ............................................................................ 120
11.2.2. Establecer los atributos de la cookie ............................................................ 120
11.2.3. Enviar la cookie..................................................................................... 121
11.2.4. Recoger las cookies ................................................................................ 121
11.2.5. Obtener el valor de la cookie ..................................................................... 121
11.3. Sesiones (Session Tracking)............................................................................. 122
11.4. Reescritura de URLs ..................................................................................... 123
12. XML (eXtensible Markup Language) .......................................................................127

vi

Indice

12.1. INTRODUCCIN ........................................................................................... 127


12.1.1. CONCEPTOS BSICOS DE XML ..................................................................... 127
12.1.2. DTD................................................................................................... 128
12.2. DOCUMENTOS XML ....................................................................................... 128
12.2.1. CABECERA ........................................................................................... 128
12.2.1.1. Instrucciones de proceso (PI)................................................................ 128
12.2.1.2. Declaracin de tipo de documento ......................................................... 128
12.2.2. CONTENIDO.......................................................................................... 128
12.2.2.1. Elemento raz.................................................................................. 128
12.2.2.2. Elementos de datos ........................................................................... 128
12.2.2.3. Atributos de elemento ....................................................................... 129
12.2.2.4. Referencias a entidad ........................................................................ 129
12.2.2.5. Datos no analizados........................................................................... 129
12.3. RESTRINGIR XML CON DTD .............................................................................. 130
12.3.1. ESPECIFICAR ELEMENTOS .......................................................................... 130
12.3.1.1. Palabra reservada ANY ....................................................................... 130
12.3.1.2. Elementos anidados .......................................................................... 130
12.3.1.3. Palabra reservada #PCDATA ................................................................. 131
12.3.1.4. Elementos vacos.............................................................................. 131
12.3.1.5. Indicadores de repeticin.................................................................... 131
12.3.1.6. Grupos de elementos ......................................................................... 131
12.3.1.7. Operador de opcin |...................................................................... 132
12.3.2. DEFINIR ATRIBUTOS ................................................................................ 132
12.3.2.1. Modificadores.................................................................................. 132
12.3.2.2. Tipos de atributo.............................................................................. 132
12.3.3. REFERENCIAS A ENTIDAD........................................................................... 133
13. SAX y DOM: Java APIs for XML Parsing....................................................................135
13.1. JAVA Y XML ............................................................................................... 135
13.1.1. SAX ................................................................................................... 135
13.1.2. DOM .................................................................................................. 135
13.2. ANALIZAR XML ............................................................................................ 135
13.2.1. INSTANCIAR UN LECTOR ........................................................................... 136
13.2.2. ANALIZAR EL DOCUMENTO......................................................................... 136
13.2.3. MANEJADORES DE CONTENIDO .................................................................... 137
13.2.3.1. Interfaz ContentHandler ..................................................................... 137
13.2.3.2. Interfaz ErrorHandler......................................................................... 139
13.2.4. PORTABILIDAD AL CARGAR EL ANALIZADOR..................................................... 139
13.2.5. VALIDAR XML ........................................................................................ 140
13.3. RECORRER XML: ANALIZAR CON DOM .................................................................. 140
13.3.1. INSTANCIAR UN ANALIZADOR DOM Y ANALIZAR EL DOCUMENTO ............................. 140
13.3.2. OBTENER EL RBOL DOM (OBJETO DOCUMENT) ................................................ 141
13.3.3. ACCEDER A LOS NODOS DEL RBOL DOM ........................................................ 141

ndice

vii

13.3.3.1. El nodo Documento (case Node.DOCUMENT_NODE) ...................................... 142


13.3.3.2. Elementos (case Node.ELEMENT_NODE) ................................................... 142
13.3.3.3. Nodo de tipo texto............................................................................ 143
13.3.4. MUTABILIDAD DE UN RBOL DOM ................................................................. 143
13.4. PROCESADORES........................................................................................... 143
14. Servicios Web XML ...........................................................................................145
14.1. Introduccin .............................................................................................. 145
14.2. Escenarios ................................................................................................. 145
14.2.1. Servicios simples.................................................................................... 145
14.2.2. Integracin de Aplicaciones ....................................................................... 146
14.2.3. Soluciones para la Gestin de Procesos de Negocio ........................................... 146
14.3. Infraestructura de los Servicios Web XML............................................................. 146
14.3.1. XML Web Services Directories..................................................................... 146
14.3.2. XML Web Service Discovery ....................................................................... 146
14.3.3. XML Web Service Description ..................................................................... 147
14.3.4. XML Web Service Wire Formats................................................................... 147
14.4. Protocolo SOAP........................................................................................... 147
14.5. Proceso de uso de un Servicio Web XML .............................................................. 147
14.6. Cmo se desarrolla un Servicio Web XML ............................................................. 148
14.7. Cmo se desarrolla un cliente de Servicio Web XML ................................................ 148
14.8. Herramientas Java para el diseo de Servicios Web XML........................................... 148
14.8.1. JAXR .................................................................................................. 148
14.8.2. JAXM ................................................................................................. 149
14.8.3. JAX-RPC.............................................................................................. 149
Bibliografa .........................................................................................................151

PRCTICAS
Prctica 1: HTML bsico..........................................................................................155
Prctica 2: Formularios en HTML...............................................................................157
Prctica 3: Lenguaje JavaScript................................................................................159
Prctica 4: Toma de contacto con Java .......................................................................161
Prctica 5: AWT y applets de Java .............................................................................165
Prctica 6: JDBC: Acceso a base de datos desde Java ......................................................169
Prctica 7: Servlets ...............................................................................................171
Prctica 8: Servlets con acceso a DB ..........................................................................173
Prctica 9: Sesin en Servlets...................................................................................175
Prctica 10: Puesta en marcha de una aplicacin de Comercio Electrnico ...........................177
Prctica 11: SAX & DOM Java XML APIs........................................................................179
Prctica 12: Peticin en varias capas de servidores mediante XML......................................183

ANEXOS
A1. Introduccin a SQL ...........................................................................................187
A1.1. Introduccin .............................................................................................. 187
A1.2. Reglas sintcticas ........................................................................................ 187
A1.3. Ejecucin de sentencias SQL ........................................................................... 187
A1.3.1. Tipos de datos SQL y equivalencia ............................................................... 188

viii

Indice

A1.3.2. Creacin de tablas ................................................................................. 188


A1.3.3. Recuperacin de informacin..................................................................... 189
A1.3.4. Almacenar informacin ............................................................................ 190
A1.3.5. Eliminacin de datos ............................................................................... 190
A1.3.6. Actualizacin de datos ............................................................................ 191

CAPITULO 1

1. Introduccin
1.1. Internet en la actualidad
1.1.1. Internet, revoluciona la manera de hacer negocios?
En un momento en el que parece que lo ms fcil es decir que Internet "no es para tanto" y "que slo es
un medio ms", este artculo defiende el argumento contrario: Internet est empezando a revolucionar la
manera de hacer negocios y cada vez ser ms importante.
En el mundo de Internet hemos pasado por varias etapas:

Etapa 1: Internet iba a ser la revolucin. Nada iba a ser como antes. Tanto el B2C (comercio a
consumidores) como B2B (comercio entre empresas) iban a ser un xito no comparable a todo lo
sucedido anteriormente. Lo nico importante era ser rpido. Se compraba un dominio
(business.com) por 7,5 millones de dlares y todo iba muy rpido y posiblemente muy mal.

Etapa 2: Tras los primeros "sustos", se llega a la conclusin que el B2C es un desastre aunque B2B
va a revolucionar el mundo entre empresas. Empiezan a aflorar gran cantidad de portales ".com"
enfocados al comercio electrnico entre empresas y empiezan a cerrar empresas B2C (boo.com por
ejemplo).

Etapa 3: Tras los segundos "sustos", se cambia y se dice que ni el B2B ni el B2C van a funcionar.
Internet ha sido un engao. Es slo un medio ms como lo son el correo y el telfono.

Entonces, no hay ms que hablar?. Claro que s Internet slo est naciendo como herramienta para
hacer negocios.
Algunos defendemos que la realidad es que Internet va a revolucionar la manera de hacer negocios
aunque eso no va a ser creando empresas puras de Internet "sin pies ni cabeza" sino para que las empresas
que operaban ya en el mundo fsico usen Internet para mejorar sus resultados reduciendo costes e
incrementando ingresos.
Internet y los sistemas de informacin modificarn las estructuras de costes de las empresas, la manera
en la que se relacionan con clientes y proveedores, los conceptos de fidelizacin de clientes y de
empleados, etc.
Pero claro, ninguna revolucin ha sido ni ser nunca ni fcil ni rpida. Cuando James Watt descubri la
mquina de vapor, difcilmente nadie podra haber imaginado los cambios que generara. En aquellos
momentos mucha gente deca "nunca dejaremos de usar caballos" y en el siglo XXI pensamos dnde estn
ahora los caballos?.
De hecho, la penetracin de Internet est siendo mucho ms rpida que el resto de tecnologas que
ahora conocemos y ampliamente utilizamos. Si se calcula el tiempo que se ha tardado en alcanzar los 50
millones de usuarios de distintas tecnologas tenemos que la radio tard 38 aos, la televisin 13 aos, los
ordenadores 16 aos e Internet slo 5 aos.
El problema y la confusin que ha habido con Internet han sido los plazos. Se pensaba que la revolucin
se iba a hacer en un ao. Pensando en el impacto en las empresas, se podran distinguir tres grandes
grupos.

Informtica II

1.1.1.1. Multinacionales
Para las multinacionales y grandes empresas, Internet es una prioridad estratgica ya que es una
manera de mejorar sus resultados de una manera radical.
En estas empresas, en las que el nmero de proveedores, clientes y empleados es muy alto, Internet
les ofrece grandes posibilidades debido a la importante reduccin de costes de interaccin con estos
grupos.
Siguiendo la frmula:
Coste total comunicacin = Nmero de comunicaciones x coste unitario de comunicacin
En las grandes empresas, al ser muy alto el nmero de comunicaciones, lo nico que pueden hacer para
reducir el coste total de comunicacin es reducir el coste unitario de cada una de ellas.
Pensemos en un caso tan sencillo como la consulta del precio sobre un producto determinado.
Conseguir derivar estas consultas a travs de Internet consigue que los miles de consultas que se realizan
para conocer el precio de este producto se realicen a coste prcticamente nulo.
Razonamientos anlogos se pueden hacer para el envo de informacin a clientes, la comunicacin
interna a sus empleados, para las solicitudes de material a proveedores, para la generacin y envo de
ofertas a clientes, etc.
1.1.1.2. Pequeas Y Medianas Empresas (PYMEs)
En cuanto a las PYMEs, en un estudio realizado por el equipo de Improven Consultores, se concluy que
las organizaciones no estn consiguiendo mejorar sus resultados empleando Internet por una o varia de las
siguientes causas:
1. Desconocimiento total o parcial de las importantes oportunidades que ofrecen las nuevas
tecnologas en general (e Internet en particular) lo que lleva a poco apoyo por parte de la
direccin.
2. Retorno de la inversin poco claro.
3. Se subestiman las posibilidades que brinda Internet a la empresa.
4. Falta de planificacin en el proceso de integracin de Internet.
5. Falta de personal cualificado para esta rea.
6. No se remodelan los procesos de la empresa para la correcta adecuacin del negocio.
7. No se tiene como prioritario.
8. Resistencia al cambio.
9. Falta de metodologa en el desarrollo del proyecto.
Con lo que, como se puede observar an hay mucho camino por recorrer aunque muchas de ellas ya
han empezado a recorrerlo. Las PYMEs tienen multitud de posibilidades en Internet, con un enfoque
distinto a las multinacionales, con inversiones mucho menores, pero tienen muchsimas posibilidades.
1.1.1.3. Las empresas puras de Internet ".com"
Aunque estas empresas son una minora, es importante hacer una resea en ellas porque han sido la
bandera de esta nueva revolucin y ms en un momento en el que un clsico de las .com, Amazon.com ha
dado por primera vez beneficios.
Y esto que es algo casi normal en cualquier empresa, en el caso de Amazon es una gran noticia. Basada
en una visin muy clara sobre las posibilidades del liderazgo y del posicionamiento en Internet, Amazon ha
lanzado una carrera hacia este liderazgo basada en inversiones y gastos sin medida y a costa de la
confianza "casi ciega" de sus inversores.
Tras unos aos duros para Amazon.com, parece que actualmente est cerca de alcanzar un
posicionamiento que le puede dar unas cuantas dcadas de rentabilidad. Aunque el mercado y los
inversores siempre tendrn su ltima palabra.

1.2. Motivacin y Objetivos de la asignatura


El objetivo de la asignatura es iniciarse en el conocimiento de las tecnologas informticas que
permitan posteriormente el desarrollo de aplicaciones y sistemas de informacin basados en la Web. En

Captulo 1. Introduccin

las asignaturas previas de informtica se ha conocido la parte cliente de las aplicaciones por lo que esta se
centra en la parte servidor e Internet.
1.2.1. Papel dentro de la Intensificacin en Tecnologas de la Informacin (Ingeniera Industrial)
Para un Ingeniero Industrial intensificado en Tecnologas de la Informacin es importante el
conocimiento de las posibilidades que ofrece Internet para los negocios. Debe conocer las tecnologas que
en la actualidad permiten:

Articular los procesos de negocio dentro de una empresa. Sistemas de Informacin.

Explotar posibilidades de negocio antes imposibles. Comercio El ectrnico (e-Comerce).

Integrar a los diferentes actores involucrados en la cadena de valor. Empresa Extendida.

Realizar operaciones entre empresas a travs de la red. Servicios Web.

1.2.2. Papel dentro de la Intensificacin en Telemtica (Ingeniera de Telecomunicacin)


Para un Ingeniero de Telecomunicacin intensificado en Telemtica, Internet y las tecnologas
asociadas brindan una serie de posibilidades muy interesantes como son las siguientes:

Control remoto de Dispositivos a travs de Internet y desde cualquier ordenador. Por nombrar
alguna aplicacin interesante, cabra resaltar el control de la domtica del hogar va Internet o el
control de cualquier dispositivo de una planta desde cualquier ordenador va Internet.

Sistemas distribuidos. Desarrollo de aplicaciones distribuidas y su impacto inherente dentro del


contexto de las redes de comunicaciones. Estas tecnologas estn diseadas dentro del escenario
de las arquitecturas de protocolos para la comunicacin tanto de procedimientos como de objetos
remotos y distribuidos.

1.3. Estructura de la asignatura


La asignatura est estructurada en cuatro secciones:

Seccin 1: Internet. En esta seccin se exponen los fundamentos de HTML. Se aprender a crear
formularios mediante los cuales enviar o pedir informacin del servidor. Se darn una pinceladas
sobre JavaScript, lenguaje script que soportan los navegadores y que nos permitirn dar cierta
funcionalidad a las pginas Web.

Seccin 2: Java. Esta seccin es una introduccin muy bsica a la programacin con lenguaje Java.
Se vern los fundamentos y se aprender a manejar el entorno de desarrollo distribuido
gratuitamente por Sun Microsystems Inc.

Seccin 3: Java avanzado. En esta seccin se profundizar en el lenguaje Java, viendo ciertas
funcionalidades ms avanzadas como son la conectividad con Bases de Datos mediante JDBC y los
Servlets.

Seccin 4: Comunicaciones en red. Esta ltima seccin tiene como objetivo mostrar el potencial
de Internet como herramienta de comunicacin, no slo entre personas sino tambin entre
mquinas. Se darn unas nociones sobre XML, que se est imponiendo como estndar en las
comunicaciones, aprendiendo a tratar documentos XML mediante Java. Finalmente se introducirn
los llamados Servicios Web XML.

Como elemento integrador de todas estas tecnologas, una sesin se dedicar a la puesta en marcha de
una aplicacin de Comercio Electrnico desarrollada utilizando todas las tecnologas expuestas en la
asignatura y que dar una visin global de esta.
La forma de evaluar al alumno sobre los conocimientos adquiridos en la asignatura ser a travs de la
labor que el alumno desarrolle durante el curso, y estar desglosado en cuatro partes:

Evaluacin continua durante el curso

Valoracin del trabajo: dificultad del tema, soluciones adoptadas y resultado final

Documento presentado acerca del trabajo

Presentacin y defensa del trabajo

La metodologa de trabajo de la asignatura es la siguiente: cada semana hay una clase terica y una
clase prctica. En las clases tericas se desarrollan los conceptos necesarios sobre un tema concreto que
ms tarde se ponen en prctica en las sesiones en el aula de ordenadores.

Informtica II

Los guiones de las prcticas estn diseados de forma que el alumno pueda acabar la prctica semanal
en un mximo de 45 minutos. De esta forma, los 45 minutos restantes de la clase prctica estn
disponibles para ir desarrollando el trabajo en grupo.
A su vez, durante las clases prcticas el profesor se reunir con los grupos de trabajo e ir realizando
una evaluacin continua de los alumnos y viendo la evolucin de los diferentes trabajos.

1.4. Software necesario para la asignatura


Todo el software necesario para la asignatura es de libre distribucin y est a disposicin de los
alumnos en las pginas Web de los desarrolladores. A continuacin se muestra un ilstado con los
programas utilizados:

Software
Crimson Editor

Java 2 Software Development Kit 1.4.2

Java Servlet Development Kit 2.0

Xerces Java Parser 1.4.4 Release

Comentario
Editor de texto. Tiene la ventaja de
enfatizar las palabras clave tanto de
Java como de HTML.
Compilador e intrprete de Java
distribuido gratuitamente por Sun.
Incluye API estndar y documentacin.
Incluye las clases necesarias para la
programacin de Servlets as como el
programa Servletrunner.exe que nos
simular el servidor de servlets.
Parser de XML. Incluye la API de Java
que nos permitir leer ficheros XML
desde nuestros programas en Java.

SECCIN 1
Internet

CAPITULO 2

2. Generalidades de Internet
2.1. Protocolo TCP/IP
Lo que consigue que los ordenadores remotos se entiendan y que Internet funcione es un conjunto de
instrucciones complicadas llamadas protocolo. La Internet utiliza varios protocolos, los ms importantes
son el Transport Control Protocol (TCP) y el llamado Internet Protocol (IP), o TCP/IP para abreviar. Son
una serie de reglas para mover los datos electrnicos en paquetes y asegurarse de que son reensamblados
correctamente cuando llegan al destino. Todos los ordenadores en Internet hablan TCP/IP, y gracias a ello
se consigue eliminar la barrera de la heterogeneidad de los ordenadores.

2.2. Protocolo HTTP y lenguaje HTML


Gracias a los protocolos se puede recibir cualquier tipo de fichero de cualquier ordenador conectado a
Internet, se puede enviar correo, se puede conectar a un servidor remoto, etc. Pero ninguno de estos
servicios permiten la posibilidad de colaborar en la creacin de un entorno multimedia, es decir, no se
pueden pedir datos a un ordenador remoto para visualizarlos localmente utilizando TCP/IP. Es por ello que
en 1991 se cre un nuevo protocolo llamado HTTP (HyperText Transport Protocol).
Una de las caractersticas del protocolo HTTP es que no es permanente, es decir, una vez que el
servidor ha respondido a la peticin del cliente la conexin se pierde y se queda en espera, al contrario de
lo que ocurre con los servicios de ftp o telnet, en los cuales la conexin es permanente hasta que el
usuario transmite la orden de desconexin. Esto tiene la ventaja de que el servidor no se colapsa, y el
inconveniente de que complica la seguridad cuando los accesos se hacen con password, pues no se puede
pedir el password cada vez que se realiza una conexin (slo se pide la primera vez).
La grandeza del HTTP es que se pueden crear recursos multimedia localmente, transferirlos fcilmente
a un ordenador remoto y visionarlos donde se han enviado. HTTP es una herramienta muy poderosa y que
es la esencia del World Wide Web.
Para la creacin de un Web en Internet se utiliza el lenguaje llamada HTML (HyperText Markup
Language). Es un lenguaje muy simple cuyo cdigo se puede escribir con cualquier editor de texto. Se basa
en comandos reconocibles por el browser y que van entre los smbolos '<' y '>'. El lenguaje HTML junto con
aplicaciones CGI (Common Gateway Interface) y Java hacen posible la creacin de pginas Web muy
vistosas.

2.3. URL (Uniform Resource Locator)


Todo ordenador en Internet y toda persona que use Internet tiene su propia direccin electrnica.
Todas estas direcciones siguen un mismo formato. Para el alumno Pedro Gmez de la Escuela Superior de
Ingenieros de San Sebastin su direccin puede ser: pgomez@gaviota.tecnun.es donde pgomez es el
identificador ID que Pedro utiliza para conectarse a la red. Es as como el ordenador le conoce. La parte
de la direccin que sigue al smbolo de arroba (@) se llama el dominio. El dominio es la direccin
especfica del ordenador, en este caso el ordenador se llama gaviota adjunto a TECNUN en Espaa (es).
Nunca hay espacios en una direccin de Internet.
El dominio est dividido en este caso en tres subdominios que se leen de derecha a izquierda. Entre
estos dominios se pueden encontrar los siguientes (utilizados en Estados Unidos):
com
gov
int

organizaciones comerciales.
gobierno.
organizacin internacional.

mil
net
org

militar.
organizacin de redes.
organizaciones sin nimo de lucro.

Informtica II

Estos subdominios se refieren al tipo de organizacin al que pertenece el servidor. Tambin podemos
encontrar informacin sobre el pas en el que se encuentra el ordenador al que pertenece la direccin:
at
ca
de

Austria
Canad
Alemania

au
ch
dk

Australia
Suiza
Dinamarca

es
fr
jp

Espaa
Francia
Japn

fi
gr
uk

Finlandia
Grecia
Reino Unido

Los ordenadores tambin son conocidos por un nmero llamado la direccin IP y es lo que el ordenador
realmente entiende. Los nombres son para facilitar la tarea a los usuarios. Por ejemplo el nmero que
corresponde al dominio gaviota.tecnun.es es 193.145.249.21.
As, qu es un URL? Pues podra concebirse como la extensin del concepto de archivo: no slo puede
apuntarse a un archivo en un directorio, sino que adems tal archivo y tal directorio existen de hecho en
cualquier ordenador de la red. Los URLs posibilitan el direccionamiento, tanto de gente como de
aplicaciones de software a una gran variedad de informacin, disponible en distintos protocolos de
Internet. El ms conocido es el HTTP, pero los FTP tambin pueden ser referenciados por medio de URLs.
Incluso la direccin de e-mail de Internet de alguien puede ser referida con un URL. Un URL es como la
direccin completa de correo: proporciona toda los datos necesarios para que la informacin llegue al
lugar de destino.
En resumen, un URL es una manera muy conveniente y sucinta de referirse a un archivo u otro recurso
electrnico.
La sintaxis genrica de los URLs es la que sigue:
mtodo://ordenador.dominio/ruta-completa-del-fichero
donde mtodo puede ser una de las siguientes palabras: http, ftp, telnet, Enseguida se ver la
sintaxis especfica de cada mtodo.
Pero antes, unas breves observaciones:

Hay ocasiones en las que se ver que el URL empleado tiene la misma sintaxis que arriba, pero acabada
la ruta completa del fichero con una barra (/). Esto no quiere decir ms que no se apunta a un archivo
especfico, sino a un directorio. El servidor generalm ente devolver el ndice por defecto de ese
directorio (un listado de archivos y subdirectorios de ese directorio para acceder al que se desee), o un
archivo por defecto que el servidor busca automticamente en el directorio.

Qu hacer una vez que se tiene un URL y se quiere utilizar? Muy sencillo: como se ver ms adelante,
todos los browsers poseen una ventana (location box) donde es posible escribir o pegar un URL.

Cmo presentar un URL a otros? Se suele recomendar la siguiente manera:

<URL: mtodo://ordenador.dominio/ruta-completa-del-fichero>
para distinguir los URLs de los URIs (Uniform Resource Identification), que representan un concepto
similar.

Finalmente, destacar que hay caracteres considerados reservados o inseguros. Para poder usarlos,
habr que emplear las secuencias de escape, que utilizan el formato %+US-ASCII-valor de un carcter
hexadecimal como puede verse en las tablas que hay a continuacin:
1. Caracteres inseguros: son aquellos considerados como tales por alguna razn determinada,
normalmente porque tienen su propio significado en algn sistema operativo.
Espacio
%
\
]

%20
%25
%74
%5D

<
{
^
`

%3C
%7B
%5E
%60

>
}
~

%3E
%7D
%7E

#
|
[

%23
%7C
%5B

2. Caracteres reservados: son aquellos considerados como tales por tener un significado especial
en los URLs; para evitar tal significado tambin habr que codificarlos en hexadecimal.
;
?

%3B
%3F

/
:

%2F
%3A

@
&

%40
%26

%3D

Captulo 2. Generalidades de Internet

A continuacin se muestran las distintas formas de construir los URLs segn los distintos servicios de
Internet:
2.3.1. URLs del protocolo HTTP
HTTP es el protocolo especficamente diseado para usar con la World Wide Web. Su sintaxis es:
http://<host>:<puerto>/<ruta>#<parte a buscar>
donde host es la direccin del servidor WWW, el puerto puede ser omitido (valor por defecto, 80), la
ruta indica al servidor el fichero que se desea y #parte a buscar nos sita en una parte del texto que est
apuntada por una TAG ancla (anchor), que se explicarn ms adelante.
As, por ejemplo, http://www.msn.com/index/prev/welcome.htm#offers accede al Web de Microsoft
Network, al archivo welcome.htm (cuya ruta de acceso es index/prev) y dentro de ste, al lugar marcado
con el ancla offers.
2.3.2. URLs del protocolo FTP
La sintaxis especfica del ftp es:
ftp://<usuario>:<password>@<host>:<puerto>/<cwd1>/<cwd2>//<cwdN>/<nombre>
Los comandos usuario y password pueden ser omitidos. Host es la direccin del ftp. El puerto, como
antes, puede ser omitido. Las series <cwd1>//<cwdN> son los comandos que el cliente deber emplear
para moverse al directorio en el que reside el documento.
As, por ejemplo, ftp://www.msn.com/index/prev/welcome.htm traer el fichero welcome.htm (cuya
ruta de acceso es index/prev) del web de Microsoft Network.
2.3.3. URLs del protocolo correo electrnico (mailto)
Su sintaxis difiere de las anteriores, y es la que sigue:
mailto:<cuenta@lugar>
siendo cuenta@lugar la direccin de correo electrnico a la cual se desea enviar un mensaje. Por
ejemplo, mailto:pgomez@ceit.es manda un mensaje a P.Gmez, en el CEIT, en Espaa.
2.3.4. URLs del protocolo Telnet
El URL para Telnet designa una sesin interactiva con un lugar remoto en Internet, mediante el
protocolo Telnet. Su sintaxis es la siguiente:
telnet://<usuario>:<password>@<host>:<puerto>/
Los parmetros user y password pueden ser omitidos, host se refiere al lugar al que se va a realizar la
conexin y port puede ser igualmente omitido (siendo su valor por defecto 23).
2.3.5. Nombres especficos de ficheros
El URL de mtodo file supone que un fichero puede ser obtenido por un cliente. Esto suele confundirse
con el mtodo ftp. La diferencia radica en que ftp es un mtodo especfico para la transmisin de
ficheros, mientras que el mtodo file deja el mtodo de trada de ficheros a eleccin del cliente que, en
algunas circunstancias, bien podra ser el mtodo ftp. La sintaxis para el mtodo file es la que se ve a
continuacin:
file://<host>/<ruta-de-acceso>
Como siempre, host es la direccin y ruta-de-acceso es el camino jerrquico para acceder al
documento (con una estructura directorio/directorio//nombre del archivo). Si el parmetro host se
deja en blanco, se supondr por defecto localhost, es decir, que se van a traer ficheros localmente.

CAPTULO 3

3. Lenguaje HTML
3.1. Introduccin
HTML (HyperText Markup Language) es el lenguaje utilizado en Internet para definir las pginas del
World Wide Web. Los ficheros HTML son ficheros de texto puramente ASCII, que pueden ser escritos con
cualquier editor bsico, tal como Notepad en Windows o vi en Unix. Tambin se pueden utilizar
procesadores de texto ms complicados como Microsoft Word, pero en este caso hay que asegurarse que
el fichero es guardado en disco como "text only". En este fichero de texto se introducen unas marcas o
caracteres de control llamadas TAGs (en esto, HTML se parece a los primeros procesadores de texto), que
son interpretadas por el browser. Cuando ste lee un fichero ASCII con extensin *.htm o *.html
interpreta estas TAGs y formatea el texto de acuerdo con ellas.
En general puede decirse que HTML es un lenguaje sencillo y eficiente. Aunque no puede competir con
los procesadores de texto en capacidades de formato, es universal, es hipertexto e hipermedia, es muy
accesible, sus ficheros ocupan poco espacio en disco; por otra parte es fcil de interpretar y de enviar a
travs de las redes. De hecho, es uno de los estndares en los cuales las empresas estn basando sus
Intranets y sus servicios de informacin interna.
En la pgina web de la asignatura est disponible la especificacin HTML 4.01 (ltima versin).

3.2. Tags generales


El formato con el que imprime o visualiza un fichero HTML depende de unas marcas especiales
llamadas TAGs. Todas las TAGs de HTML van encerradas entre los caracteres < y >, como por ejemplo
<HTML>. Adems, la mayor parte de ellas son dobles: hay una TAG de comienzo y otra de final; entre
ambas hay un contenido o texto afectado por dichas TAGs. La TAG de final es como la de comienzo, pero
incluyendo una barra (/) antes del nombre, por ejemplo </HTML>. Normalmente las TAGs se escriben en
letra mayscula para hacer ms legible el cuerpo del documento (distinguindolas del texto ordinario),
pero de hecho tambin se pueden escribir en minsculas. La forma general de estas TAGs dobles es la
siguiente:
<COMANDO>Texto afectado</COMANDO>
Existen tambin TAGs simples (sin TAG de cierre), que no tienen un texto contenido al que se aplican.
Por ejemplo, la marca de comienzo de prrafo <P> era un comando simple hasta la versin 3.0 de HTML,
pues cada vez que empieza un prrafo se sobreentiende que ha terminado el anterior. La versin 3.0 de
HTML ha introducido la TAG </P>, aunque su uso es opcional.
Una TAG, tanto si es doble o simple, puede tener uno o ms atributos, que son parmetros que definen
su forma de actuar. Los atributos se incluyen despus del nombre de la TAG, antes del carcter >,
separados por uno o ms blancos. Si la TAG es doble, los atributos se incluyen siempre en la TAG de
apertura.
Los atributos que an se soportan pero pueden quedar obsoletos en futuras versiones se indicarn como
[deprecated]. Estos atributos han sido sustituidos por otras alternativas, generalmente utilizando hojas de
estilo (style sheets), que no se vern en esta asignatura.
Se puede anidar unas TAGs dentro de otras. Se podra decir que en este caso los efectos son
acumulativos, como en el siguiente ejemplo:

12

Informtica II

<TAG1>
Texto afectado por el comando 1
<TAG2>
Texto afectado por las TAGs 1 y 2
</TAG2>
</TAG1>
Advertencia: La anidacin de TAGs debe hacerse de forma coherente, pues de lo contrario puede dar
unos resultados que no son los esperados: la ltima TAG en abrirse debe ser la primera en ser cerrada, es
decir que no se pueden entrecruzar los dominios de actuacin de las TAGs.
Todos los ficheros HTML tienen una estructura similar a la siguiente:
<HTML>
<HEAD>
<TITLE>Ttulo de la pgina</TITLE>
...
</HEAD>
<BODY>
...
</BODY>
</HTML>
donde las marcas mostradas indican lo siguiente:
<HTML>...</HTML>:

Indica el comienzo y el fin de un documento HTML. Es necesario para que el


browser sepa que tiene que interpretar un fichero en lenguaje HTML.

<HEAD>...</HEAD>:

Indica la cabecera del documento donde se guarda diversa informacin sobre el


mismo, como por ejemplo el ttulo de la ventana en la que aparecer (<TITLE>Este
es el ttulo</TITLE>).

<BODY>...</BODY>:

En l aparece el cuerpo del documento Web propiamente dicho, que contiene el


texto, las imgenes, los enlaces o links a otras pginas, etc.

3.3. Formato de texto


En este apartado se ver cmo organizar y formatear el texto de un documento.
3.3.1. TAGs generales de un documento.
Existen una serie de atributos para la TAG BODY, que afectarn a todo el documento, dado que todo el
cdigo de las pginas web se escribe dentro de la TAG doble BODY. Entre otros, los ms utilizados son
stos:

[deprecated] BGCOLOR=nombre_color BGCOLOR=#00FF00, donde nombre_color es uno de los


nombres reconocidos por los browsers (existe una tabla definida por Netscape, mayoritariamente
aceptada), y #00FF00 es el cdigo RGB del color deseado (dos dgitos hexadecimales por cada color
fundamental rojo, verde y azul, para representar hasta 256 intensidades de cada color, y unos 16
millones de colores distintos). Esta segunda opcin es la ms empleada, por ser la estndar ( y por ello
no da errores).

[deprecated] BACKGROUND="imagen.ext": sirve para poner un dibujo como fondo de documento,


siendo imagen.ext el nombre del fichero y la extensin. Si el dibujo no ocupa la pantalla entera, se
dispondr en mosaico hasta llenarla.
<BODY BACKGROUND="imagen.ext">
...
</BODY>

[deprecated] TEXT=cdigo de color: define el color del texto del documento.

[deprecated] LINK=cdigo de color: define el color del texto definido como link.

[deprecated] VLINK=cdigo de color: define el color de los links visitados (es decir, los links sobre
los que ya se ha clicado en alguna ocasin).

Captulo 3. Lenguaje HTML

13

3.3.2. Comentarios en HTML


El lenguaje HTML permite introducir comentarios, con el fin de que un documento sea ms claro y
comprensible cuando se analiza su cdigo. Lgicamente, tales comentarios no aparecern en el browser.
La sintaxis de los comentarios, que pueden ocupar tantas lneas como se desee, es la que sigue:
<!-- Comentario -->
3.3.3. Caracteres de separacin en HTML
Se consideran caracteres de separacin el espacio en blanco, el tabulador y el salto de lnea. Un punto
importante a considerar es que, en principio, HTML considera varios caracteres de separacin consecutivos
como un nico carcter de separacin. Adems, les otorga a todos ellos la misma categora, es decir,
considera todos como si fuesen espacios en blanco. Esto quiere decir que el aspecto del fichero ASCII que
contiene el cdigo HTML y el aspecto del documento visto en el browser pueden diferir notablemente. De
ah que al escribir un fichero luego haya que comprobarlo en el browser para ver si el resultado final es el
esperado. Por ejemplo, introducir un salto de lnea en un fichero HTML no implica, en principio, un salto
de lnea en la pgina Web.
As pues, para organizar el texto HTML no se basa en los caracteres de separacin citados sino en TAGs
especiales para ello. Esas TAGs se considern en el apartado siguiente. Los puntos suspensivos () entre
las TAGs de comienzo y final representan un contenido a concretar
3.3.4. TAGs de organizacin o particin de un documento
Las TAGs ms importantes de organizacin del contenido de un documento son las siguientes:

Tag <P></P> (de paragraph). Cada prrafo deber ir incluido entre estas TAGs. Entre prrafo y
prrafo se deja el espacio correspondiente a una lnea en blanco (aproximadamente).

Se puede aadir a <P> el atributo ALIGN [deprecated] para especificar cmo debe ser alineado un
prrafo. Este atributo puede tomar los valores "LEFT", "CENTER" y "RIGHT".

Tag <BR> (de break). Salta de lnea sin dejar una lnea en blanco a continuacin. Es un comando
simple.

Tag <HR> (de hard rule). Este comando simple introduce una lnea horizontal que deja espacios
antes y despus, por lo que no hace falta aadir <P> o <BR> suplementarios.
Algunos atributos de este comando son:

[deprecated] WIDTH: define la longitud de la lnea horizontal en la pantalla, que puede especificarse
usando un valor absoluto (nmero de pixels) o bien indicando un porcentaje (opcin recomendada, ya
que no es posible conocer a priori la anchura de la ventana del cliente Web), con lo que el resultado
final podra no ser el esperado. El valor por defecto es del 100%.
<HR WIDTH=75%>

[deprecated] ALIGN: alinea la lnea donde se desee. Puede tomar los valores LEFT, RIGHT y CENTER
<HR ALIGN=RIGHT>

[deprecated] SIZE: especifica la anchura o grosor de la lnea horizontal en nmero de pixels. El valor
por defecto es 1 pixel
<HR SIZE=4>

[deprecated] NOSHADE: Por defecto, estas lneas aparecen sombreadas, con un cierto efecto 3-D. Con
este comando, tal efecto desaparecer.

Puede observarse que no hay ningn atributo que haga referencia al color de la lnea, que siempre se
dibuja en negro. Conviene tener esto en cuenta a la hora de elegir colores de fondo.
3.3.5. Formateo de textos sin particiones

Tag <PRE></PRE>(de preformatted). Como ya se ha mencionado, el browser ignorar de ordinario


todos los espaciados de lnea, mltiples espacios consecutivos, tabuladores, etc. Por lo general esta
prctica es muy adecuada, pero pueden presentarse ocasiones en las que se desee un formato
especfico de texto, que aparezca en la pantalla tal y como se ha escrito (un caso tpico son los
listados de programas de ordenador, poesas, letras de canciones, etc.). Este objetivo se logra

14

Informtica II

encerrando el texto entre el comando doble <PRE> texto </PRE>, tal como puede verse en la Figura
3.1.
Por ejemplo,
si quisiera
crear alguna
figura con
palabras,
Necesitara
usar
el TAG
PRE
para
hacerlo.
Figura 3.1

Tag <BLOCKQUOTE></BLOCKQUOTE> (de block quote). Esta TAG de formateo de prrafos es muy
til. Inserta un salto de prrafo e indenta todo el texto que viene a continuacin, hasta llegar a su
TAG emparejada que, a su vez, insertar otro salto de prrafo y suprimir la indentacin anterior. As
la TAG BLOCKQUOTE debe emplearse para indentar bloques determinados de textos, pero en ningn
caso con el nico objetivo de mover el margen, ya que el comportamiento del texto afectado por este
comando vara segn los browsers.

3.3.6. Centrado de prrafos y cabeceras con <CENTER>

Tag <CENTER></CENTER>. Esta TAG se emplea para centrar todo tipo de texto, figuras, tablas y
otros elementos, como por ejemplo:
<CENTER> Texto afectado por el centrado </CENTER>

3.3.7. Efectos de formato en texto

Tag <H>...</H>(de heading). Es una tag doble que toma necesariamente un argumento, un nmero
comprendido entre 1 y 6, de tal modo que <H1> es un ttulo de primer nivel (normalmente el ms
grande) y <H6> es un ttulo de sexto nivel (de ordinario el ms pequeo, aunque el hecho de que sea
ms grande o pequeo que el estndar depende del browser). Inserta automticamente un salto de
prrafo, antes y despus. Puede tomar como atributo ALIGN [deprecated], utilizado de la misma
forma que en <P>

Tags <B>... </B>, <I>... </I> y <U>... </U> (de bold, italic y underlined respectivamente). <B>
hace que el texto afectado est en negrita (bold), <I> aplica el estilo cursiva y <U> [deprecated] lo
subraya.

Tag <TT></TT>(de teletype). Esta TAG hace que la letra que se imprima sea de estilo teletipo, es
decir, que su apariencia sea similar a la que de una mquina de escribir (fuente Courier o similar).

Tag <FONT></FONT> [deprecated]. Esta TAG sirve para controlar, por medio de sus atributos, el
tamao, el color y el tipo de letra con el que se representar el texto (si el browser es capaz de ello).
Los atributos de esta TAG son los siguientes:

[deprecated] SIZE=n (siendo n un entero entre 1 y 7). Con este atributo se puede cambiar el
tamao de la letra. El tamao base o tamao por defecto es el 3.

[deprecated] SIZE=+n SIZE=-n. Con esta TAG se cambia el tamao de la letra respecto al tamao
base, aumentando o reducindolo segn se aplique un incremento positivo o negativo. Los
tamaos deben estar comprendidos en la escala de 1 a 7.

[deprecated] COLOR=nombre_color COLOR=#00FF00, donde nombre_color es uno de los


nombres reconocidos por los browsers y #00FF00 es el cdigo RGB del color deseado.

[deprecated] FACE=tipo_letra, donde tipo_letra puede ser Arial, Times New Roman, etc.

Ejemplo: <FONT SIZE=4 COLOR="Blue" FACE="Arial">Texto a representar</FONT>

Tag <BASEFONT SIZE=n> [deprecated]. Establece el tamao de letra base o por defecto. Es un TAG
simple.

Tags <SUP></SUP> y <SUB></SUB> (de superscript y subscript). <sup> y <sub> crean los estilos
de superndice o subndice, respectivamente.

Captulo 3. Lenguaje HTML

15

Tags <BIG></BIG> y <SMALL></SMALL>. Las TAGs <BIG> y <SMALL> hacen al texto ms grande y
ms pequeo respectivamente.

3.3.8. Caracteres especiales


Existen algunos caracteres, denominados especiales, que merecen una pequea mencin. Los que
tienen ms utilidad para el castellano son:
Las vocales acentuadas se escriben en HTML como sigue:

Si son maysculas, &(LETRAMAYSC)acute. Por ejemplo, se escribe &Aacute.

Si son minsculas, &(letramin)acute. Por ejemplo, se escribe &eacute.

es &Ntilde y es &ntilde.

3.4. Listas
3.4.1. Listas desordenadas
Una lista desordenada es una lista de elementos en lneas separadas precedidas de un guin o similar
(en Ingls bullet).

Tag <UL>...</UL> (de unordered list): comienzo de una lista no ordenada

Un atributo de esta Tag es TYPE [deprecated], que define la forma del bullet y puede tomar los
valores: DISC(), CIRCLE(l), que es el valor por defecto y SQUARE(n).

Tag <LI> (de line): nuevo elemento de la lista.

<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
Esto es una lista no ordenada:
<UL>
<LI>Elemento 1
<LI>Elemento 2
<LI>Elemento 3
</UL>
</BODY>
</HTML>
3.4.2. Listas ordenadas
En este tipo de listas se emplean nmeros en lugar de bullets.

Tag <OL>...</OL> (de ordered list): comienzo de una lista ordenada.

Su atributo TYPE [deprecated] permite definir el tipo de numeracin. Puede tomar los valores: A (para
numerar A,B,C), a (a,b,c), I (I,II,III), i(i,ii,iii), 1 (1,2,3) que es el valor por defecto.

Tag <LI> (de line): nuevo elemento de la lista .

Su atributo VALUE [deprecated] permite definir a partir de qu valor se empieza a numerar.


Obviamente, por defecto comienza a numerarse por el principio. Por ejemplo, <LI VALUE=iii> numerar
iii,iv,v Cada vez que se utilice este atributo VALUE dentro de una misma lista ordenada se rompe con la
numeracin anterior.

16

Informtica II

<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
Esto es una lista ordenada:
<OL>
<LI>Elemento 1
<LI>Elemento 2
<LI>Elemento 3
</OL>
</BODY>
</HTML>
3.4.3. Listas de definiciones
Este tipo de lista es til para obtener resultados como el que se ve a continuacin:
Trmino 1
Definicin del trmino 1
Trmino 2
Definicin del trmino 2
...

Tag <DL>...</DL> (de definition list). comienzo de la definicin de la lista.

Tag <DT> (de definition term) - nueva definicin.

Tag <DD> (de definition description) - cuerpo o descripcin de la definicin.

3.5. Imgenes
El lenguaje HTML adems de hipertexto, es hipermedia, es decir, que por lo tanto permite incluir
informacin de tipo grfico. Las imgenes se tratan de forma separada al texto, y, debido al tamao que
stas suelen tener en general, se tarda ms tiempo tanto en generar como en visualizar pginas HTML con
imgenes.

Tag IMG (de image): Es un comando simple que se utiliza para insertar una imagen en el documento.
Algunos atributos de esta tag son:
o

SRC=imagen.ext: es requerido y sirve para indicar dnde se va a encontrar la imagen, siendo


imagen.ext el nombre del fichero y la extensin.
<IMG SCR="imagen.ext">

ALT=texto donde texto es el texto que se ver en lugar de la imagen, bien porque se han
desactivado los grficos para navegar ms rpidamente por Internet, bien porque el browser es
text only. Es requerido para evitar problemas en dichos casos.

WIDTH y HEIGHT: controlan el tamao de la ventana, que puede especificarse usando un valor
absoluto (nmero de pixels) o bien indicando un porcentaje (opcin recomendada, ya que no es
posible conocer a priori la anchura de la ventana del cliente Web).
<IMG WIDTH=33% HEIGHT=60% SCR="imagen.ext">

ALIGN: alinea el texto donde se desee respecto a la imagen. Puede tomar los valores TOP,
BOTTOM, MIDDLE, LEFT, RIGHT, TEXTTOP, ABSMIDDLE, BASELINE, ABSBOTTON.

BORDER=n. Permite aadir un borde o marco a la imagen, siendo n la anchura de ste en pixels.
BORDER=0 implica la supresin del borde.

HSPACE=n y VSPACE=n. Estos atributos dejan un espacio horizontal y vertical respectivamente


alrededor de la imagen, siendo n el valor en pixels.

LOWSRC=URL carga primero una imagen de baja resolucin y cuando termina de cargar todo el
documento la sustituye por la versin de alta resolucin.

Captulo 3. Lenguaje HTML

17

3.6. Links
Encerrando un texto o un grfico entre las TAGs <A> ... </A> se consigue convertir dicho texto en
hipertexto. Este link puede hacerse, entre otras posibilidades, a:

Otra pgina Web.

El correo electrnico de otra persona (se emplea el link para enviarles correo).

Un archivo local (prctica a evitar si se pretende que los dems puedan acceder a ese link!).

Una direccin relativa a documentos en directorios superiores o inferiores al directorio en que se est
en ese momento o en el directorio actual.

Por lo general, los links tienen la forma <A HREF="URL">texto</A>. A su vez, los URLs tiene una
estructura del tipo siguiente:
mtodo://localizacin/archivo/
donde mtodo hace referencia al modo de acceder al fichero (http, ftp, gopher, news, mailto),
localizacin es el lugar donde se encuentra el fichero actualmente y archivo es el nombre completo del
archivo requerido en el sistema especificado.Veamos algunos ejemplos:
<A HREF="http://www.ceit.es/">WEB CEIT</A>
lleva al web del CEIT al clicar sobre las palabras WEB CEIT, que aparecern subrayadas y en otro color
(hiperlink).
<A HREF="mailto://president@whitehouse.gov">mail</A>
mandar un e-mail al Presidente de los EE.UU.
En el caso en que se quiera "saltar" a otro punto del propio documento, se proceder como se ve en el
siguiente ejemplo: Establecemos el link <A NAME="aliniciodeldocumento"> (Atencin: si es posible evitar
los espacios, es mejor hacerlo, pues pueden originar problemas). A este tipo de links se les denomina
anclas o anchors puesto definen zonas fijas de un documento a las que se va a hacer referencia. Una vez
efectuada esta operacin, si ahora hacemos <A HREF="#aliniciodeldocumento"> texto </A> , al clicar
sobre la palabra texto iremos al lugar donde se ha definido el link.

3.7. Tablas

Las tablas se definen empleando los cdigos pareados <TABLE> y </TABLE>.

Las celdas se agrupan en filas, que se definen con los cdigos pareados <TR> y </TR> (de Table
Row).

Una tabla se compone de celdas de datos. Una celda se define usando los cdigos pareados <TD> y
</TD> (de Table Data).

Las celdas pueden contener cualquier elemento HTML: texto, imgenes, enlaces e incluso otras tablas
anidadas.

<TH>...</TH> (de Table Header): Para crear celdas cuyo texto sea resaltado (por ejemplo, en los
encabezamientos) se sustituye el TD habitual por TH.
Algunos atributos que pueden aadirse a TABLE son:

WIDTH: especifica la anchura de la tabla. Puede darse un valor absoluto en pixels o un valor relativo
en porcentaje. Si no se especifica la anchura por defecto depender del browser.

BORDER: Si se quiere que la tabla posea bordes: <TABLE BORDER(=n)> ... </TABLE>

siendo n el grosor del borde en pixels. Por ser opcional (toma un valor por defecto) se ha denotado
entre parntesis.

[deprecated] ALIGN: Posiciona la tabla respecto al documento. POSIC puede tomar los valores LEFT,
CENTER y RIGHT.

CELLSPACING: espaciado entre celdillas: <TABLE CELLSPACING(=n)> ... </TABLE>

CELLPADDING(=n): permite especificar el ancho que debe existir desde los bordes de cada celdilla a
los elementos en ella incluidos.

18

Informtica II

[deprecated] BGCOLOR: indica el color de fondo de la tabla.


Algunos atributos de TR son:

ALIGN: se utiliza para determinar la alineacin del contenido de las celdas de la fila.

VALIGN: se utiliza para determinar la posicin vertical del contenido de las celdas de la fila.

[deprecated] BGCOLOR: indica el color de fondo de la fila.


Algunos atributos que pueden aadirse a TH y TD son:

ROWSPAN(=n): indica el nmero de filas que debe abarcar la celda actual.

COLSPAN (=n): indica el nmero de columnas de la fila que abarcar la celda actual.

ALIGN: se utiliza para determinar la alineacin del contenido de la celda.

VALIGN: se utiliza para determinar la posicin vertical del contenido de la celda.

WIDTH: especifica la anchura de la celda, en pixels o en porcentaje.

HEIGHT: especifica la altura de la celda, en pixels o en porcentaje.

[deprecated] BGCOLOR: indica el color de fondo de la celda.

Un ejemplo de tabla con varios de los elementos vistos sera la de la Figura 1.4., que corresponde al
siguiente cdigo:
<HTML>
<HEAD><TITLE>Ejemplo de tabla</TITLE></HEAD>
<BODY>
<TABLE BORDER=3>
<CAPTION><STRONG>Ejemplo</STRONG></CAPTION>
<TR>
<TD>Elemento 1</TD>
<TD>Elemento 2</TD>
<TD ROWSPAN=3>Elemento</TD>
<TD>Total</TD>
</TR>
<TR>
<TD>Elemento 3</TD>
<TD>Elemento 4</TD>
</TR>
<TR>
<TD>Elemento 5</TD>
<TD>Elemento 6</TD>
</TR>
<TR>
<TD COLSPAN=3><CENTER>Elemento</CENTER></TD>
</TR>
</TABLE>
</BODY>
</HTML>

3.8. Frames
3.8.1. Introduccin a los frames
Una ventana HTML puede ser dividida en subventanas o frames , en cada una de las cuales se puede
mostrar un documento o un URL distinto. Cada frame puede tener un nombre al que se puede dirigir el
resultado (mediante el atributo TARGET, objetivo) de una accin (por ejemplo clicar un hiperlink). El
tamao de los frames se puede cambiar interactivamente con el ratn (salvo que se haya eliminado sta
posibilidad explcitamente, al definirlos.).
Puede haber frames de contenido fijo o esttico (por ejemplo un logo de una empresa, un anuncio) y
otros cuyo contenido vaya variando. Un frame puede contener un ndice y otro (ms grande) va mostrando
los apartados a los que se hace referencia en el ndice.
Se llama frameset a una ventana con frames. Un frameset puede contener otros framesets.

Captulo 3. Lenguaje HTML

19

Dentro del TAG doble <FRAMESET> </FRAMESET> slo puede haber los siguientes contenidos:
1. Otro <FRAMESET></FRAMESET>
2. Definicin de frames con el TAG simple <FRAME>
Para crear frames es necesario un fichero HTML con una estructura semejante a la siguiente
(obsrvese que la TAG <FRAMESET> sustituye a <BODY>):
<HTML>
<HEAD><TITLE>Ttulo</TITLE></HEAD>
<FRAMESET>
Definicin de marcos o frames
</FRAMESET>
</HTML>
La TAG <FRAMESET> tiene dos atributos: COLS y ROWS. Ambos atributos admiten una lista de valores
separados por comas; estos pueden ser dados en valores absolutos (n de pixels) o en porcentajes (muy
recomendable). En este contexto el asterisco (*) representa el resto del tamao disponible.
A continuacin se exponen algunos ejemplos:

Para dividir verticalmente la ventana en dos partes separadas por una lnea vertical:
<FRAMESET COLS="20%, 80%">

Si se desea reservar dos reas horizontales de 80 y 160 pixels y una tercera con el resto de la ventana:
<FRAMESET ROWS="80, 160, *>

Para crear una rejilla de 2x3 ventanas:


<FRAMESET rows="30%,70%" cols="33%,34%,33%">

Como no se sabe la resolucin de la pantalla en la que se ejecutar el browser, conviene siempre


utilizar tamaos relativos, o si se utilizan tamaos absolutos, disponer de una particin cuyo tamao se
determina con el asterisco (*). Hay que tener en cuenta que si se utilizan porcentajes relativos que no
suman 100, a dichos porcentajes se les aplica un factor de escala de modo que representen correctamente
los tamaos relativos de los distintos frames.
La TAG <FRAME> es simple y define las propiedades de cada frame en el frameset. Algunos de sus
atributos son:

<FRAME SRC="URL"> Define el contenido del frame, es decir el URL cuyo contenido se mostrar en l.
Sin este atributo aparecer en blanco.
<FRAMESET COLS="20%,60%,20%">
<FRAME SRC="frame1.html">
<FRAME SRC="frame2.html">
<FRAME SRC="frame3.html">
</FRAMESET>

En este ejemplo se crea una divisin vertical de la ventana del browser en tres frames, en los que
aparecen las pginas: frame1.html, frame2.html y frame3.html.

NAME="nombre": Define un "nombre" para poder dirigir a ese frame contenidos poniendo ese nombre
en el atributo TARGET de un hiperlink.

MARGINWIDTH="n_pixels": es opcional, y determina la distancia horizontal del contenido a los


mrgenes de los frames.

MARGINHEIGHT="n_pixels": Similar al anterior para la distancia vertical.

SCROLLING="YES/NO/AUTO: Para que haya o no barras de desplazamiento en el frame. Con AUTO las
habr o no segn quepa o no el contenido.

NORESIZE: El usuario no podr cambiar el tamao del frame con el ratn.


Vase el siguiente ejemplo, correspondiente a la Figura 3.2 con frames anidados:

20

Informtica II

<HTML><HEAD><TITLE>Ejemplo de frames</TITLE></HEAD>
<FRAMESET ROWS="30%,30%,40%">
<FRAME SRC="PRAC5.HTM" NORESIZE>
<FRAMESET cols="25%,25%,50%">
<FRAME SRC="prac1.htm">
<FRAME SRC="prac2.htm">
<FRAME SRC="prac3.htm">
</FRAMESET>
<FRAME SRC="PRAC4.HTM">
</FRAMESET>
</HTML>
Para los browsers que no admiten frames se puede emplear la TAG doble <NOFRAMES> y </NOFRAMES>,
pudiendo visualizarse el documento sin problemas de forma alternativa:
<HTML><HEAD><TITLE> Ejemplo de FRAMES</TITLE></HEAD>
<FRAMESET COLS="80%, 20%">
<FRAME SRC="Indice.htm">
<FRAME SRC="Tema1.htm">
</FRAMESET>
<NOFRAMES>
<A HREF="Tema1.htm">Tema 1</A><BR>
</NOFRAMES>
</HTML>

Figura 3.2.

3.8.2. Salida a ventanas o frames concretas de un browser.


Sin frames, al clicar en un link el nuevo documento apareca en la misma ventana en que se estaba (o
en una ventana nueva si as se haba establecido en el browser).
Cuando se utilizan frames se puede especificar dnde se desea que aparezca el resultado cuando se
clique en un hiperlink. Para ello se pueden asignar nombres (mediante el atributo NAME) a las ventanas o
frames donde se mostrarn los documentos.
A su vez, hay que asignar un atributo TARGET que haga referencia al NAME de un frame o ventana. Si
no existe, se crear una ventana con dicho nombre.

TARGET en la TAG <A></A>: <A HREF="URL" TARGET="nom_ventana">Texto</A>

donde el documento indicado en el URL aparecer en la ventana cuyo nombre sea "nom_ventana".

Captulo 3. Lenguaje HTML

21

TARGET con la TAG <BASE>, para hacer que todos los links de un documento se dirijan al mismo
TARGET. As se establece un TARGET por defecto para todo el documento, que puede cambiarse con
TARGETs especficos en TAGs tipo <A>. La TAG <BASE> debe incluirse en el <HEAD> del documento.
<HEAD>
<TITLE>Our Products</TITLE>
<BASE href="http://www.aviary.com/intro.html" TARGET="ventana">
</HEAD>

TARGET con la TAG <FORM>, de modo que los resultados de un programa CGI (salida estndar) se
dirijan a la ventana indicada. Los formularios <FORM> y los CGI se estudiarn ms adelante.
<FORM ACTION="URL" TARGET="nom_ventana">

3.8.3. Nombres de TARGET


El atributo TARGET puede contener nombres de ventana. Los nombres vlidos son los siguientes:
1. Cualquier nombre que empiece por carcter alfanumrico.
2. Los nombres que empiezan por el carcter (_) son especiales:

TARGET="_blank": Salida dirigida a una ventana nueva en blanco y sin nombre.

TARGET="_self". Salida dirigida a la propia ventana del hiperlink.

TARGET="_parent". Salida dirigida al frameset padre del documento actual. Si no hay


padre el resultado es como el de _self.

TARGET="_top". Destruye todas las FRAMES que haya y la salida se dirige a la ventana
principal del browser.

Advertencia: No se admiten framesets recursivos (cuando en un frame de un frameset, se carga el


propio frameset); si se intenta acta como FRAME=_blank".

3.9. Mapas de imgenes o imgenes sensibles


3.9.1. Cmo funciona un mapa de imgenes
Los mapas de imgenes son imgenes clicables que permiten al usuario acceder a un URL o a otro
dependiendo de dnde se clica sobre dicha imagen. Inicialmente las imgenes sensibles eran procesadas
en el servidor remoto http, por lo que se perda mucho tiempo y adems no se indicaba la direccin a la
que se iba a acceder. La solucin a estos problemas fue procesar las imgenes sensibles en el browser,
acelerando el proceso en gran medida y con la ventaja adicional de que el browser informa en la barra de
estado acerca de la direccin URL a la que se va a acceder si se clica en ese punto.
3.9.2. Mapas de imgenes procesados por el browser
Un mapa de imgenes se elabora mediante varias TAGs simples <AREA> entre las TAG dobles
<MAP>...</MAP>. La TAG <MAP> debe tener un atributo NAME para identificar el mapa de imgenes.

Las TAGs simples <AREA> definen tantas zonas geomtricas activas sobre una imagen como se desee, y
pueden tener varios atributos:

HREF="URL". Define el URL de destino del rea.

ALT="texto". Contiene una descripcin textual alternativa del rea (como en <IMG>). Se requiere para
que los browsers que no tengan grficos disponibles puedan utilizar satisfactoriamente el Web.

SHAPE="forma". Indica la forma de la zona activa; puede tomar los valores: POLY, CIRCLE, RECT
(siendo este ltimo el valor por defecto).

COORDS=x1,y1,x2,y2, Este atributo define una lista de coordenadas (en pixels) separadas por
comas que determinan las zonas activas. Las coordenadas son relativas a la esquina superior izquierda
de la imagen. El orden y el valor de estas coordenadas depende del atributo SHAPE:

En el caso de RECT: X izda., Y sup. X dcha., Y inf.

En el caso de CIRCLE: X del centro, Y del centro, radio.

En el caso de POLY: X e Y de cada uno de los vrtices, siendo el ltimo par de coordenadas
coincidente con el primero para cerrar el polgono.

22

Informtica II

NOHREF. Este es un atributo opcional que indica que no se debe realizar ninguna accin si el
usuario clica en la zona correspondiente. En todo caso, las zonas de la imagen no incluidas en
ninguna zona activa definida se consideran de tipo NOHREF.

Para hacer referencia a un determinado mapa de imgenes se utiliza el atributo USEMAP a la TAG
<IMG>, indicando el NAME del mapa deseado como valor del atributo USEMAP. A continuacin se expone
un ejemplo:
<HTML><BODY>
<IMG SRC="concha.gif" USEMAP="#FOTO" ALT="Baha de San Sebastin">
<MAP NAME="FOTO">
<AREA SHAPE="RECT" COORDS=20,25,155,83 HREF="historia.html" ALT="Historia">
<AREA SHAPE="CIRCLE" COORDS=60,150,100,150 HREF="plano.html" ALT="Planos">
<AREA SHAPE="POLY" COORDS=106,100,126,170,254,170,254,49,222,100
HREF="fotos.html" ALT="Fotos">
<AREA SHAPE="POLY" COORDS=169,26,169,93,267,26 NOHREF ALT="Idioma">
</MAP>
</BODY></HTML>
Para que funcione este cdigo se ha creado el grfico concha.gif incluyendo el dibujo de los contornos
de las futuras zonas activas. Se han obtenido las coordenadas de las zonas activas y se han escrito en el
atributo COORDS tal y como se ha explicado. Se han creado tambin los archivos plano.html,
historia.html y fotos.html, a los que se acceder tras clicar sobre esas reas.
En este ejemplo, se supone que la opcin
del idioma no est an preparada. Por ello,
la TAG AREA no hace referencia a ningn
archivo o link. Se ha empleado el atributo
NOHREF para indicar expresamente que no se
acceda a ningn URL al clicar en esta zona.
De este modo, cuando est ya preparado el
archivo idiomas.html, no habr ms que
cambiar esta parte de cdigo. Finalmente,
podr decirse que la imagen sensible
funciona si al desplazar el ratn sin clicar
sobre un rea activa aparece en la barra de
estado la direccin a la que se acceder si se
clica sobre ella. Obviamente, esto ltimo no
se cumple para las reas definidas con
NOHREF.

Figura 3.3.

3.10. Editores y conversores HTML


Con un simple editor de texto como Notepad se pueden crear los ficheros HTML ms sofisticados. Sin
embargo, hay que sealar que la tarea se simplifica mucho si se dispone de un buen editor o conversor
especialmente preparado para producir este tipo de ficheros.
Los editores permiten introducir de modo automtico o semiautomtico las TAGs de HTML a medida
que se va tecleando el texto. Los hay de dos tipos: editores automticos WYSIWYG (What You See Is What
You Get) en los que al introducir el texto se muestra tal como se ver en el browser, y editores
semiautomticos ms sencillos que simplemente proporcionan ayuda para ir introduciendo los TAGs; de
ordinario estos editores permiten llamar al browser preferido pulsando un simple botn, para comprobar
cmo se ve el fichero que se est creando. Son editores semiautomticos CMED y HotDog y automticos
los editores Netscape Navigator Gold y FrontPage HTML Editor.
Los conversores son programas que convierten los formatos propios de una aplicacin (por ejemplo
Word, Excel y Powerpoint) a formato HTML. Es posible que en la conversin se pierdan o cambien
algunas caractersticas de formato, pero eso no resta utilidad a los conversores. Cada vez ms, los
conversores son programas integrados, es decir, es la propia aplicacin original la que tiene la posibilidad
de crear ficheros *.html. Internet Assistant for Word, Excel y Powerpoint son conversores integrados en
los programas de Microsoft Office.

CAPTULO 4

4. Formularios y CGIs
4.1. Formularios (Forms)
Hasta el momento se ha visto cmo el servidor puede crear pginas Web que son visualizadas por medio
de un browser en el ordenador del usuario remoto, y cmo se mantiene cierta interactividad mediante el
carcter de hipertexto, mediante el cual el usuario va solicitando distintos contenidos segn sus
preferencias. Sin embargo, en lo visto hasta ahora se echa en falta la posibilidad de que el usuario enve
datos al servidor, tales como sugerencias, nombres, datos personales, etc. Esta posibilidad se consigue por
medio de los formularios (FORMs) que permiten el envo de datos mediante diversos tipos de botones,
cuadros de dilogo y ventanas de texto. En este apartado los formularios y sus distintos elementos se
estudiarn con un cierto detenimiento. En la Figura 4.1. se presenta un formulario con distintos
elementos: cajas de texto, botones de seleccin o de opcin, listas desplegables, etc.

Figura 4.1.

Los formularios tienen un modo propio de funcionar que conviene entender correctamente, primero de
un modo ms general y luego ms en detalle. Cada uno de los elementos del formulario tiene un nombre,
determinado por la persona que lo ha programado. Ese nombre se asociar posteriormente a la opcin
elegida o al texto introducido por el usuario. Un elemento particularmente importante (por lo decisivo,
ms que por su complejidad) es el botn Enviar (o Submit, Send, O.K., o como se le haya querido llamar),
cuya misin es dar por concluida la recogida de datos en el browser y enviar al servidor toda la
informacin que el usuario haya introducido. Cuando se pulsa este botn se enva al servidor (en la forma
que ms adelante se ver) una larga cadena de caracteres que contiene los nombres de todos los
elementos del formulario junto con la informacin que el usuario ha introducido en cada uno de ellos.
Qu hace el servidor con toda la informacin que le llega de un formulario debidamente
cumplimentado? Pues algo muy sencillo: arrancar un programa cuyo nombre est especificado en el propio
formulario, pasarle toda la informacin que ha recibido, recoger la informacin que dicho programa le
enva como respuesta, y enviarla al cliente o browser que rellen el formulario. Adems de responder al
cliente, este programa podr realizar cualquier otra accin, como por ejemplo guardar la informacin
recibida en un fichero o en una base de datos. Ya se ve que en todo este proceso el servidor acta como
una especie de intermediario entre el browser y el programa que recibe la informacin del formulario y la
procesa. La forma en la que el servidor se entiende con el programa al que llama para que procese los
datos del formulario recibe el nombre de CGI (Common Gateway Interface). La Figura 4.2. representa de
forma simblica todo este proceso.
As pues todo formulario se define mediante la doble TAG <FORM></FORM>, dentro de las cules se
definirn los distintos elementos. Al crear un formulario se debe definir el mtodo de envo de datos
(GET o POST) que el servidor utilizar para enviar al programa CGI los datos que debe procesar. Tambin
se debe especificar la accin que el servidor deber emprender cuando reciba los datos, y que ser

24

Informtica II

arrancar dicho programa CGI cuyo nombre debe conocer. Estas dos tareas se definen, respectivamente,
con los atributos METHOD y ACTION.

Servidor HTTP

Cliente
****

CGI

Respuesta
HTML

Base
de
datos

QUERY
STRING

Servidor

Figura 4.2.

A continuacin se presenta un ejemplo simple que permite ver cmo se define un formulario y cmo
aparece en el browser. El cdigo HTML es el siguiente:
<FORM ACTION="/cgi-bin/form1.exe" METHOD="GET">
Introduzca su nombre:
<INPUT TYPE="text" NAME="nombre"><br>
<INPUT TYPE="SUBMIT" VALUE="Enviar">
</FORM>
En la Figura 4.3. aparece representado el formulario correspondiente, que slo tiene dos elementos: un
cuadro de texto para que el usuario teclee el nombre y un botn para enviar los datos al servidor cuando
el nombre haya sido ya introducido. Todos los elementos de un formulario que recogen informacin se
definen con la TAG simple <INPUT>. El atributo TYPE define el tipo de elemento de que se trata (si se
omite, por defecto se supone que el tipo es text). A cada elemento (excepto a los singulares -que no se
pueden repetir- como el botn Enviar) hay que aadirle un atributo NAME que defina el nombre con el
que se identificar luego su contenido.

Figura 4.3.

En el ejemplo anterior, el cuadro de texto se ha definido con la TAG INPUT; en esa TAG se ha
introducido un parmetro NAME definiendo que ese cuadro se llama nombre.
Se ha introducido el atributo TYPE=SUBMIT para el segundo elemento del formulario. Este elemento
es un botn cuya funcin es enviar los datos de los elementos del formulario al programa CGI que lo va a
procesar. Dicho programa se especifica mediante el atributo ACTION, y resulta ser /cgi-bin/form1.exe.
En general cgi-bin es un directorio localizado en el servidor, que contiene los programas CGI.
Tambin se puede crear un botn (llamado en ingls RESET) que reinicie el formulario a su estado
inicial, anulando todos los cambios que hubiera podido introducir el usuario. La manera de crearlo se ver
en el siguiente ejemplo, que contiene algunos elementos y atributos nuevos con los que se trata de
recoger los datos del domicilio de una persona. La Figura 4.4. muestra como se ve en el browser el
formulario definido. Gracias a la TAG <PRE>...</PRE> que impone paso constante y respeta los espacios en
blanco se consigue que los cuadros de texto queden alineados. El atributo NAME permite definir un
nombre para cada elemento. El atributo SIZE determina la longitud del cuadro de texto, mientras que
MAXLENGTH limita el nmero de caracteres que se pueden introducir en cada cuadro. Inicialmente todos
los cuadros de texto estn en blanco, tal como se ve en la figura 4.4. Si el usuario introduce datos y pulsa
luego el botn Borrar, el formulario volver a la condicin inicial. Los botones SUBMIT y BORRAR no
necesitan NAME porque quedan identificados por su atributo TYPE. Por su parte los cuadros de texto no
necesitan atributo TYPE porque el tipo por defecto es TEXT.

Captulo 4. Formularios y CGIs

25

<FORM ACTION="/cgi-bin/form3" METHOD="POST">


<PRE>
Nombre:
<INPUT NAME="nombre" SIZE=30>
Calle:
<INPUT NAME="calle" SIZE=40>
Localidad:
<INPUT NAME="localid" SIZE=35>
Provincia:
<INPUT NAME="prov" SIZE=25>
Cd. Postal: <INPUT NAME="cp" SIZE=5 MAXLENGTH=5>
</PRE>
<INPUT TYPE="SUBMIT" VALUE="Enviar">
<INPUT TYPE="RESET" VALUE="Borrar">
</FORM>

Figura 4.4.

Considrese un nuevo ejemplo correspondiente al formulario que se muestra en la Figura 4.5. En l se


ve que tambin se pueden crear reas de texto en las cuales no se limita la cantidad de texto a
introducir, y que pueden servir para pedir sugerencias u opiniones. La forma de crearlas es con la TAG
doble <TEXTAREA>...</TEXTAREA>. Los parmetros que se le envan son el nombre (atributo NAME) y los
nmeros de filas y de columnas de la ventana (atributos ROWS=n y COLS=m). En este caso la TAG doble
<TEXTAREA> sustituye a la TAG simple <INPUT>. Ms adelante se vern otros TAGs alternativas para crear
distintos elementos del formulario. A continuacin se muestra un ejemplo (Figura 4.5).
<H2>Sugerencias y crticas</H2>
<P><FORM ACTION="/cgi-bin/form3" METHOD="POST">
Por favor, introduzca cualquier sugerencia o crtica positiva:<BR>
<TEXTAREA ROWS=5 COLS=30 NAME="positivo">Me encanta este Web porque...
</TEXTAREA></P>
<P>Introduzca los comentarios negativos:<BR>
<TEXTAREA ROWS=2 COLS=15 NAME="negativo"></TEXTAREA></P>
<P><INPUT TYPE="SUBMIT" VALUE="Enviar">
</FORM></P>

Figura 4.6.

Figura 4.5.

Figura 4.7.

26

Informtica II

En el siguiente ejemplo se va a ver que es posible crear cuadros de texto en los que lo que se escribe
no aparezca (que aparezca como caracteres *). Estos elementos se emplean para que el usuario introduzca
un password. En la Figura 4.6. se muestra el resultado del cdigo HTML que sigue:
<FORM>
Introduzca el nombre del usuario: <INPUT NAME="login" SIZE=25><BR>
Introduzca cdigo de acceso:
<INPUT TYPE="PASSWORD" NAME="acceso" SIZE=6 MAXLENGTH=10><P>
<INPUT TYPE="SUBMIT" VALUE="Enviar">
<INPUT TYPE="RESET" VALUE="Borrar">
</FORM>
Como se puede ver, el modo de crear este tipo de cuadros de texto es anlogo a los anteriores:
nicamente hay que introducir el atributo TYPE=password.
Una de las opciones ms interesantes de los formularios es la de poder crear casillas de verificacin.
En la Figura 4.7 aparece un ejemplo de este tipo de elemento. Para poder crear estas casillas se debe
utilizar la TAG INPUT, poniendo el atributo TYPE=CHECKBOX y el mismo NAME para todas las casillas del
grupo. La caracterstica de estas casillas es que se pueden seleccionar varias a la vez. Si al definirlas se
introduce adems el atributo CHECKED, aparecern inicialmente seleccionadas (Pese a que luego puedan
no seleccionarse). El cdigo HTML necesario para crear este formulario es el que sigue a continuacin:
<FORM ACTION="/cgi-bin/form" METHOD="POST">
Indique qu sistemas operativos conoce:<P>
<INPUT TYPE="checkbox" NAME="sisoper" VALUE="Unix" CHECKED>Unix<BR>
<INPUT TYPE="checkbox" NAME="sisoper" VALUE="OS/2">OS/2<BR>
<INPUT TYPE="checkbox" NAME="sisoper" VALUE="MacOS">MacOS<BR>
<INPUT TYPE="checkbox" NAME="sisoper" VALUE="DOS" CHECKED>DOS<BR>
<INPUT TYPE="checkbox" NAME="sisoper" VALUE="WinNT" CHECKED>Windows NT<BR>
<INPUT TYPE="SUBMIT" VALUE="Enviar">
<INPUT TYPE="RESET" VALUE="Borrar">
</FORM>
En el siguiente ejemplo se va a ver que tambin se pueden crear botones de radio, que son similares a
los CHECKBOX, pero con la condicin de que slo se puede seleccionar uno de ellos a la vez. La Figura 4.8.
muestra el resultado en el browser del cdigo que se incluye a continuacin:
<FORM ACTION="/cgi-bin/form" METHOD="POST">
Indique su estado civil:<P>
<INPUT TYPE="radio" NAME="estado" VALUE="Soltero">Soltero/a <BR>
<INPUT TYPE="radio" NAME="estado" VALUE="Casado">Casado/a <BR>
<INPUT TYPE="radio" NAME="estado" VALUE="Viudo">Viudo/a <BR>
<INPUT TYPE="radio" NAME="estado" VALUE="Otros">Otros <BR>
<INPUT TYPE="SUBMIT" VALUE="Enviar">
<INPUT TYPE="RESET" VALUE="Borrar">
</FORM>
Finalmente se presentan ejemplos de
otra de las opciones que permiten los
formularios: las ventanas de seleccin
desplegables y las ventanas de scroll
(o
ventanas
con
barras
de
deslizamiento). Las primeras estn
basadas en una TAG doble llamado
<SELECT></SELECT>. En el contenido
de esta TAG se pueden incluir tantos
TAGs simples <OPTION> como se desee.
El TAG <SELECT> tiene el atributo NAME,
lo que no ocurre con las TAGs
<OPTION>. Cada TAG <OPTION> contiene
un atributo VALUE que describe el texto
que aparecer en la ventana.

Figura 4.8.
Figura 4.9.

Captulo 4. Formularios y CGIs

27

El aspecto visual del primero de los ejemplos se muestra en la Figura 4.9 y su cdigo HTML:
<FORM>
Indique cul es el medio de<BR>
transporte que usa con mayor<BR>
frecuencia para ir al trabajo:<P>
<SELECT NAME="Transp">
<OPTION VALUE="coche"> Coche particular </OPTION>
<OPTION VALUE="bus"> Autobs </OPTION>
<OPTION VALUE="taxi"> Taxi </OPTION>
<OPTION VALUE="tren"> Tren </OPTION>
<OPTION VALUE="metro"> Metro </OPTION>
<OPTION VALUE="bici"> Bicicleta </OPTION>
</SELECT>
<INPUT TYPE="SUBMIT" VALUE="Enviar">
</FORM>
Como se puede ver cada una de las opciones de la ventana se introduce con la TAG simple <OPTION
VALUE=nombre>, y es necesario que todas las opciones estn entre las TAGs <SELECT> y </SELECT>
En el siguiente ejemplo se va a utilizar, en vez de una ventana desplegable, una ventana con barras de
deslizamiento o ventana de scroll. En la Figura 4.10 se muestra el resultado del cdigo que sigue:
<FORM>
Indique cul es el medio de<BR>
transporte que usa con mayor<BR>
frecuencia para ir al trabajo:<P>
<SELECT NAME="Transp" SIZE=3>
<OPTION VALUE="coche"> Coche particular </OPTION>
<OPTION VALUE="bus"> Autobs </OPTION>
<OPTION VALUE="taxi"> Taxi </OPTION>
<OPTION VALUE="tren"> Tren </OPTION>
<OPTION VALUE="metro"> Metro </OPTION>
<OPTION VALUE="bici"> Bicicleta </OPTION>
<SELECT>
<INPUT TYPE="SUBMIT" VALUE="Enviar">
</FORM>

Figura 4.10.

Figura 4.11.

La nica diferencia respecto al ejemplo anterior es el atributo SIZE que define el tamao vertical
(nmero de lneas) de la ventana. Si SIZE=1 la ventana ser desplegable, y en caso contrario aparecer
una ventana con barras de deslizamiento.
En los dos ejemplos anteriores slo se poda seleccionar uno de las opciones de la ventana. En el
siguiente ejemplo se va a crear una ventana de seleccin mltiple. El resultado se muestra en la Figura
4.11. y el cdigo HTML es como sigue:

28

Informtica II

<FORM>
Indique las reas que sean<BR>
de su inters:<P>
<SELECT NAME="Areas" SIZE=4 MULTIPLE>
<OPTION VALUE="lan"> Redes de rea Local
<OPTION VALUE="inet"> Internet
<OPTION VALUE="teleco"> Telecomunicaciones
<OPTION VALUE="sop"> Sistemas Operativos
<OPTION VALUE="soft"> Software
<OPTION VALUE="hard"> Hardware
</SELECT>
<INPUT TYPE="SUBMIT" VALUE="Enviar">
</FORM>
Ni que decir tiene que tambin es posible crear ventanas desplegables de seleccin mltiple: prubese
copiando ste mismo cdigo eliminando el parmetro SIZE=4 o, simplemente, haciendo SIZE= 1) En los
ejemplos anteriores se han presentado las posibilidades abiertas por los formularios. En el apartado
siguiente se considerar cmo se debe procesar esta informacin cuando llega al servidor.

4.2. Programas CGI


Ya se ha visto en el apartado anterior cmo crear formularios con los que recoger datos de diverso tipo
para enviarlos al servidor, pero cmo se envan y cmo se procesan estos datos? La respuesta est en que
los datos se envan como cadena de caracteres aadida a un URL como query string, precedida con un
carcter (?); para procesarlos se utilizan los programas CGI (Common Gateway Interface), que el servidor
arranca y a los que pasa los datos recibidos del browser.
Los CGI son programas hechos por lo general en Perl (lenguaje interpretado muy popular en el entorno
UNIX, pero que tambin existe en Windows NT) o en C/C++.
A grandes rasgos un programa CGI debe realizar las siguientes tareas:

Recibir los datos que son enviados por el browser e interpretarlos, separando la entrada
correspondiente a cada elemento del formulario.

Realizar las tareas necesarias para procesar esos datos, que de ordinario consistirn en almacenarlos
en algn archivo o base de datos y enviar una respuesta al browser donde se encuentra el usuario.
Esta respuesta debe tener la forma de pgina HTML incluyendo todos los elementos necesarios
(<HEAD>, <BODY>, etc.).

Para que un programa CGI funcione correctamente debe estar en un directorio /cgi-bin/ del servidor
HTTP (servidor Web). En caso que se utilice Visual C++ (u otro compilador compatible) es importante, para
que el ejecutable CGI funcione correctamente, el compilarlo para que funcione en modo MS-DOS (o modo
Consola). Para un programa de este tipo la entrada de datos estndar es el teclado y la salida de datos
estndar es la pantalla. Para un programa CGI el servidor HTTP asume el papel de entrada y salida de
datos estndar.

CAPTULO 5

5. JavaScript
5.1. Introduccin
JavaScript es un lenguaje de programacin que permite el script de eventos, clases y acciones para el
desarrollo de aplicaciones Internet entre el cliente y el usuario. JavaScript permite con nuevos elementos
dinmicos ir ms all de clicar y esperar en una pgina Web. Los usuarios no leern nicamente las
pginas sino que adems las pginas ahora adquieren un carcter interactivo. Esta interaccin permite
cambiar las pginas dentro de una aplicacin: poner botones, cuadros de texto, cdigo para hacer una
calculadora, un editor de texto, un juego, o cualq uier otra cosa que pueda imaginarse.
Los navegadores interpretan las sentencias de JavaScript incluidas directamente en una pgina HTML,
permitiendo la creacin de aplicaciones similares a los CGI.
An no hay definicin clara del scripting language ("lenguaje interpretado de comandos"). A veces el
trmino se usa para distinguir este tipo de lenguaje de los lenguajes compilados como el C++. Quiz,
algunos lenguajes como el C o C++ puedan ser usados para scripts de aplicaciones. JavaScript es en
muchos aspectos un lenguaje de programacin parecido al C o C++.
Como otros lenguajes script, JavaScript extiende las capacidades de la aplicacin con la que trabajan,
as JavaScript extiende la pgina Web ms all de su uso normal. Hay numerosas maneras de dar vida al
Web y dar flexibilidad al lenguaje. El nico lmite es la imaginacin.
5.1.1. Propiedades del Lenguaje JavaScript
Las propiedades ms importantes de JavaScript son las siguientes:

Se interpreta por el ordenador que recibe el programa, no se compila.

Tiene una programacin orientada a objetos. El cdigo de los objetos est predefinido y es
expandible. No usa clases ni herencia.

El cdigo est integrado (incluido) en los documentos HTML.

Trabaja con los elementos del HTML.

No se declaran los tipos de variables.

Ejecucin dinmica: los programas y funciones no se chequean hasta que se ejecutan.

Los programas de JavaScript se ejecutan cuando sucede algo, a ese algo se le llama evento.

5.1.2. El lenguaje JavaScript


JavaScript est basado en un modelo orientado al WWW. Elementos de una pgina como un botn o un
cuadro de seleccin, pueden causar un evento que ejecutar una accin. Cuando ocurre alguno de estos
eventos se ejecuta una funcin en JavaScript. Esta funcin est compuesta de varias sentencias que
examinan o modifican el contenido de la pgina Web, o hacen otras tareas para dar respuesta de algn
modo al evento.
Por lo general, los comandos de un programa en JavaScript se dividen en 5 categoras:

Variables y sus valores.

Expresiones, que manipulan los valores de las variables.

Estructuras de control, que modifican cmo las sentencias son ejecutadas.

Funciones, que ejecutan un bloque de sentencias

30

Informtica II

Clases y arrays (vectores), que son maneras de agrupar datos.

A continuacin se presenta una breve introduccin sobre estas categoras.


5.1.3. Variables y valores
En JavaScript , a diferencia de la mayora de los lenguajes de programacin, no se debe especificar el
tipo de datos. No hay manera de especificar que una variable representa un entero, una cadena de
caracteres, un nmero con decimales (que se escriben con punto y no con coma), o un valor lgico
booleano. De hecho, la misma variable puede ser interpretada de diferentes modos en diferentes
momentos.
Todas las variables se declaran usando el comando var. Una variable puede ser inicializada cuando se
da un valor al ser declarada, o puede no ser inicializada. Adems, varias variables pueden ser declaradas a
la vez separadas por comas.
Ejemplo 1:
var variable1= "coche"
var cuaderno
var mi_variable = 123456, decimal =2342.89
var n_casas, n_habitaciones, n_cuadros, nombre = "Franklin"
5.1.4. Sentencias, Expresiones y Operadores
Como en la mayora de los lenguajes de programacin, la unidad bsica de trabajo en JavaScript es la
sentencia. Una sentencia de JavaScript hace que algo sea evaluado. Esto puede ser el resultado de dar
valor a una variable, llamar a una funcin, etc. Cualquiera de las lneas del ejemplo 1 es una sentencia.
Los programas de JavaScript son un grupo de sentencias, normalmente organizadas en funciones que
manipulan las variables y el entorno HTML en el cual el script trabaja.
Los operadores hacen que en una sentencia las variables sean evaluadas y se les asigne un valor o un
resultado. Los operadores pueden actuar de distinto modo en diferentes situaciones. Algunos operadores
de JavaScript pueden ser sobrecargados, es decir, pueden tener diversas interpretaciones segn su modo
de uso.
No hay ningn carcter especial o signo que marque el final de una sentencia en un programa. Por
defecto se considera que una sentencia ha acabado cuando se llega al final de la lnea, aunque se puede
especificar el fin con el carcter punto y coma (;). sto hace posible poner varias sentencias en una sola
lnea separadas entre s por un punto y coma.
Las dos siguientes sentencias realizan la misma operacin, para JavaScript no tienen ninguna diferencia
Ejemplo 2:
var variable1= "coche"
var variable1= "coche";
y estos dos grupos de sentencias tambin:
Ejemplo 3:
var a = 0; a = 2+4; var c = a / 3 (;)
var a = 0
a = 2+4
var c = a / 3
Los segunda sentencia es una expresin.
5.1.5. Estructuras de Control.
Con lo explicado, an no es posible escribir cdigo para un programa completo; hay que conocer
construcciones de nivel ms elevado. Existen varios mtodos para controlar el modo de ejecucin de
sentencias que se vern ms adelante.
5.1.6. Funciones y Objetos
Las sentencias, expresiones y operadores bsicos se agrupan en bloques ms complejos dentro de un
mismo programa llamadas funciones. El control de estructuras representa el siguiente nivel de
organizacin de JavaScript. Las funciones y los objetos representan el nivel ms alto de organizacin del
lenguaje.
5.1.6.1. Funciones
Una funcin es un bloque de cdigo con un nombre. Cada vez que se usa el nombre, se llama a la
funcin y el cdigo de la funcin es ejecutado. Las funciones pueden llamarse con valores, conocidos

Captulo 5. JavaScript

31

como parmetros, que se usan en la funcin. Las funciones tienen dos objetivos: organizacin del
programa (archivo o documento) y ejecucin del cdigo de la funcin. Al clicar con el ratn, apretar un
botn, seleccionar texto y otras acciones pueden llamar a funciones.
El nombre de una funcin se escribe inmediatamente despus del comando function. Todos los
nombres de funciones deben ser nicos y diferentes de los nombres de los comandos que usa JavaScript.
No puede haber dos funciones con el mismo nombre. La lista de parmetros de una funcin se separa por
comas. La funcin usa esos parmetros en las sentencias de su cuerpo que la configuran. Los argumentos
que se le pasan a una funcin no pueden ser cambiados en su interior.
Ejemplo 4:
function valor_abs (num){
if (num >= 0)
return num
else
return -num
}
num es el argumento que se utiliza dentro de la funcin. El cdigo de la funcin va entre llaves.
5.1.6.2. Objetos
Las funciones se usan para organizar el cdigo. Los objetos tienen el mismo propsito pero con datos.
Los tipos de datos conocidos hasta ahora son variables declaradas o inicializadas con var. Cada uno de
estos tipos puede tener un solo valor. Los objetos permiten la capacidad de tener varios valores, de tal
manera que un grupo de datos pueda estar relacionado con otro.
Lo que en JavaScript se llama objeto en otros lenguajes se llama estructura de datos o clase. Como las
funciones, los objetos tienen 2 aspectos: cmo se crean y cmo se usan.
Al usar JavaScript, tenemos predefinidos una serie de objetos. Un objeto de JavaScript es un conjunto
de componentes, llamados propiedades o miembros. Si se supone que se tiene un objeto llamado cita para
organizar citas, ste tendr las propiedades da, hora, con quin y para qu.
A cada una de estas propiedades del objeto se hace referencia con el operador punto ( . ).
As, para referirse al mes de la cita se usa una_cita.mes mientras que una_cita.con_quien contendr el
nombre de con quin nos hemos citado.
Cada objeto puede contener todas las variables que nos interesen. Puede contener funciones que
realicen algn trabajo. Puede incluso contener otros objetos, de tal manera que se pueden organizar los
datos de modo jerrquico.
Ms adelante se vern ejemplos al entrar en detalle con los objetos.
5.1.7. La TAG Script.
En el sentido ms general, cada pgina Web est hecha con sentencias de HTML que dividen la pgina
en dos partes: el HEAD y el BODY.
La seccin HEAD de un documento HTML es la que debe contener el cdigo de JavaScript para los
gestores de eventos. Aunque no es necesario que todo el cdigo de JavaScript vaya en el HEAD, es
importante que vaya en l para asegurar que todo el cdigo de JavaScript haya sido definido antes del
BODY del documento. En particular, si el documento tiene cdigo para ejecutar un evento, y este evento
se acciona antes de que el cdigo se lea, podra ocurrir un error por que la funcin est sin definir.
En un documento HTML, el cdigo de JavaScript se introduce mediante la TAG SCRIPT. Todo lo que
haya entre <SCRIPT> y </SCRIPT> se considera como un tipo de cdigo script, como JavaScript. La sintaxis
para la TAG SCRIPT es:
<SCRIPT TYPE=Nombre del lenguaje

SRC=URL>

El elemento Nombre del lenguaje da el lenguaje que se usa en el subsiguiente script.


El atributo SRC es necesario cuando se quiere hacer referencia a un fichero que contiene el cdigo del
script. Para JavaScript, el fichero suele tener extensin .js. Si se usa el atributo SRC la TAG <SCRIPT> es
inmediatamente seguida por </SCRIPT>. Por ejemplo un bloque <SCRIPT> que carga un cdigo JavaScript
del fichero click.js en el directorio relativo al documento, se hara del siguiente modo:
Ejemplo 5
<SCRIPT TYPE=text/javascript SRC=click.js></SCRIPT>

32

Informtica II

Si no se pone el atributo SRC, entonces entre las TAGs <SCRIPT> y </SCRIPT> se escribe el cdigo en el
lenguaje indicado en la primera TAG. La estructura general del cdigo es:
<SCRIPT TYPE=text/javascript>
Sentencias
</SCRIPT>
El siguiente programa usa la funcin del ejemplo 4. Con el formulario, <FORM>, nos pide un nmero
que evaluamos con la funcin y devolvemos su valor absoluto. Puede que haya cosas que no queden claras,
pero todo se explicar con ms detalle a posteriori. La funcin de estos ejemplos previos no es sino la de
dar una visin general del lenguaje.
Ejemplo 6:
<HTML>
<BODY>
<SCRIPT TYPE="text/javascript">
function valor_abs(form){
var num = eval(form.expr.value)
if (num >= 0)
form.result.value = num
else
num = -num
form.result.value = num
}
</SCRIPT>
<FORM>
<SCRIPT>
document.write("Introduce un nmero:") // Salida por pantalla
</SCRIPT>
<INPUT TYPE="text" NAME="expr" SIZE=15 ><BR>
<INPUT TYPE="button" VALUE="Calcular" onClick="valor_abs(this.form)"><BR>
<P ALIGN=LEFT>
<SCRIPT>document.write("Valor Absoluto:")</SCRIPT>
<INPUT TYPE="text" NAME="result" SIZE=15 >
</P>
</FORM>
</BODY>
</HTML>

5.2. Activacin de JavaScript: Eventos (Events).


El nmero de cosas que se pueden hacer en una pgina HTML es bastante limitado. La mayora de los
usuarios simplemente leen un texto, miran grficos y como mucho escuchan sonidos. Para muchos, la
experiencia del Web consiste en visitar una serie de pginas sin interaccionar prcticamente con ellas. La
nica interaccin ocurre cuando el usuario selecciona un link o clica un mapa de imagen.
Los formularios de HTML han cambiado gradualmente este modelo para incrementar el nivel de
interaccin. Un formulario tiene varios modos de aceptar entradas. El usuario rellena el formulario y lo
enva. Es difcil saber si el formulario ha sido rellenado correctamente y el tiempo de proceso del
formulario es normalmente bastante largo. En el caso del HTML, este proceso ocurre porque el contenido
del formulario tiene que ser enviado a travs de la red a algn fichero en el servidor, donde se procesa y
entonces se da una respuesta al usuario. Incluso el ms simple error causa el rechazo del formulario, y por
lo tanto que deba repetirse el proceso.
Uno de los objetivos de JavaScript es localizar la mayora de estos procesos y mejorarlos dentro del
browser del usuario. JavaScript es capaz de asegurarse que un formulario se rellene y enve
correctamente; evitando que el usuario tenga que repetir el formulario a causa de algn error.
JavaScript realiza esto mediante los gestores de eventos. Estos son sentencias de JavaScript,
normalmente funciones, que se llaman cada vez que algo ocurre. Las funciones de JavaScript pueden ser
llamadas cuando se enva un formulario o cuando el usuario usa campos del formulario.
5.2.1. Eventos y acciones
Para entender el modelo de gestores de eventos de JavaScript, hay que pensar primero sobre las cosas
que pueden ocurrir actualmente en una pgina Web. Aunque algunas cosas se pueden hacer con el

Captulo 5. JavaScript

33

browser, la mayora de estas no tienen que ver con la navegacin en el Web (salvar una pgina como
texto, imprimirla, editar un bookmark, etc.).
Para entender qu acciones del browser corresponden a los eventos de JavaScript y cuales no, es
importante distinguir aquellas acciones que causan algn cambio en la pgina Web cuando se muestra. De
hecho, realmente hay slo dos tipos de acciones: las que permiten que el usuario pueda navegar o las que
hacen posible que el usuario pueda interactuar con un elemento de un formulario HTML.
5.2.1.1. Acciones de Navegacin y Eventos
En la categora de navegacin se pueden distinguir las siguientes acciones:

Seleccionar un link de hipertexto

Mover hacia adelante o hacia atrs en la lista de Webs visitados.

Abrir otro fichero.

Cerrar el browser

En la mayora de estos casos la pgina activa se descarga, y otra nueva se carga y se muestra en la
ventana del browser. Pero cualquier persona que ha usado la WWW sabe que al seleccionar un link de
hipertexto no siempre se tiene xito, puesto que la mquina puede estar desconectada o inaccesible. El
link puede haber muerto. Seleccionando un link muerto se descarga la pgina activa, y no se carga una
nueva.
Dependiendo del tipo de error y del browser usado puede perderse la pgina activa. Estos eventos,
cargar y descargar una pgina, son los nicos eventos que pueden ser manejados por JavaScript a nivel de
los documentos. Esto significa que es posible escribir cdigo JavaScript contenido dentro de la definicin
de HTML de una pgina, que se ejecutar cada vez que la pgina sea cargada o descargada.
5.2.2. Gestores de Eventos (Event Handlers)
5.2.2.1. Declaracin
En la introduccin se ha dicho que las funciones de JavaScript slo se ejecutan en respuesta a eventos.
Se sabe que los eventos ocurren cuando se produce alguna interaccin o cambio en la pgina Web activa.
Las declaraciones de los gestores de eventos es muy similar a los atributos de HTML. Cada nombre del
atributo empieza con la palabra on y sigue con el nombre del evento, as por ejemplo onClick es el
atributo que se usara para declarar un gestor de eventos para el evento Click (clicar un objeto).
La declaracin de un gestor de eventos es: onEvent=Cdigo_JS.
Normalmente, por convenio, se escribe on en minscula y el nombre del evento con la letra inicial en
mayscula. Esto ayuda a distinguir ste de los dems atributos.
Los tipos de eventos y gestores de eventos son los siguientes:
Evento
blur
click
change
focus
load
Mouseover
Select
Submit
Unload

Ocurre Cuando
El usuario quita el cursor de un elemento de formulario
El usuario clica un link o un elemento de formulario
El usuario cambia el valor de un texto, un rea de texto o
selecciona un elemento.
El usuario coloca el cursor en un elemento de formulario.
El usuario carga una pgina en el Navegador
El usuario mueve el ratn sobre un link
El usuario selecciona un campo del elemento de un
formulario
Se enva un formulario
Se descarga la pgina

Gestor
onBlur
onClick
onChange
onFocus
onLoad
onMouseOver
onSelect
onSubmit
onUnload

El valor del atributo es un conjunto de cdigo JavaScript o una referencia a una funcin de JavaScript.
El cdigo o la funcin se ejecuta al activar el evento.
Ejemplo 7:
<INPUT TYPE=button NAME=mycheck VALUE=HA!
onClick=alert(Te he dicho que no me aprietes)>

34

Informtica II

Esta sentencia crea un botn (INPUT TYPE=button). Al clicar el botn, el gestor de eventos onClick
despliega una ventana con el mensaje que se pasa como argumento.
Normalmente una pgina HTML con programacin en JavaScript tiene los siguientes componentes:

Funciones JavaScript dentro de un bloque Script dentro del <HEAD> del documento.

HTML no interactivo dentro del <BODY> del documento

HTML interactivo con atributos gestores de eventos cuyos valores son funciones de JavaScript.

En general, ya sabemos declarar gestores de eventos. Ahora se ver qu gestores de eventos pueden
asociarse con los TAGs especficos de HTML.
Los eventos de JavaScript suceden en tres niveles: a nivel del documento Web, a nivel de un formulario
individual dentro del documento y a nivel de un campo de formulario.
5.2.2.2. Uso
5.2.2.2.1. Gestores a nivel de documento
La TAG HTML BODY contiene la descripcin del contenido de la pgina HTML. La TAG BODY puede
contener dos declaraciones de gestores de eventos usando los atributos onLoad y onUnload. Una
declaracin podra ser:
Ejemplo 8:
<BODY onLoad=cargarfuncion() onUnload=descargarfuncion()>
El atributo onLoad=cargarfuncion() declara un gestor de JavaScript que manejar la carga. El evento
load se genera despus de que el contenido de la pgina entre <BODY> y </BODY> se haya ledo pero antes
de que se haya mostrado. El gestor de evento onLoad es un buen lugar para mostrar el nombre de la
compaa o la informacin de copyright, una ventana de seguridad preguntando el password de
autorizacin, etc.
El atributo onUnload=descargarfuncion() declara un gestor de eventos que se llama cada vez que la
pgina se descarga. Esto ocurre cuando se carga una pgina nueva en la misma ventana, si una pgina no
se carga con xito y la pgina activa est aun descargada. El gestor de eventos onUnload puede servir para
asegurarse de que no se ha perdido contacto con la pgina, por ejemplo si un usuario ha rellenado un
formulario pero se ha olvidado de mandarlo.
Eventos aplicados a las TAGs de HTML:

FOCUS, BLUR, CHANGE: campos de texto, reas de texto y selecciones.

CLICK: botones, botones de tipo radio, cajas de chequeo, botn de envo, botones de reset y links.

SELECT: campos de texto, reas de texto, cuadrso de seleccin.

MOUSEOVER: links.

El evento focus se genera cuando el item de texto de un elemento de la lista obtiene el foco,
normalmente como resultado de clicar con el ratn. El evento blur se genera cuando un tem pierde el
foco. El evento change se genera cada vez que un tem sufre algn cambio. En un tem de texto esto
resulta cuando se introduce nuevo texto o el que exista se borra. En una lista de seleccin ocurre cada
vez que una nueva seleccin se hace, incluso en una lista que permite mltiples selecciones. El evento
select se genera cuando el usuario selecciona algn texto o hace una seleccin en el cuadro de seleccin.
Estos eventos pueden usarse para obtener un buen control sobre el contenido de un texto o una lista de
seleccin de items. Las aplicaciones ms comunes usan el evento change o blur para asegurarse de que el
texto tiene el valor apropiado.
El argumento/comando especial this: Este comando se usa para referirse al objeto activo. Cuando la
funcin a la que se le pasa el argumento this es llamada, el parmetro que usa la funcin en su definicin
se introduce con el objeto sobre el que se acta.
Si nos fijamos en el ejemplo 9, la funcin cambiar() se activa cuando el formulario , en este caso un
cuadro de seleccin, pierde el foco. A la funcin se le pasa como argumento el formulario mediante el
comando this. form.cap.selectedIndex es el ndice de la seleccin escogida del formulario (form)
llamado cap.

Captulo 5. JavaScript

35

5.2.2.2.2. Gestores a nivel de formulario


La TAG FORM se usa para comenzar la definicin de un formulario HTML. Incluye atributos como el
METHOD usado para elegir el modo de envo del formulario, la accin que se debe cumplir (ACTION) y el
atributo onSubmit. La sintaxis es como la que sigue:
<FORM NAME="nombre_del_formulario" ... onSubmit="funcin_o_sentencia">
El gestor onSubmit es llamado cuando el contenido del formulario se enva. Tambin es posible
especificar una accin onClick en un botn de envo. El uso comn del gestor onSubmit es verificar el
contenido del formulario: el envo contina si el contenido es vlido y se cancela si no lo es.
5.2.2.2.3. Gestores a nivel de elementos de formulario
Casi todos los elementos de un formulario tienen uno o ms gestores de eventos. Los botones pueden
generar eventos click, el texto y la seleccin de elementos pueden generar los eventos focus, blur, select
y change.
Hay dos excepciones a la regla que todos los elementos de un formulario pueden tener gestores de
eventos. La primera excepcin se aplica a los items ocultos, <INPUT TYPE= "hidden">. No se ven, no se
pueden cambiar y no pueden generar eventos. La segunda se aplica a los elementos individuales OPTION
dentro de una lista de seleccin (que se crean con la opcin SELECT). La TAG SELECT puede tener
atributos declarando gestores de eventos (focus, blur y change), pero las OPTION no pueden generar
eventos.
Los campos de texto (text fields) de HTML, <INPUT> con el atributo TYPE de texto "text" pueden
declarar gestores de eventos como combinacin de los 4 elementos de texto: focus, blur, change y
select. Con la TAG TEXTAREA se crea la entrada de texto en varias lneas y pueden generarse estos
gestores de eventos. En cambio la seleccin de listas creadas con <SELECT> pueden generar todos los
eventos menos el select.
Estos eventos pueden usarse para obtener un buen control sobre el contenido de un texto o una lista de
seleccin de tems. Las aplicaciones ms comunes usan el evento change o blur para asegurarse de que el
campo tiene el valor apropiado.
Ejemplo 9:
<HTML><HEAD>
<TITLE>EJEMPLO DEL COMANDO this</TITLE>
<SCRIPT type="text/javascript">
function cambiar(form){
var indice = form.cap.selectedIndex
if(indice==0){var archivo="cap1.htm"}
if(indice==1){var archivo="cap2.htm"}
if(indice==2){var archivo="cap3.htm"}
window.open(archivo,'capitulos')
window.open('marcador.htm','resultados')
}
</SCRIPT>
</HEAD>
<BODY>
<CENTER><FORM>
<SELECT NAME="cap" SIZE=1 onBlur="cambiar(this.form)">
<OPTION VALUE=1>1. HISTORIA Y CONCEPTOS DE LA AP</OPTION>
<OPTION VALUE=2>2. MTODOS EN PATOLOGA</OPTION>
<OPTION VALUE=3>3. PATOLOGA MOLECULAR</OPTION>
<SELECT>
</FORM></CENTER>
</BODY></HTML>

5.3. Clases en JavaScript


Las clases en JavaScript se pueden agrupar en tres categoras:

Clases Predefinidas, incluyen las clases Math, String y Date.

Clases del Browser, tienen que ver con la navegacin.

36

Informtica II

Clases del HTML, estn asociadas con cualquier elemento de una pgina Web (link, formulario,
etc).

5.3.1. Clases Predefinidas (Built-In Objects).


5.3.1.1. Clase String
Cada vez que se asigna un valor string (cadena de caracteres a una variable o propiedad, se crea un
objeto de la clase string. Al asignar un string a una variable no se usa el operador new.
Los objetos string tienen una propiedad, length (nmero de carcteres de la cadena), y varios mtodos
que manipulan la apariencia de la cadena (color, tamao, etc.).
Mtodos sobre el contenido: (recordar que las string tienen como base de ndices el cero.)

charAt ( indice ), muestra el carcter que ocupa la posicin indice en la cadena.

indexOf ( caracter ), muestra el primer ndice del carcter.

lastIndexOf (caracter ), muestra el ltimo carcter del ndice.

subString ( primerindice, ultimoindice ), muestra la cadena que hay que hay entre el primer ndice
(primerindice) y el ltimo ndice (ultimoindice) includos.

toLowerCase( ), muestra todos los carcteres de la cadena en minsculas.

toUpperCase( ), muestra todos los carcteres de la cadena en maysculas.

Suponiendo que la variable cadena es un objeto de la clase string, el uso de los mtodos se realiza de
la siguiente manera: cadena.mtodo( ).
Mtodos sobre la apariencia:

big ( ), muestra las letras ms grandes.

blink ( ), muestra texto intermitente (parpadeando).

bold ( ), muestra las letras en negrita.

fixed ( ), muestra el texto en paso fijo (letra Courier New).

fontcolor ( color ), cambia el color de las letras.

fontsize ( size ), cambia el tamao de las letras.

italics ( ), muestra en letra itlica.

small ( ), muestra las letras ms pequeas.

strike ( ), muestra las letras tachadas por una ralla.

sub ( ), muestra la letra en subndice.

sup ( ), muestra la letra en superndice.

Ejemplo 10:
var cadena = "Mira hacia aqu".
cadena.charAt ( 2 ) = "r"
cadena.indexOf ( i ) = 1
cadena.lastIndexOf (a ) = 11
cadena.subString ( 5, 9 )
cadena.toLowerCase( ) = "mira hacia aqu"
cadena.toUpperCase( ) = "MIRA HACIA AQU"
Mtodos sobre el HTML:

anchor ( nombre_string ), este mtodo crea un ancla, llamada nombre_string como valor para el
atributo NAME.

link ( href_string ), este mtodo crea un link a un URL designado por el argumento href_string.

Captulo 5. JavaScript

37

Ejemplo 11:
cadena.big() = "Mira hacia aqu ".
cadena.blink() = "Mira hacia aqu". cadena.blink() = "
"
cadena.bold() = "Mira hacia aqu".
cadena.fixed() = "Mira hacia aqu". // ste es el tipo de letra Courier New
cadena.fontcolor("red") = "Mira hacia aqu".
cadena.fontsize(3) = "Mira hacia aqu".
cadena.italics() = "Mira hacia aqu".
cadena.small() = "Mira hacia aqu".
cadena.strike()= "Mira hacia aqu".
cadena.sup()= "Mira hacia aqu".
cadena.sub()= "Mira hacia aqu".
5.3.1.2. Clase Math
La clase Math se usa para efectuar clculos matemticos. Contiene propiedades generales como pi =
3.14159, y varios mtodos que representan funciones trigonomtricas y algebraicas. Todos los mtodos
de Math pueden trabajar con decimales. Los ngulos se dan en radianes, no en grados.
La clase Math es el primer ejemplo de clase esttica (que no cambia). Todos sus argumentos son
valores. Esta clase no permite crear objetos, por lo que hay que referirse directamente a la clase para
usar los mtodos.
Propiedades (se usan del modo Math.propiedad):

E, nmero "e". Es un nmero tal que su logaritmo neperiano es 1, ln(e) = 1

LN10, logaritmo neperiano del nmero 10.

LN2, logaritmo neperiano del nmero 2.

PI, nmero pi = 3.14159

SQRT1_2, raz cuadradada de .

SQRT2, raz cuadrada de 2.

Mtodos:

abs (numero), calcula el nmero absoluto de numero.

acos (numero), calcula el ngulo cuyo coseno es numero.

asin (numero), calcula el ngulo cuyo seno es numero.

atan (numero), calcula el ngulo cuya tangente es numero.

ceil (numero), calcula el entero mayor o igual que numero.

cos ( angulo ), calcula el coseno de angulo.

exp (numero), calcula el nmero e elevado a la potencia numero.

floor (numero), calcula el entero menor o igual que numero.

log (numero), calcula el logaritmo natural de numero.

max (numero1, numero2 ), calcula el mximo entre numero1y numero2.

min (numero1, numero2 ), calcula el mnimo entre numero1y numero2.

pow (numero1, numero2 ), calcula numero1 exponentado a numero2.

random ( ), calcula un nmero decimal aleatorio entre 0 y 1, SLO PARA UNIX.

round (numero), devuelve el entero ms cercano a numero.

sin (angulo), calcula el seno de angulo.

sqrt (numero), calcula la raz cuadrada de numero.

tan (angulo), calcula la tangente de angulo.

38

Informtica II

Ejemplo 12:
Math.abs(-4) = 4
Math.abs(5) = 5
Math.max(2,9).=.9
Math.pow(3,2) = 9
Math.sqrt(144) = 12

5.3.1.3. Clase Date


Una de las cosas ms complicadas de cualquier lenguaje es trabajar con fechas. Esto es porque hay
gente que para representar fechas y horas toma un sistema no decimal ( los meses en unidades sobre 12,
las horas sobre 24 y los minutos y segundos sobre 60). Para el ordenador es ilgico trabajar con nmeros
bonitos y redondeados.
La clase date simplifica y automatiza la conversin entre las representaciones horarias del ordenador y
la humana.
La clase date de JavaScript sigue el estndar de UNIX para almacenar los datos horarios como el
nmero de milisegundos desde el da 1 de enero de 1970 a las 0:00. Esta fecha se denomina "la poca".
Aunque la clase date no tiene propiedades, tiene varios mtodos. Para usar la clase date hay que
entender cmo construir un objeto de esta clase. Para eso hay tres mtodos:

new Date( ), inicializa un objeto con la hora y fecha actual.

new Date(string_dato), inicializa un objeto con el argumento string_dato. El argumento debe ser
de la forma "Mes da, ao" como "Noviembre 29, 1990".

new Date( ao, mes, da), iniciliaza un objeto tomando 3 enteros que representan el ao, mes y
da. NOTA: los meses tienen como base el 0, lo que significa que 2 corresponde con el mes de
marzo y 10 con el mes de noviembre.

Ejemplo 13:
var dato = new Date(90, 10, 23)
var dato = new Date(1990, 10, 23)
Estas dos declaraciones se refieren a la fecha del 23 de noviembre de 1990.
Hay un modo opcional para declarar la hora adems de la fecha. Hay poner 3 argumentos ms a la vez
que se ponen los argumentos de la fecha.
Ejemplo 14:
var dato2 = new Date(90, 10, 23, 13,5,9)
Esta declaracin se refiere a la 1:05:09 PM del da 23 de noviembre de 1990.
Mtodos:

getDate ( ), devuelve el nmero de da del mes (1-31).

getDay ( ), devuelve el nmero de da de la semana (0-6).

getHours ( ), devuelve el nmero de horas del da (0-23).

getMinutes ( ), devuelve el nmero de minutos de la hora (0-59)

getMonth ( ), devuelve el nmero de mes del ao (0-11).

getSeconds ( ), devuelve el nmero de segundos del minuto (0-59)

getTime ( ), devuelve la hora.

getYear ( ), devuelve el ao.

setDate ( ), fija la fecha.

setHours ( ), fija el nmero de horas del da.

setMinutes ( ), fija el nmero de segundos del minuto.

Captulo 5. JavaScript

setMonth ( ), fija el nmero de mes.

setSecond ( ), fija el nmero de los segundos del minuto.

setTime ( ), fija la hora.

setYear ( ), fija el ao.

39

Ejemplo 15:
var dato2 = new Date(90, 10, 23, 13,5,9)
dato2.getHours() = 13
dato2.getDay() = 0 (si es lunes),1 (si es martes), etc.
dato2.getSeconds = 9
dato2.setMonth() = 2 // el mes cambia a marzo
dato2.setYear() = 96
5.3.2. Funciones Predefinidas (Built-in Functions): eval, parseFloat, parseInt.
Adems de los clases String, Math y Date hay un pequeo conjunto de funciones predefinidas por
JavaScript. No son mtodos ni se aplican a los objetos. Tiene el mismo comportamiento que cuando se
crean funciones con el comando function.
5.3.2.1. eval(string)
Esta funcin intenta evaluar su argumento de tipo string como una expresin y devolver su valor. Esta
funcin es muy potente porque evala cualquier expresin de JavaScript.
Ejemplo 16:
w = (x * 14) - (x / z) + 11
z = eval ("(x * 14) - (x / z) + 11")
Si x es una variable con el valor 10 las siguientes expresiones asignan 146 a w y z.
5.3.2.2. parseFloat(string)
Esta funcin intenta convertir su argumento de tipo string como un nmero decimal (de coma
flotante).
Ejemplo17:
parseFloat("3.14pepecomeperas345") = 3.14
5.3.2.3. parseInt(string, base)
Esta funcin se comporta de forma muy similar a la anterior. Intenta convertir su argumento de tipo
string como un entero en la base elegida.
Ejemplo 18:
ParseInt(10111, 2)= 23
Se convierte el nmero 10111 en base binaria.
5.3.3. Clases del browser
El modelo de clases de JavaScript y su conjunto de clases, mtodos y funciones predefinidas dan un
moderno lenguaje de programacin. Puesto que JavaScript se design para trabajar con y en el World
Wide Web tuvo que haber un nexo entre JavaScript y el contenido de las pginas HTML. Este nexo viene
dado por un conjunto de clases del browser y del HTML.
Las clases del browser son una extraccin del entorno del browser e incluye clases para usar en la
pgina actual, en la lista de documentos visitados (history list) y en el URL actual. Existen mtodos para
abrir nuevas ventanas, mostrar cajas de dilogos y escribir directamente HTML (en algunos ejemplos se ha
usado el mtodo write de la clase document.
Las clases del browser (o navegador) son el nivel ms alto de la jerarqua de objetos de JavaScript.
Representan informacin y acciones que no necesariamente hay que asociar con una pgina Web. Dentro
de una pgina Web cada elemento HTML tiene su objeto correspondiente, un objeto HTML dentro de la
jerarqua de objetos. Cada formulario HTML y cada elemento dentro de un formulario HTML tiene su
correspondiente objeto.
La siguiente figura muestra la jerarqua de los objetos del browser y del HTML referidos a todos los
elementos de una pgina Web.

40

Informtica II

5.3.3.1. Clase Window


Es el nivel ms alto de la jerarqua de objetos de JavaScript. Cada ventana de un browser que est
abierta tiene su correspondiente objeto window. Todo el resto de objetos desciende del objeto window.
Normalmente, cada ventana se asocia a una pgina Web y la estructura HTML de esa pgina se refleja en
el objeto document de la ventana. Cada ventana se corresponde con algn URL que se refleja en el objeto
location. Cada ventana tiene una lista de documentos visitados que se han mostrado en esa ventana (
history list ), las cuales se representan por varias propiedades del objeto history.
Los mtodos de un objeto window son:

alert(string_mensaje)

confirm(string_mensaje)

open(URL_string, nombre_ventana)

close( )

prompt(string_mensaje)

Ejemplo 19:
alert("No clicar el botn izquierdo")
confirm("Quieres continuar?")
window.open("fichero.htm", ventana_1)
window.close() // cierra una ventana
prompt("Rellena el cuestionario")
Todos estos mtodos se usan para manipular el estado de la ventana del browser. Los mtodos alert y
confirm se usan para mostrar su argumento string_mensaje en una caja de dilogo. El mtodo alert se usa
para avisar al usuario sobre algo que no debe hacer. La caja de dilogo de alert contiene el botn OK,
mientras que la de confirm muestra el mensaje con un botn OK y otro Cancel. Devuelve, como valor de
retorno, true si se clica OK o false si se clica Cancel.
El mtodo prompt se usa para solicitar al usuario una entrada de datos, en forma de cadena de
caracteres. Muestra una caja de dilogo con el string_mensaje y un campo de texto editable. Este mtodo
acepta un segundo argumento opcional que se usa para fijar un valor por defecto en el campo de texto.
Devuelve lo que escribe el usuario en el campo de texto.
El mtodo open se usa para abrir una ventana nueva en el browser. El argumento URL_string
representa el URL que ser cargado en la ventana donde el otro argumento nombre_ventana da nombre a
la ventana. Este mtodo devuelve una instancia del objeto window que representa la nueva ventana
creada. Este mtodo tambin acepta un tercer argumento opcional que se usa para especificar los modos
de mostrar la nueva ventana. Cuando el mtodo close se llama desde un ejemplar del objeto window, esa
ventana se cierra y el URL se descarga.
5.3.3.2. Clase Document
Cada ventana se asocia con un objeto document. El objeto document contiene propiedades para cada
ancla, link, y formulario en la pgina. Tambin contiene propiedades para su ttulo, color de fondo,
colores de los links y otros atributos de la pgina. El objeto document tiene los siguientes mtodos:

clear()

close()

open()

write(string)

writeln(string)

El mtodo clear se usa para borrar completamente un documento. Tiene mucho uso si se est
construyendo una pgina Web slo con JavaScript, y se quiere asegurar que est vaca antes de empezar.
Los mtodos open y close se usan para empezar y parar la salida de datos a memoria. Si se llama al
mtodo open, se ejecutan series de write y/o writeln, y se llama al mtodo close, el resultado de las
operaciones que se han escrito se muestran en la pgina.

Captulo 5. JavaScript

41

El mtodo write se usa para escribir cualquier cadena de caracteres, incluyendo programacin HTML, al
documento actual. Este mtodo puede usar un nmero variable de argumentos. El mtodo writeln es
idntico al mtodo write, excepto que en la salida imprime un salto de lnea al acabar de escribir sus
argumentos. Hay que notar que el salto de lnea ser ignorado por el browser, el cual no incluye espacios
en blanco, a menos que el writeln est dentro de texto preformateado.
Ejemplo 20:
document.clear()
document.close()
document.open()
document.write("Juan come peras") -> Juan come peras
document.writeln("Juan come peras") -> Juan come peras
5.3.3.3. Clase Location
El objeto location describe el URL del documento. Este tiene propiedades representando varios
componentes del URL, incluyendo su parte de protocolo, de hostname, de pathname, de nmero de
puerto, entre otras propiedades. Tambin tiene el mtodo toString el cual se usa para convertir el URL a
una cadena de caracteres. Para mostrar el URL actual podemos usar el siguiente cdigo:
Ejemplo 21:
var lugar = document.location
document.write("<BR>El URL actual es " + lugar.toString())
document.write("<BR>")
5.3.3.4. Clase History
El objeto history se usa para referirse a la lista de URLs visitados (history list) anteriormente. Tiene una
propiedad conocida como length, la cual indica cuntos URLs estn presentes en la history list
actualmente. Tiene los siguientes mtodos:

back()

forward()

go(donde)

El mtodo go se usa para navegar en la history list. El argumento donde puede ser un nmero o un
string. Si el argumento donde es un nmero indica el nmero de orden del lugar donde se desea ir en la
history list. Un nmero positivo significa que avance tantos documentos como indique el nmero, y un
nmero negativo significa que se atrase tantos documentos como indique el nmero. Si donde es una
cadena de caracteres que representa un URL, entonces pasa a ser como el documento actual.

Ejemplo 22:
history.back()
history.forward()
history.go(-2)
history.go(+3)
5.3.4. Clases del documento HTML (anchors, forms, links)
Para entender cmo trabajan los objetos HTML en JavaScript, hay que considerar ciertas piezas de
HTML que crean un ancla, un formulario y un link a este ancla. Para aclarar estos conceptos nos basamos
en el ejemplo 23.
Este cdigo crea una pgina HTML con un ancla al principio de la pgina y un link al ancla al final.
Entre ambas hay un simple formulario que permite al usuario poner su nombre. Hay un submit button
(botn de envo) por si se quiere enviar y un botn de reset por si no se quiere enviar. Si el usuario enva
con xito el contenido del formulario va post al e-mail ficticio nobody@dev.null.
Ejemplo 23:

42

Informtica II

<HTML>
<HEAD><TITLE>Ejemplo sencillo de pgina HTML</TITLE></HEAD>
<BODY>
<A NAME="principio">Este es el principio de la pgina</A> <HR>
<FORM METHOD="post">
<P> Introduzca su nombre: <INPUT TYPE="text" NAME="me" SIZE="70"></P>
<INPUT TYPE= "reset" VALUE="Borrar Datos">
<INPUT TYPE= "submit" VALUE="OK">
</FORM><HR>
Clica aqu para ir al
<A HREF="#principio">principio</A> de la pgina // link
<BODY/>
</HTML>
El aspecto ms importante de este ejemplo es el hecho de que los elementos HTML se reflejan en la
jerarqua de objetos de JavaScript. Se puede acceder al ttulo del documento a travs de la propiedad
title del objeto documento. Se puede acceder a otros elementos HTML de este documento usando las
siguientes propiedades:

anchors(anclas)

forms(formularios)

links

Estas propiedades del objeto document son arrays que representan cada elemento HTML como un
ancla, formulario o link de una pgina. En el ejemplo, el ancla en el principio de la pgina se referira
como document.anchors[0], el link al final de la pgina como document.links[0], y el formulario en medio
de la pgina como document.forms[0]. Estos son el nivel ms alto de los objetos representados por este
documento. Cada uno de estos elementos tiene propiedades y mtodos que se usan para describir y
manipularlos.
El objeto form correspondiente a forms[0] tiene sub-objetos para cada uno de los tres elementos (el
botn de reset, el botn de envo y el campo de texto) y propiedades para el mtodo submit.
forms[0].elements[0] corresponde a la entrada del campo de texto. forms[0].elements[0].name es el
nombre de este campo, como el especificado por el atributo NAME, el cual en este caso es "me". La
siguiente figura representa el cdigo HTML del ejemplo y muestra cmo cada elemento en la pgina se
asocia con el objeto HTML.
document.title
<TITLE>Ejemplo sencillo de pgina HTML</TITLE>
document.anchors[0]
<A NAME="principio">Este es el principio de la pgina</A>
document.anchors[0].name
document.forms[0].method
<FORM METHOD="post" ACTION="mailto:nobody@dev.null">
document.forms[0]

document.forms[0].action

document.forms[0].elements[0]
<INPUT TYPE="text" NAME="me" SIZE="70">
document.forms[0].elements[0].name
document.forms[0].elements[1]
<INPUT TYPE= "reset" VALUE="Oops">
document.forms[0].elements[1].value

Captulo 5. JavaScript

43

document.forms[0].elements[2 ]
<INPUT TYPE= "submit" VALUE="OK">
document.forms[0].elements[2].value
document.links[0]
Clica aqu para ir al <A HREF="#principio">principio</A> de la pgina
document.links[0].href

5.4. Clases y Funciones definidas por el usuario.


Para entender este tipo de programacin vamos a ver un ejemplo donde creamos un objeto llamado
casa que tiene las siguientes propiedades: n de habitaciones, ao de construccin, tiene garaje?, estilo
arquitectnico. Para definir un objeto para guardar esta informacin (las propiedades) hay que hacer una
funcin que las muestre en un listado. Nota: Esta funcin usa el comando this, que hace referencia al
objeto activo. En este caso hace referencia al objeto activo que estamos creando.
Esta funcin es una especie de constructor que se usa en C++ para definir un objeto. Esto es porque en
este sentido los objetos de JavaScript son similares a las estructuras de C y a las clases de C++. En los 3
casos a los miembros, funciones miembro o propiedades del objeto/clase/estructura se accede con el
operador punto ( . ):
estructura.miembro
clase.funcin_miembro()
objeto.propiedad.
Hay varias cosas a ver en este ejemplo. El nombre de la funcin es el nombre del objeto: casa (en C++
el constructor tiene el nombre de la clase). La funcin no tiene valor de retorno.
El ejemplo muestra cmo se define un objeto casa, pero no crea ningn objeto especfico del tipo
casa.

Ejemplo 24:
function casa( habs, estil, fecha, garage){
this.habitaciones = habs
this.estilo = estil
this.fecha_construccin = fecha
this.tiene_garage = garage
}
Un objeto especfico de casa tendr las 4 propiedades con sus valores. Las instancias se crean usando la
sentencia new con una funcin de llamada. Se creara un objeto de casa, llamado micasa del siguiente
modo:
Ejemplo 25:
var micasa = new casa(10,Colonial, 1989, verdadero)
Ahora el objeto micasa es otra variable. Tiene que declararse usando var. Ahora que micasa ha sido
creada podemos referirnos a sus propiedades con el operador punto ( . ):
Ejemplo 26:
micasa.habitaciones = 10 (entero, int)
micasa.estilo = colonial (cadena de caracteres, String)
micasa.fecha_construccin = 1989 (entero ,int)
micasa.tiene_garage = true (booleano)
No hay nada que evite poner yes en la propiedad tiene_garage en vez de un valor booleano, por esto
hay que tener cuidado con este tipo de confusin. Si se pone yes, tiene_garage no ser booleana sino
una ca dena de caracteres.

44

Informtica II

5.4.1. Funciones (mtodos)


Uno de los aspectos ms potentes de la programacin orientada a objetos de JavaScript es la
posibilidad de crear clases con funciones miembro, llamadas mtodos. Esto tiene varias ventajas como la
organizacin y la asociacin de funciones con clases. Los mtodos, aunque programando se trabaje como
si fueran propiedades no se tienen en cuenta a la hora de contarlos como tales.
Por ejemplo, tenemos una funcin que muestra las propiedades de los objetos de la clase casa llamada
muestra_props( ). Para aadirla como propiedad (se llamar muestra) a un objeto o a su clase se debera
escribir:
Ejemplo 27:
this.muestra = muestra_props dentro de la definicin de la clase casa.
Micasa.muestra = muestra_props
como una sentencia normal.
y para usarlas, con los objetos de la clase casa:
micasa.muestra( ) o bien

muestra_props( micasa )

5.4.2. Objetos como Arrays (Vectores)


Algunos lenguajes de programacin soportan datos de tipo array (C, C++, Visual Basic, Java, etc.). Un
array es una coleccin de items con ndices los cuales son del mismo tipo. En C por ejemplo para declarar
un array de 10 datos de tipo entero, se hace de la forma: int nombre[10]; y estos enteros son definidos
desde el nombre[0] al nombre[9]. Es ms comn que la base del primer ndice sea un 0 (zero-based
indexing) que un 1 (one-based indexing).
JavaScript usa 0 como base del primer ndice. En JavaScript, quiz, arrays y objetos son 2 puntos de
vista del mismo concepto. Cada objeto es un array de los valores de sus propiedades, y cada array es
tambin un objeto. Volviendo al ejemplo anterior, el objeto micasa es un array con los siguientes cuatro
elementos:
Ejemplo 28:
micasa[0]=10 (habitacin)
micasa[1]=colonial (estilo)
micasa[2]=1989 (fecha_construccin)
micasa[4]=True (tiene garaje)
No parece haber muchas ventajas al referirse a objetos de este modo ms numrico y menos
informtico. Quiz, esta forma alternativa permite acceder a las propiedades secuencialmente (p. ej con
un bucle) lo que es muy usado.
Es aconsejable definir todos las clases con una propiedad que d el nmero de propiedades en el
objeto y hacindola la primera propiedad. Ahora el objeto micasa es un array de 5 elementos. La nueva
propiedad se denomina length (longitud).
Ejemplo 29:
micasa.lenght = 5
micasa[0]=10 (habitacin)
micasa[1]=colonial (estilo)
micasa.habitaciones = micasa[2]=1989 (fecha_construccin)
micasa.estilo=micasa[3] = True (tiene garaje)
micasa.tiene_garage = micasa[4] = True (tiene garaje)
Aun hay otro modo de dar valor a las propiedades:
Ejemplo 30:
micasa[length] = 5
micasa[habitaciones] = 10
micasa[estilo] = colonial
micasa[fecha_construccion] = 1989
micasa[tiene_garaje] = true
5.4.3. Extender Objetos
Qu pasa si queremos ms propiedades en un objeto: nada. Es posible extender dinmicamente un
objeto simplemente tomando una nueva propiedad. Con el Ejemplo 31 se ver mejor:

Captulo 5. JavaScript

45

Ejemplo 31:
tucasa = new casa(26, restaurante,1993, false)
tucasa.paredes = 6
tucasa.tiene_terraza = true
Estas dos sentencias aaden dos propiedades al final del array tucasa. Las extensiones dinmicas se
aplican slo a objetos especficos. El objeto micasa no se ve afectado ni la clase casa se ve afectada ni el
objeto casa cambia de ningn modo.
Esta caracterstica que se puede aplicar a los objetos simplifica mucho la programacin. Para
asegurarse de que no se producen errores al intentar mostrar las propiedades de un objeto es importante
cambiar la propiedad que almacena el nmero de propiedades.

Ejemplo 32:
tucasa.length += 2
Un caso comn donde la extensin dinmica es muy usada es en arrays de nmero variable.
5.4.4. Funciones con un nmero variable de argumentos.
Todas las funciones de JavaScript tienen las siguientes 2 propiedades: caller y arguments.
La propiedad caller es el nombre de cada uno que llama a la funcin. La propiedad arguments es un
array de todos los argumentos que no estn en la lista de argumentos de la funcin. La propiedad caller
permite a una funcin identificar y responder al entorno desde donde se llama. La propiedades arguments
permite escribir funciones que toman un nmero de argumento variable. Los argumentos de la lista de
argumentos de una funcin son obligatorios mientras que los que estn en la propiedad arguments son
opcionales.
El siguiente ejemplo muestra los argumentos obligatorios y opcionales de una funcin.
Ejemplo 33:
function anadir( string){
var nargumentos = anadir.arguments.length
var totalstring
var parcialstring =
for (var i = 1; i < nargumentos; i++ ){
parcialstring += " " + anadir.arguments[i] ","
}
totalstring = "El argumento obligatorio es " + string + ". El nmero de
argumentos opcionales es " + nargumentos + " y los argumentos opcionales
son " + parcialstring
return (totalstring)
}

5.5. Expresiones y operadores de JavaScript.


5.5.1. Expresiones
Una expresin es cualquier conjunto de letras, variables y operadores que evala un valor simple. El
valor puede ser un nmero, una cadena, o un valor lgico. Hay dos tipos de expresiones:

aquellas que asignan un valor a una variable, x =7

aquellas que simplemente tienen un valor, 3 + 4

JavaScript tiene los siguientes tipos de expresiones:

Aritmticas: evalan un nmero.

De cadena: evalan un string de carcter, por ejemplo "Fred" or "234".

Lgicas: evalan si son verdadero o falso.

46

Informtica II

5.5.1.1. Expresiones Condicionales


Una expresin condicional puede tomar uno de dos posibles valores segn una condicin. La sintaxis es
(condicin) ? valor1 : valor2.
Si la condicin es verdadera (true) toma el valor valor1, y si es falsa (false) toma el valor2. Se puede
usar una expresin condicional en cualquier parte.
Por ejemplo: estado = (edad >= 18) ? "adulto" : "menor de edad". Si edad es mayor o igual que 18 a la
variable estado se le asigna la cadena "adulto", si no se le asigna el valor "menor de edad".
5.5.2. Operadores de asignacin (=, +=, -=, *=, /=)
Un operador de asignacin da un valor a la izquierda de su operando basado en la parte derecha de su
operando. El operador bsico de asignacin es el igual (=), el cual asigna el valor de la derecha de su
operando al de la izquierda de su operando. x = y, asigna el valor de y a x.
Los otros operadores de asignacin para operaciones aritmticas son los siguientes:

x=y

x += y significa x = x + y

x -= y significa x = x - y

x *= y significa x = x * y

x /= y significa x = x / y

x %= y significa x = x % y

Estas sentencias primero operan a la derecha del operador y despus devuelven el valor obtenido a la
variable situada a la izquierda del operador.
5.5.3. Operadores aritmticos
Los operadores toman valores numricos (sean letras o variables) y devuelven un nico valor numrico.

Los operadores estndar son la suma (+), la resta (-), la multiplicacin (*), y la divisin (/). Estos
operadores trabajan de la forma estndar operando1 operador operando2.
Adems hay otros operadores no tan conocidos como:

Resto (%) El operador resto devuelve el resto entero al dividir el primer operando entre el segundo
operando. Sintaxis: var1 % var2 .
Ejemplo 34:
12 % 5 returns 2.
Incremento (++) El operador incremento se usa de la siguiente manera: var++ o ++var. Este operador
suma uno a su operando y devuelve el valor.
1. var++, primero devuelve el valor de la variable y despus le suma uno.
2. ++var, primero suma uno y despus devuelve el valor de la variable.

Por ejemplo si x es 3, la sentencia y = x++, incrementa x a 4 y asigna 3 a y, pero si la sentencia es y =


++x, incrementa x a 4 y asigna 4 a y.

Decremento (--) El operador decremento se usa de la siguiente manera: var-- o --var. Este operador
resta uno a su operando y devuelve el valor.
1. var-- primero devuelve el valor de la variable y despus le resta uno.
2. --var, primero suma uno y despus devuelve el valor de la variable.

Por ejemplo si x es 3, la sentencia y = x--, decrementa x a 2 y asigna 3 a y, pero si la sentencia es y = -x, decrementa x a 2 y asigna 2 a y.

Negacin (-) El operador negacin precede a su operando. Devuelve su operando negado. Por ejemplo,
x = -x, hace negativo el valor de x, que si fuera 3, sera -3.

5.5.4. Operadores lgicos


Los operadores lgicos toman valores lgicos (booleanos) como operandos. Devuelven un valor lgico.
Los valores lgicos son true (verdadero) y false (falso). Se suelen usar en las sentencias de control.

Captulo 5. JavaScript

47

And (&&) Uso: expr1 && expr2. Este operador devuelve true si ambas expresiones lgicas son
verdaderas, o false si alguna no es true.

Or ( || )Uso: expr1 || expr2. Este operador devuelve true si una de las dos expresiones lgicas, o
ambas, son verdaderas, o false si ambas son falsas.

Not (!) Uso: !expr. Este operador niega su expresin. Devuelve true si es false y false si es true.

Ejemplo 35:
if ((edad_pepe>=18)&&(edad_juan==18)){
document.write("Juan y pepe son adultos")
} else {
document.write("Uno de los dos no es adulto")
}
5.5.5. Operadores de Comparacin (= =, >, >=, <, <=, !=)
Un operador de comparacin compara sus operandos y devuelve un valor lgico segn sea la
comparacin verdadera o no. Los operandos pueden ser nmeros o cadenas de caracteres. Cuando se usan
cadenas de caracteres, las comparaciones se basan en el orden alfabtico. Al igual que los operadores
lgicos, se suelen usar en sentencias de control.
Los operadores son:

Igual ( ==), devuelve true si los operandos son iguales.

Desigual (!=), devuelve true si los operandos son diferentes.

Mayor que (>), devuelve true si su operando izquierdo es mayor que el derecho.

Mayor o igual que (>=), devuelve true si su operando izquierdo es mayor o igual que el derecho.

Menor que (>), devuelve true si su operando izquierdo es menor que el derecho.

Menor o igual que (>=), devuelve true si su operando izquierdo es menor o igual que el derecho.

5.5.6. Operadores de String


Adems de los operadores de comparacin, que pueden usarse con cadenas de caracteres, existe el
operador concatenacin (+) que une dos cadenas, devolviendo otra cadena que es la unin de las dos
anteriores.
Ejemplo 36:
"mi " + "casa" devuelve la cadena "mi casa".
El operador de asignacin += se puede usar para concatenar cadenas. Por ejemplo, si la variable letra
es una cadena con el valor "alfa", entonces la expresin letra += "beto" evala a "alfabeto" y asigna este
valor a letra.
5.5.7. Prioridad de los operadores
La prioridad de los operadores determina el orden con el cual se aplican cuando se evalan. Esta
prioridad se rompe cuando se usan parntesis.
La prioridad de operadores, de menor a mayor es la que sigue:

coma ,

asignacin = += -= *= /= %=

condicional ?:

lgico-or ||

logical-and &&

igualdad == !=

relacin < <= > >=

adicin/sustraccin + -

multiplicacin / divisin / resto * / %

negacin/incremento ! ~ - ++ --

48

Informtica II

parntesis, corchetes () [] .

5.6. Sentencias de control de JavaScript.


JavaScript soporta un conjunto de sentencias que se pueden usar para hacer interactivas las pginas
Web.
5.6.1. La sentencia if
Una sentencia if es como un interruptor. Si la condicin especificada es cierta, se ejecutan ciertas
sentencias. Si la condicin es falsa, se pueden ejecutar otras. Un sentencia if es :
if (condicin) {
sentencias 1 }
[else {
sentencias 2}]
La parte else es opcional.
Ejemplo 37:
if ((edad_pepe>=18)&&(edad_juan==18)){
document.write("Juan y pepe son adultos")
} else {
docuemnt.write("Uno de los dos no es adulto")
}
5.6.2. Bucles
Un bucle es un conjunto de comandos que se ejecutan repetidamente hasta que una condicin
especificada se encuentra. JavaScript proporciona dos tipos de bucles: for y while.
5.6.2.1. Bucle for
Una sentencia for repite un bucle hasta que una condicin se evale como false. Este bucle es similar
al tradicional bucle for en Java, C y C++.
Un bucle for es:
for ([expresin_inicial]; [condicin] ;[expresin_incremento]) {
sentencias
}

Ejemplo 38:
for (var contador = 0; contador <= 5; contador++) {
document.write("Nmero "+ contador + "<br>")
}

Y la salida por pantalla del ejemplo es:


Nmero 0
Nmero 1
Nmero 2
Nmero 3
Nmero 4
Nmero 5
Cuando se encuentra un bucle for, se ejecuta la expresin inicial. Las sentencias se ejecutan mientras
la condicin sea true. La expresin_incremento se ejecuta cada vez que vuelve a realizarse una vuelta o
paso en el bucle.

Captulo 5. JavaScript

49

5.6.2.2. Bucle while


Una sentencia while repite un bucle mientras la condicin evaluada sea true. Un bucle while es:
while (condicin)
{
sentencias
}
Ejemplo 39:
var contador = 0
while (contador <= 5){
document.write("Nmero "+ contador + "<br>")
contador++
}
Es el mismo ejemplo que el 38 pero con el bucle while.
Si la condicin llega a ser false, las sentencias dentro del bucle dejan de ejecutarse y el control pasa a
la siguiente sentencia despus del bucle.
La condicin se evala cuando las sentencias en el bucle han sido ejecutadas y el bucle est a punto de
ser repetido. Dentro del bucle debe haber una sentencia que en algn momento haga parar la ejecucin
del bucle.
La comprobacin de la condicin tiene lugar nicamente cuando las sentencias del bucle se han
ejecutado y el bucle est a punto de volverse a ejecutar. Esto es, la comprobacin de la condicin no es
continuada, sino que tiene lugar por primera vez al principio del bucle y de nuevo a continuacin de la
ltima sentencia del bucle, cada vez que el bucle llega a este punto.

Ejemplo
n = 0;
while(
n++;
}

40:
x = 0
n < 3 ) {
x += n;

5.7. Comentarios
Los comentarios son anotaciones del autor para explicar qu hace cada sentencia. Son ignorados por el
navegador. JavaScript soporta el estilo de comentarios de C, C++ y Java.

Los comentarios de una sola lnea son precedidos por una doble barra normal (//).

Los comentarios de ms de una lnea van escritos entre /* y */.

Ejemplo 41:
// Esto es un comentario de una sola lnea.

/* Esto es un comentario de ms de una lnea. Puede


tener la extensin que se quiera. */

SECCIN 2
Java

CAPTULO 6

6. Introduccin a Java
6.1. Programacin Orientada a Objetos. Fundamentos.
La produccin de aplicaciones de altas prestaciones suele significar la presencia de una complejidad
cada vez mayor. Los sistemas orientados a objetos tienen caractersticas adecuadas para expresar la
complejidad de un sistema, algunas de las cuales son:

Adaptabilidad, es decir, facilidad de transporte de unos sistemas a otros.

Reusabilidad, total o parcial, para reducir costes y reutilizar componentes software cuya
fiabilidad est comprobada.

Mantenibilidad: Los programas son desarrollados por muchas personas agrupadas en equipos de
trabajo. Las personas cambian pero la aplicacin permanece e incluso necesita modificaciones.
Por ello, es importante que los programas sean fciles de comprender y mantener. En caso
contrario, podra ser necesario descartar la aplicacin y hacer una nueva.

Para conseguir estos objetivos, es necesario aplicar de forma rigurosa criterios de diseo claros y bien
definidos que permitan hacer frente a la complejidad de las aplicaciones. El diseo orientado a objetos
es la metodologa que consiste en definir cules son los objetos de un sistema, las clases en las que
pueden agruparse y las relaciones entre objetos.
Las caractersticas fundamentales de la Programacin Orientada a Objetos (POO) son:

Abstraccin: Es la representacin de las caractersticas esenciales de algo sin incluir los


antecedentes o detalles irrelevantes. La clase es una abstraccin porque en ella se definen las
propiedades y los atributos genricos de un conjunto de objetos

Encapsulacin u ocultamiento de informacin: Las variables y las funciones miembro de una clase
pueden ser declaradas como public, private o protected. De esta forma se puede controlar
el acceso a los miembros de la clase y evitar un uso inadecuado.

Herencia: Es el mecanismo para compartir automticamente mtodos y atributos entre clases y


subclases. Una clase puede derivar de otra, y en este caso hereda todas las variables y funciones
miembro. As, puede aadir nuevas funciones y datos miembros.

Polimorfismo: Esta caracterstica permite implementar mltiples formas de un mismo mtodo,


dependiendo cada una de ellas de la clase sobre la que se realice la implementacin.

Una Clase es un tipo de datos definido por el usuario consistente, bsicamente, en una agrupacin de
las definiciones de los datos (variables) y de las funciones (mtodos) que operan sobre esos datos. Un
Objeto es un ejemplar concreto de una clase: un conjunto concreto de datos y de los mtodos para
manipular stos. La creacin de un objeto a partir de una clase se denomina instanciacin., es decir,
crear una instancia concreta de la clase.
La definicin de una clase consta de dos partes:

La primera, formada por el nombre de la clase precedido por la palabra reservada Class.

La segunda parte es el cuerpo de la clase, encerrado entre llaves, y que consta de:

Especificadores de acceso: public, protected y private.

Atributos: datos miembro de la clase (variables).

Mtodos: definiciones de funciones miembro de la clase.

54

Informtica II

Una forma de asegurar que los objetos siempre contengan valores vlidos y que puedan ser
inicializados en el momento de la declaracin es escribiendo un constructor. Un constructor es una
funcin miembro especial de una clase que es llamada de forma automtica siempre que se declara un
objeto de esa clase. Su funcin es crear e inicializar un objeto de su clase. Dado que un constructor es una
funcin miembro, admite argumentos al igual que stas. El constructor se puede distinguir claramente,
con respecto a las dems funciones miembro de la clase, porque tiene el mismo nombre que el de la
clase. Un constructor no retorna ningn valor ni se hereda. Si el usuario no ha creado uno, el compilador
crea uno por omisin, sin argumentos. Una clase puede tener varios constructores, siempre que tengan
distintos argumentos de entrada.
Class Point extends Object{
//-------CONSTRUCTORES--------Point();
Point(int x, int y);
Point(Point p);
//---VARIABLES DE INSTANCIA---int x;
int y;
//---------METODOS------------boolean equals(Point p);
void move(int x, int y);
void setLocation(Point p);
void setLocation(int x, int y);
void translate(int dx, int dy);
}

Punto1
x
y

Punto2
x
y

13
21

24
3

Point()
Point(int, int)
Point(Point)
boolean
void
void
void
void

equals(Point)
move(int, int)
setLocation(Point)
setLocation(int, int)
translate(int, int)

Point()
Point(int, int)
Point(Point)
boolean
void
void
void
void

equals(Point)
move(int, int)
setLocation(Point)
setLocation(int, int)
translate(int, int)

Figura 6.1. Clase Point y dos objetos de la clase Point.

6.2. El lenguaje de programacin Java


Java surgi en 1991 cuando un grupo de ingenieros de Sun Microsystems Inc. trataron de disear un
nuevo lenguaje de programacin destinado a electrodomsticos. La reducida potencia de clculo y
memoria de los electrodomsticos llev a desarrollar un lenguaje sencillo capaz de generar cdigo de
tamao muy reducido.
Debido a la existencia de distintos tipos de CPUs y a los continuos cambios, era importante conseguir
una herramienta independiente del tipo de CPU utilizada. Esto hizo de Java un lenguaje ideal para
distribuir programas ejecutables va la WWW, adems de un lenguaje de programacin de propsito
general para desarrollar programas que sean fciles de usar y portables en una gran variedad de
plataformas. Desarrollaron un cdigo "neutro" que no dependa del tipo de electrodomstico, el cual se
ejecutaba sobre una "mquina hipottica o virtual" denominada Java Virtual Machine (JVM). Era la JVM
quien interpretaba el cdigo neutro convirtindolo a cdigo particular de la CPU utilizada. Esto permita lo
que luego se ha convertido en el principal lema del lenguaje: "Write Once, Run Everywhere". A pesar de

Captulo 6. Introduccin a Java

55

los esfuerzos realizados por sus creadores, ninguna empresa de electrodomsticos se interes por el nuevo
lenguaje.
Como lenguaje de programacin para computadoras, Java se introdujo a finales de 1995. Se us en
varios proyectos de Sun (en aquel entonces se llamaba Oak) sin mucho xito comercial. Se difundi ms
cuando se uni con HotJava, un navegador Web experimental, para bajar y ejecutar subprogramas (los
futuros applets). La clave del xito fue la incorporacin de un intrprete Java en la versin 2.0 del
programa Netscape Navigator en 1994, produciendo una verdadera revolucin en Internet. Obtuvo tanta
atencin que en Sun la divisin de Java se separ en la subsidiaria JavaSoft.
Java 1.1 apareci a principios de 1997, mejorando sustancialmente la primera versin del lenguaje.
Java 1.2, ms tarde rebautizado como Java 2, naci a finales de 1998.
A nivel de cdigo fuente, los tipos de datos primitivos de Java tienen tamaos consistentes en todas las
plataformas de desarrollo. Las bibliotecas de clases fundamentales en Java facilitan la escritura de
cdigo, el cual puede ser transportado de una plataforma a otra sin necesidad de rescribirlo para que
trabaje en la nueva plataforma. Lo anterior tambin se aplica al cdigo binario. Se puede ejecutar sin
necesidad de recompilarlo.
Con los lenguajes convencionales al compilar se genera cdigo binario para una plataforma en
particular. Si se cambia la plataforma se tendr que recompilar el programa. Por ejemplo un programa en
C para una PC, no servir en un servidor UNIX y viceversa.
Al programar en Java no se parte de cero. Cualquier aplicacin que se desarrolle "cuelga" (o se apoya,
segn como se quiera ver) en un gran nmero de clases preexistentes. Algunas de ellas las ha podido
hacer el propio usuario, otras pueden ser comerciales, pero siempre hay un nmero muy importante de
clases que forman parte del propio lenguaje (el API o Application Programming Interface de Java). Java
incorpora en el propio lenguaje muchos aspectos que en cualquier otro lenguaje son extensiones
propiedad de empresas de software o fabricantes de ordenadores (threads, ejecucin remota,
componentes, seguridad, acceso a bases de datos, etc.). Por eso muchos expertos opinan que Java es el
lenguaje ideal para aprender la informtica moderna, porque incorpora todos estos conceptos de un modo
estndar, mucho ms sencillo y claro que con las citadas extensiones de otros lenguajes. Esto es
consecuencia de haber sido diseado ms recientemente y por un nico equipo.
El principal objetivo del lenguaje Java es llegar a ser el "nexo universal" que conecte a los usuarios con
la informacin, est sta situada en la computadora local, en un servidor de Web, en una base de datos o
en cualquier otro lugar.
Java es un lenguaje muy completo (de hecho se est convirtiendo en un macrolenguaje: Java 1.0
tena 12 paquetes; Java 1.1 tena 23 y Java 1.2 tiene 59). En cierta forma casi todo depende de casi
todo. Por ello, conviene aprenderlo de modo iterativo: primero una visin muy general, que se va
refinando en sucesivas iteraciones. Una forma de hacerlo es empezar con un ejemplo completo en el que
ya aparecen algunas de las caractersticas ms importantes.
Java 2 (antes llamado Java 1.2 o JDK 1.2) es la tercera versin importante del lenguaje de
programacin Java. No hay cambios conceptuales importantes respecto a Java 1.1 (en Java 1.1 s los
hubo respecto a Java 1.0), sino extensiones y ampliaciones, lo cual hace que a muchos efectos, sea casi
lo mismo trabajar con Java 1.1 o con Java 1.2.
La compaa Sun describe el lenguaje Java como "simple, orientado a objetos, distribuido,
interpretado, robusto, seguro, de arquitectura neutra, portable, de altas prestaciones, multitarea y
dinmico". Adems de una serie de halagos por parte de Sun hacia su propia criatura, el hecho es que todo
ello describe bastante bien el lenguaje Java, aunque en algunas de esas caractersticas el lenguaje sea
todava bastante mejorable.

6.3. Caractersticas generales de Java


Java es un lenguaje de propsito general, de alto nivel y orientado a objetos. Java es un lenguaje
compilado e interpretado. Una de las herramientas de desarrollo es el compilador de Java, que realiza un
anlisis de sintaxis del cdigo escrito en los ficheros fuente de Java (con extensin *.java). Si no
encuentra errores en el cdigo genera los denominados bytecodes o ficheros compilados (con extensin
*.class). En otro caso muestra la lnea o lneas donde se han encontrado errores.
Por otro lado, la denominada Java Virtual Machine (JVM) anteriormente mencionada es el intrprete
de Java, de forma que convierte el cdigo neutro a cdigo particular de la CPU que se est utilizando. Se
evita tener que realizar un programa diferente para cada CPU o plataforma. La JVM ejecuta los
bytecodes (ficheros compilados con extensin *.class) creados por el compilador de Java.

56

Informtica II

Macintosh

Compilador

Intrprete

Hola.clas

Hola.jav

Windows

Unix
Figura 6.2. Java, un lenguaje compilado e interpretado.

La API de Java es muy rica, est formada por un conjunto de paquetes de clases que le proporcionan
una gran funcionalidad. El ncleo de la API viene con cada una de las implementaciones de la Java
Virtual Machine.
Java ofrece la posibilidad de crear programas que difieren en su forma de ejecucin:

Aplicacin independiente (Stand-alone Application): Es anloga a la de otros lenguajes.

Applet: Es una aplicacin especial que se descarga desde el servidor Web, viaja a travs de la
Internet y se ejecuta dentro de un navegador o browser al cargar una pgina HTML. El applet no
requiere instalacin en el ordenador donde se encuentra el browser.

Servlet: Es una aplicacin sin interface grfica que se ejecuta en un servidor de Internet.

Java permite fcilmente el desarrollo tanto de arquitecturas cliente-servidor como de aplicaciones


distribuidas, consistentes en crear aplicaciones capaces de conectarse a otros ordenadores y ejecutar
tareas en varios ordenadores simultneamente, repartiendo por lo tanto el trabajo. Aunque tambin otros
lenguajes de programacin permiten crear aplicaciones de este tipo, Java incorpora en su propio API
estas funcionalidades.

6.4. Entornos de desarrollo de Java


6.4.1. Java Development Kit (JDK)
El JDK es un conjunto de herramientas (programas y libreras) que permiten desarrollar (compilar,
ejecutar, generar documentacin, etc.) programas en lenguaje Java. Incorpora adems el denominado
Debugger, que permite la posibilidad de ejecutar parcialmente el programa, deteniendo la ejecucin en
el punto deseado y estudiando en cada momento el valor de cada una de las variables, para poder depurar
el programa. Existe tambin una versin reducida del JDK, denominada JRE (Java Runtime Environment)
destinada nicamente a ejecutar cdigo Java (no permite compilar). Aunque viene incluida en el JDK,
tambin se puede bajar de forma separada. Es de libre distribucin, luego se puede incluir junto con los
programas a la hora de distribuir aplicaciones si el usuario final no dispone de la Java Virtual Machine
(JVM).
La compaa Sun Microsystems Inc., creadora de Java, distribuye gratuitamente estas herramientas,
bajo el nombre de Java 2 Software Development Kit (SDK), Standard Edition. Existen versiones para los
siguientes sistemas operativos: Windows 95/98/NT, Solaris y Linux. Hasta el momento, la ltima
versin del SDK es la 1.4.2 y est disponible directamente desde la direccin
http://java.sun.com/j2se/1.4/download.html, recordar pinchar en la fila correspondiente a
Windows (all languages) y la columna de SDK.
6.4.1.1. Instalacin
Para comenzar a trabajar se necesita tener una instalacin del Java Development Kit (JDK) en el
ordenador local o en una unidad de red (partiendo de un programa de instalacin o copindolo desde

Captulo 6. Introduccin a Java

57

otro ordenador). Se llamar JAVAPATH al path completo del directorio donde se encuentra instalado el
JDK. Dicha instalacin pone a disposicin una serie de ejecutables para poder compilar y ejecutar
programas en Java, que se encuentran en el directorio \bin dentro del JAVAPATH. Algunos de estos
programas son:
appletviewer.exe

Permite la visualizacin de Applets.

java.exe

Ejecucin de programas como aplicaciones Stand-alone

javac.exe

Compilacin de cdigo

javadoc.exe

Creacin de documentacin a partir de las clases de Java

jar.exe

Creacin o extraccin de ficheros *.jar (ficheros comprimidos)

La ejecucin de programas en Java utilizando el JDK se realiza desde consolas MS-DOS. Desde una
ventana de comandos de MS-DOS, slo se pueden ejecutar los programas que se encuentren en los
directorios indicados en la variable de entorno PATH o en el directorio activo. Para que se encuentren
accesibles las herramientas de compilacin (javac.exe) y ejecucin (java.exe), la variable de entorno
PATH del ordenador debe incluir el directorio JAVAPATH\bin.
Adems, Java requiere de una nueva variable de entorno denominada CLASSPATH que determina
dnde encontrar las clases o libreras de Java o del usuario. A partir de la versin 1.1.4 del JDK no es
necesario indicar esta variable salvo que se desee aadir conjuntos de clases de usuario que no vengan con
dicho JDK. La variable CLASSPATH puede incluir la ruta de directorios o ficheros *.zip o *.jar en los que
se encuentren los ficheros *.class.
Una forma ms general de indicar estas dos variables es crear un fichero batch o de proceso por lotes
de MS-DOS (*.bat) donde se indiquen los valores de estas dos variables. Cada vez que se abra una ventana
de MS-DOS ser necesario ejecutar este fichero *.bat para asignar adecuadamente estos valores. El
fichero contendr las lneas:
set JAVAPATH=C:\j2sdk1.4.2
set PATH=.;%JAVAPATH%\bin;%PATH%
set CLASSPATH=
Si no se desea tener que ejecutar este fichero cada vez que se abre una consola de MS-DOS es
necesario indicar estos cambios de forma permanente. La forma de hacerlo difiere segn la plataforma:

Windows 95/98: Consiste en modificar el fichero Autoexec.bat situado en el directorio raz C:\
aadiendo las lneas antes mencionadas. Una vez re-arrancado el ordenador estarn presentes en
cualquier consola MS-DOS que se cree.

Windows NT: Se aadirn las variables JAVAPATH, PATH y CLASSPATH en Settings -> Control Panel
-> System -> Environment -> User Variables for NombreUsuario.

6.4.1.2. Documentacin
Existe una documentacin muy completa que acompaa a cada versin del JDK, aunque hay que
bajarla en un fichero aparte. Informa sobre los packages, clases e interfaces, con descripciones bastante
detalladas de las variables y mtodos, as como de las relaciones jerrquicas. La documentacin de Java
est escrita en HTML y se explora con un browser como Netscape Navigator o Microsoft Internet Explorer.
De ordinario, en Java hay que programar teniendo a la vista esta informacin.
Puedes conseguirla de forma gratuita descargndola desde http://java.sun.com/docs/, o ms
exactamente, para Java 1.4 desde http://java.sun.com/j2se/1.4/download.html.
6.4.1.3. Manos a la obra
Una vez que disponemos de una instalacin del JDK, ya podemos compilar y ejecutar programas en
Java. Vamos a aprender en primer lugar a desarrollar Aplicaciones Independientes (Stand-alone
Applications). Comenzaremos con una de las aplicaciones ms sencillas que pueden escribirse en Java,
una aplicacin que muestra un texto en la consola, y que nos servir para ver cmo es la estructura
general de un programa en Java.
El primer paso es escribir el programa. Para ello utilizaremos un editor de texto cualquiera (por
ejemplo el Notepad). Abramos, pues, el editor de texto y escribamos el siguiente programa, respetando
las maysculas y minsculas:

58

Informtica II

/* Estructura general de un programa en Java */


// Otra forma de comentar slo una lnea
public class MiPrograma {
public static void main (String args[]){
System.out.println(?Mi primer programa en Java?);
} // Fin de main()
} // Fin de la clase MiPrograma
Guardamos el programa en el fichero MiPrograma.java. Abrimos una ventana o consola de MS-DOS.
Recordar que cada vez que abrimos una ventana o consola de MS-DOS debemos establecer el valor de la
variable PATH del entorno (siempre que no la tengamos definida de manera permanente en el sistema).
Para ello ya sabemos que podemos crear un fichero batch (*.bat) y ejecutarlo.
Ya podemos proceder a compilar el programa. En la lnea de comandos de la ventana de MS-DOS
introducimos las rdenes necesarias para situarnos en el directorio donde se encuentra nuestro fichero
MiPrograma.java y despus ejecutamos la sentencia:
javac MiPrograma.java
Si se ha compilado y no ha mostrado errores, se habr creado un nuevo fichero MiPrograma.class en el
directorio actual. En caso contrario, hay que corregir los errores y volver a compilar. Para ejecutar el
programa, se hace mediante la siguiente sentencia:
java MiPrograma
En la consola debe aparecer: Mi primer programa en Java
En la figura 1.3. se muestra el proceso completo, desde la creacin del programa mediante un editor
de texto, hasta la ejecucin del mismo.

Editor de
Texto
Errores

MiPrograma.java

Errores

Compilador
(javac.exe)

MiPrograma.class
Sin
Error

Intrprete
(java.exe)

Figura 6.3. Uso del JDK.

6.4.2. Entornos IDE (Integrated Development Environment)


Se trata de entornos de desarrollo visual integrados. Las ventajas que tienen son las siguientes:

Permiten desarrollar ms rpidamente aplicaciones puesto que tienen incorporado el editor de


texto, el compilador, el intrprete y permiten gestionar de manera eficiente proyectos o
programas de cierta entidad.

Incorporan libreras de componentes, los cuales se aaden al proyecto o programa.

Facilitan enormemente el uso del Debugger.

Como inconvenientes se pueden sealar algunos fallos de compatibilidad entre plataformas y archivos
resultantes de mayor tamao que los basados en clases estndar.
Algunos IDEs conocidos son los siguientes:

Jbuilder, de Borland.

VisualAge for Java, de IBM

Visual J++ 6.0, de Microsoft.

Captulo 6. Introduccin a Java

59

Sun ONE Studio 4 update 1, Community Edition. Se puede obtener de forma gratuita desde la
web de Sun. Antes se conoca como FORTE for Java, Community Edition.

Figura 6.4. Aspecto del IDE Sun ONE Studio 4 update 1, Community Edition

6.5. Estructura general de un programa en Java


El ejemplo del apartado 6.4.1.3. presenta la estructura habitual de un programa realizado en Java.
Aparece una clase que contiene el programa principal (aquel que contiene la funcin main()). Un fichero
fuente (*.java) puede contener ms de una clase, pero slo una puede ser public. El nombre del fichero
fuente debe coincidir con el de la clase public (con la extensin *.java). Es importante que coincidan
maysculas y minsculas puesto que Java es sensible a ello, de forma que MiClase y miclase seran dos
clases diferentes.
Por cada clase definida en los ficheros fuente (*.java) el compilador genera un *.class para dicha
clase, luego de ordinario, una aplicacin de Java est constituida por varios ficheros *.class. Cada clase
realiza unas funciones particulares, permitiendo construir las aplicaciones con gran modularidad e
independencia entre clases. La aplicacin se ejecuta por medio del nombre de la clase que contiene la
funcin main() (sin la extensin *.class).
6.5.1. Concepto de Clase
Una clase es una agrupacin de datos (variables o campos) y de funciones (mtodos) que operan sobre
esos datos. A estos datos y funciones pertenecientes a una clase se les denomina variables y mtodos o
funciones miembro. La programacin orientada a objetos se basa en la programacin de clases. Un
programa se construye a partir de un conjunto de clases.
Una vez definida e implementada una clase, es posible declarar elementos de esta clase de modo
similar a como se declaran las variables del lenguaje (de los tipos primitivos int, double, String, ). Los
elementos declarados de una clase se denominan objetos de la clase. De una nica clase se pueden
declarar o crear numerosos objetos. La clase es lo genrico: es el patrn o modelo para crear objetos.
Cada objeto tiene sus propias copias de las variables miembro, con sus propios valores, en general
distintos de los dems objetos de la clase. Las clases pueden tener variables static, que son propias de la
clase y no de cada objeto.

60

Informtica II

Mtodos de clase (static) son funciones que no actan sobre objetos concretos de la clase. Son
ejemplos de mtodos static los mtodos matemticos de la clase java.lang.Math. Mtodos de
objeto son funciones definidas dentro de una clase que se aplican siempre a un objeto de la clase.
6.5.2. Herencia
La herencia permite que se puedan definir nuevas clases basadas en clases existentes, lo cual facilita
re-utilizar cdigo previamente desarrollado. Si una clase deriva de otra (extends) hereda todas sus
variables y mtodos. La clase derivada puede aadir nuevas variables y mtodos y/o redefinir las
variables y mtodos heredados.
En Java, a diferencia de otros lenguajes orientados a objetos, una clase slo puede derivar de una
nica clase, con lo cual no es posible realizar herencia mltiple en base a clases. Sin embargo es posible
simular la herencia mltiple en base a las interfaces.
6.5.3. Concepto de Interface
Una interface es un conjunto de declaraciones de funciones. Si una clase implementa (implements)
una interface, debe definir todas las funciones especificadas por la interface. Una clase puede
implementar ms de una interface, representando una forma alternativa de la herencia mltiple.
A su vez, una interface puede derivar de otra o incluso de varias interfaces, en cuyo caso incorpora
todos los mtodos de las interfaces de las que deriva.
6.5.4. Concepto de Package
Un package es una agrupacin de clases. Existen una serie de packages incluidos en el lenguaje (ver
jerarqua de clases que aparece en el API de Java).
Adems el usuario puede crear sus propios packages. Lo habitual es juntar en packages las clases que
estn relacionadas. Todas las clases que formen parte de un package deben estar en el mismo directorio.
6.5.5. La jerarqua de clases de Java (API)
Durante la generacin de cdigo en Java, es recomendable y casi necesario tener siempre a la vista la
documentacin on-line del API de Java 1.1 Java 1.2. En dicha documentacin es posible ver tanto la
jerarqua de clases, es decir, la relacin de herencia entre clases, como la informacin de los distintos
packages que componen las libreras base de Java.
Es importante distinguir entre lo que significa herencia y package. Un package es una agrupacin
arbitraria de clases, una forma de organizar las clases. La herencia sin embargo consiste en crear nuevas
clases en base a otras ya existentes. Las clases incluidas en un package no derivan por lo general de una
nica clase.
En la documentacin on-line se presentan ambas visiones: Package Index y Class Hierarchy,
tanto en Java 1.1 como en Java 1.2, con pequeas variantes. La primera presenta la estructura del API
de Java agrupada por packages, mientras que en la segunda aparece la jerarqua de clases. Hay que
resaltar el hecho de que todas las clases en Java son derivadas de la clase java.lang.Object, por lo que
heredan todos los mtodos y variables de sta.
Si se selecciona una clase en particular, la documentacin muestra una descripcin detallada de todos
los mtodos y variables de la clase. A su vez muestra su herencia completa (partiendo de la clase
java.lang.Object).

CAPTULO 7

7. GUI y otros elementos de Java


7.1. Graphic User Interfaces (GUI)
Las interfaces grficas de usuario (GUI) se componen de un conjunto de partes cada vez ms usadas,
como los botones para respuestas del usuario, regiones para despliegue y escritura de texto, mens
descendentes y as sucesivamente. Estas partes se denominan widgets.
La simple adicin de widgets a un programa permite tener escaso control del aspecto de la interfaz, lo
que se ve bien en un ambiente podra ser del todo inaceptable en otro. Se hace necesario un anlisis del
diseo visual. Veremos dos caractersticas que hacen posible lograr el aspecto que se pretende de la GUI
sin importar el sistema en que se ejecute el programa: los Container y los LayoutManager.
Adems de un diseo visual correcto, las aplicaciones deben ser capaces de prestar atencin a la
actividad del teclado, los movimientos y clics del ratn, etc., en definitiva, ser capaces de interactuar con
el usuario. Este tipo de aplicaciones se dice que estn controladas por eventos. Java incluye un amplio
conjunto de funciones para vigilar y notificar eventos.
7.1.1. Componentes grficos: Abstract Window Toolkit (AWT)
El paquete java.awt constituye un conjunto de clases con independencia de plataforma que permite
usar componentes grficos muy diversos. Al utilizar las clases de AWT, es posible disear un programa til
y visualmente eficaz sin preocuparse por detalles de bajo nivel relacionados con los objetos grficos.
7.1.1.1. Widgets o componentes elementales
En la jerga computacional se conoce como widgets a los componentes elementales que forman las
interfaces grficas de usuario (GUI). La clase Component es, sin duda, la ms importante del paquete
java.awt (Figura 7.1) y es la superclase de todas las clases de widget, salvo los menus, adems de servir
como depsito de todos los mtodos comunes a widget.
Tenemos componentes de texto como la clase Label, y las clases TextField y TextArea y por otro
lado componentes activos como las clases Button, CheckBox, CheckboxGroup, Choice y List.
7.1.1.2. Mtodos de organizacin: Contenedores
Las subclases de Container posibilitan pensar en el diseo visual con base en una organizacin
jerrquica, mientras que las clases de diseo permiten especificar el aspecto que la jerarqua de los
Container y sus Component tienen para el usuario.
7.1.1.3. Diseo Visual: Layouts
Cada Container tiene su propio diseo visual o LayoutManager, interfaz que se encarga de
colocar los componentes en un objeto Container. Para acceder al diseo y modificarlo se dispone de los
siguientes mtodos:
LayoutManager getLayout()

Devuelve el LayoutManager activo de este


Container.

void setLayout(LayoutManager layout)

Este
mtodo
permite
cambiar
LayoutManager de este Container.

el

Se dispone de tres clases de diseo o LayoutManager que se analizan en este apartado y slo
difieren en la forma de posicionar los componentes. Estas con las clases FlowLayout, BorderLayout y
GridLayout.

62

Informtica II

Figura 7.1. Una porcin de la jerarqua de clases de


Component

Figura 7.2. Una porcin de la jerarqua de clases de


Container

Label

TextField

TextArea

Button

CheckBox

CheckboxGroup

Choice

List

Figura 7.3. Aspecto de los componentes elementales

Captulo 7. GUI y otros elementos de Java

63

import java.awt.*;
java.applet.*;
public class FlowLayoutTest extends Applet {
public void init() {
setLayout(new FlowLayout());
add(new Button("One"));
add(new Button("Two"));
add(new Button("Three"));
add(new Button("Four"));
add(new Button("Five"));
add(new Button("Six"));
}
}
import java.awt.*;
import java.applet.*;
public class BorderLayoutTest extends Applet {
public void init() {
setLayout(new BorderLayout());
add(BorderLayout.NORTH, new Button("One"));
add(BorderLayout.EAST, new Button("Two"));
add(BorderLayout.SOUTH, new Button("Three"));
add(BorderLayout.WEST, new Button("Four"));
add(BorderLayout.CENTER, new Button("Five"));
}
}
import java.awt.*;
import java.applet.*;
public class GridLayoutTest extends Applet {
public void init() {
setLayout(new GridLayout(3,2));
add(new Button("One"));
add(new Button("Two"));
add(new Button("Three"));
add(new Button("Four"));
add(new Button("Five"));
add(new Button("Six"));
}
}
Figura 7.4. Aspecto de los diferentes LayoutManager.

7.1.2. Eventos
Casi todos los lenguajes de programacin evolucionan con el paso del tiempo, y Java no es la
excepcin. En la primera revisin importante de Java, la versin 1.1, se incluy un grupo de nuevos
mtodos para las clases de la AWT. Tambin se aadieron algunos nuevos paquetes y clases; pero gran
parte de los cambios fue ms o menos superficial, excepto lo relativo al manejo de eventos. Es en estos
donde se advierten las diferencias ms significativas entre las versiones 1.0 y subsiguientes de Java (Java
1.1 y sus modificaciones y Java 1.2, ahora llamada Java 2). Por fortuna (al menos, para los autores de
libros), ya no se tiene soporte para el modelo de eventos de la versin 1.0, por lo que los autores pueden
dedicar el tiempo a escribir acerca de una sola forma de manejar los eventos, con la confianza de que
este modelo ser vlido al menos durante la vida til de su obra, sin importar que se use el ambiente Java
2 cualquiera de las versiones 1.1.x.
Un programa escrito en Java maneja los eventos mediante lo que se conoce como modelo de
delegacin. En ste, existen dos actores, el objeto Component (un botn, por ejemplo) que genera los
eventos y otro objeto, que podr ser un subprograma o una instancia de otra clase, el cual contiene el
cdigo para el manejo de los eventos. Las principales caractersticas de este modelo son:

Todo componente puede ser la fuente de un evento.

Toda clase puede ser un escucha (listener) de un evento, para lo cual basta la instrumentacin de
la interface de escucha apropiada.

64

Informtica II

El evento que genera un Component se enva slo a los escuchas registrados con el objeto fuente.

Para poder trabajar con eventos se hace necesario importar un nuevo paquete, java.awt.event. Los
diversos tipos de eventos en Java estn organizados en una jerarqua de clases que se ilustra en la Figura
7.7.
Vamos a desarrollar un ejemplo que muestra la sencillez de este modelo. La aplicacin contiene dos
botones, en los que se puede hacer clic para mover el punto rojo hacia la izquierda o la derecha. En la
Figura 7.5 se ilustra el aspecto que tiene la aplicacin en pantalla.

Figura 7.5. Aplicacin Eventos.class

A continuacin se muestra el cdigo en Java de la aplicacin. Se han resaltado en negrita las partes
del cdigo que se aaden para poder manejar los eventos. Estas sentencias y mtodos realizan diferentes
tareas: incluir el paquete de clases de eventos, establecer vnculos entre fuentes y escuchas e
instrumentar el interfaz del escucha para manejar el evento.
/* Programa que muestra el funcionamiento de Eventos en Java */
import java.awt.*;
import java.awt.event.*;

//Paquete para las clases de eventos

public class Eventos extends Frame{


private Button
private Display

left,right;
myDisplay;

//Constructor
public Eventos(){
super("Aplicacin Ejemplo de Eventos");
setSize(400,200);
setLayout(new BorderLayout());
myDisplay = new Display();
add(BorderLayout.CENTER, myDisplay);
Panel p = new Panel();
left = new Button("Izquierda");
p.add(left);
right = new Button("Derecha");
p.add(right);
add(BorderLayout.SOUTH, p);
//Registrar myDisplay con cada botn
left.addActionListener(myDisplay);
right.addActionListener(myDisplay);
}
public static void main(String args[]){
Eventos a = new Eventos();
a.show();
}
}

Captulo 7. GUI y otros elementos de Java

65

class Display extends Canvas implements ActionListener{


private Point center;
//Constructor
public Display(){
center = new Point(50,50);
setBackground(Color.white);
}
//Mtodo que se llama cuando se produce un evento
public void actionPerformed(ActionEvent e){
//Obtener el rtulo del botn que gener el evento
String rotulo = e.getActionCommand();
//Movemos el punto segn qu botn haya generado el evento
if(rotulo.equals("Izquierda")){
center.x -= 12;
}else if (rotulo.equals("Derecha")){
center.x += 12;
}
//Se fuerza una llamada a paint()
repaint();
}
//Dibujar el punto rojo
public void paint(Graphics g){
g.setColor(Color.red);
g.fillOval(center.x -5, center.y -5, 10, 10);
}
}
El manejo de eventos generados por un componente fuente en un programa requiere:

Una declaracin de la forma: import java.awt.event.*;

Un objeto escucha que instrumente todos los mtodos de una interface escucha apropiada.

Un vnculo entre los objetos fuente y escucha, que se establece mediante una llamada a un
mtodo de Component, con la forma: fuente.addXXXListener(escucha); , donde XXX indica
el tipo de evento que se manejar.

Cdigo en el mtodo escucha apropiado para manejar el evento.


Escucha (Listener)
registrado con las Fuentes

Genera
ActionEvent

Instrumenta el
interface
ActionListener

Izquierda

Genera
ActionEvent

Derecha

Fuentes de Eventos

Figura 7.6. Fuentes y escuchas de Eventos en el ejemplo.

Los eventos ms comunes que se manejan en aplicaciones Java son los siguientes:

66

Informtica II

Eventos de accin (clase ActionEvent): Un ActionEvent se genera cuando el usuario hace clic
en un botn, hace doble clic en un elemento de una lista, selecciona un MenuItem o presiona
<Intro> en un TextField.

Eventos de elementos (clase ItemEvent): Se genera una instancia de ItemEvent cuando el


usuario hace clic en un CheckBox, CheckBoxMenuItem o Choice.

Eventos del teclado (clase KeyEvent): Los eventos del teclado se generan cuando el usuario
pulsa o suelta una tecla. En realidad existen tres tipos de KeyEvent: pulsar una tecla, soltar una
tecla y escribir con una tecla, que es una secuencia de las dos primeras.

Eventos del ratn (clase MouseEvent): Cuando se hace clic con el ratn, se le mueve o se realiza
cualquier otra accin con l, el Component donde est el puntero en el momento de la accin
genera un MouseEvent.

Eventos de texto (clase TextEvent): Los TextEvent se generan cuando el usuario modifica el
contenido de un objeto TextArea o TextField, o si cambia su contenido con un mtodo como
setText().

Eventos de ventana: Son las diversas acciones que un usuario o programa pueden emprender con
una ventana. Una ventana puede volverse activa o inactiva, al colocarse delante o detrs de otra.
En muchos sistemas, es posible iconificar ventanas, al minimizarlas hasta una pequea
representacin en un icono, o desiconificarlas, mediante su expansin desde su estado de icono.
Se generan eventos a su vez cuando se abre o se cierra la ventana.
EventObjec
t
AWTEvent
ActionEvent
ComponentEvent
ContainerEvent
FocusEvent
InputEvent
KeyEvent
MouseEven
t
PaintEvent
WindowEvent
AdjustmentEvent
ItemEvent
TextEvent

Figura 7.7. Jerarqua de clases de AWTEvent

En el modelo de eventos de Java, los Component generan eventos cuyo manejo corresponde a
cualquier objeto escucha registrado con la fuente del evento. Un escucha es toda clase que instrumenta la
interfaz apropiada para el evento. Luego, a fin de disear un manejador de eventos, se construye una
clase (o se utiliza una ya definida que cuente con toda la informacin necesaria para responder al evento
concreto) que instrumente el escucha apropiado del evento y se realiza una sobrecarga de todos los
mtodos de la interfaz. Por ello, es necesario conocer las interfaces escucha y sus mtodos. Existen 11
interfaces escucha, que se listan a continuacin:

Captulo 7. GUI y otros elementos de Java

ActionListener
AdjustmentListener
ComponentListener
ContainerListener
FocusListener
ItemListener
KeyListener
MouseListener
MouseMotionListener
TextListener
WindowListener

67

//
//
//
//
//
//
//
//
//
//
//

para ActionEvent
para Scrollbar
para ComponentEvent
para ContainerComponent
para rastrear eventos de enfoque
para ItemEvent
para KeyEvent
para todos los eventos del ratn excepto
MOUSE_DRAG y MOUSE_MOVE
para TextEvent
para WindowEvent

7.1.3. Applets
Como se puede observar en la Figura 7.2 los applets son contenedores, herederos de la clase Panel.
Permiten realizar aplicaciones a las que se accede mediante un visualizador de pginas web (o
navegador), pues se transmiten a travs de la red y los ejecuta la mquina virtual del visualizador. En
castellano se denominan subprogramas.
Los applets no tienen mtodo main() y su ciclo de vida se basa en la ejecucin de los siguientes
mtodos:

void init(): es ejecutado por el navegador la primera vez que se carga el applet. Se suele colocar
en este mtodo el cdigo que se pondra en el constructor si se tratase de una aplicacin
independiente, es decir, todo lo necesario para su inicializacin.

void start(): se ejecuta cada vez que se carga el applet.

void stop(): se ejecuta cuando se abandona el documento que contiene el applet.

Otros mtodos importantes son:

void paint(Graphics g): dibuja el applet; g indica la zona que se va a dibujar.1

void update(Graphics g): actualiza el applet, rellenndolo primero con el color de g e


invocando despus al mtodo paint.

void repaint(): este mtodo llama al mtodo update(). ste es el mtodo que debe invocar el
programador si quiere repintar el applet.

void resize(int ancho, int alto): cambia el tamao al indicado por ancho y alto.

Veamos a continuacin un ejemplo sencillo de un applet que muestra un mensaje:


/* Applet que muestra un mensaje */
import java.applet.Applet;
import java.awt.Graphics;
public class MiApplet extends Applet{
public void paint (Graphics g){
g.drawString (?Mi primer Applet?, 10, 30);
}
}
Guardamos el cdigo en un fichero con nombre MiApplet.java y lo compilamos de la misma forma que
vimos para aplicaciones independientes. Sin embargo, para visualizar el applet en un navegador (puesto
que no es una aplicacin independiente) es necesario disponer de una pgina HTML que lo despliegue. El
contenido mnimo de esta pgina ser:
<HTML>
<BODY>
<APPLET code=?MiApplet.class? width=60 height=60></APPLET>
</BODY>
</HTML>

La clase Graphics mantiene un contexto grfico: indica la zona en que se va a dibujar, color de dibujo
del background y del foreground, font, etc...

68

Informtica II

Guardamos el cdigo HTML en un fichero con extensin *.html, por ejemplo MiApplet.hmtl. Ahora se
utiliza cualquier navegador para abrir la pgina html. El fichero *.class del applet debe estar en el mismo
directorio que el *.html. La Figura 7.8 muestra el proceso completo de despliegue de un applet en una
pgina Web.

Compilador

Hola.class

Hola.java
Navegador

Hola.html
Despliegue del Applet
en una pgina Web

Figura 7.8. Despliegue de Applets.

El JDK pone a disposicin una herramienta para visualizar applets sin necesidad de un navegador
comercial. Esta herramienta es el appletviewer.exe y se utiliza con la siguiente sentencia desde una
consola de MS-DOS y desde el directorio donde se encuentre el *.html y el *.class:
Appletviewer MiApplet.html
La salida grfica ser la siguiente:

Figura 7.9. MiApplet.class en el AppletViewer.

7.2. Otros elementos de Java


7.2.1. Manejo de Excepciones y Errores
Java incorpora en el propio lenguaje la gestin de errores. El mejor momento para detectar los errores
es durante la compilacin. Sin embargo prcticamente slo los errores de sintaxis son detectados durante
este periodo. El resto de problemas surgen durante la ejecucin de los programas.
En el lenguaje Java, una Exception es un cierto tipo de error o una condicin anormal que se ha
producido durante la ejecucin de un programa. Algunas excepciones son fatales y provocan que se deba
finalizar la ejecucin del programa. En este caso conviene terminar ordenadamente y dar un mensaje
explicando el tipo de error que se ha producido. Otras, como por ejemplo no encontrar un fichero en el
que hay que leer o escribir algo, pueden ser recuperables. En este caso el programa debe dar al usuario la
oportunidad de corregir el error (indicando una nueva localizacin del fichero no encontrado).
Un buen programa debe gestionar correctamente todas o la mayor parte de los errores que se pueden
producir. Hay dos estilos de hacer esto:
1. A la antigua usanza: los mtodos devuelven un cdigo de error. Este cdigo se chequea en el
entorno que ha llamado al mtodo con una serie de if elseif , gestionando de forma diferente el

Captulo 7. GUI y otros elementos de Java

69

resultado correcto o cada uno de los posibles errores. Este sistema resulta muy complicado cuando
hay varios niveles de llamadas a los mtodos.
2. Con soporte en el propio lenguaje: En este caso el propio lenguaje proporciona construcciones
especiales para gestionar los errores o Exceptions. Suele ser lo habitual en lenguajes modernos,
como C++, Visual Basic y Java.
Los errores se representan mediante dos tipos de clases derivadas de la clase Throwable: Error y
Object
Throwable
Error
LinkageError

...
Exception
IllegalAccessException
RuntimeException
IOException

...
Figura 7.10. Una parte de la jerarqua de clases de Throwable.

La clase Error est relacionada con errores de compilacin, del sistema o de la JVM. De ordinario estos
errores son irrecuperables y no dependen del programador ni debe preocuparse de capturarlos y
tratarlos. La clase Exception tiene ms inters. Dentro de ella se puede distinguir:
1. RuntimeException: Son excepciones muy frecuentes, de ordinario relacionadas con errores de
programacin. Se pueden llamar excepciones implcitas.
2. Las dems clases derivadas de Exception son excepciones explcitas. Java obliga a tenerlas en
cuenta y chequear si se producen.
Las clases derivadas de Exception pueden pertenecer a distintos packages de Java. Algunas perenecen
a java.lang (Throwable, Exception, RuntimeException, ); otras a java.io (EOFException,
FileNotFoundException, ...) o a otros packages.
7.2.2. Entrada/Salida de Datos
Todos los lenguajes de programacin modernos poseen la caracterstica de permitir que se guarde la
salida de un programa en un archivo externo, que puede residir, por ejemplo, en un disco duro. Una vez
que se guarda en el disco duro (o cualquier otro medio de almacenamiento), se puede leer posteriormente
y usar como entrada para un programa, ya sea el mismo que gener el archivo, u otro programa
totalmente distinto.
La entrada y salida de datos en Java se logran mediante las clases de flujo de datos InputStream y
OutputStream, as como sus subclases, algunas de las cuales se ilustran en la Figura 5.11, junto con la
clase File, que permite obtener informacin acerca de un archivo. Todas estas clases son parte del
paquete java.io.
En Java, un flujo de datos es una secuencia ordenada de objetos y un conjunto de mtodos que
permiten extraer un objeto (leerlo del flujo) y aadir un nuevo objeto al flujo (escribirlo en el flujo).

70

Informtica II

Object
File
InputStream
FileInputStream
FilterInputStream
DataInputStream
OutputStream
FileOutputStream
FilterOutputStream
DataOutputStream

Figura 7.11. Una parte de la jerarqua de clases de flujo de datos.

7.2.3. Subprocesos
Generalmente se piensa en la ejecucin de un programa como un proceso secuencial, de instruccin en
instruccin, quiz realizando bucles o saltando a otra parte del cdigo en respuesta a una llamada a un
mtodo. Sin embargo, es posible tener varios procesos secuenciales a la vez. En la prctica, los procesos
secuenciales nunca se ejecutan simultneamente, sino que uno ejecuta varias instrucciones y luego
descansa, mientras otro ejecuta su cdigo. Pero esta alternacin ocurre tan rpidamente que puede
pensarse que trabajan al mismo tiempo.
As pues, un subproceso representa una secuencia de accin independiente en un programa. Java
proporciona la clase Thread, parte del paquete java.lang, para el manejo de subprocesos.

SECCIN 3
Java Avanzado

CAPTULO 8

8. JDBC: acceso a bases de datos


8.1. Introduccin
8.1.1. Qu es ODBC?
Open Database Connectivity (ODBC) es una interface de aplicaciones (API) para acceder a datos en
sistemas gestores de bases de datos tanto relacionales como no relacionales, utilizando para ello SQL
(Lenguaje de Consulta Estructurado).
Todas las aplicaciones que soporten ODBC reconocern una instruccin comn de Lenguaje de Consulta
Estructurado (SQL).
Las aplicaciones ODBC o aplicaciones cliente envan peticiones a un servidor de bases de datos. El
gestor del driver ODBC determina qu fuente de datos usar y qu driver ODBC puede comunicar con esa
fuente de datos en particular. La peticin se enva luego a travs del driver al servidor normalmente una
aplicacin de base de datos. Esta base de datos puede ser local, o en el mismo ordenador, o remota. Los
datos solicitados se devuelven a travs del gestor del driver ODBC, entonces a la aplicacin del cliente. El
lenguaje ODBC es una combinacin de llamadas de funcin ODBC API y lenguaje SQL.
Antes de continuar, es til conocer los siguientes trminos:

Sistema de Gestin de Bases de Datos (DBMS): Aplicacin que permite a los usuarios almacenar,
procesar, y recuperar informacin en una base de datos

Fuente de Datos (DSN): Los datos a los cuales quiere acceder (como a DBMS) e informacin para
localizar datos (como la ruta o direccin IP)

Lenguaje de Consulta Estructurado (SQL): Un lenguaje de programacin estndar que controla e


interacta con una DBMS

Aplicacin Cliente: La aplicacin que solicita datos (mediante SQL) de una fuente de datos usando
ODBC

Query: Recuperacin, manipulacin, o modificacin de datos desde una fuente de datos enviando
instrucciones SQL

Tabla: Recoleccin de datos cuya estructura lgica es en forma de campos (atributos) y registros es
decir, columnas y filas.

Driver o controlador ODBC: Un fichero DLL, fichero conectado dinmicamente (Windows) que enva
una consulta SQL para acceder a datos almacenados en una base de datos y entregar datos a la
aplicacin cliente

8.1.2. Qu es y que hace JDBC?


JDBC es una API de Java para ejecutar sentencias SQL. (Como punto de inters, JDBC es nombre de una
marca registrada y no es un acrnimo, a pesar de todo, JDBC es a menudo interpretado como Java
DataBase Connectivity). Consta de un conjunto de clases e interfaces escrito en lenguaje de
programacin Java.
Usando JDBC es fcil enviar sentencias SQL a virtualmente cualquier base de datos relacional. En otras
palabras, con la API JDBC no es necesario escribir un programa para acceder a una base de datos tipo
Access, otro programa para acceder a una base de datos tipo Oracle y as para cada tipo de base de datos.
Uno puede escribir un solo programa usando la API JDBC y el programa ser capaz de enviar sentencias
SQL a la base de datos apropiada. Y, con una aplicacin escrita en Java, uno no tiene por qu preocuparse
por escribir diferentes programas para diferentes plataformas. La combinacin de JDBC permite al
programador escribir una vez y ejecutar en cualquier sitio.

74

Informtica II

Java, siendo robusto, seguro, fcil de usar, fcil de entender, y automticamente descargable en una
red, es un excelente lenguaje base para aplicaciones con bases de datos. Lo que es necesario es una forma
para que las aplicaciones Java puedan entenderse con bases de datos de diferentes tipos. JDBC es el
mecanismo para hacer esto.
JDBC extiende lo que puede hacerse con Java. Por ejemplo, con Java y la API de JDBC, es posible
publicar una pgina web que usa informacin obtenida de una base de datos remota. O una compaa
puede usar JDBC para conectar todos sus empleados (incluso si estos estn usando un conglomerado de
mquinas Windows, Macintosh y UNS) a una o ms bases de datos internas va una intranet.
De una forma simple, JDBC posibilita hacer tres cosas:

Establecer una conexin con una base de datos

Enviar sentencias SQL

Procesar los resultados

8.1.3. JDBC versus ODBC y otras APIs


La API ODBC de Microsoft es probablemente la interface de programacin para acceder a bases de
datos relacionales ms extensamente usada. Ofrece la posibilidad de conectar a casi la totalidad de bases
de datos. Entonces, por qu no usar simplemente ODBC desde Java?
La respuesta es que se puede usar ODBC desde Java, pero esto se hace mejor con la ayuda de JDBC en
la forma de un Puente JDBC-ODBC, el cual trataremos en breve. La pregunta es ahora Por qu se necesita
JDBC? Hay varias respuestas para esta pregunta:

ODBC no es apropiado para su uso directo desde Java porque usa una interface en C. Las llamadas
desde Java a cdigo C nativo tienen un nmero de inconvenientes en la seguridad, implementacin,
robustez y portabilidad de las aplicaciones.

Una traduccin literal de la OBDC API en C a una API en Java no sera deseable. Por ejemplo, Java no
tiene punteros y ODBC hace un copioso uso de ellos. Se puede pensar en JDBC como ODBC traducido a
un interface orientado a objetos que es natural para programadores en Java.

ODBC es duro de aprender. Mezcla caractersticas elementales con otras ms avanzadas y tiene
complejas opciones incluso para las consultas ms simples. JDBC, por otro lado, fue diseado para
mantener simples las cosas simples mientras permite posibilidades ms avanzadas cuando se
requieren.

Una API en Java como JDBC es necesaria para conseguir una solucin puramente Java. Cuando se
usa ODBC, el gestor de controladores (driver manager) y los controladores (drivers) ODBC deben ser
manualmente instalados en cada mquina cliente. Sin embargo, cuando el driver JDBC est escrito
totalmente en Java, el cdigo JDBC es automticamente instalable, portable y seguro en todas las
plataformas Java desde computadoras en red hasta mainframes.

En definitiva, la JDBC API es una interface natural de Java para las abstracciones y conceptos bsicos
de SQL. Est fundamentada en ODBC por lo que los programadores familiarizados con ODBC encontrarn
fcil de aprender JDBC. JDBC mantiene las caractersticas de diseo bsicas de ODBC. La gran diferencia
es que JDBC est basada y refuerza el estilo y virtudes de Java y, por supuesto, es fcil de usar.
8.1.4. Controladores JDBC
8.1.4.1. Tipos de controladores (Drivers) de JDBC
Java puede acceder a la base de datos mediante un driver o controlador JDBC apropiado que pueda
utilizar las clases que permiten el acceso a la base de datos. Existen diversos tipos de drivers, que utilizan
distintos protocolos. En particular, en esta asignatura se utilizar el llamado Puente JDBC-ODBC, que se
explicar ms adelante.
8.1.4.2. Cmo obtener los Drivers de JDBC
Para conseguir la informacin actualizada sobre drivers, acceder a la pgina web sobre drivers para
JDBC de Sun, donde se mantiene un registro actualizado de vendedores de drivers:
http://industry.java.sun.com/products/jdbc/drivers

Captulo 8. JDBC: acceso a bases de datos

75

8.1.5. JDBC-ODBC Bridge


El Puente JDBC-ODBC es un controlador JDBC que implementa operaciones JDBC traducindolas en
operaciones ODBC. Para ODBC aparece como una aplicacin normal. El Puente implementa JDBC para
cualquier base de datos para la cual haya disponible un driver ODBC.
El Puente est implementado en Java y usa mtodos nativos de Java para llamar a ODBC. Se instala
automticamente con el Java Development Kit como el paquete sun.jdbc.odbc.
Si es posible, usar un driver JDBC 100% Java en lugar de un Puente y un driver ODBC. Esto elimina
completamente la configuracin en el cliente requerida por ODBC.

8.2. JDBC 3.0 API


La JDBC 3.0 API comprende dos paquetes:

El paquete java.sql

El paquete javax.sql, que aade capacidades de la parte servidor.

Los dos paquetes se consiguen automticamente cuando se baja la Java 2 Platform, Standard Edition,
Version 1.4 (J2SE) de la web de Sun.
8.2.1. Paquete java.sql
Provee la API para acceso y procesamiento de datos guardados en una fuente de datos (usualmente
una base de datos relacional) usando el lenguaje de programacin Java. Esta API incluye un mbito donde
diferentes drivers pueden ser instalados dinmicamente para acceder a diferentes fuentes de datos.
Aunque la JDBC API est preparada principalmente para pasar sentencias SQL a una base de datos,
permite leer y escribir datos desde cualquier fuente de datos con un formato tabular.
El paquete java.sql contiene el interface de programacin para lo siguiente (la informacin que se
muestra a continuacin est obtenida directamente de la documentacin de la API):

Making a connection with a database via the DriverManager facility

DriverManager class -- makes a connection with a driver

Driver interface -- provides the API for registering and connecting drivers based on JDBC
technology ("JDBC drivers"); generally used only by the DriverManager class

DriverPropertyInfo class -- provides properties for a JDBC driver; not used by the general
user

Sending SQL statements to a database

Statement -- used to send basic SQL statements

PreparedStatement -- used to send prepared statements or basic SQL statements (derived from
Statement)

CallableStatement

--

used

to

call

database

stored

procedures

(derived

from

PreparedStatement)

Retrieving and updating the results of a query

Connection interface -- provides methods for creating statements and managing connections and
their properties
ResultSet interface

Standard mappings for SQL types to classes and interfaces in Java programming language

Date class -- mapping for SQL DATE

Time class -- mapping for SQL TIME

Timestamp class -- mapping for SQL TIMESTAMP

Types class -- provides constants for SQL types

Metadata

DatabaseMetaData interface -- provides information about the database

76

Informtica II

ResultSetMetaData interface -- provides information about the columns of a ResultSet


object

Exceptions

SQLException -- thrown by most methods when there is a problem accessing data and by some
methods for other reasons

SQLWarning -- thrown to indicate a warning

DataTruncation -- thrown to indicate that data may have been truncated

Interface Index

Class Index

Exception Index

CallableStatement

Date

DataTruncation

Connection

DriverManager

SQLException

DatabaseMetaData

DriverPropertyInfo

SQLWarning

Driver

Time

PreparedStatement

Timestamp

ResultSet

Types

ResultSetMetaData
Statement
Tabla 8.1. JDBC API

8.2.2. DriverManager
La clase DriverManager es la capa gestora de JDBC, trabajando entre el usuario y el controlador
(driver). Se encarga de seguir el rastro de los controladores que estn disponibles y establecer la conexin
entre la base de datos y el controlador apropiado.
La clase DriverManager mantiene una lista de clases Driver que se han registrado llamando al
mtodo DriverManager.registerDriver. Un usuario normalmente no llamar al mtodo
DriverManager.registerDriver directamente, sino que ser llamado automticamente por el
controlador (driver) cuando este se carga. El usuario lo que hace es forzar que se cargue el driver, lo cual
puede hacerse de dos formas, aunque la recomendada es llamando al mtodo Class.forName(). Esto
carga
la
clase
driver
explcitamente.
La
siguiente
sentencia
carga
la
clase
sun.jdbc.odbc.JdbcOdbcDriver, que permite usar el Puente JDBC-ODBC:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

Captulo 8. JDBC: acceso a bases de datos

77

La clase sun.jdbc.odbc.JdbcOdbcDriver ha sido escrita de forma que al cargarla crea una


instancia de ella y llama a DriverManager.registerDriver con esa instancia como parmetro y
entonces es aadida a la lista de drivers de DriverManager y est disponible para crear una conexin a
una base de datos.

Connection

createStatement

prepareStatement

prepareCall

subclasses
Statement

subclasses
PreparedStatement

CallableStatement

Data Types

executeQuery

executeQuery

executeQuery
getXXX

getMoreResults
getResultSet

ResultSet
Figura 8.2. Relacin entre las principales clases e interface en el paquete java.sql

8.2.3. Connection
Un objeto Connection representa una conexin a una base de datos. Una sesin con una conexin
incluye las sentencias SQL que son ejecutadas y los resultados que son devueltos a travs de dicha
conexin. Una misma aplicacin puede tener una o ms conexiones con una sola base de datos o puede
tener conexiones con varias bases de datos diferentes.
La forma estndar de establecer una conexin con una base de datos es llamando al mtodo
DriverManager.getConnection. Este mtodo toma como parmetro una cadena de caracteres que
contiene una URL. La clase DriverManage trata de localizar el driver que pueda conectar con la base de
datos representada por esa URL.
El siguiente cdigo ejemplifica cmo abrir una conexin a una base de datos localizada en la URL
jdbc:odbc:wombat:
String url = ?jdbc:odbc:wombat?;
Connection con = DriverManager.getConnection(url);
Una URL de JDBC facilita una forma de identificar una base de datos de forma que el driver apropiado
la reconozca y establezca una conexin con ella. La sintaxis estndar para URLs de JDBC es la siguiente:
jdbc:<subprotocolo>:<subnombre>
Una URL de JDBC tiene tres partes separadas por dos puntos:
jdbc es el protocolo. El protocolo en una URL JDBC es siempre jdbc.
<subprotocolo> es usualmente el driver o el mecanismo de conectividad de la base de datos, el cual debe
ser soportado por uno o ms drivers. Un ejemplo de un subprotocolo es odbc, que ha sido reservado para

78

Informtica II

URLs que especifican fuentes de datos de ODBC. Por ejemplo, para acceder a una base de datos a travs
del Puente JDBC-ODBC se usar una URL como la siguiente:
jdbc:odbc:fred
donde el subprotocolo es odbc y el subnombre es fred, una fuente de datos ODBC.
<subnombre> es una forma de identificar la base de datos. Puede variar dependiendo del subprotocolo y
puede tener un subsubnombre con cualquier sintaxis interna que el programador del driver haya elegido.
La funcin del <subnombre> es dar la suficiente informacin para localizar la base de datos.
8.2.4. Statement
Un objeto Statement se usa para enviar sentencias SQL a una base de datos. Una vez que se ha
establecido una conexin con una base de datos particular, esa conexin puede ser usada para enviar
sentencias SQL. Un objeto Statement se crea con el mtodo creatStatement de Connection como
en el siguiente fragmento de cdigo:
Connection con = DriverManager.getConnection(url);
Statement stmt = con.createStatement();
La sentencia SQL que ser enviada a la base de datos es proporcionada como argumento a uno de los
mtodos para ejecutar un objeto Statement:
ResultSet rs = stmt.executeQuery(?SELECT a, b, c FROM Table2?);
8.2.5. ResultSet
Un ResultSet contiene todos los registros (filas) que satisfacen las condiciones impuestas en una
sentencia SQL y proporciona acceso a los datos en dichos registros a travs de un conjunto de mtodos
get que permiten acceder a los diferentes campos o atributos (columnas) del registro actual. Un
ResultSet mantiene un cursor que apunta al registro actual. El mtodo ResultSet.next() se usa para
moverse al siguiente registro del ResultSet, haciendo el siguiente registro el registro actual.
Los mtodos getXXX proporcionan los medios para obtener los valores de los campos, atributos o
columnas del registro actual. Para cada registro, los valores de las columnas pueden ser obtenidos en
cualquier orden, pero para la mayor portabilidad, se debe hacer de izquierda a derecha y leer el valor de
la columna slo una vez. Tanto el nombre de la columna como el nmero de esta puede ser usado para
designar la columna de la cual se quiere obtener el valor. Si en el ejemplo anterior la columna a es de
tipo entero, la b del tipo cadena de caracteres y la c de tipo coma flotante, la siguiente porcin de
cdigo imprimira los valores de todos los registros:
while(rs.next()){
int i = rs.getInt(a);
String s = rs.getString(b);
Float f = rs.getFloat(c);
System.out.println(ROW= + i + + s + + f);
}

8.3. Empezando con JDBC


Mediante unos ejemplos vamos a introducirnos en la utilizacin de la API de JDBC. Para acceder a la
base de datos vamos a utilizar el Puente JDBC-ODBC suministrado junto al Java Software Development Kit.
Primeramente, vamos a crear una base de datos tipo Access a la cual accederemos y un DSN (Data
Source Name) en ODBC de conexin a dicha base de datos. El DSN ser necesario para que el driver
localice la base de datos.
8.3.1. Base de datos en formato Access
Supongamos que hemos creado una base de datos en Access con el nombre Libros.mdb (las bases de
datos en formato Access tienen extensin *.mdb) que contiene una tabla denominada Datos que tiene
como campos: Codigo, Titulo y Autor, todos ellos de tipo texto. Adems hemos rellenado la tabla con
datos de libros.

Captulo 8. JDBC: acceso a bases de datos

79

Figura 8.3. Forma de presentar las tablas de Microsoft Access

8.3.2. Creacin de un Data Source Name (DSN)


Un Data Source Name (DSN) en ODBC es una Fuente de Datos de ODBC, que nos indica el tipo y la
localizacin de la base de datos para que ms tarde podamos acceder a ella mediante el Puente JDBCODBC desde nuestro programa en Java, lo cual simplifica enormemente la conexin, que queda en manos
del driver.
La creacin de un DSN vara segn los sistemas. Nosotros vamos a ver cmo se crea en un sistema
Windows. Los pasos a seguir son los siguientes:
Abrir el administrador de ODBC desde el Control Panel (Start/Settings) o mediante Start/Run... y
ejecutando odbcad32. En Windows 2000 se encuentra en Control Panel/Administrative Tools/Data
Sources (DSN). En las salas de ordenadores habr que buscar el ejecutable con el explorador
(C:\WinNT\System32\Odbcad32.exe) y ejecutarlo haciendo doble clic sobre l.
Aadir un nuevo Data Source Name (DSN) mediante el botn Add y seleccionar el driver de Microsoft
Access en la siguiente ventana.
Dar un nombre al DSN (en este caso pruebaODBC) y pulsando el botn Select asignarle la base de datos
que se ha creado anteriormente (Libros.mdb).
El proceso completo de creacin de un DSN se puede ver en la figura 6.4.
8.3.3. Ejemplo de una aplicacin JDBC simple
Este primer ejemplo tiene como objetivo mostrar la utilizacin del paquete java.sql y realiza un
proceso completo de registrar el Puente JDBC-ODBC, crear una conexin a una base de datos tipo Access a
travs de dicho driver, enviar una sentencia SQL a la base de datos a travs de dicha conexin y por
ltimo leer y mostrar los resultados de la consulta SQL.
El programa recibe como primer argumento el Data Source Name (DSN) de ODBC que hemos creado
antes, la sentencia SQL entre comillas que queremos enviar a la base de datos como segundo argumento y
despus como argumentos tercero, cuarto, etc., los nombre de los campos que queremos que nos muestre
al imprimir los registros obtenidos de la base de datos.
Una vez escrito el programa en un editor de texto y despus de haberlo guardado con el nombre
firstJDBC.java, debemos compilarlo con la instruccin ya familiar:
javac firstJDBC.java
Para ejecutarlo, la instruccin que debemos usar tiene la siguiente forma:
java firstJDBC DataSourceName "Sentencia SQL" [Campo1 Campo2 ...]

80

Informtica II

Figura 8.4. Proceso de creacin de un DSN

Los corchetes indican que se trata de argumentos opcionales. Probemos a pasarle como parmetros
distintas sentencias SQL para irnos familiarizando con el uso del SQL:
java firstJDBC pruebaODBC SELECT * FROM Datos ORDER BY Codigo Codigo Titulo Autor

La salida ser la siguiente:


C001|La estructura de las revoluciones cientficas|Thomas S. Kuhn
C002|Sobre la teora de la relatividad especial y general|Albert Einstein
C003|Historia del tiempo|Stephen W. Hawking
C004|La nueva mente del Emperador|Roger Penrose
C005|Killing Time|Paul Feyerabend
N001|El perfume|Patrick Sskind
N002|Orgullo y prejuicio|Jane Austen
N003|El pndulo de Foucault|Umberto Eco
N004|El Proceso|Franz Kafka
N005|Baudolino|Umberto Eco
...
Una sentencia SQL un poco ms compleja involucra seleccin de registros que cumplan condiciones en
alguno de sus campos, como es el caso siguiente, que selecciona todos los registros cuyo cdigo empiece
por la letra C:
java firstJDBC pruebaODBC SELECT * FROM Datos WHERE Codigo Like C% ORDER
BY Autor Codigo Tirulo Autor
La salida ser la siguiente:
C002|Sobre la teora de la relatividad especial y general|Albert Einstein
C005|Killing Time|Paul Feyerabend
C004|La nueva mente del Emperador|Roger Penrose
C003|Historia del tiempo|Stephen W. Hawking
C001|La estructura de las revoluciones cientficas|Thomas S. Kuhn

Captulo 8. JDBC: acceso a bases de datos

81

Ejemplo 1:
import java.sql.*;
class firstJDBC {
public static void main(String args[]) throws ClassNotFoundException,
SQLException {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url="jdbc:odbc:" + args[0];
Connection connection=DriverManager.getConnection(url);
Statement statement=connection.createStatement();
String sql = args[1];
ResultSet result=statement.executeQuery(sql);
while(result.next()) {
for(int i=2;i<args.length;++i) {
if(i<args.length-1)
System.out.print (result.getString(args[i])+"|");
else
System.out.println (result.getString(args[i]));
}
}
connection.close();
}
}
8.3.4. Ejemplo de una aplicacin JDBC con excepciones y MetaData
El siguiente ejemplo introduce ms funcionalidades al ejemplo anterior. Una de ellas es que se pueden
conocer las caractersticas de los campos que la base de datos devuelve a partir de una sentencia SQL en
un objeto ResultSet. La otra caracterstica aadida es el manejo de excepciones.
Para ejecutar este segundo ejemplo ms elaborado, la instruccin que debemos usar tiene la siguiente
forma:
java ResultAppSQL DataSourceName "Sentencia SQL"
Como se puede ver ya no es necesario pasar como argumentos los campos que queremos que se
muestren. Dichos campos ya vienen explcitamente en la sentencia SQL que le pasamos a la base de datos
y, a diferencia del ejemplo 1, hemos dotado al programa de la capacidad para reconocer dichos campos y
mostrarlos con su nombre. Todo esto es posible gracias a la interface ResultSetMetaData, de la API de
JDBC.
Probemos este nuevo programa, pues, con la siguiente sentencia y tratemos de entender lo que est
haciendo el programa (es muy recomendable tener presente la ayuda de la API de Java donde tambin
encontraremos las clases correspondientes a JDBC):
java ResultAppSQL pruebaODBC SELECT * FROM Datos WHERE Codigo Like C%
ORDER BY Autor
La salida en este caso ser la siguiente:
Codigo|Titulo|Autor
C002|Sobre la teora de la relatividad especial y general|Albert Einstein
C005|Killing Time|Paul Feyerabend
C004|La nueva mente del Emperador|Roger Penrose
C003|Historia del tiempo|Stephen W. Hawking
C001|La estructura de las revoluciones cientficas|Thomas S. Kuhn
Adems, hemos dotado al programa de la capacidad para manejar excepciones lanzadas por las classes
de la API de JDBC, de tal forma que cuando se produzca una excepcin, el programa mostrar un mensaje
como el siguiente:
Error de SQLException: Texto explicativo de la excepcin (lanzado por Java)

82

Informtica II

Ejemplo 2:
import java.sql.*;
class ResultAppSQL {
public static void main(String args[]) {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException ex) {
System.out.println("Error de ClassNotFoundException" + ex);
System.exit(0);
}
String url="jdbc:odbc:" + args[0];
try {
Connection connection=DriverManager.getConnection(url);
Statement statement=connection.createStatement();
String sql = args[1];
ResultSet result=statement.executeQuery(sql);
ResultSetMetaData rmeta=result.getMetaData();
int numColumns=rmeta.getColumnCount();
for(int i=1;i<=numColumns;++i) {
if(i<numColumns)
System.out.print(rmeta.getColumnName(i)+"|");
else
System.out.println(rmeta.getColumnName(i));
}
while(result.next()) {
for(int i=1;i<=numColumns;++i) {
if(i<numColumns)
System.out.print
(result.getString(rmeta.getColumnName(i))+"|");
else
System.out.println
(result.getString(rmeta.getColumnName(i)));
}
}
connection.close();
}
catch(SQLException ex) {
System.out.println("Error de SQLException:" + ex);
System.exit(0);
}
}
}
De esta forma, cuando se introduce una sentencia SQL errnea, el programa mostrar un aviso que nos
dir qu es lo que est pasando. Bien, probemos las siguientes sentencia:
java ResultAppSQL pruebaODBC " "
La respuesta del programa ser la siguiente:
Error
de
SQLException:java.sql.SQLException:
[Microsoft][ODBC
Microsoft
Access Driver] Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE',
'SELECT', or 'UPDATE'.

Captulo 8. JDBC: acceso a bases de datos

83

Introduzcamos un error en la propia sentencia SQL, una tabla que no existe:


C:\tmp\JDBC>java ResultAppSQL pruebaODBC "SELECT * FROM OtraTabla"
La respuesta del programa en este caso ser:
Error
de
SQLException:java.sql.SQLException:
[Microsoft][ODBC
Microsoft
Access Driver] The Microsoft Jet database engine cannot find the input table or
query 'OtraTabla'. Make sure it exists and that its name is spelled correctly.
Introduzcamos otro error en la propia sentencia SQL, concerniente a un campo inexistente:
C:\tmp\JDBC>java ResultAppSQL pruebaODBC "SELECT Precio FROM Datos"
La respuesta del programa en este caso ser:
Error
de
SQLException:java.sql.SQLException:
Access Driver] Too few parameters. Expected 1.

[Microsoft][ODBC

Microsoft

CAPTULO 9

9. Servlets
9.1. Clientes y Servidores
9.1.1. Clientes (clients)
Por su versatilidad y potencialidad, en la actualidad la mayora de los usuarios de Internet utilizan en
sus comunicaciones con los servidores de datos, los browsers o navegadores. Esto no significa que no
puedan emplearse otro tipo de programas como clientes e-mail, news, etc. para aplicaciones ms
especficas. De hecho, los browsers ms utilizados incorporan lectores de mail y de news.
En la actualidad los browsers ms extendidos son Netscape Communicator y Microsoft Internet
Explorer. Ambos acaparan una cuota de mercado que cubre prcticamente a todos los usuarios.
A pesar de que ambos cumplen con la mayora de los estndares aceptados en la Internet, cada uno de
ellos proporciona soluciones adicionales a problemas ms especficos. Por este motivo, muchas veces ser
necesario tener en cuenta qu tipo de browser se va a comunicar con un servidor, pues el resultado puede
ser distinto dependiendo del browser empleado, lo cual puede dar lugar a errores.
Ambos browsers soportan Java, lo cual implica que disponen de una Java Virtual Machine en la que
se ejecutan los ficheros *.class de las Applets que traen a travs de Internet. Netscape es ms fiel al
estndar de Java tal y como lo define Sun, pero ambos tienen la posibilidad de sustituir la Java Virtual
Machine por medio de un mecanismo definido por Sun, que se llama Java Plug-in (los plug-ins son
aplicaciones que se ejecutan controladas por los browsers y que permiten extender sus capacidades, por
ejemplo para soportar nuevos formatos de audio o video).
9.1.2. Servidores (servers)
Los servidores son programas que se encuentran permanentemente esperando a que algn otro
ordenador realice una solicitud de conexin. En un mismo ordenador es posible tener simultneamente
servidores de los distintos servicios anteriormente mencionados (HTTP, FTP, TELNET, etc.). Cuando a
dicho ordenador llega un requerimiento de servicio enviado por otro ordenador de la red, se interpreta el
tipo de llamada, y se pasa el control de la conexin al servidor correspondiente a dicho requerimiento. En
caso de no tener el servidor adecuado para responder a la comunicacin, est ser rechazada.
Como ya se ha apuntado, no todos los servicios actan de igual manera. Algunos, como TELNET y FTP,
una vez establecida la conexin, la mantienen hasta que el cliente o el servidor explcitamente la cortan.
Por ejemplo, cuando se establece una conexin con un servidor de FTP, los dos ordenadores se mantienen
en contacto hasta que el cliente cierre la conexin mediante el comando correspondiente (quit, exit, )
o pase un tiempo establecido en la configuracin del servidor FTP o del propio cliente, sin ninguna
actividad entre ambos.
La comunicacin a travs del protocolo HTTP es diferente, ya que es necesario establecer una
comunicacin o conexin distinta para cada elemento que se desea leer. Esto significa que en un
documento HTML con 10 imgenes son necesarias 11 conexiones distintas con el servidor HTTP, esto es,
una para el texto del documento HTML con las tags y las otras 10 para traer las imgenes referenciadas en
el documento HTML.
La mayora de los usuarios de Internet son clientes que acceden mediante un browser a los distintos
servidores WWW presentes en la red. El servidor no permite acceder indiscriminadamente a todos sus
ficheros, sino nicamente a determinados directorios y documentos previamente establecidos por el
administrador de dicho servidor.

86

Informtica II

9.2. Tendencias Actuales para las aplicaciones en Internet


En la actualidad, la mayora de aplicaciones que se utilizan en entornos empresariales estn
construidos en torno a una arquitectura cliente-servidor, en la cual uno o varios computadores
(generalmente de una potencia considerable) son los servidores, que proporcionan servicios a un nmero
mucho ms grande de clientes conectados a travs de la red. Los clientes suelen ser PCs de propsito
general, de ordinario menos potentes y ms orientados al usuario final. A veces los servidores son
intermediarios entre los clientes y otros servidores ms especializados (por ejemplo los grandes servidores
de bases de datos corporativos basados en mainframes y/o sistemas Unix. En esta caso se habla se
aplicaciones de varias capas).
Con el auge de Internet, la arquitectura cliente-servidor ha adquirido una mayor relevancia, ya que la
misma es el principio bsico de funcionamiento de la World Wide Web: un usuario que mediante un
browser (cliente) solicita un servicio (pginas HTML, etc.) a un computador que hace las veces de
servidor. En su concepcin ms tradicional, los servidores HTTP se limitaban a enviar una pgina HTML
cuando el usuario la requera directamente o clicaba sobre un enlace. La interactividad de este proceso
era mnima, ya que el usuario poda pedir ficheros, pero no enviar sus datos personales de modo que
fueran almacenados en el servidor u obtuviera una respuesta personalizada. La Figura 9.1 representa
grficamente este concepto.

Solicita fichero HTML

Proporciona fichero HTML

Cliente

Servidor

Figura 9.1. Arquitectura cliente-servidor tradicional.


Desde esa primera concepcin del servidor HTTP como mero servidor de ficheros HTML el concepto ha
ido evolucionando en dos direcciones complementarias:
1. Aadir ms inteligencia en el servidor, y
2. Aadir ms inteligencia en el cliente.
Las formas ms extendidas de aadir inteligencia a los clientes (a las pginas HTML) han sido
Javascript y las applets de Java. Javascript es un lenguaje relativamente sencillo, interpretado, cuyo
cdigo fuente se introduce en la pgina HTML por medio de los tags <SCRIPT> </SCRIPT>. Las applets
de Java tienen mucha ms capacidad de aadir inteligencia a las pginas HTML que se visualizan en el
browser, ya que son verdaderas clases de Java (ficheros *.class) que se cargan y se ejecutan en el
cliente.
De cara a estos apuntes tienen mucho ms inters los caminos seguidos para aadir ms inteligencia en
el servidor HTTP. La primera y ms empleada tecnologa ha sido la de los programas CGI (Common
Gateway Interface), unida a los formularios HTML.
Los formularios HTML permiten de alguna manera invertir el sentido del flujo de la informacin.
Cumplimentando algunos campos con cajas de texto, botones de opcin y de seleccin, el usuario puede
definir sus preferencias o enviar sus datos al servidor. Cuando en un formulario HTML se pulsa en el botn
Enviar (o nombre equivalente, como Submit) los datos tecleados por el cliente se envan al servidor para
su procesamiento.
Cmo recibe el servidor los datos de un formulario y qu hace con ellos? ste es el problema que
tradicionalmente han resuelto los programas CGI. Cada formulario lleva incluido un campo llamado
Action con el que se asocia el nombre de programa en el servidor. El servidor arranca dicho programa y le
pasa los datos que han llegado con el formulario. Existen dos formas principales de pasar los datos del
formulario al programa CGI:

Captulo 9. Servlets

87

1. Por medio de una variable de entorno del sistema operativo del servidor, de tipo String (mtodo
GET)
2. Por medio de un flujo de caracteres que llega a travs de la entrada estndar (stdin o System.in),
que de ordinario est asociada al teclado (mtodo POST).
En ambos casos, la informacin introducida por el usuario en el formulario llega en la forma de una
nica cadena de caracteres en la que el nombre de cada campo del formulario se asocia con el valor
asignado por el usuario, y en la que los blancos y ciertos caracteres especiales se han sustituido por
secuencias de caracteres de acuerdo con una determinada codificacin. Ms adelante se vern con ms
detenimiento las reglas que gobiernan esta transmisin de informacin. En cualquier caso, lo primero que
tiene que hacer el programa CGI es decodificar esta informacin y separar los valores de los distintos
campos. Despus ya puede realizar su tarea especfica: escribir en un fichero o en una base de datos,
realizar una bsqueda de la informacin solicitada, realizar comprobaciones, etc. De ordinario, el
programa CGI termina enviando al cliente (el navegador desde el que se envi el formulario) una pgina
HTML en la que le informa de las tareas realizadas, le avisa de si se ha producido alguna dificultad, le
reclama algn dato pendiente o mal cumplimentado, etc. La forma de enviar esta pgina HTML al cliente
es a travs de la salida estndar (stduot o System.out), que de ordinario suele estar asociada a la
pantalla. La pgina HTML tiene que ser construida elemento a elemento, de acuerdo con las reglas de
este lenguaje. No basta enviar el contenido: hay que enviar tambin todas y cada una de las tags. En un
prximo apartado se ver un ejemplo completo.
En principio, los programas CGI pueden estar escritos en cualquier lenguaje de programacin, aunque
en la prctica se han utilizado principalmente los lenguajes Perl 2 y C/C++. Un claro ejemplo de un
programa CGI sera el de un formulario en el que el usuario introdujera sus datos personales para
registrarse en un sitio web. El programa CGI recibira los datos del usuario, introducindolos en la base de
datos correspondiente y devolviendo al usuario una pgina HTML donde se le informara de que sus datos
haban sido registrados. La Figura 9.2 muestra el esquema bsico de funcionamiento de los programas
CGI.
Es importante resaltar que estos procesos tienen lugar en el servidor. Esto a su vez puede resultar un
problema, ya que al tener mltiples clientes conectados al servidor, el programa CGI puede estar siendo
llamado simultneamente por varios clientes, con el riesgo de que el servidor se llegue a saturar. Tngase
en cuenta que cada vez que se recibe un requerimiento se arranca una nueva copia del programa CGI.
Existen otros riesgos adicionales que se estudiarn ms adelante.

Solicita servicio (con un


formulario, etc.)

Flujo de
entrada

Proporciona resultado
como flujo con formato
HTML

Proceso
interno en
el servidor
(servlet,
CGI, etc)

Flujo de
salida

Cliente

Servidor

Figura 9.2. Arquitectura cliente-servidor interactiva para la WEB.


El objetivo de este captulo es el estudio de la alternativa que Java ofrece a los programas CGI: los
servlets, que son a los servidores lo que los applets a los browsers. Se podra definir un servlet como un
programa escrito en Java que se ejecuta en el marco de un servicio de red, (un servidor HTTP, por
ejemplo), y que recibe y responde a las peticiones de uno o ms clientes.

PERL es un lenguaje interpretado procedente del entorno Unix (aunque tambin existe en Windows
NT), con grandes capacidades para manejar texto y cadenas de caracteres.

88

Informtica II

9.3. Diferencias entre las tecnologas CGI y Servlet


La tecnologa Servlet proporciona las mismas ventajas del lenguaje Java en cuanto a portabilidad
(write once, run anywhere) y seguridad, ya que un servlet es una clase de Java igual que cualquier
otra, y por tanto tiene en ese sentido todas las caractersticas del lenguaje. Esto es algo de lo que carecen
los programas CGI, ya que hay que compilarlos para el sistema operativo del servidor y no disponen en
muchos casos de tcnicas de comprobacin dinmica de errores en tiempo de ejecucin.
Otra de las principales ventajas de los servlets con respecto a los programas CGI, es la del
rendimiento, y esto a pesar de que Java no es un lenguaje particularmente rpido. Mientras que los es
necesario cargar los programas CGI tantas veces como peticiones de servicio existan por parte de los
clientes, los servlets, una vez que son llamados por primera vez, quedan activos en la memoria del
servidor hasta que el programa que controla el servidor los desactiva. De esta manera se minimiza en
gran medida el tiempo de respuesta.
Adems, los servlets se benefician de la gran capacidad de Java para ejecutar mtodos en
ordenadores remotos, para conectar con bases de datos, para la seguridad en la informacin, etc. Se
podra decir que las clases estndar de Java ofrecen resueltos mucho problemas que con otros lenguajes
tiene que resolver el programador.

9.4. Caractersticas de los servlets


Adems de las caractersticas indicadas en el apartado anterior, los servlets tienen las siguientes
caractersticas:
1. Son independientes del servidor utilizado y de su sistema operativo, lo que quiere decir que a pesar
de estar escritos en Java, el servidor puede estar escrito en cualquier lenguaje de programacin,
obtenindose exactamente el mismo resultado que si lo estuviera en Java.
2. Los servlets pueden llamar a otros servlets, e incluso a mtodos concretos de otros servlets. De
esta forma se puede distribuir de forma ms eficiente el trabajo a realizar. Por ejemplo, se podra
tener un servlet encargado de la interaccin con los clientes y que llamara a otro servlet para que
a su vez se encargara de la comunicacin con una base de datos. De igual forma, los servlets
permiten redireccionar peticiones de servicios a otros servlets (en la misma mquina o en una
mquina remota).
3. Los servlets pueden obtener fcilmente informacin acerca del cliente (la permitida por el
protocolo HTTP), tal como su direccin IP, el puerto que se utiliza en la llamada, el mtodo
utilizado (GET, POST, ...), etc.
4. Permiten adems la utilizacin de cookies y sesiones, de forma que se puede guardar informacin
especfica acerca de un usuario determinado, personalizando de esta forma la interaccin clienteservidor. Una clara aplicacin es mantener la sesin con un cliente.
5. Los servlets pueden actuar como enlace entre el cliente y una o varias bases de datos en
arquitecturas cliente-servidor de 3 capas (si la base de datos est en un servidor distinto).
6. Asimismo, pueden realizar tareas de proxy para un applet. Debido a las restricciones de
seguridad, un applet no puede acceder directamente por ejemplo a un servidor de datos localizado
en cualquier mquina remota, pero el servlet s puede hacerlo de su parte.
7. Al igual que los programas CGI, los servlets permiten la generacin dinmica de cdigo HTML
dentro de una propia pgina HTML. As, pueden emplearse servlets para la creacin de
contadores, banners, etc.

9.5. JSDK 2.0


El JSDK (Java Servlet Developer Kit), distribuido gratuitamente por Sun, proporciona el conjunto de
herramientas necesarias para el desarrollo de servlets. Su instalacin se realiza a travs de un fichero de
950 Kbytes, llamado jsdk20-Win32.exe, que est disponible en la zona de recursos de la web la
asignatura. El JSDK consta bsicamente de 3 partes:
1. El API del JSDK, que se encuentra diseada como una extensin del JDK propiamente dicho.
Consta de dos packages cuyo funcionamiento ser estudiado en detalle en apartados posteriores, y
que se encuentran contenidos en javax.servlet y javax.servlet.http. Este ltimo es una
particularizacin del primero para el caso del protocolo HTTP, que es el que ser utilizado en este
manual, al ser el ms extendido en la actualidad. Mediante este diseo lo que se consigue es que

Captulo 9. Servlets

89

se mantenga una puerta abierta a la utilizacin de otros protocolos que existen en la actualidad
(FTP, POP, SMTP, etc.), o vayan siendo utilizados en el futuro. Estos packages estn almacenados
en un fichero JAR (\lib\jsdk.jar).
2. La documentacin propiamente dicha del API y el cdigo fuente de las clases (similar a la de los
JDK 1.1 y 1.2).
3. La aplicacin servletrunner, que es una simple utilidad que permite probar los servlets creados
sin necesidad de hacer complejas instalaciones de servidores HTTP.. Es similar en concepcin al
appletviewer del JDK. Su utilizacin ser descrita en un apartado posterior.
9.5.1. Visin general del API de JSDK 2.0
Es importante adquirir cuanto antes una visin general del API (Application Programming Interface) del
Java Servlet Development Kit 2.0, de qu clases e interfaces la constituyen y de cul es la relacin
entre ellas.
El JSDK 2.0 contiene dos paquetes: javax.servlet y javax.servlet.http. Todas las clases e interfaces
que hay que utilizar en la programacin de servlets estn en estos dos paquetes.
La relacin entre las clases e interfaces de Java, muy determinada por el concepto de herencia, se
entiende mucho mejor mediante una representacin grfica tal como la que puede verse en la Figura 9.3.
En dicha figura se representan las clases con letra normal y las interfaces con cursiva.
Object

Servlet
init(), destroy()
abstract service(ServletRequest rq, ServletResponse rp)
ServletConfig getServletConfig(), String getServletInfo()

ServletConfig
ServletContext getServletContext()
String getInitParameter(String)
Enumeration getInitParameterNames()

GenericServlet
GenericServlet()
init(), destroy(), service(ServletRequest rq, ServletResponse rp)
ServletConfig getServletConfig(), ServletContext getServletContext()

HttpServlet
HttpServlet()
service(HttpServletRequest hrq, HttpServletResponse hrp)
doPost(), doGet(), doPut(), doDelete(), doOptions(), doTrace()

Figura 9.3. Jerarqua y mtodos de las principales clases para crear servlets.
La clase GenericServlet es una clase abstract puesto que su mtodo service() es abstract. Esta clase
implementa dos interfaces, de las cuales la ms importante es la interface Servlet.
La interface Servlet declara los mtodos ms importantes de cara a la vida de un servlet: init() que se
ejecuta slo al arrancar el servlet; destroy() que se ejecuta cuando va a ser destruido y service() que se
ejecutar cada vez que el servlet deba atender una solicitud de servicio.
Cualquier clase que derive de GenericServlet deber definir el mtodo service(). Es muy interesante
observar los dos argumentos que recibe este mtodo, correspondientes a las interfaces ServletRequest y
ServletResponse. La primera de ellas referencia a un objeto que describe por completo la solicitud de
servicio que se le enva al servlet. Si la solicitud de servicio viene de un formulario HTML, por medio de
ese objeto se puede acceder a los nombres de los campos y a los valores introducidos por el usuario;
puede tambin obtenerse cierta informacin sobre el cliente (ordenador y browser). El segundo
argumento es un objeto con una referencia de la interface ServletResponse, que constituye el camino
mediante el cual el mtodo service() se conecta de nuevo con el cliente y le comunica el resultado de su
solicitud. Adems, dicho mtodo deber realizar cuantas operaciones sean necesarias para desempear su
cometido: escribir y/o leer datos de un fichero, comunicarse con una base de datos, etc. El mtodo
service() es realmente el corazn del servlet.
En la prctica, salvo para desarrollos muy especializados, todos los servlets debern construirse a partir
de la clase HttpServlet, sub-clase de GenericServlet.
La clase HttpServlet ya no es abstract y dispone de una implementacin o definicin del mtodo
service(). Dicha implementacin detecta el tipo de servicio o mtodo HTTP que le ha sido solicitado
desde el browser y llama al mtodo adecuado de esa misma clase (doPost(), doGet(), etc.). Cuando el
programador crea una sub-clase de HttpServlet, por lo general no tiene que redefinir el mtodo
service(), sino uno de los mtodos ms especializados (normalmente doPost()), que tienen los mismos

90

Informtica II

argumentos que
ServletResponse.

service():

dos

objetos

referenciados

por

las

interfaces

ServletRequest

En la Figura 9.3 aparecen tambin algunas otras interfaces, cuyo papel se resume a continuacin.
1. La interface ServletContext permite a los servlets acceder a informacin sobre el entorno en que
se estn ejecutando.
2. La interface ServletConfig define mtodos que permiten pasar al servlet informacin sobre sus
parmetros de inicializacin.
3. La interface ServletRequest permite al mtodo service() de GenericServlet obtener informacin
sobre una peticin de servicio recibida de un cliente. Algunos de los datos proporcionados por
GenericServlet son los nombres y valores de los parmetros enviados por el formulario HTML y una
input stream.
4. La interface ServletResponse permite al mtodo service() de GenericServlet enviar su respuesta
al cliente que ha solicitado el servicio. Esta interface dispone de mtodos para obtener un output
stream o un writer con los que enviar al cliente datos binarios o caracteres, respectivamente.
5. La interface HttpServletRequest deriva de ServletRequest. Esta interface permite a los mtodos
service(), doPost(), doGet(), etc. de la clase HttpServlet recibir una peticin de servicio HTTP.
Esta interface permite obtener informacin del header de la peticin de servicio HTTP.
6. La interface HttpServletResponse extiende ServletResponse. A travs de esta interface los
mtodos de HttpServlet envan informacin a los clientes que les han pedido algn servicio.
El API del JSDK 2.0 dispone de clases e interfaces adicionales, no citadas en este apartado. Algunas de
estas clases e interfaces sern consideradas en apartados posteriores.
9.5.2. La aplicacin servletrunner
Servletrunner es la utilidad que proporciona Sun conjuntamente con el JSDK. Es a los servlets lo que
el appletviewer a los applets. Sin embargo, es mucho ms til que appletviewer, porque mientras es
muy fcil disponer de un browser en el que comprobar las applets, no es tan sencillo instalar y disponer
de un servidor HTTP en el que comprobar los servlets. Por esta razn la aplicacin servletrunner, a
pesar de ser bastante bsica y poco configurable, es una herramienta muy til para el desarrollo de
servlets, pues se ejecuta desde la lnea de comandos del MS-DOS. Como es natural, una vez que se haya
probado debidamente el funcionamiento de los servlets, para una aplicacin en una empresa real sera
preciso emplear servidores HTTP profesionales.
Adems, servletrunner es multithread, lo que le permite gestionar mltiples peticiones a la vez.
Gracias a ello es posible ejecutar distintos servlets simultneamente o probar servlets que llaman a su
vez a otros servlets.
Una advertencia: servletrunner no carga de nuevo de modo automtico los servlets que hayan sido
actualizados externamente; es decir, si se cambia algo en el cdigo de un servlet y se vuelve a compilar,
al hacer una nueva llamada al mismo servletrunner utiliza la copia de la anterior versin del servlet que
tiene cargada. Para que cargue la nueva es necesario cerrar el servletrunner (Ctrl+C) y reiniciarlo otra
vez. Esta operacin habr que realizarla cada vez que se modifique el servlet.
Para asegurarse de que servletrunner tiene acceso a los packages del Servlet API, ser necesario
comprobar que la variable de entorno CLASSPATH contiene la ruta de acceso del fichero jsdk.jar en el
directorio \lib. En la plataforma Java 2 es ms sencillo simplemente copiar el JAR al directorio ext que
se encuentra en \jre\lib. Esto hace que los packages sean tratados como extensiones estndar de Java.
Tambin es necesario cambiar la variable PATH para que se encuentre la aplicacin servletrunner.exe.
Otra posibilidad es copiar esta aplicacin al directorio donde estn los dems ejecutables de Java (por
ejemplo c:\jdk117\bin).
9.5.3. Ficheros de propiedades
Servletrunner permite la utilizacin de ficheros que contienen las propiedades (properties) utilizadas
en la configuracin, creacin e inicializacin de los servlets. Las propiedades son pares del tipo
clave/valor. Por ejemplo, servlet.catalogo.codigo=ServletCatalogo es una propiedad cuya
clave es servlet.catalogo.codigo y cuyo valor es ServletCatalogo.
Existen dos propiedades muy importantes para los servlets:
servlet.nombre.code
servlet.nombre.initargs

Captulo 9. Servlets

91

La propiedad servlet.nombre.code debe contener el nombre completo de la clase del servlet,


incluyendo su package. Por ejemplo, la propiedad,
servlet.libros.code=basededatos.ServletLibros
asocia el nombre libros con la clase basededatos.ServletLibros.
La propiedad initargs contiene los parmetros de inicializacin del servlet. El valor de un nico
parmetro se establece en la forma nombreDeParametro=valorDeParametro. Es posible establecer el
valor de varios parmetros a la vez, pero el conjunto de la propiedad debe ser una nica lnea lgica. Por
tanto, para una mayor legibilidad ser preciso emplear el carcter barra invertida (\) para emplear varias
lneas del fichero. As, por ejemplo:
servlet.librodb.initArgs=\
fichero=servlets/Datos,\
usuario=administrador,\
...
Obsrvese que los distintos parmetros se encuentran separados por comas (,). El ltimo de los
parmetros no necesitar ninguna coma al final.
Todas estas propiedades estarn almacenadas en un fichero que por defecto tiene el nombre
servlet.properties (se puede especificar otro nombre en la lnea de comandos de servletrunner tal y
como se ver ms adelante). Se pueden incluir lneas de comentario, que debern comenzar por el
carcter (#). Por defecto, este fichero debe estar en el mismo directorio que el servlet, pero al ejecutar
servletrunner puede especificarse un nombre de fichero de propiedades con un path diferente.
9.5.4. Ejecucin de la aplicacin servletrunner
La aplicacin servletrunner se ejecuta desde la lnea de comandos de MS-DOS y admite los siguientes
parmetros (aparecen tecleando en la consola servletrunner ?):
-p
-m
-t
-d
-s

puerto al que escuchar


nmero mximo de conexiones
tiempo de desconexin en milisegundos
directorio en el que estn los servlets
nombre del fichero de propiedades

As por ejemplo, si se tuviera un servlet en el directorio c:\programas, el fichero de propiedades se


llamara ServletEjemplo.prop y se quisiera que el servletrunner estuviera escuchando el puerto 8000,
habra que escribir lo siguiente en la lnea de comandos:
C:\servletrunner -p 8000 -d c:\programas -s ServletEjemplo.prop

9.6. Ejemplo Introductorio


Para poder hacerse una idea del funcionamiento de un servlet y del aspecto que tienen los mismos, lo
mejor es estudiar un ejemplo sencillo. Imagnese que en una pgina web se desea recabar la opinin de un
visitante as como algunos de sus datos personales, con el fin de realizar un estudio estadstico. Dicha
informacin podra ser almacenada en una base de datos para su posterior estudio.
La primera tarea sera disear un formulario en el que el visitante pudiera introducir los datos. Este
paso es idntico a lo que se hara al escribir un programa CGI, ya que bastar con utilizar los tags que
proporciona el lenguaje HTML (<FORM>, <ACTION>, <TYPE>, etc.).
9.6.1. Instalacin del Java Servlet Development Kit (JSDK 2.0)
Para poder ejecutar este ejemplo es necesario que el JSDK 2.0 est correctamente instalado, bien en
el propio ordenador, bien en uno de los ordenadores de las Salas de PCs de la ESI. Para realizar esta
instalacin en un ordenador propio se pueden seguir los siguientes pasos:
En primer lugar se debe conseguir el fichero de instalacin, llamado jsdk20-win32.exe. Este fichero se
puede obtener de la zona de recursos de la pgina web de la asignatura. Se trata de un fichero de 950
Kbytes, que puede ser transportado en un disquete sin dificultad.
Se copia el fichero citado al directorio C:\Temp del propio ordenador. Se clica dos veces sobre dicho
fichero y comienza el proceso de instalacin.
Se determina el directorio en el que se realizar la instalacin. El programa de instalacin propone el
directorio C:\Jsdk2.0, que es perfectamente adecuado.

92

Informtica II

En el directorio C:\Jsdk2.0\bin aparece la aplicacin servletrunner.exe, que es muy importante como


se ha visto anteriormente. Para que esta aplicacin sea encontrada al teclear su nombre en la ventana de
MS-DOS es necesario que el nombre de dicho directorio aparezca en la variable de entorno PATH. Una
posibilidad es modificar de modo acorde dicha variable y otra copiar el fichero servletrunner.exe al
directorio donde estn los dems ejecutables de Java (por ejemplo C:\Jdk1.1.7\bin); como ese directorio
ya est en el PATH, la aplicacin servletrunner.exe ser encontrada sin dificultad. sta es la solucin
ms sencilla.
Adems de encontrar servletrunner.exe, tanto para compilar los servlets como para ejecutarlos con
servletrunner es necesario encontrar las clases e interfaces del API de JSDK 2.0. Estas clases pueden
estar por ejemplo en el archivo C:\Jsdk2.0\lib \jsdk.jar. Para que este archivo pueda ser localizado, es
necesario modificar la variable de entorno CLASSPATH. Esto se puede hacer en la forma:
set CLASSPATH=C:\Jsdk2.0\lib\jsdk.jar;%CLASSPATH%
9.6.2. Formulario
El formulario contendr dos campos de tipo TEXT donde el visitante introducir su nombre y apellidos.
A continuacin, deber indicar la opinin que le merece la pgina visitada eligiendo una entre tres
posibles (Buena, Regular o Mala). Por ltimo, se ofrece al usuario la posibilidad de escribir un
comentario si as lo considera oportuno. En la Figura 9.4 puede observarse el diseo del formulario
creado. El cdigo correspondiente a la pgina HTML que contiene este formulario es el siguiente (fichero
MiServlet.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://miServidor:8080/servlet/ServletOpinion" 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>
En el cdigo anterior, hay algunas cosas que merecen ser comentadas. En primer lugar, es necesario
asignar un identificador nico (es decir, un valor de la propiedad NAME) a cada uno de los campos del
formulario, ya que la informacin que reciba el servlet estar organizada en forma de pares de valores,
donde uno de los elementos de dicho par ser un String que contendr el nombre del campo. As, por
ejemplo, si se introdujera como nombre del visitante Mikel, el servlet recibira del browser el par
nombre=Mikel, que permitir acceder de una forma sencilla al nombre introducido mediante el mtodo
getParameter(), tal y como se explicar posteriormente al analizar el servlet del ejemplo introductorio.
Por este motivo es importante no utilizar nombres duplicados en los elementos de los formularios.
Por otra parte puede observarse que en el tag <FORM> se han utilizado dos propiedades, ACTION y
METHOD. El mtodo (METHOD) utilizado para la transmisin de datos es el mtodo HTTP POST. Tambin
se podra haber utilizado el mtodo HTTP GET, pero este mtodo tiene algunas limitaciones en cuanto al
volumen de datos transmisible, por lo que es recomendable utilizar el mtodo POST. Mediante la
propiedad ACTION deber especificarse el URL del servlet que debe procesar los datos. Este URL
contiene, en el ejemplo presentado, las siguientes caractersticas:

Captulo 9. Servlets

93

Figura 9.4. Diseo del formulario de adquisicin de datos.

El servlet se encuentra situado en un servidor cuyo nombre es miServidor (un ejemplo ms real
podra ser www.tecnun.es). Este nombre depender del ordenador que proporcione los servicios de
red. En cualquier caso, para poder hacer pruebas, se puede utilizar como nombre de servidor el host
local o localhost, o su nmero IP si se conoce. Por ejemplo, se podra escribir:
<FORM ACTION="http://localhost:8080/servlet/ServletOpinion" METHOD="POST">
o de otra forma,
<FORM ACTION="http://Numero_IP:8080/servlet/ServletOpinion" METHOD="POST">

El servidor HTTP est escuchando por el puerto el puerto 8080. Todas las llamadas utilizando
dicho puerto sern procesadas por el mdulo del servidor encargado de la gestin de los servlets. En
principio es factible la utilizacin de cualquier puerto libre del sistema, siempre que se indique al
servidor HTTP cul va a ser el puerto utilizado para dichas llamadas. Por diversos motivos, esto
ltimo debe ser configurado por el administrador del sistema.

El servlet se encuentra situado en un subdirectorio (virtual) del servidor llamado servlet. Este
nombre es en principio opcional, aunque la mayora de los servidores lo utilizan por defecto. En caso
de querer utilizar otro directorio, el servidor debe ser configurado por el administrador a tal fin. En
concreto, la aplicacin servletrunner de Sun no permite dicha modificacin, por lo que la URL
utilizada debe contener dicho nombre de directorio.

El nombre del servlet empleado es ServletOpinion, y es ste el que recibir la informacin enviada
por el cliente al servidor (el formulario en este caso), y quien se encargar de disear la respuesta,
que pasar al servidor para que este a su vez la enve de vuelta al cliente. Al final se ejecutar una
clase llamada ServletOpinion.class.

9.6.3. Cdigo del Servlet


Tal y como se ha mencionado con anterioridad, el servlet que gestionar toda la informacin del
formulario se llamar ServletOpinion. Como un servlet es una clase de Java, deber por tanto
encontrarse almacenado en un fichero con el nombre ServletOpinion.java. En cualquier caso, por hacer
lo ms simple posible este ejemplo introductorio, este servlet se limitar a responder al usuario con una
pgina HTML con la informacin introducida en el formulario, dejando para un posterior apartado el
estudio de cmo se almacenaran dichos datos. El cdigo fuente de la clase ServletOpinion es el
siguiente:

94

Informtica II

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ServletOpinion extends HttpServlet {
// Declaracin de variables miembro correspondientes a
// los campos del formulario
private String nombre=null;
private String apellidos=null;
private String opinion=null;
private String comentarios=null;

// Este mtodo se ejecuta una nica vez (al ser inicializado el servlet)
// Se suelen inicializar variables y realizar operaciones costosas en
// tiempo de ejecucin (abrir ficheros, bases de datos, etc)
public void init(ServletConfig config) throws ServletException {
// Llamada al mtodo init() de la superclase (GenericServlet)
// As se asegura una correcta inicializacin del servlet
super.init(config);
System.out.println("Iniciando ServletOpinion...");
} // fin del mtodo init()
// Este mtodo es llamado por el servidor web al "apagarse" (al hacer
// shutdown). Sirve para proporcionar una correcta desconexin de una
// base de datos, cerrar ficheros abiertos, etc.
public void destroy() {
System.out.println("No hay nada que hacer...");
} // fin del mtodo destroy()
// Mtodo llamado mediante un HTTP POST. Este mtodo se llama
// automticamente al ejecutar un formulario HTML
public void doPost (HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// Adquisicin de los valores del formulario a travs del objeto req
nombre=req.getParameter("nombre");
apellidos=req.getParameter("apellidos");
opinion=req.getParameter("opinion");
comentarios=req.getParameter("comentarios");
// Devolver al usuario una pgina HTML con los valores adquiridos
devolverPaginaHTML(resp);
} // fin del mtodo doPost()
public void devolverPaginaHTML(HttpServletResponse resp) {
// Se establece el tipo de contenido MIME de la respuesta
resp.setContentType("text/html");
// 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 genera el contenido de la pgina HTML
out.println("<html>");
out.println("<head>");
out.println("<title>Valores recogidos en el formulario</title>");
out.println("</head>");

Captulo 9. Servlets

95

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("</body>");
out.println("</html>");
// Se fuerza la descarga del buffer y se cierra el PrintWriter,
// liberando recursos de esta forma. IMPORTANTE
out.flush();
out.close();
} // fin de devolverPaginaHTML()

// Funcin que permite al servidor web obtener una 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 muestra en pantalla";
} // fin del mtodo getServletInfo()
}
El resultado obtenido en el browser tras la ejecucin del servlet puede apreciarse en la Figura 9.5. En
aras de una mayor simplicidad en esta primera aproximacin a los servlets, se ha evitado tratar de
conseguir un cdigo ms slido, que debera realizar las comprobaciones pertinentes (verificar que los
String no son null despus de leer el parmetro, excepciones que se pudieran dar, etc.) e informar al
usuario acerca de posibles errores en caso de que fuera necesario.

Figura 9.5. Pgina HTML devuelta por el servlet.


En cualquier caso, puede observarse que el aspecto del cdigo del servlet es muy similar al de
cualquier otra clase de Java. Sin embargo, cabe destacar algunos aspectos particulares:

La clase ServletOpinion hereda de la clase HttpServlet, que a su vez hereda de GenericServlet. La


forma ms sencilla (y por tanto la que debera ser siempre empleada) de crear un servlet, es heredar
de la clase HttpServlet. De esta forma se est identificando la clase como un servlet que se
conectar con un servidor HTTP. Ms adelante se estudiar esto con ms detalle.

El mtodo init() es el primero en ser ejecutado. Slo es ejecutado la primera vez que el servlet es
llamado. Se llama al mtodo init() de la super-clase GenericServlet a fin de que la inicializacin sea
completa y correcta. La interface ServletConfig proporciona la informacin que necesita el servlet
para inicializarse (parmetros de inicializacin, etc.).

96

Informtica II

El mtodo destroy() no tiene ninguna funcin en este servlet, ya que no se ha utilizado ningn
recurso adicional que necesite ser cerrado, pero tiene mucha importancia si lo que se busca es
proporcionar una descarga correcta del servlet de la memoria, de forma que no queden recursos
ocupados indebidamente, o haya conflictos entre recursos en uso. Tareas propias de este mtodo son,
por ejemplo, el cierre de las conexiones con otros ordenadores o con bases de datos.

Como el formulario HTML utiliza el mtodo HTTP POST para la transmisin de sus datos, habr que
redefinir el mtodo doPost(), que se encarga de procesar la respuesta y que tiene como argumentos
el objeto que contiene la peticin y el que contiene la respuesta (pertenecientes a las clases
HttpServletRequest y HttpServletResponse, respectivamente). Este mtodo ser llamado tras la
inicializacin del servlet (en caso de que no haya sido previamente inicializado), y contendr el
ncleo del cdigo del servlet (llamadas a otros servlets, llamadas a otros mtodos, etc.).

El mtodo getServletInfo() proporciona datos acerca del servlet (autor, fecha de creacin,
funcionamiento, etc.) al servidor web. No es en ningn caso obligatoria su utilizacin aunque puede
ser interesante cuando se tienen muchos servlets funcionando en un mismo servidor y puede resultar
compleja la identificacin de los mismos.

Por ltimo, el mtodo devolverPaginaHTML() es el encargado de mandar los valores recogidos del
cliente. En primer lugar es necesario tener un stream hacia el cliente (PrintWriter cuando haya que
mandar texto, ServletOutputStream para datos binarios). Posteriormente debe indicarse el tipo de
contenido MIME de aquello que va dirigido al cliente (text/html en el caso presentado). Estos dos
pasos son necesarios para poder enviar correctamente los datos al cliente. Finalmente, mediante el
mtodo println() se va generando la pgina HTML propiamente dicha (en forma de String).

Puede sorprender la forma en que ha sido enviada la pgina HTML como String. Podra parecer ms
lgico generar un String en la forma (concatenacin de Strings),
String texto=<html><head> +...+"<b>Nombre:</b>" + nombre + "</font>...
y despus escribirlo en el stream o flujo de salida. Sin embargo, uno de los parmetros a tener en
cuenta en los servlets es el tiempo de respuesta, que tiene que ser el mnimo posible. En este sentido,
la creacin de un String mediante concatenacin es bastante costosa, pues cada vez que se
concatenan dos Strings mediante el signo + se estn convirtiendo a StringBuffers y a su vez creando
un nuevo String, lo que utilizado profusamente requiere ms recursos que lo que se ha hecho en el
ejemplo, donde se han escrito directamente mediante el mtodo println().

El esquema mencionado en este ejemplo se repite en la mayora de los servlets y es el fundamento de


esta tecnologa. En posteriores apartados se efectuar un estudio ms detallado de las clases y mtodos
empleados en este pequeo ejemplo.

9.7. El Servlet API 2.0


El Java Servlet API 2.0 es una extensin al API de Java 1.1.x, y tambin de Java 2. Contiene los
paquetes javax.servlet y javax.servlet.http. El API proporciona soporte en cuatro reas:
1. Control del ciclo de vida de un servlet: clase GenericServlet
2. Acceso al contexto del servlet (servlet context)
3. Clases de utilidades
4. Clases de soporte especficas para HTTP: clase HttpServlet
9.7.1. El ciclo de vida de un servlet: clase GenericServlet
La clase GenericServlet es una clase abstract porque declara el mtodo service() como abstract.
Aunque los servlets desarrollados en conexin con pginas web suelen derivar de la clase HttpServlet,
puede ser til estudiar el ciclo de vida de un servlet en relacin con los mtodos de la clase
GenericServlet. Esto es lo que se har en los apartados siguientes. Adems, la clase HttpServlet hereda
los mtodos de GenericServlet y define el mtodo service().
Los servlets se ejecutan en el servidor HTTP como parte integrante del propio proceso del servidor.
Por este motivo, el servidor HTTP es el responsable de la inicializacin, llamada y destruccin de cada
objeto de un servlet, tal y como puede observarse en la Figura 9.6.
Un servidor web se comunica con un servlet mediante la los mtodos de la interface
javax.servlet.Servlet. Esta interface est constituida bsicamente por tres mtodos principales, alguno
de los cuales ya se ha utilizado en el ejemplo introductorio:

Captulo 9. Servlets

97

init(), destroy() y service()


y por dos mtodos algo menos importantes:

getServletConfig(), getServletInfo()
Carga

Servidor

Servlet

Peticin

Cliente

Respuesta

Servlet

Peticin

Servidor
Cliente

Respuesta

Descarga

Servidor

Servlet

Figura 9.6. Ciclo de vida de un servlet.


9.7.1.1. El mtodo init() en la clase GenericServlet
Cuando un servlet es cargado por primera vez, el mtodo init() es llamado por el servidor HTTP. Este
mtodo no ser llamado nunca ms mientras el servlet se est ejecutando. Esto permite al servlet
efectuar cualquier operacin de inicializacin potencialmente costosa en trminos de CPU, ya que sta
slo se ejecutar la primera vez. Esto es una ventaja importante frente a los programas CGI, que son
cargados en memoria cada vez que hay una peticin por parte del cliente. Por ejemplo, si en un da hay
500 consultas a una base de datos, mediante un CGI habra que abrir una conexin con la base de datos
500 veces, frente a una nica apertura que sera necesaria con un servlet, pues dicha conexin podra
quedar abierta a la espera de recibir nuevas peticiones.
Si el servidor permite pre-cargar los servlets, el mtodo init() ser llamado al iniciarse el servidor. Si
el servidor no tiene esa posibilidad, ser llamado la primera vez que haya una peticin por parte de un
cliente.
El mtodo init() tiene un nico argumento, que es una referencia a un objeto de la interface
ServletConfig, que proporciona los argumentos de inicializacin del servlet. Este objeto dispone del
mtodo getServletContext() que devuelve una referencia de la interface ServletContext, que a su vez
contiene informacin acerca del entorno en el que se est ejecutando el servlet.
Siempre que se redefina el mtodo init() de la clase base GenericServlet (o de HttpServlet, que lo
hereda de GenericServlet), ser preciso llamar al mtodo init() de la super-clase, a fin de garantizar que
la inicializacin se efecte correctamente. Por ejemplo:
public void init (ServletConfig config) throws ServletException {
// Llamada al mtodo init de la superclase
super.init(config);
System.out.println("Iniciando...");
// Definicin de variables
...
// Apertura de conexiones, ficheros, etc.
...
}
El servidor garantiza que el mtodo init() termina su ejecucin antes de que sea llamado cualquier
otro mtodo del servlet.

98

Informtica II

9.7.1.2. El mtodo service() en la clase GenericServlet


Este mtodo es el ncleo fundamental del servlet. Recurdese que es abstract en GenericServlet, por
lo que si el servlet deriva de esta clase deber ser definido por el programador. Cada peticin por parte
del cliente se traduce en una llamada al mtodo service() del servlet. El mtodo service() lee la peticin
y debe producir una respuesta en base a los dos argumentos que recibe:

Un objeto de la interface ServletRequest con datos enviados por el cliente. Estos incluyen parejas de
parmetros clave/valor y un InputStream. Hay diversos mtodos que proporcionan informacin acerca
del cliente y de la peticin efectuado por el mismo, entre otros los mostrados en la Tabla 9.1.

Un objeto de la interface ServletResponse, que encapsula la respuesta del servlet al cliente. En el


proceso de preparacin de la respuesta, es necesario llamar al mtodo setContentType(), a fin de
establecer el tipo de contenido MIME de la respuesta. La Tabla 9.2 indica los mtodos de la interface
ServletResponse.

Puede observarse en la Tabla 9.1 que hay dos formas de recibir la informacin de un formulario HTML
en un servlet. La primera de ellas consiste en obtener los valores de los parmetros (mtodos
getParameterNames() y getParameterValues()) y la segunda en recibir la informacin mediante un
InputStream o un Reader y hacer por uno mismo su particin decodificacin.
El cometido del mtodo service() es conceptualmente bastante simple: genera una respuesta por cada
peticin recibida de un cliente. Es importante tener en cuenta que puede haber mltiples respuestas que
estn siendo procesadas al mismo tiempo, pues los servlets son multithread. Esto hace que haya que ser
especialmente cuidadoso con los threads, para evitar por ejemplo que haya dos objetos de un servlet
escribiendo simultneamente en un mismo campo de una base de datos.
A pesar de la importancia del mtodo service(), en general es no es aconsejable su definicin (no
queda ms remedio que hacerlo si la clase del servlet deriva de GenericServlet, pero lo lgico es que el
programador derive las clases de sus servlets de HttpServlet). El motivo es simple: la clase HttpServlet
define service() de una forma ms que adecuada, llamando a otros mtodos (doPost(), doGet(), etc.) que
son los que tiene que redefinir el programador. La forma de esta redefinicin ser estudiada en apartados
posteriores.
9.7.1.3. El mtodo destroy() en la clase GenericServlet:
Una buena implementacin de este mtodo debe permitir que el servlet concluya sus tareas de forma
ordenada. De esta forma, es posible liberar recursos (ficheros abiertos, conexiones con bases de datos,
etc.) de una forma limpia y segura. Cuando esto no es necesario o importante, no har falta redefinir el
mtodo destroy().
Puede suceder que al llamar al mtodo destroy() haya peticiones de servicio que estn todava siendo
ejecutadas por el mtodo service(), lo que podra provocar un fallo general del sistema. Por este motivo,
es conveniente escribir el mtodo destroy() de forma que se retrase la liberacin de recursos hasta que
no hayan concluido todas las llamadas al mtodo service(). A continuacin se presenta una forma de
lograr una correcta descarga del servlet:
En primer lugar, es preciso saber si existe alguna llamada al mtodo service() pendiente de ejecucin,
para lo cual se debe llevar un contador con las llamadas activas a dicho mtodo.
Aunque en general es poco recomendable redefinir service() (en caso de tratarse de un servlet que
derive de HttpServlet). Sin embargo, en este caso s resulta conveniente su redefinicin, para poder saber
cundo ha sido llamado. El mtodo redefinido deber llamar al mtodo service() de su super-clase para
mantener ntegra la funcionalidad del servlet.
Los mtodos de actualizacin del contador deben estar sincronizados, para evitar que dicho valor sea
accedido simultneamente por dos o ms threads, lo que podra hacer que su valor fuera errneo.
Adems, no basta con que el servlet espere a que todos los mtodos service() hayan acabado. Es
preciso indicarle a dicho mtodo que el servidor se dispone a apagarse. De otra forma, el servlet podra
quedar esperando indefinidamente a que los mtodos service() acabaran. Esto se consigue utilizando una
variable boolean que establezca esta condicin.

Captulo 9. Servlets

99

Mtodos de ServletRequest

Comentarios

Public abstract int getContentLength()

Devuelve el tamao de la peticin del cliente o -1 si es


desconocido.

Public abstract String getContentType()

Devuelve el tipo de contenido MIME de la peticin o null


si ste es desconocido.

Public abstract String getProtocol()

Devuelve el protocolo y la versin de la peticin como un


String en la forma <protocolo>/<versin mayor>.<versin
menor>

public abstract String getScheme()

Devuelve el tipo de esquema de la URL de la peticin:


http, https, ftp...

public abstract String getServerName()

Devuelve el nombre del host del servidor que recibi la


peticin..

public abstract int getServerPort()

Devuelve el nmero del puerto en el que fue recibida la


peticin.

public abstract String getRemoteAddr()

Devuelve la direccin IP del ordenador que realiz la


peticin.

public abstract String getRemoteHost()

Devuelve el nombre completo del ordenador que realiz


la peticin.

public abstract ServletInputStream


getInputStream() throws IOException

Devuelve un InputStream para leer los datos binarios que


vienen dentro del cuerpo de la peticin.

public abstract String getParameter(String)

Devuelve un String que contiene el valor del parmetro


especificado, o null si dicho parmetro no existe. Slo
debe emplearse cuando se est seguro de que el
parmetro tiene un nico valor.

public abstract String[]


getParameterValues(String)

Devuelve los valores del parmetro especificado en forma


de un array de Strings, o null si el parmetro no existe.
til cuando un parmetro puede tener ms de un valor.

public abstract Enumeration


getParameterNames()

Devuelve una enumeracin en forma de String de los


parmetros encapsulados en la peticin. No devuelve
nada si el InputStream est vaco.

public abstract BufferedReader getReader()


throws IOException

Devuelve un BufferedReader que permite leer el texto


contenido en el cuerpo de la peticin.

public abstract String


getCharacterEncoding()

Devuelve el tipo de codificacin de los caracteres


empleados en la peticin.
Tabla 9.1. Mtodos de la interface ServletRequest.

Mtodos de ServletResponse
ServletOutput
getOutputStream()

Comentarios
Stream

Permite obtener un ServletOutputStream para enviar datos


binarios

PrintWriter getWriter()

Permite obtener un PrintWriter para enviar caracteres

setContentType(String)

Establece el tipo MIME de la salida

setContentLength(int)

Establece el tamao de la respuesta


Tabla 9.2. Mtodos de la interface ServletResponse.

Todas las consideraciones anteriores se han introducido en el siguiente cdigo:

100

Informtica II

public class ServletSeguro extends HttpServlet {


...
private int contador=0;
private boolean apagandose=false;
...
protected synchronized void entrandoEnService() {
contador++;
}
protected synchronized void saliendoDeService() {
contador--;
}
protected synchronized void numeroDeServicios() {
return contador;
}
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
entrandoEnService();
try {
super.service(req, resp);
} finally {
saliendoDeService();
}
} // fin del mtodo service()
protected void setApagandose(boolean flag){
apagandose=flag;
}
protected boolean estaApagandose() {
return apagandose;
}
...
public void destroy() {
// Comprobar que hay servicios en ejecucin y en caso afirmativo
// ordernarles que paren la ejecucin
if(numeroDeServicios()>0)
setApagandose(true);
// Mientras haya servicios en ejecucin, esperar
while(numServices()>0) {
try {
Thread.sleep(intervalo);
} catch(InterruptedException e) {
} // fin del catch
} // fin del while
} // fin de destroy()
...
// Servicio
public void doPost(...) {
...
// Comprobacin de que el servidor no se est apagando
for (i=0; ((i<numeroDeCosasAHacer)&& !estaApagandose()); i++) {
try {
...
// Aqu viene el cdigo
} catch(Exception e)
} // fin del for
} // fin de doPost()
} // fin de la clase ServletEjemplo

Captulo 9. Servlets

101

9.7.2. El contexto del servlet (servlet context)


Un servlet vive y muere dentro de los lmites del proceso del servidor. Por este motivo, puede ser
interesante en un determinado momento obtener informacin acerca del entorno en el que se est
ejecutando el servlet. Esta informacin incluye la disponible en el momento de inicializacin del servlet,
la referente al propio servidor o la informacin contextual especfica que puede contener cada peticin de
servicio.
9.7.2.1. Informacin durante la inicializacin del servlet
Mtodos de ServletContext

Comentarios

public abstract Object getAttribute(String)

Devuelve informacin acerca de determinados


atributos del tipo clave/valor del servidor. Es propio
de cada servidor.

public abstract Enumeration


getAttributeNames()

Devuelve una enumeracin con los nombre de


atributos disponibles en el servidor.

public abstract String getMimeType(String)

Devuelve el tipo MIME de un determinado fichero.

public abstract String getRealPath(String)

Traduce una ruta de acceso virtual a la ruta relativa al


lugar donde se encuentra el directorio raz de pginas
HTML

public abstract String getServerInfo()

Devuelve el nombre y la versin del servicio de red en


el que est siendo ejecutado el servlet.

public abstract Servlet getServlet(String)


throws ServletException

Devuelve un objeto servlet con el nombre dado.

public abstract Enumeration getServletNames()

Devuelve un enumeracin con los servlets disponibles


en el servidor.

public abstract void log(String)

Escribe informacin en un fichero de log. El nombre


del mismo y su formato son propios de cada servidor.

Tabla 9.3. Mtodos de la interface ServletContext.


Esta informacin es suministrada al servlet mediante el argumento ServletConfig del mtodo init().
Cada servidor HTTP tiene su propia forma de pasar informacin al servlet. En cualquier caso, para
acceder a dicha informacin habra que emplear un cdigo similar al siguiente:
String valorParametro;
public void init(ServletConfig config) {
valorParametro = config.getInitParameter(nombreParametro);
}
Como puede observarse, se ha empleado el mtodo getInitParameter() de la interface ServletConfig
(implementada por GenericServlet) para obtener el valor del parmetro. Asimismo, puede obtenerse una
enumeracin de todos los nombres de parmetros mediante el mtodo getInitParameterNames() de la
misma interface.
9.7.2.2. Informacin contextual acerca del servidor
La informacin acerca del servidor est disponible en todo momento a travs de un objeto de la
interface ServletContext. Un servlet puede obtener dicho objeto mediante el mtodo
getServletContext() aplicable a un objeto ServletConfig.
La interface ServletContext define los mtodos descritos en la Tabla 9.3.
9.7.3. Clases de utilidades (Utility Classes)
El Servlet API proporciona una serie de utilidades que se describen a continuacin.

La primera de ellas es la interface javax.servlet.SingleThreadModel que puede hacer ms sencillo el


desarrollo de servlets. Si un servlet implementa dicha interface, el servidor sabe que nunca debe
llamar al mtodo service() mientras est procesando una peticin anterior. Es decir, el servidor
procesa todas las peticiones de servicio dentro de un mismo thread. Sin embargo, a pesar de que esto

102

Informtica II

puede facilitar el desarrollo de servlets, puede ser un gran obstculo en cuanto al rendimiento del
servlet. Por ello, a veces es preciso explorar otras opciones. Por ejemplo, si un servlet accede a una
base de datos para su modificacin, existen dos alternativas para evitar conflictos por accesos
simultneos:
1. Sincronizar los mtodos que acceden a los recursos, con la consiguiente complejidad en el cdigo
del servlet.
2. Implementar la ya citada interface SingleThreadModel, solucin ms sencilla pero que trae
consigo un aumento en el tiempo de respuesta. En este caso, no es necesario escribir ningn
cdigo adicional, basta con implementar la interface. Es una forma de marcar aquellos servlets
que deben tener ese comportamiento, de forma que el servidor pueda identificarlos.

El Servlet API incluye dos clases de excepciones:


1. La excepcin javax.servlet.ServletException puede ser empleada cuando ocurre un fallo general
en el servlet. Esto hace saber al servidor que hay un problema.
2. La excepcin javax.servlet.UnavailableException indica que un servlet no se encuentra
disponible. Los servlets pueden notificar esta excepcin en cualquier momento. Existen dos tipos
de indisponibilidades:
a) Permanente: El servlet no podr seguir funcionando hasta que el administrador del servidor
haga algo. En este estado, el servlet debera escribir en el fichero de log una descripcin del
problema, y posibles soluciones.
b) Temporal: El servlet se ha encontrado con un problema que es potencialmente temporal,
como pueda ser un disco lleno, un servidor que ha fallado, etc. El problema puede arreglarse
con el tiempo o puede requerir la intervencin del administrador.

9.7.4. Clase HttpServlet: soporte especfico para el protocolo HTTP


Los servlets que utilizan el protocolo HTTP son los ms comunes. Por este motivo, Sun ha incluido un
package especfico para estos servlets en su JSDK: javax.servlet.http. Antes de estudiar dicho package
en profundidad, se va a hacer una pequea referencia al protocolo HTTP.
HTTP son las siglas de HyperText Transfer Protocol, que es un protocolo mediante el cual los
browser y los servidores puedan comunicarse entre s, mediante la utilizacin de una serie de mtodos:
GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT y OPTIONS. Para la mayora de las aplicaciones,
bastar con conocer los tres primeros.
9.7.4.1. Mtodo GET: codificacin de URLs
El mtodo HTTP GET solicita informacin a un servidor web. Esta informacin puede ser un fichero,
el resultado de un programa ejecutado en el servidor (como un servlet, un programa CGI, ...), etc.
En la mayora de los servidores web los servlets son accedidos mediante un URL que comienza por
/servlet/. El siguiente mtodo HTTP GET solicita el servicio del servlet MiServlet al servidor
miServidor.com, con lo cual peticin GET tiene la siguiente forma (en negrita el contenido de la
peticin):
GET /servlet/MiServlet?nombre=Antonio&Apellido=Lopez%20de%20Romera HTTP/1.1
Connection: Keep-Alive
User-Agent: Mozilla/4.5 (
compatible;
MSIE 4.01;
Windows NT)
Host: miServidor.com
Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg
El URL de esta peticin GET llama a un servlet llamado MiServlet y contiene dos parmetros, nombre
y apellido. Cada parmetro es un par que sigue el formato clave=valor. Los parmetros se especifican
poniendo un signo de interrogacin (?) tras el nombre del servlet. Adems, los distintos parmetros
estn separados entre s por el smbolo ampersand (&).
Obsrvese que la secuencia de caracteres %20 aparece dos veces en el apellido. Es una forma de decir
que hay un espacio entre Lopez y de, y otro entre de y Romera. Esto ocurre por la forma en que
se codifican los URL en el protocolo HTTP. Sucede lo mismo con otros smbolos como las tildes u otros
caracteres especiales. Esta codificacin sigue el esquema:
%+<valor hexadecimal del cdigo ASCII correspondiente al carcter>

Captulo 9. Servlets

103

Por ejemplo, el carcter se escribira como %E1 (cdigo ASCII 225). Tambin se puede cambiar la
secuencia %20 por el signo +, obteniendo el mismo efecto.
En cualquier caso, los programadores de servlets no deben preocuparse en principio por este
problema, ya que la clase HttpServletRequest se encarga de la decodificacin, de forma que los valores
de los parmetros sean accesibles mediante el mtodo getParameter(String parametro) de dicha clase.
Sin embargo, hay que tener cuidado con algunos caracteres a la hora de incluirlos en un URL, en concreto
con aquellos caracteres no pertenecientes al cdigo ASCII y con aquellos que tienen un significado
concreto para el protocolo HTTP. Ms en concreto, se pueden citar los siguientes caracteres especiales y
su secuencia o cdigo equivalente:
" (%22), # (%23), % (%25), & (%26), + (%2B), , (%2C), / (%2F),
: (%3A), < (%3C), = (%3D), > (%3E), ? (%3F) y @ (%40).
Adicionalmente, Java proporciona la posibilidad de codificar un URL de forma que cumpla con las
anteriores restricciones. Para ello, se puede utilizar la clase URLEncoder, que se encuentra incluida en el
package java.net, que es un package estndar de Java. Dicha clase tiene un nico mtodo, String
encode(String), que se encarga de codificar el String que recibe como argumento, devolviendo otro
String con el URL debidamente codificado. As, considrese el siguiente ejemplo:
import java.net.*;
public class Codificar {
public static void main(String argv[]) {
String URLcodificada = URLEncoder.encode
("/servlet/MiServlet?nombre=Antonio"+"&Apellido=Lpez de Romera");
System.out.println(URLcodificada);
}
}
que cuando es ejecutado tiene como resultado la siguiente secuencia de caracteres:
%2Fservlet%2FMiServlet%3Fnombre%3DAntonio%26Apellido%3DL%A2pez+de+Romera
Obsrvese adems que, cuando sea necesario escribir una comilla dentro
out.println(String), hay que precederla por el carcter escape (\). As, la sentencia:

del

String

de

out.println("<A HREF="http://www.yahoo.com">Yahoo</A>"); // INCORRECTA


es incorrecta y produce errores de compilacin. Deber ser sustituida por:
out.println("<A HREF=\http://www.yahoo.com\>Yahoo</A>");
Las peticiones HTTP GET tienen una limitacin importante (recurdese que transmiten la informacin
a travs de las variables de entorno del sistema operativo) y es un lmite en la cantidad de caracteres que
pueden aceptar en el URL. Si se envan los datos de un formulario muy extenso mediante HTTP GET
pueden producirse errores por este motivo, por lo que habra que utilizar el mtodo HTTP POST.
Se suele decir que el mtodo GET es seguro e idempotente:

Seguro, porque no tiene ningn efecto secundario del cual pueda considerarse al usuario responsable
del mismo. Es decir, por ejemplo, una llamada del mtodo GET no debe ser capaz en teora de alterar
una base de datos. GET debera servir nicamente para obtener informacin.

Idempotente, porque puede ser llamado tantas veces como se quiera de una forma segura.
Es como si GET fuera algo as como ver pero no tocar.

9.7.4.2. Mtodo HEAD: informacin de ficheros


Este mtodo es similar al anterior. La peticin del cliente tiene la misma forma que en el mtodo GET,
con la salvedad de que en lugar de GET se utiliza HEAD. En este caso el servidor responde a dicha peticin
enviando nicamente informacin acerca del fichero, y no el fichero en s. El mtodo HEAD se suele
utilizar frecuentemente para comprobar lo siguiente:

La fecha de modificacin de un documento presente en el servidor.

104

Informtica II

El tamao del documento antes de su descarga, de forma que el browser pueda presentar
informacin acerca del progreso de descarga.

El tipo de servidor.

El tipo de documento solicitado, de forma que el cliente pueda saber si es capaz de soportarlo.
El mtodo HEAD, al igual que GET, es seguro e idempotente.

9.7.4.3. Mtodo POST: el ms utilizado


El mtodo HTTP POST permite al cliente enviar informacin al servidor. Se debe utilizar en lugar de
GET en aquellos casos que requieran transferir una cantidad importante de datos (formularios).
El mtodo POST no tiene la limitacin de GET en cuanto a volumen de informacin transferida, pues
sta no va incluida en el URL de la peticin, sino que viaja encapsulada en un input stream que llega al
servlet a travs de la entrada estndar.
El encabezamiento y el contenido (en negrita) de una peticin POST tiene la siguiente forma:
POST /servlet/MiServlet HTTP/1.1
User-Agent: Mozilla/4.5 (
compatible;
MSIE 4.01;
Windows NT)
Host: www.MiServidor.com
Accept: image/gif, image/x-bitmap, image/jpeg, image/jpeg, */
Content-type: application/x-www-form-urlencoded
Content-length: 39
nombre=Antonio&Apellido=Lopez%20de%20Romera
Ntese la existencia de una lnea en blanco entre el encabezamiento (header) y el comienzo de la
informacin extendida. Esta lnea en blanco indica el final del header.
A diferencia de los anteriores mtodos, POST no es ni seguro ni idempotente, y por tanto es
conveniente su utilizacin en aquellas aplicaciones que requieran operaciones ms complejas que las de
slo-lectura, como por ejemplo modificar bases de datos, etc.
9.7.4.4. Clases de soporte HTTP
Una vez que se han presentado unas ciertas nociones sobre el protocolo HTTP, resulta ms sencillo
entender las funciones del package javax.servlet.http, que facilitan de sobremanera la creacin de
servlets que empleen dicho protocolo.
La clase abstracta javax.servlet.http.HttpServlet incluye un numero de importante de funciones
adicionales e implementa la interface javax.servlet.Servlet. La forma ms sencilla de escribir un servlet
HTTP es heredando de HttpServlet como puede observarse en la Figura 9.7.
La clase HttpServlet es tambin una clase abstract, de modo que es necesario definir una clase que
derive de ella y redefinir en la clase derivada al menos uno de sus mtodos, tales como doGet(),
doPost(), etc.
Como ya se ha comentado, la clase HttpServlet proporciona una implementacin del mtodo service()
en la que distingue qu mtodo se ha utilizado en la peticin (GET, POST, etc.), llamando seguidamente
al mtodo adecuado (doGet(), doHead(), doDelete(), doOptions(), doPost() y doTrace()). Estos mtodos
e corresponden con los mtodos HTTP anteriormente citados.
As pues, la clase HttpServlet no define el mtodo service() como abstract, sino como protected, al
igual que los mtodos init(), destroy(), doGet(), doPost(), etc., de forma que ya no es necesario escribir
una implementacin de service() en un servlet que herede de dicha clase. Si por algn motivo es
necesario redefinir el mtodo service(), es muy conveniente llamar desde l al mtodo service() de la
super-clase (HttpServlet).
La clase HttpServlet es bastante inteligente, ya que es tambin capaz de saber qu mtodos han
sido redefinidos en una sub-clase, de forma que puede comunicar al cliente qu tipos de mtodos soporta
el servlet en cuestin. As, si en la clase MiServlet slo se ha redefinido el mtodo doPost(), si el cliente
realiza una peticin de tipo HTTP GET el servidor lanzar automticamente un mensaje de error similar
al siguiente:

Captulo 9. Servlets

105

501 Method GET Not Supported


donde el nmero que aparece antes del mensaje es un cdigo empleado por los servidores HTTP para
indicar su estado actual. En este caso el cdigo es el 501.
Object

Servlet
init(), destroy()
abstract service(ServletRequest rq, ServletResponse rp)
ServletConfig getServletConfig(), String getServletInfo()

ServletConfig
ServletContext getServletContext()
String getInitParameter(String)
Enumeration getInitParameterNames()

GenericServlet
GenericServlet()
init(), destroy(), service(ServletRequest rq, ServletResponse rp)
ServletConfig getServletConfig(), ServletContext getServletContext()

HttpServlet
HttpServlet()
service(HttpServletRequest hrq, HttpServletResponse hrp)
doPost(), doGet(), doPut(), doDelete(), doOptions(), doTrace()

Miservlet

Figura 9.7. Jerarqua de clases en servlets.


No siempre es necesario redefinir todos los mtodos de la clase HttpServlet. Por ejemplo, basta
definir el mtodo doGet() para que el servlet responda por s mismo a peticiones del tipo HTTP HEAD o
HTTP OPTIONS.
9.7.4.5. Modo de empleo de la clase HttpServlet
Todos los mtodos de clase HttpServlet que debe o puede redefinir el programador (doGet(),
doPost(), doPut(), doOptions(), etc.) reciben como argumentos un objeto HttpServletRequest y otro
HttpServletResponse.
La interface HttpServletRequest proporciona numerosos mtodos para obtener informacin acerca de
la peticin del cliente (as como de la identidad del mismo). Consultar la documentacin del API para
mayor informacin. Por otra parte, el objeto de la interface HttpServletResponse permite enviar desde
el servlet al cliente informacin acerca del estado del servidor (mtodos sendError() y setStatus()), as
como establecer los valores del header del mensaje saliente (mtodos setHeader(), setDateHeader(),
etc.).
Recurdese que tanto HttpServletRequest como HttpServletResponse son interfaces que derivan de
las interfaces ServletRequest y ServletResponse respectivamente, por lo que se pueden tambin utilizar
todos los mtodos declarados en estas ltimas.
Recurdese a modo de recapitulacin que el mtodo doGet() debera:
1. Leer los datos de la solicitud, tales como los nombres de los parmetros y sus valores
2. Establecer el header de la respuesta (longitud, tipo y codificacin)
3. Escribir la respuesta en formato HTML para enviarla al cliente.
Recurdese que la implementacin de este mtodo debe ser segura e idempotente.
El mtodo doPost() por su parte, debera realizar las siguientes funciones:
1. Obtener input stream del cliente y leer los parmetros de la solicitud.
2. Realizar aquello para lo que est diseado (actualizacin de bases de datos, etc.).
3. Informar al cliente de la finalizacin de dicha tarea o de posibles imprevistos. Para ello hay que
establecer primero el tipo de la respuesta, obtener luego un PrintWriter y enviar a travs suyo el
mensaje HTML.

CAPTULO 10

10. Servlets con acceso a bases de datos


10.1. 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 en la Figura
10.1.

Client
(Applet, HTML form,
application)

HTML

Web Server

JDBC

Data base

Figura 10.1. Arquitectura de 3 capas.


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.
Los ejemplos que se presentan en este captulo hacen uso de JDBC y SQL de una forma muy simple,
pero perfectamente vlida para lo que se pretende de los servlets en este documento.
La arquitectura de los servlets hace que la escritura de aplicaciones que se ejecuten en el servidor sea
relativamente sencilla y que sean aplicaciones muy robustas. La principal ventaja de utilizar servlets es
que se puede programar sin dificultad la informacin que va a proporcionar entre peticiones del cliente.
Es decir, se puede tener constancia de lo que el usuario ha hecho en peticiones anteriores. Adems, cada
objeto del servlet se ejecuta dentro de un thread de Java, por lo que se pueden controlar las
interacciones entre mltiples objetos; y al utilizar el identificador de sincronizacin, se puede asegurar
que los servlets del mismo tipo esperan a que se produzca la misma transaccin, antes de procesar la

108

Informtica II

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 sta est en pleno
proceso de actualizacin.
En efecto, las caractersticas multithread de los servlets hacen que se adecuen perfectamente a este
tipo de tareas. Si el servidor de base de datos incluye soporte para mltiples conexiones simultneas,
incluso es posible establecer stas una nica vez e ir administrando las conexiones entre las sucesivas
peticiones de servicio.

10.2. Ejemplo 1: Escribir en una base de datos tipo Access


El siguiente ejemplo muestra cmo compartir una nica conexin entre todas las peticiones de
servicio. Para ello, se retoma el ejemplo introductorio del captulo anterior, pero en lugar de mostrar en
pantalla la informacin recogida en el formulario, se introducir en una base de datos.
Para poder ejecutar este ejemplo en los PCs de las Salas de Tecnun (o en el propio domicilio) se deben
seguir los siguientes pasos:
1. Se deber disponer de Microsoft Access. Con dicho programa se debe crear una nueva base de datos,
llamada por ejemplo ServletOpinion2.mdb. En dicho fichero 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.
2. A continuacin se debe crear un Data Source Name (DSN) con el nombre opinion mediante el
administrador de ODBC y asignarle la base de datos anterior.
3. Abrir una consola de MS-DOS y arrancar servletrunner.exe. Se supone que la variable CLASSPATH
tiene ya un valor correcto.
4. El siguiente fichero contiene 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.html 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.
// fichero ServletOpinion2.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
public class ServletOpinion2 extends HttpServlet {
// Declaracin
private String
private String
private String
private String

de variables miembro
nombre = null;
apellidos = null;
opinion = null;
comentarios = null;

// Referencia a un objeto de la interface java.sql.Connection


Connection conn = null;
// Este mtodo se ejecuta una nica vez (al ser inicializado el servlet
// por primera vez)
// Se suelen inicializar variables y ejecutar operaciones costosas en tiempo
// de ejecucin (abrir ficheros, conectar con bases de datos, etc)
public void init (ServletConfig config) throws ServletException {
// Llamada al mtodo init() de la superclase (GenericServlet)
// As se asegura una correcta inicializacin del servlet
super.init(config);
// dsn (Data Source Name) de la base de datos
String dsn = new String("jdbc:odbc:opinion");
// Carga del Driver del puente JDBC-ODBC

Captulo 10. Servlets con acceso a bases de datos

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

109

110

Informtica II

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

Captulo 10. Servlets con acceso a bases de datos

111

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

<!-- Fichero 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>
Nota importante: En este fichero el valor del parmetro ACTION depende del ordenador con el que se
est trabajando como servidor de servlets. En el ejemplo se ha supuesto que el propio ordenador local es
el servidor de servlets. Si se trata de otro ordenador se puede poner su nombre o su nmero de IP
(suponiendo que lo tenga).
Este servlet tiene como resultado el cambio en la base de datos reflejado en la Figura 10.2 y una
pantalla similar a la del ejemplo introductorio en el browser. Cada vez que se ejecuta el formulario de
aade una nueva lnea a la tabla Opiniones_Recogidas.

Figura 10.2. Resultado obtenido en la base de datos.

112

Informtica II

En este ejemplo cabe resaltar lo siguiente:

La conexin con la base de datos se hace por medio de un driver que convierte de JDBC a ODBC. La
carga de dicho driver JDBC-ODBC tiene lugar durante la inicializacin del servlet, al igual que la
conexin con la base de datos. Basta pues con una nica conexin a la base de datos para satisfacer
todas las peticiones de los clientes (a priori, ya que puede ser necesario tener ms conexiones
abiertas si se espera un trfico intenso).

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.

10.3. Ejemplo 2: Consultar una base de datos Tipo Access


Este segundo ejemplo pretende mostrar la forma en que se accede a datos contenidos en bases de
datos. Para ello, se ha escrito un programa empleando un servlet que recibe como parmetro el nombre
de un grupo de prcticas (parmetro GRUPO), y muestra la lista de los alumnos que estn en ese grupo,
as como algunos de sus datos personales (nmero de carnet, nombre, apellidos, curso).
El usuario selecciona el grupo que quiere ver en el formulario mostrado en la Figura 10.3:

Figura 10.3. Formulario del Ejemplo 2.


El cdigo HTML correspondiente a la pgina mostrada en la Figura 10.3 es el siguiente:

Captulo 10. Servlets con acceso a bases de datos

113

<!-- fichero Formulario2.htm -->


<html>
<head>
<title>Grupos de prcticas</title>
</head>
<body>
<h2 align="center">Escoja el grupo de prcticas cuya lista desea ver</h2>
<form method="GET" action="http://localhost:8080/servlet/ListaAlumnos"
name="Formulario">
<div align="center"><center><p>
<input type="radio" value=1 checked name="GRUPO">Grupo1&nbsp;
<input type="radio" name="GRUPO" value=2>Grupo2&nbsp;
<input type="radio" name="GRUPO" value=3>Grupo3
</p></center></div>
<div align="center"><center><p>
<input type="submit" value="Enviar" name="BotonEnviar">
<input type="reset" value="Borrar" name="BotonBorrar">
</p></center></div>
</form>
</body>
</html>
El formulario se compone de tres radio buttons con los nombres de los grupos disponibles, y de los
botones Enviar y Borrar. Por otra parte, el mtodo HTTP empleado en este ejemplo ha sido HTTP GET.
Por esto, clicando en Enviar, el URL solicitado al servidor tiene la siguiente forma:
http://localhost:8080/servlet/ListaAlumnos?GRUPO=1&BotonEnviar=Enviar
Seleccionando el Grupo1 y clicando en Enviar, se obtiene el resultado mostrado en la Figura 10.4.

Figura 10.4. Lista de alumnos del Grupo 1


El servlet empleado para obtener es bastante simple. He aqu el cdigo del servlet:

114

Informtica II

// fichero ListaAlumnos.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import java.util.*;
public class ListaAlumnos extends HttpServlet {
Connection conn = null;
// Vector que contendr los objetos Alumno
Vector vectorAlumnos=null;
//Este mtodo se ejecuta una nica vez, al ser inicializado por primera vez
//el servlet.Se suelen inicializar variables y ejecutar operaciones costosas
//en tiempo de ejecucin (abrir ficheros, conectar con bases de datos, etc)
public void init (ServletConfig config) throws ServletException {
// Llamada al mtodo init() de la superclase (GenericServlet)
// As se asegura una correcta inicializacin del servlet
super.init(config);
// url de la base de datos
String url=new String("jdbc:odbc:alumnos");
// Carga del Driver
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
try {
conn=DriverManager.getConnection(url,"","");
} catch (SQLException sqlEx) {
System.out.println("Se ha producido un error al establecer "+
"la conexin con: "+url);
System.out.println(sqlEx.getMessage());
}
System.out.println("Iniciando ListaAlumnos");
} // 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 de destroy()
// Mtodo llamada mediante un HTTP GET
public void doGet (HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// Obtencin del grupo de prcticas
String grupo = null;

Captulo 10. Servlets con acceso a bases de datos

grupo = req.getParameter("GRUPO");
if(grupo==null) {
resp.sendError(500, "Se ha producido un error en la lectura " +
"de la solicitud");
return;
}
//Consulta a la base de datos para obtener la lista de alumnos de un grupo
if(obtenerLista(grupo)==0) {
// Mostrar la lista de alumnos mediante una pgina HTML
mostrarListaAlumnos(resp, grupo);
}
else if(obtenerLista(grupo)==-3) {
resp.sendError(500, "No se ha encontrado el grupo: " +grupo);
}
else
resp.sendError(500, "Se ha producido un error en el acceso " +
"a la base de datos");
} // fin del mtodo doGet()
public int obtenerLista(String grupo) {
Statement stmt = null;
ResultSet rs = null;
// Ejecucin del query
try {
stmt=conn.createStatement();
rs = stmt.executeQuery("SELECT DISTINCT Nombre, Apellidos, Curso, " +
"Carnet, GrupoPractica FROM TablaAlumnos " +
"WHERE GrupoPractica=" + grupo + " ORDER BY Carnet");
vectorAlumnos=new Vector();
// Lectura del ResultSet, en Java 2
while (rs.next()) {
Alumno temp=new Alumno();
temp.setNombre(rs.getString("Nombre"));
temp.setApellidos(rs.getString("Apellidos"));
temp.setCarnet(rs.getLong("Carnet"));
temp.setCurso(rs.getInt("Curso"));
vectorAlumnos.addElement(temp);
}
// En el JDK 1.1.x hay un bug que hace que no se lean bien los valores
// que no son Strings. Sera de la siguiente forma:
/* while (rs.next()) {
Alumno temp=new Alumno();
temp.setNombre(rs.getString("Nombre"));
temp.setApellidos(rs.getString("Apellidos"));
temp.setCarnet(java.lang.Long.parseLong(rs.getString("Carnet")));
temp.setCurso(java.lang.Integer.parseInt(rs.getString("Curso")));
vectorAlumnos.addElement(temp);
}*/
if(vectorAlumnos.size()==0) return -3;
return 0;
} catch (SQLException sql) {
System.out.println("Se produjo un error al crear el Statement");
System.out.println(sql.getMessage());
return -1;
} finally {

115

116

Informtica II

// se cierra el Statment
if(stmt!=null) {
try {
stmt.close();
} catch(SQLException e) {
System.out.println("Error al cerrar el Statement");
System.out.println(e.getMessage());
return -2;
}
}
} // fin del finally
} // fin del mtodo obtenerLista()
public void mostrarListaAlumnos(HttpServletResponse resp, String grupo) {
// se establece el tipo de contenido MIME de la respuesta
resp.setContentType("text/html");
// 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 manda la lista
out.println("<html>");
out.println("");
out.println("<head>");
out.println("<title>Lista de alumnos del grupo "+grupo+"</title>");
out.println("<meta name=\"GENERATOR\" " +
"content=\"Microsoft FrontPage 3.0\">");
out.println("</head>");
out.println("");
out.println("<body>");
out.println("");
out.println("<H2 align=\"center\">Lista de alumnos del grupo " +
grupo + "</H2>");
out.println("<div align=\"center\"><center>");
out.println("");
out.println("<table border=\"1\" width=\"70%\">");
out.println("<tr>");
out.println("<td width=\"25%\" bgcolor=\"#808080\">"+
"<font color=\"#FFFFFF\">Carnet</font></td>");
out.println("<td width=\"25%\" bgcolor=\"#808080\">"+
"<font color=\"#FFFFFF\">Nombre</font></td>");
out.println("<td width=\"25%\" bgcolor=\"#808080\">"+
"<font color=\"#FFFFFF\">Apellidos</font></td>");
out.println("<td width=\"25%\" bgcolor=\"#808080\">"+
"<font color=\"#FFFFFF\">Curso</font></td>");
out.println("</tr>");
// Datos del Alumno por filas
Alumno alum=null;
for (int i=0; i<vectorAlumnos.size();i++) {
alum=(Alumno)vectorAlumnos.elementAt(i);
out.println("<tr>");
out.println("<td width=\"25%\">"+alum.getCarnet()+"</td>");
out.println("<td width=\"25%\">"+alum.getNombre()+"</td>");
out.println("<td width=\"25%\">"+alum.getApellidos()+"</td>");
out.println("<td width=\"25%\">"+alum.getCurso()+"</td>");
out.println("</tr>");
}

Captulo 10. Servlets con acceso a bases de datos

117

out.println("</table>");
out.println("</center></div>");
out.println("</body>");
out.println("</html>");
// se fuerza la descarga del buffer y se cierra el PrintWriter
out.flush();
out.close();
} // fin del mtodo mostrarListaAlumnos()
// Funcin que permite al servidor web obtener una pequea descripcin del
// servlet, qu cometido tiene, nombre del autor, comentarios adicionales...
public String getServletInfo() {
return "Servlet que muestra en pantalla la lista de un grupo de prcticas";
}
} // fin de la clase ListaAlumnos
Puede observarse que este servlet es bastante parecido al del ejemplo previo, en cuanto a su forma
general. Tiene como el anterior un mtodo init() donde efecta la conexin con la base de datos cuyo DSN
es alumnos, y comprueba que la conexin se ha realizado con xito. Asimismo, tiene un mtodo destroy()
donde se cierra dicha conexin y se avisa de posibles eventualidades.
Sin embargo, a diferencia del servlet del ejemplo anterior, la peticin del cliente es de tipo HTTP
GET, por lo que se ha redefinido el mtodo doGet() y no el doPost() como en el caso anterior. En este
mtodo, lo primero que se hace es leer el parmetro GRUPO dentro del mtodo doGet(). En caso de que
haya algn problema en la lectura de dicho parmetro, lanza un mensaje de error.
Una vez que se sabe cul es el grupo cuya lista quiere visualizar el cliente, se llama al mtodo
obtenerLista(String), que tiene como parmetro precisamente el nombre del grupo a mostrar. En este
mtodo se realiza la consulta con la base de datos, mediante el mtodo executeQuery() de la interface
Statement.
La ejecucin de dicho mtodo tiene como resultado un objeto ResultSet, que es como una especie de
tabla cuyas filas son cada uno de los alumnos, y cuyas columnas son los datos solicitados de ese alumno
(carnet, nombre, apellidos, curso, ...). Para obtener dichos datos se emplea el mtodo next() del objeto
ResultSet en conjuncin con los mtodos getXXX() de dicho objeto. En el JDK 1.1.x exista un bug por el
cual Java fallaba en determinadas circunstancias al intentar leer valores de campos con mtodos distintos
del getString() (por ejemplo: getLong(), getInt(), etc.). Esto puede ser solventado empleando el mtodo
getString() y despus convirtiendo el String resultante a los distintos tipos primitivos deseados (int, long,
etc.). En Java 2 dicho bug ha sido corregido, y pueden emplearse directamente los mtodos adecuados
sin ningn problema.
En este ejemplo, adems, al leer los valores de la base de datos, estos han sido almacenados en un
Vector de objetos de la clase Alumno, que ha sido creada para este ejemplo. Esta clase lo nico que hace
es definir las variables que van a contener los datos de cada alumno, y establecer los mtodos de
introduccin y recuperacin de dichos datos.
public class Alumno {
// Definicin de variables miembro
private String nombre;
private String apellidos;
private long carnet;
private int curso;
private String grupoPractica;
// Mtodos para establecer los datos
public void setNombre(String nom) { nombre=nom; }
public void setApellidos(String apel) { apellidos=apel; }
public void setCarnet(long carn) { carnet=carn; }
public void setCurso(int cur) { curso=cur; }
public void setGrupoPractica(String grupo) { grupoPractica=grupo; }
// Mtodos de recuperacin de datos
public String getNombre() { return nombre; }
public String getApellidos() { return apellidos; }

118

Informtica II

public long getCarnet() { return carnet; }


public int getCurso() { return curso; }
public String getGrupoPractica() { return grupoPractica; }
} // fin de la clase Alumno
Siguiendo con el mtodo obtenerLista(String), su funcin es comprobar que se ha obtenido al menos
una fila como resultado de la consulta y capturar posibles excepciones, retornando los correspondientes
cdigos de error si fuera necesario.
Por ltimo, volviendo al mtodo doGet() que se estaba describiendo, slo queda llamar al mtodo
mostrarListaAlumnos(HttpServletResponse resp, String grupo), en caso de que no se haya producido
ningn error. Este mtodo es anlogo al mtodo devolverPaginaHTML() del ejemplo anterior. En este
caso, muestra una tabla HTML que va construyendo dinmicamente, aadiendo tantas filas a la misma
como alumnos estn contenidos en el vector de alumnos.

CAPTULO 11

11. Sesin en Servlets


11.1. Formas de seguir la trayectoria de los usuarios
Los servlets permiten seguir la trayectoria de un cliente, es decir, obtener y mantener una
determinada informacin acerca del cliente. De esta forma se puede tener identificado a un cliente
(usuario que est utilizando un browser) durante un determinado tiempo. Esto es muy importante si se
quiere disponer de aplicaciones que impliquen la ejecucin de varios servlets o la ejecucin repetida de
un mismo servlet. Un claro ejemplo de aplicacin de esta tcnica es el de los comercios va Internet que
permiten llevar un carrito de la compra en el que se van guardando aquellos productos solicitados por el
cliente. El cliente puede ir navegando por las distintas secciones del comercio virtual, es decir realizando
distintas conexiones HTTP y ejecutando diversos servlets, y a pesar de ello no se pierde la informacin
contenida en el carrito de la compra y se sabe en todo momento que es un mismo cliente quien est
haciendo esas conexiones diferentes.
El mantener informacin sobre un cliente a lo largo de un proceso que implica mltiples conexiones se
puede realizar de tres formas distintas:

Mediante cookies

Mediante seguimiento de sesiones (Session Tracking)

Mediante la reescritura de URLs

11.2. Cookies
Estrictamente hablando cookie significa galleta. Parece ser que dicha palabra tiene otro significado:
se utilizara tambin para la ficha que le dan a un cliente en un guardarropa al dejar el abrigo y que tiene
que entregar para que le reconozcan y le devuelvan dicha prenda. ste sera el sentido de la palabra
cookie en el contexto de los servlets: algo que se utiliza para que un servidor HTTP reconozca a un
cliente como alguien que ya se haba conectado anteriormente. Como era de esperar, los cookies en Java
son objetos de la clase Cookie, en el package javax.servlet.http.
El empleo de cookies en el seguimiento de un cliente requiere que dicho cliente sea capaz de
soportarlas. Sin embargo, puede ocurrir que a pesar de estar disponible, dicha opcin est desactivada
por el usuario, por lo que puede ser necesario emplear otras alternativas de seguimiento de clientes como
la reescritura de URLs. Esto es debido a que los servlets envan cookies a los clientes junto con la
respuesta, y los clientes las devuelven junto con una peticin. As, si un cliente tiene activada la opcin
No cookies o similar en su navegador, no le llegar la cookie enviada por el servlet, por lo que el
seguimiento ser imposible.
Cada cookie tiene un nombre que puede ser el mismo para varias cookies, y se almacenan en un
directorio o fichero predeterminado en el disco duro del cliente. De esta forma, puede mantenerse
informacin acerca del cliente durante das, ya que esa informacin queda almacenada en el ordenador
del cliente (aunque no indefinidamente, pues las cookies tienen una fecha de caducidad).
La forma en que se envan cookies es bastante sencilla en concepto. Aadiendo una clave y un valor al
header del mensaje es posible enviar cookies al cliente, y desde ste al servidor. Adicionalmente, es
posible incluir otros parmetros adicionales, tales como comentarios. Sin embargo, estos no suelen ser
tratados correctamente por los browsers actuales, por lo que su empleo es desaconsejable. Un servidor
puede enviar ms de una cookie al cliente (hasta veinte cookies).

120

Informtica II

Las cookies almacenadas en el cliente son enviadas en principio slo al servidor que las origin. Por
este motivo (porque las cookies son enviadas al servidor HTTP y no al servlet), los servlets que se
ejecutan en un mismo servidor comparten las mismas cookies.
La forma de implementar todo esto es relativamente simple gracias a la clase Cookie incluida en el
Servlet API. Para enviar una cookie es preciso:

Crear un objeto Cookie

Establecer sus atributos

Enviar la cookie
Por otra parte, para obtener informacin de una cookie, es necesario:

Recoger todas las cookies de la peticin del cliente

Encontrar la cookie precisa

Obtener el valor recogido en la misma

11.2.1. Crear un objeto Cookie


La clase javax.servlet.http.Cookie tiene un constructor que presenta como argumentos un String con
el nombre de la cookie y otro String con su valor. Es importante hacer notar que toda la informacin
almacenada en cookies lo es en forma de String, por lo que ser preciso convertir cualquier valor a String
antes de aadirlo a una cookie.
Hay que ser cuidadoso con los nombres empleados, ya que aquellos que contengan caracteres
especiales pueden no ser vlidos. Adicionalmente, aquellos que comienzan por el smbolo de dlar ($) no
pueden emplearse, por estar reservados.
Con respecto al valor de la cookie, en principio puede tener cualquier forma, aunque hay que tener
cautela con el valor null, que puede ser incorrectamente manejado por los browsers, as como espacios en
blanco o los siguientes caracteres:
[ ] ( ) = , / ? @:;
Por ltimo, es importante saber que es necesario crear la cookie antes de acceder al Writer del objeto
HttpServletResponse, pues como las cookies son enviadas al cliente en el header del mensaje, y stas
deben ser escritas antes de crear el Writer.
Por ejemplo, el siguiente cdigo crea una cookie con el nombre Compra y el valor de
IdObjetoAComprar, que es una variable que contiene la identificacin de un objeto a comprar (301):
...
String IdObjetoAComprar = new String("301");
if(IdObjetoAComprar!=null)
Cookie miCookie=new Cookie("Compra", IdObjetoAComprar);
11.2.2. Establecer los atributos de la cookie
La clase Cookie proporciona varios mtodos para establecer los valores de una cookie y sus atributos.
Entre otros, los mostrados en la Tabla 11.1.
Todos estos mtodos tienen sus mtodos getXXX() correspondientes incluidos en la misma clase.
Por ejemplo, se puede cambiar el valor de una cookie de la siguiente forma:
...
Cookie miCookie=new Cookie("Nombre", "ValorInicial");
miCookie.setValue("ValorFinal");
o hacer que sea eliminada al cerrar el browser:
miCookie.setMaxAge(-1);
...

Captulo 11. Sesin en Servlets

121

Mtodos de la clase Cookie

Comentarios

public void
setComment(String)

Si un browser presenta esta cookie al usuario, el cometido de la cookie


ser descrito mediante este comentario.

public void setDomain(String)

Establece el patrn de dominio a quien permitir el acceso a la


informacin contenida en la cookie. Por ejemplo .yahoo.com permite el
acceso a la cookie al servidor www.yahoo.com pero no a a.b.yahoo.com

public void setMaxAge(int)

Establece el tiempo de caducidad de la cookie en segundos. Un valor -1


indica al browser que borre la cookie cuando se apague. Un valor 0 borra
la cookie de inmediato.

public void setPath(String)

Establece la ruta de acceso del directorio de los servlets que tienen


acceso a la cookie. Por defecto es aquel que origin la cookie.

Public void
setSecure(boolean)

Indica al browser que la cookie slo debe ser enviada utilizando un


protocolo seguro (https). Slo debe utilizarse en caso de que el servidor
que haya creado la cookie lo haya hecho de forma segura.

public void setValue(String)

Establece el valor de la cookie

public void setVersion(int)

Establece la versin del protocolo de la cookie.


Tabla 11.1. Mtodos de la clase Cookie.

11.2.3. Enviar la cookie


Las cookies son enviadas como parte del header de la respuesta al cliente. Por ello, tienen que ser
aadidas a un objeto HttpServletResponse mediante el mtodo addCookie(Cookie). Tal y como se ha
explicado con anterioridad, esto debe realizarse antes de llamar al mtodo getWriter() de ese mismo
objeto. Sirva como ejemplo el siguiente cdigo:
...
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
...
Cookie miCookie=new Cookie("Nombre","Valor");
miCookie.setMaxAge(-1);
miCookie.setComment("Esto es un comentario");
resp.addCookie(miCookie);
PrintWriter out=resp.getWriter();
...
}
11.2.4. Recoger las cookies
Los clientes devuelven las cookies como parte integrante del header de la peticin al servidor. Por
este motivo, las cookies enviadas debern recogerse del objeto HttpServletRequest mediante el mtodo
getCookies(), que devuelve un array de objetos Cookie. Vase el siguiente ejemplo:
...
Cookie miCookie = null;
Cookie[] arrayCookies = req.getCookies();
miCookie = arrayCookies[0];
...
El anterior ejemplo recoge la primera cookie del array de cookies.
Por otra parte, habr que tener cuidado, pues tal y como se ha mencionado con anterioridad, puede
haber ms de una cookie con el mismo nombre, por lo que habr que detectar de alguna manera cul es
la cookie que se necesita.
11.2.5. Obtener el valor de la cookie
Para obtener el valor de una cookie se utiliza el mtodo getValue() de la clase Cookie. Obsrvese el
siguiente ejemplo. Supngase que se tiene una tienda virtual de libros y que un usuario ha decidido

122

Informtica II

eliminar un libro del carro de la compra. Se tienen dos cookies con el mismo nombre (compra), pero con
dos valores (libro1, libro2). Si se quiere eliminar el valor libro1:
...
String libroABorrar=req.getParameter("Borrar");
...
if(libroABorrar!=null) {
Cookie[] arrayCookies=req.getCookies();
for(i=0;i<arrayCookies.length;i++) {
Cookie miCookie=arrayCookies[i];
if(miCookie.getName().equals("compra")
&&miCookie.getValue.equals("libro1") {
miCookie.setMaxAge(0); // Elimina la cookie
} // fin del if
} // fin del for
} // fin del if
...
Tal y como se ha dicho con anterioridad, una cookie contiene como valor un String. Este String debe
ser tal que signifique algo para el servlet. Con esto se quiere decir que es responsabilidad exclusiva del
programador establecer que formato o codificacin va a tener ese String que almacena la cookie. Por
ejemplo, si se tiene una tienda on-line, pueden establecerse tres posibles tipos de status de un producto
(con referencia al inters de un cliente determinado por dicho producto): el cliente se ha solicitado
informacin sobre el producto (A), el cliente lo tiene contenido en el carrito de la compra (B) o el cliente
ya ha comprado uno anteriormente (C). As, si por ejemplo el cdigo del producto fuera el 301 y estuviera
contenido en el carrito de la compra, podra enviarse una cookie con el siguiente valor:
Cookie miCookie = new Cookie("NombreDeCookie", "301_B");
El programador
posteriormente.

deber

establecer

una

codificacin

propia

ser

capaz

de

descodificarlo

11.3. Sesiones (Session Tracking)


Una sesin es una conexin continuada de un mismo browser a un servidor durante un tiempo prefijado
de tiempo. Este tiempo depende habitualmente del servidor, aunque a partir de la versin 2.1 del Servlet
API puede establecerse mediante el mtodo setMaxInactiveInterval(int) de la interface HttpSession.
Esta interface es la que proporciona los mtodos necesarios para mantener sesiones.
Al igual que las cookies, las sesiones son compartidas por todos los servlets de un mismo servidor. De
hecho, por defecto se utilizan cookies de una forma implcita en el mantenimiento de sesiones. Por ello,
si el browser no acepta cookies, habr que emplearse las sesiones en conjuncin con la reescritura de
URLs (Ver apartado 11.4).
La forma de obtener una sesin es mediante el mtodo getSession(boolean) de un objeto
HttpServletRequest. Si este boolean es true, se crea una sesin nueva si es necesario mientras que si es
false, el mtodo devolver la sesin actual. Por ejemplo:
...
HttpSession miSesion = req.getSession(true);
...
crea una nueva sesin con el nombre miSesion.
Una vez que se tiene un objeto HttpSession, es posible mantener una coleccin de pares nombre de
dato/valor de dato, de forma que pueda almacenarse todo tipo de informacin sobre la sesin. Este
valor puede ser cualquier objeto de la clase Object que se desee. La forma de aadir valores a la sesin
es mediante el mtodo putValue(String ,Object ) de la clase HttpSession y la de obtenerlos es mediante
el mtodo getValue(String , Object ) del mismo objeto. Esto puede verse en el siguiente ejemplo:

Captulo 11. Sesin en Servlets

123

...
HttpSession miSesion=req.getSesion(true);
CarritoCompras compra = (CarritoCompras) miSesion.getValue(miSesion.getId());
if(compra==null) {
compra = new CarritoCompras();
miSesion.putValue(miSesion.getId(), compra);
}
...
En este ejemplo, se supone la existencia de una clase llamada CarritoCompras. En primer lugar se
obtiene una nueva sesin (en caso de que fuera necesario, si no se mantendr una creada previamente), y
se trata de obtener el objeto CarritoCompras aadido a la sesin. Obsrvese que para ello se hace una
llamada al mtodo getId() del objeto miSesion. Cada sesin se encuentra identificada por un
identificador nico que la diferencia de las dems. Este mtodo devuelve dicho identificador. Esta es una
buena forma de evitar confusiones con el nombre de las sesiones y el de sus valores. En cualquier caso, al
objeto CarritoCompras se le poda haber asociado cualquier otra clave. Si no se hubiera aadido
previamente el objeto CarritoCompras a la sesin, la llamada al mtodo getValue() tendra como
resultado null. Obsrvese adems, que es preciso hacer un cast para pasar el objeto Object a objeto
CarritoCompras.
En caso de que compra sea null, es decir, que no existiera un objeto aadido previamente, se crea un
nuevo objeto CarritoCompras y se aade a la sesin miSesion mediante el mtodo putValue(), utilizando
de nuevo el identificador de la sesin como nombre.
Adems de estos mtodos mencionados, la interface HttpSession define los siguientes mtodos:

getCreationTime(): devuelve el momento en que fue creado la sesin (en milisegundos).

getLastAccessedTime():devuelve el ltimo momento en que el cliente realiz una peticin con el


identificador asignado a una determinada sesin (en milisegundos)

getValueNames(): devuelve un array con todos los nombres de los objetos asociados con la sesin.

invalidate(): invalida la sesin en curso.

isNew(): devuelve un boolean indicando si la sesin es nueva.

removeValue(String): elimina el objeto asociado con una determinada clave.


De todos los anteriores mtodos conviene comentar dos en especial: invalidate() y isNew().

El mtodo invalidate() invalida la sesin en curso. Tal y como se ha mencionado con anterioridad, una
sesin puede ser invalidada por el propio servidor si en el transcurso de un intervalo prefijado de tiempo
no ha recibido peticiones de un cliente. Invalidar quiere decir eliminar el objeto HttpSession y los valores
asociados con l del sistema.
El mtodo isNew() sirve para conocer si una sesin es nueva. El servidor considera que una sesin es
nueva hasta que el cliente se una a la sesin. Hasta ese momento isNew() devuelve true. Un valor de
retorno true puede darse en las siguientes circunstancias:

El cliente todava no sabe nada acerca de la sesin

La sesin todava no ha comenzado.

El cliente no quiere unirse a la sesin. Ocurre cuando el browser tiene la aceptacin de cookies
desactivada.

11.4. Reescritura de URLs


A pesar de que la mayora de los browser ms extendidos soportan las cookies en la actualidad, para
poder emplear sesiones con clientes que o bien no soportan cookies o bien las rechazan, debe utilizarse
la reescritura de URLs. No todos los servidores soportan la reescritura de URLs (por ejemplo el
servletrunner que acompaa el JSDK).
Para emplear est tcnica lo que se hace es incluir el cdigo identificativo de la sesin (sessionId) en
el URL de la peticin. Los mtodos que se encargan de reescribir el URL si fuera necesario son
HttpServletResponse.encodeUrl() y HttpServletResponse.encodeRedirectUrl() (sustituidas en el API 2.1
por encodeURL() y encodeRedirectURL() respectivamente). El primero de ellos lee un String que

124

Informtica II

representa un URL y si fuera necesario la reescribe aadiendo el identificativo de la sesin, dejndolo


inalterado en caso contrario. El segundo realiza lo mismo slo que con URLs de redireccin, es decir,
permite reenviar la peticin del cliente a otro URL .
Vase el siguiente ejemplo:
...
HttpSession miSesion=req.getSesion(true);
CarritoCompras compra = (CarritoCompras)miSesion.getValue(miSesion.getId());
if(compra==null) {
compra = new CarritoCompras();
miSesion.putValue(miSesion.getId(), compra);
}
...
PrintWriter out = resp.getWriter();
resp.setContentType("text/html");
...
out.println("Esto es un enlace reescrito");
out.println("<a href\""+
resp.encodeUrl("/servlet/buscador?nombre=Pedro")+"\"</a>");
...
En este caso, como hay una sesin, la llamada al mtodo encodeUrl() tendra como consecuencia la
reescritura del enlace incluyendo el identificativo de la sesin en l.

SECCIN 4
Comunicaciones en red

CAPTULO 12

12. XML (eXtensible Markup Language)


12.1. INTRODUCCIN
XML es una Recomendacin del W3C (Consorcio World Wide Web) puede consultarse en
http://www.w3.org/TR/REC-xml. Como esta especificacin es de difcil lectura hay disponible una
excelente versin con anotaciones de la especificacin en http://www.xml.com.
XML (Lenguaje de Marcado Extensible) es un metalenguaje utilizado para definir otros lenguajes de
marcado adecuados a usos determinados. XML no especifica ni las etiquetas ni la gramtica del lenguaje.
HTML, en cambio, define las etiquetas permitidas y la gramtica. Es decir, se puede utilizar la etiqueta
<TABLE> porque est definida pero no, por ejemplo, la etiqueta <SILLA>. La gramtica define la correcta
utilizacin de las etiquetas. Por ejemplo en HTML pueden incluirse en la etiqueta <TABLE> un conjunto
determinado de atributos (BORDER, CELLSPACING, CELLPADDING,...). Con XML se pueden inventar las
etiquetas y la gramtica.
Los documentos XML se organizan como una jerarqua de elementos. A continuacin se muestra la
estructura de un fichero XML:
<?xml version=1.0?>
<libro>
<autor>Antonio Muoz Molina</autor>
<titulo>El Jinete Polaco</titulo>
<precio moneda=EURO>20</precio>
</libro>
XML permite definir la informacin o el contenido de los datos de la forma que se desee, mientras sea
conforme a la estructura general que XML requiere:

<gato>
<nombre>Micif</nombre>
<raza>Persa</raza>
</gato>

<gato raza=Persa>Micif</gato>

<gato raza=Persa nombre=Micif/>


Sin embargo, XML no define la presentacin de los datos.

12.1.1. CONCEPTOS BSICOS DE XML


En primer lugar, cualquier documento XML debe estar bien formado para poderse analizar
correctamente. Un documento bien formado:

Tiene cerrada cada etiqueta que se haya abierto.

No tiene etiquetas anidadas fuera de lugar.

Es sintcticamente correcto de acuerdo a la especificacin.

Las reglas sintcticas de XML son utilizadas despus por las aplicaciones y los analizadores compatibles
con XML para que el documento tenga sentido y pueda llevarse a cabo alguna accin con los datos, como
por ejemplo encontrar el precio de un libro o crear un fichero PDF con los datos.

128

Informtica II

En segundo lugar, los documentos XML pueden ser (aunque no es obligatorio) vlidos. Un documento
vlido es aquel que sigue las reglas de cierto DTD (definicin de tipo de documento).
12.1.2. DTD
Un DTD define establece un conjunto de restricciones (etiquetas permitidas, reglas gramaticales) para
un documento XML. Estas restricciones:

Pueden residir en un fichero externo y ser compartidas por varios documentos XML.

Bien pueden estar contenidas en el propio documento XML.


La suma de estos conjuntos de restricciones es la definicin de tipo de documento (DTD).

Por ejemplo se podra definir que el atributo moneda tuviera como nicos valores permitidos: euro y
dlar.
El DTD es el que da portabilidad a los datos XML, es necesario para transferir datos entre diferentes
aplicaciones de manera que stas puedan entenderse.
Los DTD se explican con detalle en un apartado posterior.

12.2. DOCUMENTOS XML


Un documento XML puede dividirse en dos partes bsicas: la cabecera (que da informacin sobre cmo
manejar el documento a los analizadores XML y a las aplicaciones XML) y el contenido (que son los datos).
12.2.1. CABECERA
12.2.1.1. Instrucciones de proceso (PI)
Tienen la forma <?instruccin?> y representan comandos para el analizador XML o para un programa
que utilizar el documento XML. Por ejemplo, la siguiente instruccin indica al analizador qu versin de
XML se est utilizando.
<?xml version=1.0?>
12.2.1.2. Declaracin de tipo de documento
Se utiliza para especificar un DTD en el documento XML. y tiene la sintaxis <!DOCTYPE parmetros>.

El primer parmetro es el elemento raz del documento, que identifica al documento xml actual (se
explica en un apartado posterior).

El segundo argumento puede ser SYSTEM o PUBLIC.

Si se especifica SYSTEM el siguiente parmetro debe indicar al analizador desde dnde se puede
cargar el fichero DTD (mediante un URI-o una URL).
<!DOCTYPE lista SYSTEM Lista.dtd>
<!DOCTYPE book SYSTEM http://www.oreilly.com/catalog/JavaXML.dtd>

Si se especifica PUBLIC quiere decir que el DTD se ha hecho pblico y est disponible para
utilizarse por cualquiera. En este caso, antes de especificar un URI se debe indicar un nombre
pblico y el analizador intentar primero utilizar el nombre pblico para localizar el DTD y
solamente si falla utilizar el URI.
<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd>

12.2.2. CONTENIDO
12.2.2.1. Elemento raz
Slo puede haber un elemento raz, que es el de ms alto nivel en un documento XML. Debe ser la
primera etiqueta que se abra y la ltima que se cierre y entre estas etiquetas se incluye el resto de
elementos del documento, formando una estructura jerrquica de elementos, anidados unos en otros.
12.2.2.2. Elementos de datos
Son etiquetas con nombres arbitrarios. Reglas para nombrar elementos:

Su nombre debe empezar con una letra o un subrayado.

Captulo 12. XML (eXtensible Markup Language)

129

A continuacin puede contener cualquier nmero de letras, nmeros, subrayados, guiones o


puntos.

No puede contener espacios.

Es sensible a maysculas y minsculas.

Cada elemento que se abra, se debe cerrar. Entre las etiquetas de apertura y cierre puede haber datos
de tipo texto o cualquier nmero de elementos anidados.
<gato>
<nombre>Micif</nombre>
<raza>Persa</raza>
</gato>
Los elementos deben estar correctamente anidados: el primer elemento que se abra debe ser siempre
el ltimo que se cierre.
Tambin puede haber elementos vacos, es decir, no contienen datos de tipo texto ni otros elementos
anidados. En ese caso se consolidan las etiquetas de apertura y cierre en una nica etiqueta.
<img src=xml.gif/>
12.2.2.3. Atributos de elemento
Los elementos pueden contener atributos con sus respectivos valores incluidos dentro de la etiqueta de
apertura.
<precio moneda=EURO>20</precio>
En este caso moneda es el nombre del atributo. Las reglas que siguen los nombres de atributos son las
mismas que las de los nombres de elementos. Los valores de los atributos deben encerrarse entre comillas
dobles (el estndar) o simples.
Tambin pueden incluirse atributos en los elementos vacos:
<gato raza=Persa nombre=Micif/>
12.2.2.4. Referencias a entidad
Si se desea introducir como contenido en un documento XML algn carcter reservado para el marcado,
deben utilizarse entidades. Las entidades se emplean para representar estos caracteres especiales y, ms
en general, para representar a otros datos de sustitucin. Las referencias a entidad en un documento XML
se hacen precediendo el nombre de la entidad por & y terminando con ;. Cuando un analizador XML
se encuentra una referencia a entidad, el valor de sustitucin especificado se inserta y no se procesa.
En XML 1.0 se definen cinco entidades para representar caracteres especiales y que no se interpretan
como
marcado
por
el
analizador
XML
Referencia a Entidad
Carcter
&amp;
&
&lt;
<
&gt;
>
&apos;

&quot;

El usuario puede definir entidades propias en un DTD, como se ver ms adelante, de manera que la
referencia a cada entidad sea sustituida por el contenido especfico indicado por el usuario.
12.2.2.5. Datos no analizados
Cuando hay una cantidad significativa de datos que se tienen que pasar a la aplicacin llamante sin
hacer ningn anlisis XML se utilizan secciones CDATA. Una seccin CDATA comienza con <![CDATA[ y
termina con ]]> y toda la informacin contenida entre el comienzo y el final de la seccin se pasa
directamente sin interpretar a la aplicacin. Por lo tanto, los elementos, las referencias a entidad, las
instrucciones de proceso y los comentarios no son reconocidos.
<![CDATA[
*p = &q;
b = (i <= 3);
]]>

130

Informtica II

12.3. RESTRINGIR XML CON DTD


Un DTD documenta las combinaciones vlidas de elementos y atributos en los documentos XML que
referencian a dicho DTD. Adems proporciona portabilidad, permitiendo que diferentes aplicaciones
entiendan los datos XML y se comuniquen entre s.
En un DTD deben definirse cada uno de los elementos que se permiten en un documento XML, as como
los atributos, posiblemente los valores aceptables para los atributos de cada elemento, el anidamiento y
las entidades externas, entre otras cosas.
La referencia a un DTD en un documento XML se hace del siguiente modo:
<?xml versin=1.0?>
<!DOCTYPE libro SYSTEM Nombre.dtd>
<libro>
<autor>Antonio Muoz Molina</autor>
<titulo>El Jinete Polaco</titulo>
<precio moneda=EURO>20</precio>
</libro>
Tambin pueden incluirse las restricciones, que a continuacin se explican, en el propio documento
XML:
<?xml version="1.0"?>
<!DOCTYPE ToDoList [
<!ELEMENT ToDoList (task)*>
<!ELEMENT task (#PCDATA)>
<!ATTLIST task status (important|normal) #REQUIRED>
]>
<ToDoList>
<task status="important">This is an important
task that must be completed</task>
<task status="normal">This task can wait</task>
</ToDoList>
12.3.1. ESPECIFICAR ELEMENTOS
Cada elemento se especifica mediante el nombre del elemento y una definicin de su contenido, como
se ir explicando en los subapartados posteriores:
<!ELEMENT [Element Name] [Element Definition/Type]>
12.3.1.1. Palabra reservada ANY
Si se utiliza la palabra reservada ANY indica que el elemento puede contener datos de tipo texto o
elementos anidados. Por ejemplo, si se definieran los elementos Book, Chapter, Topic y Copyright como
tipo ANY:
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT

Book ANY>
Chapter ANY>
Topic ANY>
Copyright ANY>

sera vlido el siguiente documento sin sentido:


<Topic>
<Book>My book</Book>
<Copyright>
<Chapter>Chapter 1</Chapter>
</Copyright>
</Topic>
12.3.1.2. Elementos anidados
Para definir la jerarqua de elementos se utiliza como tipo de elemento una lista de elementos entra
parntesis y separados por comas. El orden de los elementos en la lista debe cumplirse en el documento
XML para que sea vlido.

Captulo 12. XML (eXtensible Markup Language)

<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT

131

Book (Contents, Copyright)>


Contents (Chapter)>
Chapter (Topic)>
Topic ANY>
Copyright ANY>

El siguiente documento sera vlido:


<Book>
<Contents>
<Chapter>
<Topic> Qu es XML?</Topic>
</Chapter>
</Contents>
<Copyright>&OreillyCopyright;</Copyright>
</Book>
12.3.1.3. Palabra reservada #PCDATA
Para los datos de tipo texto se utiliza como tipo de elemento la palabra reservada #PCDATA (Parsed
Character Data) escrita entre parntesis. En este caso se limita al elemento a utilizar nicamente datos de
tipo texto y no se permiten los elementos anidados.
<!ELEMENT Topic (#PCDATA)>
12.3.1.4. Elementos vacos
Para exigir que un elemento est siempre vaco se utiliza la palabra reservada EMPTY. No se necesita
que aparezca entre parntesis ya que no se puede agrupar con otros elementos, que es lo que permiten
los parntesis, como se ver ms adelante.
<!ELEMENT SectionBreak EMPTY> dara lugar en el documento a: <SectionBreak/>
12.3.1.5. Indicadores de repeticin
Por defecto un elemento puede aparecer exactamente una vez cuando se especifica en el DTD sin
ningn modificador.
<!ELEMENT Book (Contents, Copyright)>
En este ejemplo Contents debe aparecer exactamente una vez y siempre debe ir seguido por
exactamente un elemento Copyright para que el documento sea vlido.
Para cambiar este comportamiento puede aadirse al final del nombre de un elemento un indicador de
repeticin:
Indicador
?
*
+

Frecuencia
Opcional (0 1 vez)
Opcional y repetible (0 ms veces)
Necesario y repetible (1 ms veces)

Si por ejemplo se quiere permitir que el encabezamiento (elemento Heading) de un captulo aparezca
una vez o que opcionalmente se omita, y que puedan aparecer uno o ms elementos Topic, hay que hacer
la siguiente declaracin:
<!ELEMENT Chapter (Heading?,Topic+)>
Un documento XML vlido sera:
<Chapter>
<Topic> Qu es XML?</Topic>
<Topic> Cmo se utiliza XML?</Topic>
</Chapter>
12.3.1.6. Grupos de elementos
En el contenido de un libro podran aparecer un captulo o un conjunto de captulos, despus un salto
de seccin y a continuacin ms captulos y opcionalmente otro salto de seccin. La estructura captulos y
salto opcional de seccin podra repetirse aplicando un indicador de repeticin al final de dicho grupo de
elementos (un grupo se indica encerrando un conjunto de elementos entre parntesis):

132

Informtica II

<!ELEMENT Contents (Chapter+,SectionBreak?)+ >


Un ejemplo de documento XML vlido sera:
<Book>
<Contents>
<Chapter>
<Heading> Introduccin </Heading>
<Topic> Qu es XML? </Topic>
<Topic> Cmo se utiliza XML? </Topic>
</Chapter>
<Chapter> </Chapter>
<SectionBreak/>
<Chapter> </Chapter>
<Chapter> </Chapter>
<SectionBreak/>
<Chapter> </Chapter>
</Contents>
<Copyright>&OreillyCopyright;</Copyright>
</Book>
12.3.1.7. Operador de opcin |
Permite que ocurra una de las opciones separadas por el operador |. El nmero de opciones no est
limitado y se pueden agrupar usando parntesis.
<!ELEMENT aviso (parrafo | grafico)>
En el ejemplo anterior el elemento aviso debe contener o un prrafo o un grfico.
<!ELEMENT aviso (titulo, (parrafo | grafico))>
En este ejemplo el elemento aviso debe contener un ttulo y adems un prrafo o un grfico.
12.3.2. DEFINIR ATRIBUTOS
La definicin de atributos suele incluirse despus de la especificacin del elemento y tiene la siguiente
forma:
<!ATTLIST [Enclosing Element] [Attribute Name] [type] [modifier] >
El primer parmetro corresponde al nombre del elemento. A continuacin pueden definirse mltiples
atributos para cualquier elemento.
12.3.2.1. Modificadores
Para especificar el grado de necesidad de una atributo se utiliza una de las siguientes palabras
reservadas: #IMPLIED (no se requiere para que el documento sea vlido), #REQUIRED (es necesario
incluirlo) , #FIXED (el usuario nunca puede cambiar el valor del atributo; es poco frecuente en
aplicaciones). El formato de este ltimo es:
<!ATTLIST [Enclosing Element] [Attribute Name] #FIXED [Fixed Value]>
12.3.2.2. Tipos de atributo
Para indicar que el valor del atributo puede ser cualquier dato de tipo texto se utiliza la palabra
reservada CDATA.
<!ATTLIST texto idioma CDATA #REQUIRED>
<!ATTLIST img url CDATA #REQUIRED alt CDATA #IMPLIED>
<!ATTLIST sender company CDATA #FIXED "Microsoft">
Si quiere darse un valor por defecto, en vez de utilizar un modificador, debe escribirse el valor por
defecto entre comillas.
<!ATTLIST texto idioma CDATA "ingls">
Si se desea enumerar un conjunto de valores permitidos se escriben entre parntesis y separados por el
operador |. En este caso, tambin puede indicarse por defecto uno de los valores de la lista, en vez de
utilizar un modificador.
<!ATTLIST Chapter focus (XML|Java) Java>
<!ATTLIST task status (important|normal) #REQUIRED>

Captulo 12. XML (eXtensible Markup Language)

133

El tipo ID permite que un atributo determinado tenga un nombre nico que podr ser referenciado por
un atributo de otro elemento que sea de tipo IDREF. Permite implementar un sistema de hipervnculos en
un documento XML.
<!ELEMENT
<!ATTLIST
<!ELEMENT
<!ATTLIST

enlace EMPTY>
enlace destino IDREF #REQUIRED>
capitulo (parrafo)*>
capitulo referencia ID #IMPLIED>

12.3.3. REFERENCIAS A ENTIDAD


Cuando el analizador se encuentra con una referencia a entidad intenta resolverla utilizando el DTD.
Las declaraciones de entidades en un DTD tienen la siguiente notacin:

Si se especifica un conjunto de caracteres de reemplazo:

<!ENTITY ovni Objeto Volador No Identificado>


que se utilizara en el documento XML:
<texto>
<titulo> Durmiendo en clase, lvaro so con un &ovni; </titulo>
</texto>

Si se desea acceder a un recurso local o a un recurso a travs de la red:

<!ENTITY
<!ENTITY

OReillyCopyright SYSTEM copyright.txt>


OReillyCopyright SYSTEM http://www.oreilly.com/catalog/copyright.xml>

CAPITULO 13

13. SAX y DOM: Java APIs for XML Parsing


13.1. JAVA Y XML
Java es cdigo portable y XML son datos portables. Escribir cdigo en Java asegura que cualquier
sistema operativo y hardware con una mquina virtual Java (JVM) puede ejecutar su cdigo compilado. Si
a esto se aade la habilidad de representar la entrada y salida de la aplicacin con una capa de datos
basada en el estndar XML la aplicacin ser completamente portable y podr comunicarse con cualquier
otra aplicacin utilizando los mismos estndares.
13.1.1. SAX
SAX (API simple para XML) es una API de Java que permite utilizar XML en aplicaciones Java.
Proporciona un marco basado en eventos para analizar datos XML. SAX no es un analizador de XML. La API
SAX proporciona un marco para analizar un documento y define eventos para monitorizar el proceso de
anlisis. Por ejemplo, SAX define la interfaz org.xml.sax.ContentHandler con mtodos como
startDocument() y endElement(), que permite un control completo sobre el proceso de anlisis de un
documento XML. Tambin define otra interfaz para el manejo de errores durante el anlisis XML, como por
ejemplo que un documento no sea vlido.
A SAX se le debe suministrar un analizador para realizar el anlisis de datos XML. Hay disponibles
muchos analizadores para Java, que pueden conectarse con la API SAX, como:

Project X de Sun

Xerces de Apache Software Foundation

XML Parser de Oracle

XML4J de IBM
SAX slo proporciona acceso a los datos de un documento XML.

13.1.2. DOM
DOM es un estndar que tiene su origen en el Consorcio World Wide Web (W3C).No est diseado
especficamente para Java, sino que es una especificacin independiente de lenguaje.
DOM (Modelo de Objetos de Documento) est diseado para acceder y adems manipular datos XML.
Proporciona una representacin de un documento mediante una estructura de tipo rbol (que son muy
sencillas de recorrer y manipular con lenguajes de programacin). DOM carga un documento XML entero
en memoria, almacenando todos los datos como nodos.
La desventaja de DOM es que al cargar el documento entero en memoria consume ms recursos del
sistema y es ms lento.

13.2. ANALIZAR XML


En primer lugar hay que seleccionar un analizador: Se va a emplear el analizador en cdigo abierto
Apache Xerces, disponible en http://xml.apache.org. Xerces implementa los estndares XML y DOM de
W3C, as como el estndar SAX. Las clases del analizador deben estar en la ruta de clases del entorno Java
(ya sea un IDE o un entorno de lnea de comandos).
Generalmente las clases SAX estn incluidas en el analizador, como en el caso de Xerces. En ese caso,
no deberan descargarse explcitamente las clases SAX, ya que es probable que el analizador se haya
empaquetado con la ltima versin de SAX soportada por el analizador.

136

Informtica II

A continuacin se escribir un programa Java que coge un fichero XML de la lnea de comandos y lo
analiza.
13.2.1. INSTANCIAR UN LECTOR
SAX proporciona la interfaz org.xml.sax.XMLReader que deber ser implementada por el analizador. La
clase org.apache.xerces.parsers.SAXParser del analizador Xerces implementa dicha interfaz y debe
instanciarse para poder analizar XML.:
XMLReader parser= new SAXParser();
A continuacin se muestra el esquema del programa, que instancia el analizador, pero an no analiza
ningn documento.
import org.xml.sax.XMLReader;
import org.apache.xerces.parsers.SAXParser;
public class SAXParserDemo{
public static void main(String[] args){
String uri=args[0];
SAXPArserDemo parserDemo=new SAXParserDemo();
parserDemo.performDemo(uri);
}
public void performDemo(String uri){
XMLReader parser= new SAXParser();
}
}
13.2.2. ANALIZAR EL DOCUMENTO
Una vez instanciado el analizador, se le dan instrucciones para que analice el documento. Debe
aadirse al programa el mtodo parse() de org.xml.sax.XMLReader, as como dos manejadores de
excepciones: java.io.IOException y org.xml.sax.SAXException.
import
import
import
import

java.io.IOException;
org.xml.sax.SAXException;
org.xml.sax.XMLReader;
org.apache.xerces.parsers.SAXParser;

public class SAXParserDemo{


public static void main(String[] args){
String uri=args[0];
SAXPArserDemo parserDemo=new SAXParserDemo();
ParserDemo.performDemo(uri);
}
public void performDemo(String uri){
try{
XMLReader parser= new SAXParser();
parser.parse(uri);
}catch (IOException e){
System.out.println(Error reading URI:+e.getMessage));
}catch (SAXException e){
System.out.println(Error in parsing:+e.getMessage));
}
}
}
Una vez compilado este programa, para ejecutarlo, se debe especificar la ruta completa de un fichero
XML en la lnea de comandos, por ejemplo el fichero contents.xml:
java SAXParserDemo G:\contents.xml

Captulo 13. SAX y DOM: Java APIs for XML Parsing

137

Hasta ahora no se ha establecido ninguna llamada de retorno que diga qu accin tomar durante el
proceso de anlisis. Sin estas llamadas de retorno, el documento se analiza sin intervencin de la
aplicacin. Las llamadas de retorno del analizador permiten insertar acciones en el programa
reaccionando ante los datos, los elementos, los atributos y la estructura del documento que se est
analizando.
13.2.3. MANEJADORES DE CONTENIDO
Para que la aplicacin realice algo til con los datos XML segn se van analizando, hay que declarar
manejadores con el analizador SAX. Un manejador es un conjunto de llamadas de retorno que SAX define
para agregar el cdigo de la aplicacin en eventos importantes durante el anlisis. Estos eventos se
producen mientras el documento se analiza, no despus de que el anlisis haya terminado. SAX permite,
por tanto, manejar un documento secuencialmente sin tener que cargar primero el documento entero en
memoria.
SAX 2.0 define cuatro interfaces de manejadores principales:
org.xml.sax.ContentHandler
org.xml.sax.ErroHandler
org.xml.sax.DTDHandler
org.xml.sax.EntityResolver
Solo se explicar la interfaz ContentHandler, que permite manejar eventos estndar relacionados con
los datos del documento XML, y se mencionarn los mtodos de la interfaz ErrorHandler, que recibe
notificaciones del analizador cuando se encuentran errores en los datos XML.
Estas interfaces deben ser implementadas por clases para realizar acciones especficas en el proceso de
anlisis; y estas clases deben declararse en el analizador con los mtodos:
setContentHandler()
setErrorHandler()
setDTDHandler()
setEntityResolver()
Despus el analizador invoca los mtodos de llamada de retorno en los manejadores apropiados
durante el anlisis.
13.2.3.1. Interfaz ContentHandler
Esta interfaz declara varios mtodos importantes en el ciclo de vida del anlisis a los que la aplicacin
Java puede reaccionar. Se definir una nueva clase (MyContentHandler) para implementar la interfaz
ContentHandler, que puede ser aadida al final del fichero SAXParserDemo.java. De momento se han
dado implementaciones vacas para todos los mtodos de la interfaz ContentHandler, que permiten
compilar el fichero pero que no proporcionan ninguna informacin.
Por otro lado, hay que declarar el manejador en el XMLReader que se ha instanciado. Esto se hace con
setContentHandler().

import
import
import
import
import
import
import

org.xml.sax.ContentHandler;
org.xml.sax.Attributes;
org.xml.sax.Locator;
java.io.IOException;
org.xml.sax.SAXException;
org.xml.sax.XMLReader;
org.apache.xerces.parsers.SAXParser;

public class SAXParserDemo{


public static void main(String[] args){
...
}
public void performDemo(String uri){
ContentHandler contentHandler=new MyContentHandler();
try{
XMLReader parser= new SAXParser();
parser.setContentHandler(contentHandler);
parser.parse(uri);

138

Informtica II

}catch (IOException e){


System.out.println(Error reading URI:+e.getMessage));
}catch (SAXException e){
System.out.println(Error in parsing:+e.getMessage));
}
}
}
class MyContentHandler implements ContentHandler{
public void startDocument() throws SAXException{ }
public void endDocument() throws SAXException{ }
public void startElement(String namespaceURI, String localName,
String rawName, Attributes atts) throws SAXException{ }
public void endElement(String namespaceURI, String localName,
String rawName) throws SAXException{ }
public void characters(char[] ch, int start, int end)
throws SAXException{ }
public void setDocumentLocator(Locator locator){ }
public void processingInstruction(String target, String data)
throws SAXException{ }
public void startPrefixMapping(String prefix, String uri){}
public void endPrefixMapping(String prefix){}
public void ignorableWhitespace(char[] ch, int start, int end)
throws SAXException{ }
public void skippedEntity(String name) throws SAXException{ }
//solo lo usan muy pocos analizadores, los menos establecidos.
}
Los mtodos startDocument() y endDocument() indican a la aplicacin cundo empieza y cundo
acaba el anlisis del documento XML. Incluso cuando ocurre un error irrecuperable, el ltimo mtodo que
se llama es endDocument() completando el intento de anlisis, tras haber invocado al mtodo necesario
de ErrorHandler().
Los mtodos en los que se centrar este guin son startElement(), characters() y endElement(),
que indican cundo se analiza un elemento, los datos de ese elemento y cundo se alcanza la etiqueta de
cierre para ese elemento.
El mtodo starElement() da a la aplicacin informacin sobre un elemento XML y los atributos que
pueda tener. Los argumentos para este mtodo son el nombre del elemento (en varias formas) y una
instancia de org.xml.sax.Attributes, que tiene referencias a todos los atributos del elemento (permite
una iteracin sencilla por los atributos del elemento de forma similar a un vector). Puede hacerse
referencia a un atributo por su ndice (se usa cuando se itera entre todos los atributos) o por su nombre.
A continuacin se muestra el cdigo para imprimir en pantalla el nombre y los atributos de un
elemento que se abre.
public void startElement(String namespaceURI, String localName,
String rawName, Attributes atts) throws SAXException{
System.out.print(startElement:+localName);
for(int i=0;i<atts.getLength();i++){
System.out.print(Attribute:+atts.getLocalName(i)+=+atts.getValue(i));
}
}
Es importante tener en cuenta que los atributos no estarn disponibles necesariamente en el orden en
que se analizaron, que es el orden en el que se escribieron. Aunque hay algunos analizadores que
implantan la ordenacin, a menudo no est incluido en el conjunto de caractersticas de un analizador.
El propsito principal de la llamada de retorno endElement() es indicar el cierre de un elemento
haciendo saber a la aplicacin que el resto de caracteres no son parte del elemento en curso que se est
cerrando.
En los elementos puede haber contenidos otros elementos anidados o datos de tipo texto. Cuando
aparecen elementos anidados en otros elementos se inician llamadas de retorno anidadas en llamadas
de retorno. En algn momento se encontrarn datos de tipo texto, que se mandan a la aplicacin

Captulo 13. SAX y DOM: Java APIs for XML Parsing

139

mediante la llamada de retorno characters(). Este mtodo proporciona un array o vector de caracteres,
as como el ndice de comienzo y de final, con los que se leern los datos de tipo texto pertinentes:
public void characters(char[] ch, int start, int end) throws SAXException{
String s=new String(ch,start,end);
System.out.println(characters:+s);
}
Aclaracin: sera un error utilizar el siguiente cdigo para leer el array de caracteres, porque no debe
leerse el array de caracteres desde el principio hasta el final sino utilizando los lmites inicial y final que
pasa el analizador.
public void characters(char[] ch, int start, int end) throws SAXException{
for (int i=0; i<ch.length; i++) //error
System.out.print(i);
}
SAX analiza secuencialmente: el analizador avanza manejando elementos, atributos y datos segn se
encuentra con ellos. Por ejemplo en el siguiente fragmento de XML,
<gato>
<nombre>Micif</nombre>
</gato>
las llamadas de retorno dan como resultado la siguiente cadena de eventos:
startElement: gato
startElement: nombre
characters: Micif
endElement: nombre
endElement: gato
13.2.3.2. Interfaz ErrorHandler
Se utiliza para manejar e informar de diversas condiciones de error que pueden surgir durante el
anlisis. Define tres mtodos de llamadas de retorno: warning(), error(), fatalError(), que reciben
como argumento una excepcin SAXParserException, con informacin sobre el error o advertencia y su
localizacin.
13.2.4. PORTABILIDAD AL CARGAR EL ANALIZADOR
Si se utiliza el cdigo explicado hasta el momento:
import org.apache.xerces.parsers.SAXParser;
XMLReader parser=new SAXPArser();
se est violando el principio de portabilidad de Java y el cdigo no puede compilarse y ejecutarse en
una plataforma que no utilice el analizador Apache Xerces. Se est importando explcitamente la
implementacin de XMLReader de un fabricante concreto y posteriormente se est instanciando
directamente esa implementacin.
Es
preferible
utilizar
el
mtodo
createXMLReader()
que
proporciona
la
clase
org.XML.SAX.helpers.XMLReaderFactory. Este mtodo devuelve una instancia de XMLReader y hay que
pasarle como argumento el nombre de la clase del analizador a cargar. Para tener portabilidad se
almacena el nombre de la clase del analizador en un fichero de propiedades y se lee de dicho fichero en
tiempo de ejecucin, permitiendo as modificar el analizador sin tener que cambiar el cdigo Java.
Aunque el cdigo para leer un fichero de propiedades no se proporciona en este guin, a continuacin
puede verse cmo se utilizara:
import org.xml.sax.helpers.XMLReaderFactory;
try{
XMLReader parser= XMLReaderFactory.createXMLReader(
PropertiesReader().getInstance().getProperty( parserClass));
parser.setContentHandler(contentHandler);
parser.parse(uri);
}catch (IOException e){
System.out.println(Error reading URI:+e.getMessage());
}catch(SAXException e){

140

Informtica II

System.out.println(Eroor in parsing:+e.getMessage());
}
La clase PropertiesReader permitira leer el fichero de propiedades y devolvera el valor de la
propiedad parserClass conteniendo el nombre de la clase del analizador., por ejemplo
org.apache.xerces.parsers.SAXParser.
13.2.5. VALIDAR XML
La validacin asegura que las restricciones impuestas a un documento XML se cumplan. El mtodo
setFeature() de la interfaz XMLReader permite activar la validacin en el analizador usando el URI:
http://xml.org/sax/features/validation.

try{
XMLReader parser=
XMLReaderFactory.createXMLReader(org.apache.xerces.parsers.SAXParser);
parser.setContentHandler(contentHandler);
parser.setFeature(http://xml.org/sax/features/validation, true);
parser.parse(uri);
}catch (IOException e){
System.out.println(Error reading URI:+e.getMessage));
}catch (SAXException e){
System.out.println(Error in parsing:+e.getMessage));
}
Para ejecutar la validacin es necesario estar conectado a Internet si se intentan resolver referencias a
entidades no locales, como en el ejemplo:
<!ENTITY

OReillyCopyright SYSTEM http://www.oreilly.com/catalog/copyright.xml>

Aclaracin: No se necesita implementar la interfaz DTDHandler para validar XML.

13.3. RECORRER XML: ANALIZAR CON DOM


Una alternativa a la utilizacin de SAX para llegar a los datos XML es el Modelo de Objetos de
Documento (DOM). El modelo secuencial que proporciona SAX no permite un acceso aleatorio a un
documento XML. Un analizador DOM, sin embargo, construye una representacin en memoria del
documento XML., por lo que permite acceder al documento en cualquier orden.
Utilizar DOM para un lenguaje de programacin especfico requiere un conjunto de interfaces y clases.
En el caso de Java las clases necesarias estn en el paquete org.w3c.dom y al igual que el paquete SAX, el
paquete DOM a menudo se incluye en el analizador XML, como en el caso del analizador Xerces de Apache.
Se va a crear un sencillo programa para trabajar con DOM, similar al explicado con SAX, que lee un
documento XML y lo analiza.
13.3.1. INSTANCIAR UN ANALIZADOR DOM Y ANALIZAR EL DOCUMENTO
En primer lugar hay que importar e instanciar la clase del analizador DOM que se va a utilizar:
import org.apache.xerces.parsers.DOMParser;
public class DOMPArserDemo{
public static void main(String[] args){
String uri=args(0);
DOMParserDemo parserDemo=new DOMParserDemo();
parserDemo.performDemo(uri);
}
public void performDemo(String uri){
DOMParser parser=new DOMPArser();
try{
parser.parse(uri);
}catch(Exception e){
System.out.println(Error in parsing: + e.getMessage());
}
}

Captulo 13. SAX y DOM: Java APIs for XML Parsing

141

}
13.3.2. OBTENER EL RBOL DOM (OBJETO DOCUMENT)
En DOM la salida del proceso de anlisis es un objeto org.w3c.dom.Document, que jerrquicamente
constituye un nivel por encima del elemento raz del documento XML. Hay varios mecanismos para
obtener el objeto Document despus del anlisis. En la mayora de los analizadores, entre ellos el Xerces
de Apache, el mtodo parse() devuelve void y hay un mtodo adicional para obtener el objeto Document
como resultado del anlisis XML. En Xerces este mtodo se llama getDocument(). Las lneas de cdigo que
habra que aadir al ejemplo para obtener el rbol DOM son:
import org.w3c.dom.Document;
import org.apache.xerces.parsers.DOMParser;
public class DOMPArserDemo{
public static void main(String[] args){}
public void performDemo(String uri){
DOMParser parser=new DOMPArser();
try{
parser.parse(uri);
Document doc = parser.getDocument();
}catch(Exception e){
System.out.println(Error in parsing: + e.getMessage());
}
}
}
13.3.3. ACCEDER A LOS NODOS DEL RBOL DOM
Para manipular los datos del rbol se utilizan las interfaces:
Document
DocumentFragment
DocumentType
ProcessingInstruction

Node

Comment

CharacterData
Element

Text

CDATASection

Attr
EntityReference
Entity
Notation

Node es la interfaz base de las dems interfaces (entre ellas Document). Para determinar el tipo de
nodo se emplea el mtodo getNodeType() de la interfaz Node, que devuelve un valor entero. Este valor se
puede comparar con un conjunto de constantes definidas en la interfaz Node para identificar el tipo de
nodo. Los tipos de nodos ms comunes son DOCUMENT_NODE, ELEMENT_NODE y TEXT_NODE. Como Node es
la interfaz base de todas las dems, si se desea imprimir el rbol DOM, puede definirse un nico mtodo
que reciba como argumento un objeto Node, determine qu tipo de nodo es y, en funcin de ello, utilice
el cdigo adecuado para imprimirlo. La estructura de este mtodo sera:

142

Informtica II

public static void printNode(Node node){


switch (node.getNodeType()){
case Node.DOCUMENT_NODE:
//imprimir el contenido del objeto Document
break;
case Node.ELEMENT_NODE:
//imprimir el nodo
//iterar en sus hijos invocando recursivamente a printNode
break;
case Node.TEXT_NODE:
//imprimir los datos
break;
}
}
13.3.3.1. El nodo Documento (case Node.DOCUMENT_NODE)
Primero se invoca el mtodo sobre el objeto inicial Document y posteriormente, la recursin continuar
la impresin hasta completar el rbol
public void performDemo(String uri){
DOMParser parser = new DOMPArser();
try{
parser.parse(uri);
Document doc = parser.getDocument();
printNode(doc);
}catch(Exception e){
System.out.println(Error in parsing: + e.getMessage());
}
}
Al invocar el mtodo printNode() pasndole como argumento el objeto Document se tiene el caso
Node.DOCUMENT_NODE. El objeto Document contiene al elemento raz y para obtenerlo se utiliza el mtodo
getDocumentElement(). El elemento raz se pasa como argumento al mtodo de printNode() para seguir
imprimiendo el rbol.

switch (node.getNodeType)){
case Node.DOCUMENT_NODE:
Document doc=(Document)node;
printNode(doc.getDocumentElement());
break;
case ...
}
13.3.3.2. Elementos (case Node.ELEMENT_NODE)
Cuando el argumento de printNode() es un elemento, en primer lugar hay que conseguir el nombre
del elemento XML mediante el mtodo getNodeName() de la interfaz Node, e imprimirlo.
Despus hay que obtener sus atributos utilizando el mtodo getAttributes() de la interfaz Node, que
devuelve un objeto NameNodeMap con la lista de atributos del elemento. Se itera esta lista imprimiendo el
nombre y el valor de cada atributo con los mtodos getNodeName() y getNodeValue().
Adems se necesita acceder a los elementos hijos para continuar imprimiendo el rbol; para ello se
utiliza el mtodo getChilNodes() que devuelve un objeto NodeList.
Las sentencias import que se necesitan son:
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.NameNodeMap;
El cdigo para imprimir los elementos y sus atributos es:
case Node.ELEMENT_NODE:
String name=node.getNodeName();
System.out.print(<+name);

Captulo 13. SAX y DOM: Java APIs for XML Parsing

143

NamedNodeMap attributes = node.getAttributes();


for(int i=0; i<attributes.getLength();i++){
Node current=attributes.item(i);
System.out.print( + current.getNodeName() +
=\ + current.getNodeValue()+\);
}
System.out.println(>);
NodeList children=node.getChildNodes();
if(children!=null){
for(int i=0; i<children.getLength();i++){
printNode(children.item(i));
}
}
System.out.println(</+name+>);
break;
13.3.3.3. Nodo de tipo texto
Para obtener los datos de tipo texto se emplea el mtodo getNodeValue() de la interfaz Node.
case Node.TEXT_NODE:
System.out.print(node.getNodeValue());
break;
13.3.4. MUTABILIDAD DE UN RBOL DOM
Una de las caractersticas ms utilizadas de DOM, aunque no se explicar en este manual, es la
posibilidad de modificar un rbol DOM. Por ejemplo, una aplicacin que recibe un documento XML de
entrada puede generar como salida otro rbol copiando, modificando, aadiendo o eliminando nodos del
rbol de entrada.

13.4. PROCESADORES
Despus de analizar un documento XML, casi siempre se transforma utilizando las especificaciones XSL
(Lenguaje de Hojas de Estilo Extensible) y XSLT (Transformacin del Lenguaje de Hojas de Estilo
Extensible). Los procesadores aplican a un documento XML una hoja de estilo XSL transformando as el
documento en otro formato como por ejemplo HTML, PDF o PostScript..
Un ejemplo de procesador es Apache Xalan: http://xml.apache.org.

CAPITULO 14

14. Servicios Web XML


14.1. Introduccin
Un servicio Web XML es una unidad programable a la que sistemas muy dispares pueden tener acceso a
travs de Internet. Estos servicios dependen fundamentalmente de la aceptacin generalizada de XML,
HTTP y otros estndares de Internet que admiten la interoperabilidad.
Un servicio Web XML se puede utilizar internamente por una sola aplicacin, o bien exponerse de forma
externa en Internet para que puedan usarlo varias aplicaciones. Estos servicios son accesibles a travs de
una interfaz estndar, lo que permite que sistemas heterogneos puedan trabajar en comn como una
sola red de informtica.
En lugar de buscar las capacidades genricas de portabilidad del cdigo, los servicios Web XML ofrecen
una solucin viable que permite la interoperabilidad de sistemas y datos. Estos servicios utilizan la
mensajera basada en XML para el intercambio de datos entre los sistemas que utilizan lenguajes de
programacin, sistemas operativos y modelos de componentes incoherentes. Los desarrolladores pueden
crear aplicaciones que relacionen entre s servicios Web XML de diversos orgenes de forma muy similar a
como se utilizan normalmente los componentes en una aplicacin distribuida.
Una de las caractersticas fundamentales de un servicio Web XML es el alto grado de abstraccin que
existe entre la implementacin y el uso del servicio. Al utilizar la mensajera basada en XML como
mecanismo para crear y tener acceso al servicio, el cliente y el proveedor del servicio Web XML slo
necesitan la informacin relativa a las entradas, las salidas y la ubicacin.
Los servicios Web XML estn abriendo una nueva era de desarrollo de aplicaciones distribuidas. Los
sistemas bien acoplados que utilizan infraestructuras de propietario sacrifican la interoperabilidad entre
las aplicaciones. Sin embargo, los servicios Web XML ofrecen interoperabilidad en un nivel totalmente
nuevo. Como prximo avance revolucionario en la era de Internet, los servicios Web XML se convertirn en
la estructura fundamental que vincular a todos los dispositivos informticos.

14.2. Escenarios
Para entender mejor la valiosa contribucin de los Servicios Web XML, es til examinar ciertos
escenarios en los cuales pueden jugar un papel ventajoso.
14.2.1. Servicios simples
El escenario ms bsico que se puede solucionar mediante Servicios Web XML es aquel que provee a los
clientes de alguna parte fundamental de funcionalidad para su uso. Por ejemplo, un reto al que se
enfrentan las aplicaciones de comercio electrnico es la necesidad de calcular los costes de envo para
una seleccin concreta de opciones de envo. Dichas aplicaciones pueden requerir las tablas de costes de
envo actualizadas de cada compaa de transporte para usarlas en los clculos.
Alternativamente, una aplicacin puede enviar un mensaje simple basado en XML a travs de Internet,
usando un protocolo de transporte estndar como http, al Servicio Web XML de clculo de coste del
transportista. El mensaje puede contener el peso y dimensiones del paquete, lugar de origen y lugar de
destino, y otros parmetros como la clase de servicio. El Servicio Web XML del transportista calculara los
costes del envo usando las tablas de coste actuales y devolver esa cantidad, en un mensaje simple basado
en XML, a la aplicacin que efectu la peticin que usar esta cantidad en el clculo del coste total del
pedido para el cliente en particular.

146

Informtica II

14.2.2. Integracin de Aplicaciones


Los Servicios Web XML pueden ser usados a modo de conglomerado para integrar un conjunto
aparentemente dispar de aplicaciones existentes. La extendida adopcin de software hecho a medida por
parte de virtualmente la totalidad de departamentos de la mayora de las empresas ha resultado en un
vasto surtido de aplicaciones tiles pero que crean islas de informacin dentro de las propias empresas.
Debido a la variedad de circunstancias bajo las cuales cada aplicacin fue desarrollada y a la naturaleza
evolutiva de la tecnologa, crear un ensamblaje funcional entre estas aplicaciones es una tarea cuando
menos intimidante.
Con los Servicios Web XML es posible exponer la funcionalidad y los datos de cada una de las
aplicaciones existentes como un Servicio Web para las dems aplicaciones. Se puede crear una aplicacin
compuesta que use esta coleccin de Servicios Web XML para permitir la interoperabilidad entre las
aplicaciones que constituyen dicho conglomerado.
14.2.3. Soluciones para la Gestin de Procesos de Negocio
Los Servicios Web XML posibilitan un potente mecanismo mediante el cual se pueden crear aplicaciones
que constituyan una solucin para la gestin de procesos de negocio de principio a fin. Dichas soluciones
son apropiadas para escenarios como transacciones B2B (Business-to-Business).
Estos servicios proveen la infraestructura y herramientas para el enrutado, transformacin y
seguimiento, basados en reglas, de documentos de negocio. La infraestructura permite a las compaas
integrar, manejar y automatizar procesos de negocio mediante el intercambio de documentos de negocio
(por ejemplo, pedidos de compra y facturas) entre aplicaciones dentro o a travs de los lmites fsicos de
la organizacin.

14.3. Infraestructura de los Servicios Web XML


Los servicios Web XML deben ser independientes de la eleccin de sistema operativo, modelo de
objetos y lenguaje de programacin para tener xito dentro de la heterogeneidad de la Web. Para que los
servicios Web XML logren la misma expansin que han conseguido otras tecnologas basadas en la Web,
deben ser:

Dbilmente articulado (Loosely coupled) : Dos sistemas se consideran dbilmente articulados si slo lo
nico que se impone en ambos sistemas es el entendimiento de mensajes de texto que se describen a
si mismos. Por otro lado, sistemas fuertemente articulados (tightly coupled) requieren un mayor
entendimiento entre ellos para poder comunicarse.

Comunicacin ubicua: Es improbable que nadie desarrolle un sistema operativo ahora o en el futuro
que no incluya la posibilidad de conexin a Internet, y por lo tanto que provea un canal de
comunicacin ubicua. Por s mismo, la habilidad de conectar casi cualquier sistema o aparato a
Internet asegurar que esos sistemas o aparatos est disponibles universalmente para otros sistemas o
aparatos a su vez conectados a Internet.

Formato de Datos Universal: Adoptando mtodos de comunicacin estndar abiertos cualquier sistema
que soporte los mismos estndar abiertos es capaz de entender servicios Web XML. Utilizando
mensajes de texto que se describen a si mismos y que los servicios Web XML y sus clientes pueden
compartir sin la necesidad de saber lo que constituye cada uno de los sistemas subyacentes, se logra
una comunicacin entre sistemas autnomos y dispares. Los servicio Web XML logran esta capacidad
usando XML.

Los servicios Web emplean una infraestructura que provee lo siguiente: un mecanismo de
descubrimiento para localizar servicios Web XML, un servicio de descripcin para definir cmo se usan esos
servicios y un formato estndar de protocolos con los cuales comunicarse.
A continuacin se enumeran las diferentes partes de esta infraestructura y su papel.
14.3.1. XML Web Services Directories
XML Web Services Directories ponen a disposicin una localizacin central para la bsqueda de
servicios Web XML ofertados por otras organizaciones. Los directorios de servicios Web XML como el
registro UDDI (Universal Description, Discovery and Integration) cumplen este papel. Los clientes de
servicios Web XML pueden necesitar o no estos directorios.
14.3.2. XML Web Service Discovery
XML Web service discovery es el proceso de localizar, o descubrir, uno o ms documentos
relacionados que describan un servicio Web XML particular usando WSDL (Web Services Description

Captulo 14. Servicios Web

147

Language). Si un cliente de un servicio Web XML conoce la localizacin de la descripcin del servicio,
puede saltarse este proceso.
14.3.3. XML Web Service Description
Para entender cmo interactuar con un servicio Web XML en particular es necesario disponer de un
servicio de descripcin que defina qu interacciones soporta el servicio Web XML. Los clientes de un
servicio Web XML deben saber cmo interactuar con un servicio Web XML antes de poder usarlo.
14.3.4. XML Web Service Wire Formats
Para posibilitar una comunicacin universal, los servicios Web XML usan estndares abiertos, que son
protocolos que son entendibles desde cualquier sistema capaz de soportar los estndares Web ms
comunes. SOAP es el protocolo clave para las comunicaciones de servicios Web XML.

14.4. Protocolo SOAP


SOAP es un protocolo basado en XML, simple y ligero, para el intercambio de informacin estructurada
en la Web. El objetivo global de diseo de SOAP es mantenerlo tan simple como sea posible y poner a
disposicin un mnimo de funcionalidad. El protocolo define un marco para el intercambio de mensajes. Se
trata de un protocolo modular y muy extensible.
Viajando a travs de protocolos estndares de transporte, SOAP es capaz de apalancar las arquitecturas
abiertas existentes en Internet y ganar fcilmente la aceptacin de cualquier sistema arbitrario capaz de
soportar los estndares ms bsicos de Internet. Se podra ver la infraestructura requerida para soportar
servicios Web XML bajo SOAP como algo simplistas, aunque potentes, ya que SOAP aade relativamente
poco a la infraestructura existente en Internet y an y todo facilita acceso universal a los servicios
construidos bajo SOAP.
La especificacin del protocolo SOAP consiste en cuatro partes principales. La primera de ellas define
una parte extensible obligatoria que encapsula los datos. Define un mensaje SOAP y es la unidad bsica de
intercambio entre procesadores de mensajes SOAP. Es la nica parte obligatoria de la especificacin.
La segunda parte de la especificacin de SOAP define reglas opcionales de codificacin de datos para
representar los tipos de datos y grafos definidos por las aplicaciones y un modelo uniforme para serializar
modelos no sintcticos de datos.
La tercera parte define un patrn de intercambio de mensajes. Cada mensaje SOAP es un transmisin
en un solo sentido. La cuarta parte de la especificacin define una unin entre SOAP y http. Sin embargo
esta opcin es tambin opcional. Se puede usar SOAP en combinacin con cualquier protocolo o
mecanismo de transporte.
Para obtener la especificacin de SOAP, visitar la Web de W3C: http://www.w3.org/TR/soap.

14.5. Proceso de uso de un Servicio Web XML


El proceso que tiene lugar cuando se realiza una llamada a un servicio Web XML es similar al proceso
que ocurre cuando se hace una llamada regular a un mtodo. La principal diferencia es que en vez de
llamar a un mtodo que est en la aplicacin cliente, se genera un mensaje de peticin a travs del
transporte especfico, como HTTP. Ya que el mtodo del servicio Web XML puede estar localizado en otro
computador, la informacin que el servicio Web XML necesita para procesar la peticin debe ser pasada a
travs de la red al servidor que tiene el servicio Web XML. El servicio Web XML procesa la informacin y
enva el resultado de vuelta, a travs de la red, a la aplicacin cliente.
A continuacin se describe la secuencia de eventos que tienen lugar cuando se llama a un servicio Web
XML:
1. El cliente crea una nueva instancia de una proxy class del servicio Web XML. Este objeto reside en el
mismo computador que el cliente.
2. El cliente invoca un mtodo de la proxy class.
3. La infraestructura en el computador del cliente serializa los argumentos del mtodo del servicio Web
XML en un mensaje SOAP y lo enva a travs de la red al servicio Web XML.
4. La infraestructura recibe el mensaje SOAP y deserializa el XML. Crea una instancia de la clase que
implementa el servicio Web XML e invoca el mtodo del servicio Web XML, pasndole el XML
deserializado como argumentos.

148

Informtica II

5. El mtodo del servicio Web XML ejecuta su cdigo, fijando los valores que debe retornar y cualquier
parmetro de salida.
6. La infraestructura en el servidor Web serializa los valores de retorno y los parmetros de salida en un
mensaje SOAP y lo enva a travs de la red de vuelta al cliente.
7. La infraestructura del servicio Web XML en el computador del cliente recive el mensaje SOAP,
deserializa el XML en los valores de retorno y cualquier parmetro de salida, y los pasa a la instancia
de la proxy class.
8. El cliente recibe los valores de retorno y cualquier parmetro de salida.

14.6. Cmo se desarrolla un Servicio Web XML


La creacin de un Servicio Web XML es similar a la creacin de cualquier componente que ponga a
disposicin acceso a su lgica interna de aplicacin. Para crear un servicio Web XML es necesaria alguna
funcionalidad que constituya el servicio que se quiere poner a disposicin, la descripcin de dicho servicio
que define cmo se usa y una infraestructura que soporta la recepcin y procesamiento de peticiones y el
envo de respuestas. Afortunadamente, la mayora de la infraestructura requerida viene dada.
El proceso de desarrollo depende de la plataforma de desarrollo sobre la que se decida trabajar.

14.7. Cmo se desarrolla un cliente de Servicio Web XML


Usar un servicio Web XML comprende la comunicacin de mtodos del servicio Web XML a travs de la
red usando protocolos estndar. Sin embargo, antes de que una aplicacin pueda empezar a comunicarse
con un servicio Web XML, hay cuatro pasos que debe seguir:
1. Determinar si existe un servicio Web
XML. Se puede buscar en un directorio, como
http://uddi.microsoft.com, vendedores que provean servicios Web XML con funcionalidades
especficas. El directorio tendr una URL al Web del vendedor.
2. Descubrir un servicio Web XML. Dada la URL de un vendedor, se invoca al discovery del servicio Web
XML para obtener detalles especficos acerca de cada servicio Web XML disponible en dicha URL. La
informacin sobre cada servicio Web XML se devuelve al cliente en forma de descripcin del servicio,
que es un documento XML que describe con detalle el servicio Web XML en Web Service Description
Language (WSDL). Concretamente el documento detalla cmo comunicarse con un servicio Web XML.
3. Dada la descripcin de un servicio, hay que generar una proxy class que puede comunicar con los
mtodos del servicio Web XML.
4. Crear una aplicacin cliente que invoque los mtodos de la proxy class Estos mtodos pueden
comunicar con los mtodos del servicio Web XML a travs de Internet, usando protocolos estndar.
Los Servicios Web XML pueden ser usados por una gran variedad de aplicaciones cliente. Se puede
comunicar con un Servicio Web XML desde cualquier aplicacin Web, incluyendo otro servicio Web XML. El
cliente de un servicio Web XML no es necesariamente una aplicacin basada en un cliente; en realidad la
mayora de los clientes son aplicaciones basadas en un servidor, tales como Formularios Web u otros
Servicios Web XML.

14.8. Herramientas Java para el diseo de Servicios Web XML


Se dispone de las siguientes APIs (Application Programming Interfaces) para el diseo de Servicios Web
XML y clientes de servicios Web XML:

JAXR: Acceso a directorios de servicios.

JAXM: Envo de mensajes XML.

JAX-RPC: Uso de XML-RPC (mecanismo para invocacin remota de procedimientos (mtodos)


utilizando XML como forma de comunicacin) desde Java.

14.8.1. JAXR
Es una API para Java que permite trabajar con los registros de servicios web sin preocuparnos de los
detalles de los documentos XML que intervienen en las operaciones. Un registro es una infraestructura que
facilita el descubrimiento de servicios web. Este tipo de registros se encuentra disponibles para cualquier
organizacin, normalmente como un servicio web ms. Existen varias especificaciones para estos registros,
la ms importantes es UDDI, desarrollada por una serie de empresas.

Captulo 14. Servicios Web

149

Es independiente del tipo de registro concreto al que accedemos, pues se utiliza un modelo de
contenido unificado.
Permite realizar las siguientes operaciones bsicas: buscar servicios web disponibles, publicar servicios
web, modificar los datos de un servicio, eliminar un servicio.
14.8.2. JAXM
Es una API para Java que permite trabajar con mensajes SOAP sin preocuparnos de los detalles de los
documentos XML que intervienen en las operaciones.
Permite enviar mensajes de dos formas:

Mediante una conexin punto a punto: el programa enva el mensaje directamente al destinatario,
quedando bloqueado a la espera de una respuesta.

Mediante un proveedor de mensajes: se enva el mensaje a un proveedor que ser el encargado de


hacerlo llegar al destinatario, sin producirse ningn bloqueo en espera de una respuesta.

14.8.3. JAX-RPC
Es una API para Java que permite construir servicios web y clientes para los servicios sin
preocuparnos de los detalles de los documentos XML que intervienen en las operaciones.
Las llamadas a los mtodos y las respuestas se implementan mediante mensajes SOAP.
En un servicio web, los mtodos que lo constituyen se definen en un interfaz y se implementan en una
clase aparte.
En un cliente, las llamadas a los mtodos se realizan mediante objetos locales que representan el
mtodo remoto (stubs).
Un cliente escrito con JAX-RPC puede interactuar con un servicio escrito en otro lenguaje, y
viceversa, pues esta tecnologa se basa en una serie de estndares como HTTP, SOAP y WSDL.

Bibliografa

Rick Decker, Stuart Hirshfield. Programacin con Java. Segunda edicin. Thomson. (2001).

Jos M Prez Menor, Jess Carretero Prez, Flix Garca Carballeira, Jos Manuel Prez Lobato.
Problemas Resueltos de Programacin en lenguaje Java. THOMSON. (2002).

Jasn Hunter, William Crawford. Java Servlet Programming, Second Edition. OReilly & Associates,
Inc. (2001).

JDBCTM Guide: Getting Started. Sun Microsystems, Inc. (1997).

Cay S. Horstmann & Gary Cornell. Java 2. Volumen 1. Fundamentos. Prentice Hall (2003).

Cay S. Horstmann & Gary Cornell. Java 2. Volumen 2. Caractersticas avanzadas. Prentice Hall
(2003).

PRCTICAS

Prctica 1: HTML bsico


El objetivo de esta prctica es familiarizarse con el lenguaje HTML, por lo que se trabajar con
un editor de ficheros ASCII como el Notepad, aunque existen otros mtodos para conseguir el mismo
resultado (editores de HTML o conversores desde otras aplicaciones).
Esta prctica consiste en un website que se ir completando progresivamente. Crea una carpeta
en tu cuenta y descarga en ella el archivo Practica01.zip de la web de Informtica II.
Ejercicio 1.1: Estructura del HTML; FRAMES.
Crea la pgina index.html con las siguientes caractersticas:

Ttulo: CULTURSITE.

Dos frames: margen izquierdo (20% de la pantalla) y parte principal (80%).

Contenido del margen izquierdo: pgina menu.html. Target de nombre: navegador.

Contenido de la parte principal: pgina principal.html. Target de nombre: main.

Ejercicio 1.2: TAGs para estructurar y formatear texto; LISTAS.


Formatea el texto de instituciones.html segn se muestra.

Formatos:

Color de fondo: #8CACD4

Texto de ttulo: fuente arial, color blanco, tamao 2 puntos mayor que el estndar.

156

Informtica II

Resto del documento: listas numeradas y no numeradas; negrita; subrayado; itlica


(cursiva); fuente arial / por defecto.

Ejercicio 1.3: IMGENES; TABLAS.


Aade la ltima columna de la tabla de turismo.html y modifica la tabla para que muestre este
aspecto:

Imgenes: receta1.jpg, receta2.jpg, cultura.jpg, playa.jpg.


Ejercicio 1.4: LINK en IMAGEN (mapa de bits); TARGETs especiales.
Aade links en la imagen de principal.html:

Las dos imgenes de la izquierda: link a turismo.html en ventana nueva.

Las dos imgenes de la derecha: link a instituciones.html en ventana actual completa.

Prctica 2: Formularios en HTML


En esta prctica se aadirn dos nuevas pginas al website de la prctica anterior. Se trata
de crear dos formularios para que el usuario pueda registrarse como tal y pedir informacin.
Descarga en la misma carpeta de la prctica 1 el contenido de Practica02.zip, que est en la
zona de material de la web de la asignatura. Redirecciona los links de menu.html y
menu_tur.html
donde
corresponda
a
informacin.html
y
arte.html
(antes
enconstruccion.html).
Los formularios deben estar dirigidos a: http://www.tecnun.es/cgi-bin/ii/CGI0.exe.
Ejercicio 2.1
Introduce el formulario y sus cajas de texto en informacion.html y ordnalos de esta forma:

Caractersticas de los campos del formulario:


Campo

Nombre de la caja de texto

Tamao

Nombre

nombre

12

Primer Apellido

apell1

(por defecto)

Segundo Apellido

apell2

(por defecto)

Domicilio

domicilio

Cdigo Postal

CP

Telfono

tel

e-mail

mail

25

Confirmar e-mail

c_mail

25

Ejercicio 2.2.
Completa el formulario de arte.html disponindolo de la siguiente manera:

18

158

Informtica II

Elementos del formulario:

Tipo: casillas checkbox de nombre tipo y valores esc, arq y pint.

Disponibilidad: casillas radio de nombre disp y valores publ y priv.

Estilo: ventana de seleccin de nombre estilo y valores clas, abs, surr y otro,
representados por los textos Clsico, Abstracto, Surrealista y Otros.

rea de texto: 4 filas y 40 columnas y con un texto por defecto.

Prctica 3: Lenguaje JavaScript


Esta prctica tiene dos partes. En la primera de ellas, correspondiente a los ejercicios 3.1, 3.2 y
3.3, se analizarn varias funcionalidades de JavaScript que pueden ayudarnos en la creacin de
nuestros propios formularios. En la segunda parte de esta prctica, correspondiente al ejercicio 3.4,
se realizar la validacin de un formulario de la prctica anterior utilizando recursos vistos en los
ejercicios previos.
Ejercicio 3.1: Calculadora
Se parte del ejemplo de una calculadora realizada con JavaScript: Calculator.html. Se pide
analizar su funcionamiento. Sera capaz de realizar las variaciones necesarias para lograr la
calculadora presentada en CalculatorNew.html? Lograra realizar la presentada en
CalculatorScientific.html?

Calculator.html

CalculatorNew.html

CalculatorScientific.html

Ejercicio 3.2: Selector de Fechas


El fichero CalendarExample.html muestra una aplicacin muy til de JavaScript. Se trata de un
selector de fechas que acompaa a un campo de introduccin de fechas y que facilita la
introduccin de fechas mostrando un calendario completo en una ventana a parte. Desde esta
ventana, clicando en el da seleccionado, se rellena el campo en el formulario original. El cdigo
fuente JavaScript se encuentra en el fichero date-picker.js y la imagen que acompaa al campo y
que al clicarla muestra el calendario se llama show-calendar.gif.
Se pide estudiar su funcionamiento y ser capaz de utilizar este recurso en formularios que
creemos nosotros.

160

Informtica II

Ejercicio 3.3: Validacin de Formularios 1


El formulario de la figura se encuentra en el fichero
Registro.html. Desde este fichero se hace referencia al
fichero con el cdigo fuente JavaScript de nombre
Validacion.js.
Se pide estudiar su funcionamiento de forma que el
alumno aprenda cmo se valida el contenido de un
formulario antes de proceder a su envo, evitando as que se
produzcan errores innecesarios en el servidor por
incongruencia de datos.

Ejercicio 3.4: Validacin de Formularios 2


Se trata de hacer una funcin en JavaScript para que se valide el formulario del ejercicio 2.1 de
la prctica anterior, de forma que el Cdigo Postal y Telfono slo admitan nmeros y los campos
para la introduccin del e-mail coincidan y contengan el carcter @.

Prctica 4: Toma de contacto con Java


El objetivo de esta primera prctica es la toma de contacto con el lenguaje Java, con el Java 2
Software Development Kit (J2SDK) y con la documentacin del J2SDK donde podremos ver las
definiciones de las clases que vayamos utilizando en los ejercicios. Escribiremos 5 programas, los
compilaremos y ejecutaremos de forma que durante el proceso vayamos descubriendo la estructura
de los programas en Java y cmo se trabaja con las clases de la API de Java.
Ejercicio 4.1: Pasando argumentos al programa
El siguiente programa tiene por objetivo ensearte la forma en que puedes pasar parmetros a
un programa en Java. Los dos nmeros que le pasars al programa, desde la lnea de comandos, se
van a comparar y el programa te dir cul es el mayor.
Despus de compilar el programa, ejectalo de la siguiente manera:
java Ejer1 20 25
Observa cmo se le pasan los dos parmetros al programa (los dos nmeros que va a comparar,
en este caso el 20 y el 25).
/* Obtener el mayor de 2 nmeros, pasados como argumentos */
// Fichero Ejer1.java
public class Ejer1{
public static void main(String args[]){
float x1=0,x2=0;
if ( args.length<2 ) {
System.out.println("Faltan los dos numeros");
} else {
x1 = Float.parseFloat(args[0]);
x2 = Float.parseFloat(args[1]);
if (x1>x2) System.out.println("Mayor: " + x1);
else if (x1<x2) System.out.println("Mayor: " + x2);
else if (x1==x2) System.out.println("Iguales");
System.out.println("Otra Forma:");
System.out.println("El mayor es: " + Math.max(x1,x2));
}
} // Fin de main()
} // Fin de clase Ejer1
Se han definido dos variables nuevas (x1 y x2) de tipo float. Observa la forma en que puedes
inicializar una variable en el momento de declararla y cmo se utilizan los condicionales If-Else.
Se utiliza la clase Float, con uno de sus mtodos, parseFloat, para convertir el string o
cadena de caracteres en un nmero flotante, para as tratarlo luego como nmeros en la
comparacin. Conviene que leas un poco en el manual de Java sobre esta clase.
Ejercicio 4.2: Lectura de datos desde el Teclado
Este programa te ensear la forma de introducir datos al programa desde el teclado. Se definen
dos variables (str1 y str2) del tipo String (realmente son objetos de la clase String) donde se
almacenarn los caracteres dados por el teclado. Notars al final del ejercicio que usamos el
mtodo o funcin max() de la clase Math para comparar el mayor de los nmeros pasados como
argumentos.

162

Informtica II

/* Lectura de datos desde el teclado */


// Fichero Ejer2.java
import java.io.*;

//no olvidar poner esta lnea

public class Ejer2 {


public static void main(String args[]) throws IOException {
float x1=0,x2=0;
String str1,str2;
BufferedReader InBuf =
new BufferedReader(new InputStreamReader(System.in));
System.out.println("Primer Numero: "); //Leer Primer nmero
str1=InBuf.readLine();
x1 = Float.parseFloat(str1);
System.out.println("Segundo Numero: "); //Leer Segundo nmero
str2=InBuf.readLine();
x2 = Float.parseFloat(str2);
//Obtener el mayor
System.out.println("El mayor es: " + Math.max(x1,x2));
}
}
Las clases que conviene que aprendas a utilizar son: BufferedReader e InputStreamReader, ya
que las vas a utilizar muy a menudo. Son las que permiten acceder al teclado y leer lo que escribes.
Consulta la ayuda sobre java para que te familiarices con estas clases.
Ejercicio 4.3: Bucle For - Factorial de un nmero
A continuacin veremos cmo se hace un bucle con la sentencia For.
Aqu usamos la clase Integer para convertir un string (con su mtodo parseInt) en un nmero
entero, al cual vamos a calcular su factorial. Conviene que te anotes esta clase para que la repases,
junto con la Float del ejercicio 1.

/* Bucle For: Factorial de un nmero */


// Fichero Ejer3.java
import java.io.*;
public class Ejer3 {
public static void main(String args[]) throws IOException {
int x1;
long Fact;
String str1;
BufferedReader InBuf =
new BufferedReader(new InputStreamReader(System.in));
System.out.println("Factorial de un Numero\r");
System.out.println("Dar el Numero: ");
str1=InBuf.readLine();
x1 = Integer.parseInt(str1); //convertimos a un nmero entero
Fact=x1;
for (int i=x1-1; i>0; i--){
Fact *= i;
}

Prcticas

163

System.out.println("\rFactorial de "+x1+" es: "+Fact);


}
}
Prueba haciendo el bucle For con la variable ascendente, de la siguiente forma:
for (int i=1; i<=x1; i++){
...
}
Ejercicio 4.4: Bucle While - Generacin aleatoria de nmeros
En este ejercicio aprenders a hacer un bucle con la sentencia While. Este programa generar
una cantidad determinada (que el usuario dar por medio del teclado) de nmeros reales de forma
aleatoria, comprendidos entre dos lmites.

/* Bucle While: Generacin aleatoria de nmeros */


// Fichero Ejer4.java
import java.io.*;
public class Ejer4 {
public static void main(String args[]) throws IOException {
int x1;
char c;
double val;
String str1="";
System.out.println("Generacion Aleatoria de Numeros\r");
//Ahora no usaremos printl, sino print. Ya no saltar una lnea
System.out.print("Cuantos Numeros?: ");
//Leeremos caracter por caracter del teclado, hasta presionar Enter
//read() devuelve un byte y por eso hay que hacer un cast
//read() detiene la ejecucin del programa hasta que se pulsa Enter
while ( (c=(char)System.in.read()) != \r ) {
if ( c>=0 && c<=9) {
str1 = str1 + c; //Slo tomamos los dgitos
}
}
x1 = Integer.parseInt(str1);
while((x1--)>0) {
val = Math.random();
val *= 10.0;
System.out.println("Numero: " + val);
}
}
}
Si ya has acabado el programa, prueba hacer una variacin de ste: los lmites de generacin de
nmeros los des por teclado (Por ejemplo, generar nmeros entre 10 y 40).
Ejercicio 4.5: Mtodos (funciones) de clase y Variables de clase
Este ejercicio te ensear cmo crear mtodos (o funciones) de una clase. As mismo vers cmo
las variables pueden ser declaradas locales (dentro de un mtodo) o globales (variables de la
clase), y cmo stas pueden ser accedidas.

/* Mtodos de clase y Variables de clase */


// Observar tambin la visibilidad de las variables
// Fichero Ejer5.java

164

Informtica II

public class Ejer5 {


double area; //Variable de la Clase
public static void main(String args[]){
double radio,area; //variables de la funcin main()
Ejer5 ej = new Ejer5();
if ( args.length < 1){
System.out.println("Pasar el radio. Ej. : >java Ejer5 12.5");
System.exit(0); //Terminar el programa
}
radio = Double.parseDouble(args[0]);
area = ej.Area(radio); //Acceder a funcin de Objeto creado
System.out.println("Area del circulo r="+radio+" m. = " +area+" m2");
area = ej.area;
System.out.println("Area del circulo r="+radio+" m. = "+area+" Has.");
}
//Funcin o mtodo Area de la clase Ejer5
public double Area (double rd ){
double area; //variable local de la funcion Area
//usar la variable local
area = Math.PI*Math.pow(rd,2.0);
//acceder a la variable de la clase
this.area = area/10000; //obtener el area en Has.
return area; //devuelve el valor
}
}

Observa que la variable area, declarada como double, ha sido definida tanto en la clase como
dentro de los mtodos main() y Area(). La variable area de la clase puede ser accedida por
cualquier mtodo (o funcin) de la clase, no as las variables declaradas dentro de cada mtodo, ya
que stas son locales.
Si ya has acabado todos los ejercicios y ves que te sobra tiempo, sera bueno que fueses
consultando la documentacin de la API, de tal forma que empieces a aprender la sintaxis y las
clases de Java.

Prctica 5: AWT y applets de Java


Ejercicio 5.1: Usando Componentes Grficos
En este primer ejercicio aprenderemos a introducir componentes elementales en una aplicacin
y a utilizar contenedores y diseos para que nuestra aplicacin siempre tenga la misma organizacin
independientemente del tamao de la ventana donde est desplegada.
En una primera versin de la aplicacin para realizar pedidos en una empresa de comida rpida
se introducen componentes elementales directamente sobre un Container de la clase Frame con
un LayoutManager de la clase FlowLayout. Compila y ejecuta el fichero Ejer1_01.java.
El programa anterior despliega una ventana como la presentada en la parte izquierda de la
figura 5.1. Ahora bien, cambiemos el tamao de la ventana mientras esta est activa. Observamos
que los componentes se mueven y se acomodan a las nuevas dimensiones, pero las nuevas
posiciones de los elementos no cumplen el cometido que tenan al principio (parte derecha de la
figura 5.1).

Figura 5.1: Inconveniente del Layout FlowLayout

Figura 5.2. Diseo Visual de un programa y su jerarqua de contencin

166

Informtica II

Para evitar que el aspecto de nuestra aplicacin cambie de un sistema a otro, se utilizan
jerarquas de contencin de los elementos y otros diseos adems del ya visto de FlowLayout. El
programa Ejer1_02.java resuelve el problema anterior.
La figura 5.2 muestra el aspecto que tendr la aplicacin con los cambios introducidos. Prubese
en este caso a modificar el tamao de la ventana y se comprobar que los elementos siguen
manteniendo sus posiciones relativas, aunque no as sus tamaos que se van ajustando segn las
dimensiones de la ventana. Tambin se puede observar en la figura 5.2 la estructura jerrquica de
los diferentes elementos contenedores.
Ejercicio 5.2: Usando Eventos
En este segundo ejercicio vamos a hacer que la aplicacin desarrollada en el ejercicio 1 sea
sensible a ciertos eventos. En concreto vamos a introducir las siguientes caractersticas:

Que la aplicacin se cierre cuando se pulse en el botn de cerrar ventana de la esquina


superior derecha.

Que el CheckBox de Tamao Super est inactivo y que slo se active cuando en el
Choice se seleccione el tamao Grande.

Que cuando se pulse el Button de Colocar Pedido se genere una pgina HTML
Pedido.html que contenga toda la informacin del pedido.

Para conseguir todo lo anterior debemos introducir ciertos elementos en el cdigo que
enumeramos a continuacin:
1. Se deben incluir dos nuevos paquetes correspondientes a los eventos y a la entrada/salida:
import java.awt.event.*;
import java.io.*;

2. La clase Ejer2 debe implementar tres interfaces de escucha:


public
class
Ejer2
ActionListener {

extends

Frame

implements

WindowListener,

ItemListener,

3. En el constructor de la clase se deben registrar los escuchas para los generadores de eventos
que queremos controlar y hacer que el CheckBox est inactivo al comienzo de la
aplicacin:
addWindowListener(this);
sizes.addItemListener(this);
order.addActionListener(this);
supersize.setEnabled(false);

4. Se deben instrumentar las interfaces correspondientes:


//Instrumentacin de la Interfaz WindowListener
public void windowActivated(WindowEvent e){}
public void windowClosed(WindowEvent e){}
public void windowClosing(WindowEvent e){
System.exit(0);
}
public void windowDeactivated(WindowEvent e){}
public void windowDeiconified(WindowEvent e){}
public void windowIconified(WindowEvent e){}
public void windowOpened(WindowEvent e){}
//Instrumentacin de la Interfaz ItemListener
public void itemStateChanged(ItemEvent e){
String label = "" + e.getItem();
if(label.equals("Grande")){
supersize.setEnabled(true);
}else{
supersize.setEnabled(false);
supersize.setState(false);
}
}
//Instrumentacin de la interfaz ActionListener
public void actionPerformed(ActionEvent e){
try{

Prcticas

167
BufferedWriter salida = new BufferedWriter(new FileWriter("Pedido.html"));
String title = "Su Pedido";
String Bebidas[], Comidas[];
int i;

Bebidas = drinks.getSelectedItems();
Comidas = sandwiches.getSelectedItems();
salida.write("<HTML><HEAD><TITLE>");
salida.newLine();
salida.write(title);
salida.write("</TITLE></HEAD><BODY>");
salida.newLine();
salida.write("<H1>" + title + "</H1>");
salida.newLine();
salida.write("<P><STRONG>Comidas:</STRONG> ");
for(i=0;i<Comidas.length-1;i++){
salida.write(Comidas[i] + "," );
}
salida.write(Comidas[i]);
salida.newLine();
salida.write("<BR><STRONG>Bebidas:</STRONG> " );
for(i=0;i<Bebidas.length-1;i++){
salida.write(Bebidas[i] + ",");
}
salida.write(Bebidas[i]);
salida.newLine();
salida.write("<BR><STRONG>Guarnicin:</STRONG> " +
sides.getSelectedCheckbox().getLabel());
salida.newLine();
salida.write("<BR><STRONG>Tamao:</STRONG> " + sizes.getSelectedItem());
if(supersize.isEnabled() == true){
salida.write(" SUPER");
}
salida.newLine();
salida.write("<BR><STRONG>Ordenes:</STRONG> " + comments.getText());
salida.newLine();
salida.write("<BR><STRONG>Recuerde:</STRONG> " + reminder.getText());
salida.newLine();
salida.write("</BODY></HTML>");
salida.close();
}catch(IOException ex){}
}

Una vez realizados los cambios anteriores, compilar y ejecutar la aplicacin comprobando que
responde a los eventos introducidos. Cuando se pulse el botn de Colocar Pedido se generar una
pgina Pedidos.html en el mismo directorio donde est la aplicacin. Abrmosla y veamos cmo
queda.
Ejercicio 5.3: Applet para pedir datos de usuario.
/* Applet para pedir datos de usuario */
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Ejer3 extends Applet implements ActionListener{
Label LblExplicacion =
new Label("Rellena los siguientes campos y pulsa ACEPTAR");
Label Etiqueta1 = new Label("Nombre Usuario:", Label.RIGHT);
Label Etiqueta2 = new Label("Contrasea:", Label.RIGHT);
Label Etiqueta3 = new Label("", Label.CENTER);
TextField Campo1 = new TextField(15);
TextField Campo2 = new TextField(15);
Button BtnAceptar = new Button("ACEPTAR");
String Nombre = "informatica3";
String Password = "java";
public void init(){
setLayout(new BorderLayout());
//Fuente usada en el rtulo y caracter de eco de la contrasea

168

Informtica II
LblExplicacion.setFont(new Font("SansSerif", Font.BOLD, 16));
Campo2.setEchoChar('*');
Etiqueta3.setForeground(Color.red);
//Aadir el rtulo de explicacin
add(BorderLayout.NORTH, LblExplicacion);
//Construir el panel central y aadirlo
Panel pc = new Panel();
pc.setLayout(new FlowLayout());
Panel pc1 = new Panel();
pc1.setLayout(new GridLayout(2, 2, 8, 2));
pc1.add(Etiqueta1);
pc1.add(Campo1);
pc1.add(Etiqueta2);
pc1.add(Campo2);
pc.add(pc1);
//Poner el botn ACEPTAR en un panel y aadirlo tambin
Panel pc2 = new Panel();
pc2.add(BtnAceptar);
pc.add(pc2);
add(BorderLayout.CENTER,pc);
add(BorderLayout.SOUTH, Etiqueta3);
//Registramos el Botn como escucha
BtnAceptar.addActionListener(this);
}
//Instrumentamos la Interfaz ActionListener
public void actionPerformed(ActionEvent e){
if (Nombre.equals(Campo1.getText()) == false){
Etiqueta3.setText("Nombre de Usuario errneo");
}else if(Password.equals(Campo2.getText()) == false){
Etiqueta3.setText("Contrasea errnea");
}else{
Etiqueta3.setText("Acceso Permitido");
}
}

Para desplegar el applet o subprograma anterior en un navegador o en el appletviewer, se


necesita un archivo html como el siguiente:
<HTML>
<APPLET code = "Ejer3.class" width = 400 height = 100>
</APPLET>
</HTML>

En la figura 5.3 se muestra el despliegue del applet en un navegador. Si introducimos un nombre


de usuario o una contrasea incorrecta, aparecer un aviso en rojo. Si los datos son correctos el
aviso nos dir: Acceso Permitido.

Figura 5.3. Despliegue del Applet en un navegador

Prctica 6: JDBC: Acceso a base de


datos desde Java
Ejercicio 6.1: Toma de contacto con JDBC
En este primer ejercicio se pide seguir los pasos expuestos en el apartado 8.3 del libro de la
asignatura. En dicho apartado aparecen dos ejemplos sencillos de utilizacin de la JDBC 3.0 API.
Para poder utilizar el puente JDBC-OBDC habr que realizar unos pasos previos que vienen
detallados en dicho apartado. El objetivo de este ejercicio es familiarizarse con:

Bases de Datos en Access

ODBC y creacin de DSN (Data Source Name)

JDBC y su utilizacin

Una vez creado el DSN y compilado el cdigo fuente Java, se trata de ir ejecutando las
sentencias que aparecen en el libro e ir comprobando que los resultados son los mismos. Adems, el
alumno debe entender completamente el cdigo fuente Java y saber qu hace cada una de las
sentencias que en l aparecen.
Ejercicio 6.2: Realizando consultas de actualizacin
Los ejemplos que se han estudiado en el ejercicio anterior realizaban consultas de Seleccin de
Datos, es decir, hacan peticiones de registros que cumpliesen ciertos requisitos a la Base de Datos.
Corresponden a sentencias SQL tipo SELECT.
Esto se haca mediante el mtodo executeQuery(String sql) de la clase Statement. Este
mtodo devuelve un objeto de tipo ResultSet con los registros que cumplan las condiciones
especificadas en la sentencia SQL. Este objeto ResultSet puede ser recorrido registro a registro y
obtener los valores de los campos deseados.
En este segundo ejercicio se van a realizar consultas de Actualizacin de Datos, es decir, ahora
se trata de insertar, modificar o eliminar un registro de una tabla de la Base de Datos.
Corresponden a sentencias SQL tipo INSERT INTO, UPDATE o DELETE.
En este caso, se realizar mediante el mtodo executeUpdate(String sql) de la clase
Statement. Este mtodo no devuelve ningn objeto de la clase ResultSet, sino que devuelve un
entero correspondiente al nmero de registros modificados mediante la sentencia SQL ejecutada o
cero si la sentencia SQL no devuelve nada.
A continuacin se muestra el cdigo fuente en Java que vamos a utilizar. Como puede
observarse, es similar en gran parte al utilizado en el programa firstJDBC.java. De hecho slo
cambia la sentencia que contiene el mtodo executeUpdate(String sql), que no devuelve un
ResultSet sino un entero.
Se pide compilar dicho cdigo fuente y ejecutar la secuencia de sentencias que vienen a
continuacin. Despus de cada una de las sentencias, se deben comprobar los cambios producidos
en la Base de Datos.

170

Informtica II
import java.sql.*;
class secondJDBC {
public static void main(String args[]) throws ClassNotFoundException, SQLException {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url="jdbc:odbc:" + args[0];
Connection connection = DriverManager.getConnection(url);
Statement statement = connection.createStatement();
String sql = args[1];
int nrows = statement.executeUpdate(sql);
System.out.println ("Numero de registros modificados: " + nrows);
connection.close();
}
}

Consulta de Insercin de Registros


La siguiente sentencia introduce un registro en la tabla Datos de la Base de Datos Libros.mdb,
sealada por el DSN pruebaODBC:
java secondJDBC pruebaODBC "INSERT INTO Datos (Codigo,Titulo,Autor) VALUES ('N006','El
jinete polaco','A. Muoz Molina')"

La salida de la ejecucin de la sentencia anterior es:


Numero de registros modificados: 1
Consulta de Actualizacin de Registro
La siguiente sentencia modifica el campo Autor del registro con Codigo=N006 de la tabla
Datos de la Base de Datos Libros.mdb, sealada por el DSN pruebaODBC:
java secondJDBC
Codigo='N006'"

pruebaODBC

"UPDATE

Datos

SET

Autor='Antonio

Muoz

Molina'

WHERE

Numero de registros modificados: 1

Si ninguno de los registros cumple las condiciones no se produce ninguna modificacin, como por
ejemplo la siguiente consulta:
java secondJDBC
Codigo='N999'"

pruebaODBC

"UPDATE

Datos

SET

Autor='Antonio

Muoz

Molina'

WHERE

Numero de registros modificados: 0

Consulta de Eliminacin de Registros


La siguiente sentencia elimina el registro con Codigo=N006 de la tabla Datos de la Base de
Datos Libros.mdb, sealada por el DSN pruebaODBC:
java secondJDBC pruebaODBC "DELETE FROM Datos WHERE Codigo='N006'"
Numero de registros modificados: 1

Prctica 7: Servlets
En esta prctica se instalar un servlet y se comprobar su funcionamiento, para posteriormente
realizar las modificaciones que se solicitan. El servlet con el que se trabajar ser el ejemplo
SurveyServlet.java que introduce los datos de una encuesta en un fichero.
Primeramente se debe realizar la instalacin y configuracin del servlet y del servidor de
servlets. Para ello se dispone de los ficheros JdcSurvey.html, SurveyServlet.java y
servlet.properties comprimidos en el fichero Practica07.zip, que se encuentra en la zona de
material de la pgina web de la asignatura. Descarga el fichero y descomprmelo en un directorio
propio.
Modificar JdcSurvey.html para que el formulario enve los datos al servlet
SurveyServlet.java del propio directorio y comprobar el funcionamiento viendo que inserta los
datos correctamente en el fichero especificado. A continuacin realizar las modificaciones
oportunas en el servlet SurveyServlet.java para que este presente los datos que se han
introducido en la respuesta al cliente de la forma mostrada en la Figura 7.1.

Figura 7.1. Salida del servlet SurveyServlet.java

El servlet SurveyServlet.java slo imprime una de las opciones elegidas de IDE. En el caso
de seleccionar varias, para imprimir todas se debe sustituir el cdigo que se muestra en la siguiente
tabla (se recomienda crear un nuevo servlet: SurveyServletNew.java):
SurveyServlet.java

SurveyServletNew.java

while(values.hasMoreElements()) {
String name = (String)values.nextElement();
String value =
req.getParameterValues(name)[0];
if(name.compareTo("submit") != 0) {
toFile.println(name + ": " + value);
}
}

while(values.hasMoreElements()) {
String name = (String)values.nextElement();
String[] valueArray =
req.getParameterValues(name);
for (int i=0;i<valueArray.length;i++) {
String value = valueArray[i];
if(name.compareTo("submit") != 0) {
toFile.println(name + ": " + value);
}
}
}

Pasos a realizar para la puesta en funcionamiento del servlet:


1. Crea un nuevo directorio de trabajo y descomprime all el fichero Practica07.zip.

172

Informtica II

2. Modifica el texto Thank you por Gracias las dos veces que aparece en el fichero
SurveyServlet.java. De esta forma sabrs si el servlet al que se est llamando es el propio.
3. Modifica el ttulo de la pgina HTML a Mi pgina JdcSurvey en el fichero JdcSurvey.html.
4. En el fichero de proceso por lotes (*.BAT) en el que tengas establecidas las variables de entorno
PATH, JAVAPATH y CLASSPATH, aade las siguientes lneas:
SET PATH=%PATH%;q:\jsdk2.0\bin
SET CLASSPATH=%CLASSPATH%;q:\jsdk2.0\lib\jsdk.jar;.
De esta forma se tendr acceso a la aplicacin servletrunner.exe y a las clases de la Servlet API 2.0

5. Abre una consola de MS-DOS y ejecuta dicho fichero de proceso por lotes (*.BAT).
6. Compila el cdigo fuente java con el comando:
javac SurveyServlet.java
7. En el fichero servlet.properties cambia la ltima lnea para indicar que el directorio en el
que se escribir es el c:/temp en lugar de /tmp.
8. Arranca el servidor de servlets con el comando:
servletrunner -d "path completo del directorio de trabajo"
9. Arranca el navegador y solicita la pgina JdcSurvey.html.
10. Selecciona una opcin referente al tamao de la compaa, introduce un comentario e indica un
IDE. Pulsa el botn Submit Query. Comprueba que el resultado que se obtiene tiene el ttulo
Gracias y el mensaje Gracias por su participacin" (es decir, se est usando el servlet que
hemos modificado). En el servidor de servlets se debe haber impreso la lnea:
SurveyServlet: INIT
11. Comprueba que se ha escrito el siguiente fichero: c:\temp\Survey01Results.txt

Puede ocurrir que no se reconozca la mquina que hace de servidor de servlets, en este caso el
ordenador local, cuando el formulario enva la informacin:
<FORM action=http://localhost:8080/servlet/survey method=POST>

Entonces se debe modificar el nombre que aparece actualmente localhost por:

el nmero de IP de la mquina en la que se est trabajando, por ejemplo:


193.145.251.42:8080

el nombre de la mquina
A01.tecnun.es:8080.

en

la

que

se

est

trabajando,

por

ejemplo:

Lo habitual es colocar el nmero propio de IP que se puede obtener con el comando


ipconfig. El nombre de la mquina en la que se est trabajando o host se obtiene con el
comando ipconfig/all.

Prctica 8: Servlets con acceso a DB


En esta prctica se modificar el servlet de la prctica anterior, SurveyServlet.java, para
que introduzca los datos que le llegan en una Base de Datos en lugar de escribirlos en un fichero.
Pasos para insertar los datos en una tabla de una base de datos:
Los dos primeros pasos del proceso corresponden a la creacin de la Base de Datos que
almacenar los datos de las encuestas y la definicin del Data Source Name (DSN) que nos permitir
acceder a ella mediante el puente JDBC-ODBC:
1. Crea una Base de Datos y en ella la tabla SurveyData con los campos:
Nombre del Campo
Tamano

Tipo
Text
Memo

Comentarios
UtilizaJavaWorkShop
UtilizaJpp

Boolean
Boolean

UtilizaCafe

Boolean

Comentarios
Almacena el n de empleados
empresa
Almacena los comentarios

de

la

Los campos almacenarn True o False


dependiendo de si se seleccion cada una
de las opciones mediante su checkbox
correspondiente en el formulario.

2. Crea un Data Source Name (DSN) para la Base de Datos creada en el paso anterior mediante el
administrador de ODBC. Pon como nombre del DNS: "surveyODBC".
Los siguientes pasos corresponden a las modificaciones que se deben realizar en el fichero
SurveyServlet.java para que este lleve a cabo la insercin del nuevo registro en la Base de
Datos que se ha creado a tal efecto:
3. Inserta la siguiente sentencia para importar el paquete java.sql:
import java.sql.*;

4. Inserta un objeto Connection como miembro de la clase SurveyServlet:


Connection conn;

5. Inserta en el mtodo init() la conexin con la base de datos ODBC, que sustituye al cogido
que antes obtena el directorio donde guardar el fichero con la salida:
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:odbc:surveyODBC";
conn = DriverManager.getConnection(url);
} catch(Exception e) {
System.out.println("Error al crear la conexin");
e.printStackTrace();
}

6. Inserta en el mtodo doPost() el cdigo que ejecuta las inserciones en la base de datos, que
sustituir a aquel que realizaba la escritura en el fichero:

174

Informtica II

public void doPost(HttpServletRequest req, HttpServletResponse res)


throws ServletException, IOException {
res.setContentType("text/html");
PrintWriter toClient = res.getWriter();
String sql;
String sql1 = "INSERT INTO SurveyData (Tamano,Comentarios";
String sql2 = ") VALUES ('" + req.getParameter("employee") + "','"
+ req.getParameter("comment") + "'";
String[] valueArray = req.getParameterValues("ide");
for (int i=0;i<valueArray.length;i++) {
String value = valueArray[i];
if(value.equals("JavaWorkShop") == true){
sql1 += ",UtilizaJavaWorkShop";
sql2 += ",True";
} else if(value.equals("J++") == true){
sql1 += ",UtilizaJpp";
sql2 += ",True";
} else if(value.equals("Cafe'") == true){
sql1 += ",UtilizaCafe";
sql2 += ",True";
}
}
sql = sql1 + sql2 + ")";
System.out.println(sql);
try {
Statement stmt = conn.createStatement();
stmt.executeUpdate(sql);
} catch(SQLException e) {
e.printStackTrace();
}
toClient.println("<HTML>");
toClient.println("<TITLE>Thank you!</TITLE>");
toClient.println("Thank you for participating");
toClient.println("</HTML>");
toClient.close();
}
Ntese que el servlet, adems de insertar el nuevo registro en la Base de Datos, imprime en la
consola la sentencia SQL que realiza la insercin.

Prctica 9: Sesin en Servlets


Ejercicio 9.1: Escritura de valores en una sesin
En SessionServlet.java aadir a la salida de la pgina HTML un formulario que recoja el
valor de dos variables, una conteniendo el nombre de un atributo de una sesin y la otra el valor de
dicho atributo. Estas variables se deben enviar al mismo servlet. Para crear el formulario aadir
despus de:
out.println("</table></center>");
las lneas:
out.println("<H2>Envo de atributo al servlet</H2>");
out.println("<FORM action=\"SessionServlet\" method=\"GET\">");
out.println("<INPUT type=\"text\" size=\"20\" name=\"dataname\">");
out.println("<BR>");
out.println("<INPUT type=\"text\" size=\"20\" name=\"datavalue\">");
out.println("<BR>");
out.println("<INPUT type=\"submit\">");
out.println("</FORM>");
En el mismo servlet, una vez obtenida la sesin, se deben leer las dos variables anteriores y si
las dos no son nulas aadir el nuevo atributo con su valor a la sesin. Para leer los parmetros y
crear el atributo, aadir despus de:
HttpSession session = request.getSession(true);
las lneas:
String dataName = request.getParameter("dataname");
String dataValue = request.getParameter("datavalue");
if (dataName != null && dataValue != null) {
session.putValue(dataName, dataValue);
}
Llamar al servlet desde el navegador:
http://localhost:8080/servlet/SessionServlet
Comprobar que los nuevos atributos que se van aadiendo se muestran en la lista de atributos,
as como que se puede cambiar el valor de un atributo existente.
Ejercicio 9.2: Guardar distintas solicitudes de un mismo usuario
Se trata de simular el funcionamiento de un carro de la compra de un comercio electrnico. Se
utilizar para ello la base de datos de biblio.mdb que contiene una lista de libros. El objetivo es
mostrar una relacin de libros e ir aadindolos a una lista de reservas del usuario.
9.2.1. Servlet que muestra la relacin de libros
Primeramente es necesario crear el DSN libro, con la base de datos biblio.mdb. Se dispone
de un servlet, Libros.java, que muestra los libros que cumplan la condicin de contener la
palabra que se le da como parmetro. Se puede llamar al servlet sin ningn parametro, con lo que
se muestran todos los libros de la tabla, o con el parmetro "filtro", en cuyo caso muestra solo los
libros que contienen la palabra o parte de la palabra especificada en el parmetro:

176

Informtica II

http://localhost:8080/servlet/Libros
http://localhost:8080/servlet/Libros?filtro=handbook
9.2.2. Servlet que muestra la relacin de libros con posibilidad de seleccin de libros
A partir del servlet Libros.java anterior, se ha realizado el servlet LibrosCheck.java con
las siguientes modificaciones:

La tabla debe estar incluida en un formulario que llame al servlet: RealizarReserva.java

Cada lnea debe tener un checkbox que en el caso de marcarse enva el ISBN del libro

Se pide probar este servlet. La salida originada por el servlet LibrosCheck.java es la que se
muestra en la Figura 9.1.

Figura 9.1. Relacin de libros

9.2.3. Servlet que realiza la reserva de un libro seleccionado


Por ltimo se dispone del servlet RealizarReserva.java que graba en una tabla el ISBN del
libro solicitado y el ID de la sesin que realiza la reserva. Este servlet muestra a continuacin todas
las reservas de la sesin correspondiente.
Este servlet se llama cuando se pulsa Submit Query en el formulario que muestra el servlet
LibrosCheck.java (ver Figura 9.1).

A continuacin se resumen los servlets que aparecen en la prctica con las caractersticas
generales de cada uno de ellos:
Servlet
SessionServlet
Libros
LibrosCheck
RealizarReserva

JDBC
No
S
S
S

HttpSession
S
No
No
S

Prctica 10: Puesta en marcha de una


aplicacin de Comercio Electrnico
El objetivo de esta prctica es estudiar el funcionamiento de una aplicacin completa que
incluye todos los elementos y tecnologas que se desarrollan a lo largo de la asignatura.
Se trata de una tienda de discos virtual que permite consultar el catlogo de discos disponibles a
cualquier usuario, registrarse como usuario y aadir discos al carrito de la compra. A su vez, existe
un administrador que puede aadir nuevos discos al catlogo y ver los datos de todos los usuarios
registrados.
La prctica consta de dos partes principales: puesta en marcha y anlisis de la aplicacin. Una
tercera parte opcional ser el planteamiento de mejoras sobre la aplicacin actual.
Ejercicio 10.1: Puesta en marcha de la aplicacin
Descarga el fichero Practica10.zip de la zona de Material de la web de la asignatura y
descomprmelo en un directorio propio, por ejemplo: G:\Infor2\Practica10\
La aplicacin consta de los siguientes archivos:
Tipo de Archivo
Base de Datos

Html

Servlet

Nombre
Tienda.mdb
index.html
login.html
menu.html
principal.html
registro.html
Actualizar.java
Actualizar_Datos.java
Add_Carrito.java
Add_Disco.java
Baja_Disco.java
Datos_Cliente.java
Datos_Disco.java
Ejecutar_Actualizacion.java
Eliminar.java

Inicio_Catalogo.java
Login.java
Logout.java
Registro.java
Registro_Disco.java
Ver_Carrito.java
Ver_Catalogo.java
Ver_Clientes.java

En primer lugar hay que crear un DSN para la Base de Datos Tienda.mdb con nombre tienda.
Los servlets de la aplicacin se encontrarn en un subdirectorio llamado \Servlets del
directorio donde se haya descomprimido el fichero Practica10.zip. Se deben compilar todos los
servlets. Esto se puede realizar mediante la instruccin:
javac *.java
Despus de esto, arrancar el servletrunner. Si el directorio en el que se ha guardado la prctica
fuese el mismo que el ejemplo (G:\Infor2\Practica10\), se arrancara con la instruccin:
servletrunner -p 8081 -d G:\Infor2\Practica10\Servlets

178

Informtica II

La pgina HTML de inicio de la aplicacin es index.html.


Ejercicio 10.2: Anlisis del funcionamiento de la aplicacin
Una vez que hemos sido capaces de poner en marcha la aplicacin de Tienda de Discos, el
objetivo de esta segunda parte de la prctica es aprender cmo funciona y analizar su estructura
interna.
El alumno debe usar la aplicacin desde los dos roles predefinidos, el de usuario normal y el de
administrador y probar todas las funcionalidades que sta pone a su disposicin para cada uno de
los roles.
Una vez que el alumno se ha familiarizado con las funcionalidades de la aplicacin, debe centrar
su atencin en descubrir y analizar cmo estn programadas.
La aplicacin contiene servlets que realizan operaciones muy variadas contra la Base de Datos y
que pueden servir al alumno como plantilla para sus propios desarrollos. Entre otros, existen
servlets que realizan las siguientes acciones contra la Base de Datos:

Consultas de seleccin simples a una sola tabla

Consultas de seleccin complejas que incluyen varias tablas relacionadas

Consultas de insercin de nuevos registros en una tabla

Consultas de actualizacin de registros en una tabla

Consultas de eliminacin de registros de una tabla

Por ltimo, una cuestin para pensar sobre ella... de dnde saca la aplicacin las imgenes de
las cartulas de los discos y los iconos? a qu se debe que las extraiga de all?
Ejercicio10.3: Planteamiento de mejoras
En este ejercicio el alumno se debe plantear posibles mejoras a la aplicacin de la Tienda de
Discos. Las mejoras pueden estar orientadas a:

Interfaces de usuario: Forma de mostrar la informacin, accesibilidad a las


funcionalidades, economa de pasos para realizar operaciones por parte del usuario, etc.

Funcionalidades: Otro tipo de funcionalidades que puedan ser de utilidad para un usuario o
para un administrador.

Operativa: Obligacin de autenticarse antes de comenzar la compra, antes de entrar en la


propia tienda, slo cuando se va a cursar un pedido, etc.

Para obtener ideas, se anima al alumno a visitar Web Sites de comercio electrnico de
reconocido prestigio como por ejemplo Amazon.com:
http://www.amazon.com
http://www.amazon.co.uk

Prctica 11: SAX & DOM Java XML APIs


El objetivo de esta prctica es familiarizarse con los ficheros XML y comenzar a utilizar las APIs
de Java que permiten analizar (parse) dichos ficheros. Se ha diseado una aplicacin bajo entorno
Web que permite guardar en un fichero XML los datos extrados de una Base de Datos y tambin leer
dichos ficheros XML, analizarlos y mostrar los datos contenidos en ellos en formato HTML. Para ello
la aplicacin dispone de dos servlets para esta ltima tarea, uno que utiliza la API SAX de anlisis
secuencial y otro que usa la API DOM de anlisis mediante estructura de rbol.
Puesta en marcha
Descarga el fichero Practica11.zip de la zona de Material de la web de la asignatura y
descomprmelo en un directorio propio, por ejemplo: G:\Infor2\Practica11\
La aplicacin consta de los siguientes archivos:
Tipo de Archivo
HTML

Servlets

Nombre
index.html
menu.html
Leer_Factura_SAX.html
Leer_Factura_DOM.html
Facturacion.java
Emitir_Factura_xml.java
Leer_Factura_xml_SAX.java
Leer_Factura_xml_DOM.java

Propiedades

servlet.properties

La aplicacin tomar los datos para emitir las facturas de la Base de Datos Tienda.mdb de la
aplicacin Tienda de Discos de la prctica 10, a travs del DSN con nombre tienda, el cual ya
debe estar presente en el sistema.
Los servlets de la aplicacin se encontrarn en un subdirectorio llamado \Servlets del
directorio donde se haya descomprimido el fichero Practica11.zip. Se deben compilar todos los
servlets como en prcticas anteriores.
Ahora bien, para que el compilador pueda entender las clases de las SAX y DOM APIs para XML,
debemos ponerle a disposicin dichas clases y modificar las VARIABLES DE ENTORNO de MS-DOS para
que sepa dnde encontrarlas.
Las clases se encuentran en el fichero xerces.jar que puedes descargar de la zona de
recursos, seccin de XML, de la pgina Web de la asignatura. Una vez que guardes este fichero en
un directorio propio, por ejemplo G:\Infor2\, en el fichero de proceso por lotes (*.BAT) en el que
tengas establecidas las variables de entorno PATH, JAVAPATH y CLASSPATH, aade la siguiente
lnea:
SET CLASSPATH=%CLASSPATH%;G:\Infor2\xerces.jar;.
Se debe modificar el fichero servlet.properties para que los servlets tengan acceso a la
propiedad facturasPath que les indicar el directorio donde deben guardar y de donde deben
leer los ficheros XML. Por ejemplo:
# Emitir_Factura_xml servlet
servlet.Emitir_Factura_xml.code=Emitir_Factura_xml

180

Informtica II

servlet.Emitir_Factura_xml.initArgs=\
facturasPath=G:/Infor2/Practica11
Despus de esto, arrancar el servletrunner. Si el directorio en el que se ha guardado la prctica
fuese el mismo que el ejemplo (G:\Infor2\Practica11\), se arrancara con la instruccin:
servletrunner -p 8081 -d G:\Infor2\Practica11\Servlets
La pgina HTML de inicio de la aplicacin es index.html, que muestra una pantalla con dos
frames (figura 11.1), uno con un men y el otro con el contenido resultante de las llamadas a las
distintas opciones. Por defecto aparece la primera opcin: Emitir Factura.

Figura 11.1. Aspecto de la aplicacin de Facturacin

Escribiendo un fichero en formato XML


La escritura del fichero en formato XML con los datos de una factura la lleva a cabo el servlet
Emitir_Factura_xml.java, que sigue un esquema como el de la figura 11.2.
El servlet recibe a travs de HTTP el identificador del cliente del cual se quiere la factura y el
nmero de factura (que utilizar como nombre del fichero XML). Accede a la Base de Datos y
obtiene los datos del carrito de la compra de ese cliente y escribe un fichero XML con el nombre
indicado y en el directorio sealado por la propiedad facturasPath.
Servidor

Cliente
Peticin HTML

Servlet

Fichero XML
<?xml version="1.0" encoding="UTF-8" ?>
<factura moneda="euro">
<cliente id="2">
<nombre>Fernando</nombre>
<apellido1>Alonso</apellido1>
<apellido2>Blazquez</apellido2>
</cliente>
<articulo>
<cantidad>1</cantidad>
...
...

Respuesta HTML

DB
tienda

Figura 11.2. Operativa del servlet Emitir_Factura_xml.java

Analizando un documento XML mediante las APIs de Java para XML


El anlisis de un fichero en formato XML con los datos de una factura lo llevan a cabo los servlet
Leer_Factura_xml_SAX.java y Leer_Factura_xml_DOM.java, que siguen un esquema como
el de la figura 11.3.
Ambos servlets reciben a travs de HTTP el nmero de una factura previamente grabada en
formato XML (que utilizarn como nombre del fichero XML a leer). Leen el fichero XML con el
nombre indicado del directorio sealado por la propiedad facturasPath y lo analizan mediante un

Prcticas

181

analizador sintctico (parser). Mediante este anlisis sintctico generan una factura en formato
HTML que devuelven a travs de HTTP.
El servlet Leer_Factura_xml_SAX.java usa el modelo SAX (Simple API for XML) de parser,
que se trata de un analizador sintctico secuencial, es decir, recorre el fichero XML de principio a
fin de forma secuencial y lanza eventos a medida que encuentra etiquetas o TAGs.
El servlet Leer_Factura_xml_DOM.java usa el modelo DOM (Document Object Model) de
parser, que se trata de un analizador sintctico que genera un modelo del documento XML en forma
de rbol (forma natural de los ficheros XML) que ms tarde se puede recorrer para dar formato.
Servidor

Cliente
Peticin HTML

Respuesta HTML

Servlet

Fichero XML
<?xml version="1.0" encoding="UTF-8" ?>
<factura moneda="euro">
<cliente id="2">
<nombre>Fernando</nombre>
<apellido1>Alonso</apellido1>
<apellido2>Blazquez</apellido2>
</cliente>
<articulo>
<cantidad>1</cantidad>
...
...

Figura 11.3. Operativa de los servlets Leer_Factura_xml_SAX.java y


Leer_Factura_xml_DOM.java

Prctica 12: Peticin en varias capas de


servidores mediante XML
En esta prctica se trata de utilizar el formato XML para la transmisin de datos desde un servidor a
otro como se muestra en la figura 12.1. Segn la figura, el cliente hace una peticin HTML de una factura
al servidor 1 pero la informacin se encuentra en el servidor 2. El servidor 1 hace la peticin al servidor 2,
el cual accede a la Base de Datos, obtiene la informacin, la pone en formato XML y la devuelve al
servidor 1. Este lee y analiza la respuesta XML y le da formato HTML para devolvrselo al cliente.

Servidor 1

Cliente

Servidor 2

Peticin HTML

Peticin HTML

Respuesta HTML

Respuesta XML

DB

Figura 12.1. Peticin en varias capas de servidores mediante XML

Puesta en marcha
Descarga el fichero Practica12.zip de la zona de Material de la web de la asignatura y descomprmelo
en un directorio propio, por ejemplo: G:\Infor2\Practica12\
La aplicacin consta de los siguientes archivos:
Tipo de Archivo
Servlets

Nombre
Facturacion.java
Servidor1.java
Servidor2.java

La aplicacin tomar los datos para emitir las facturas de la Base de Datos Tienda.mdb de la
aplicacin Tienda de Discos de la prctica 10, a travs del DSN con nombre tienda, el cual ya debe
estar presente en el sistema.
Se deben compilar todos los servlets como en prcticas anteriores. Ahora bien, para que el compilador
pueda entender las clases de la DOM API para XML. Si se ha realizado la prctica 11 esto ya debe estar
resuelto y no debe suponer un problema.
Para simular la operativa de dos servidores nos vamos a servir de dos servletrunner ejecutndose
en dos consolas de MS-DOS diferentes y escuchando a dos puertos diferentes.
Si el directorio en el que se ha guardado la prctica fuese el mismo que el ejemplo
(G:\Infor2\Practica12\), los servidores se arrancaran con las instrucciones:

Consola 1 de MS-DOS (simula Servidor 1):


servletrunner -p 8081 -d G:\Infor2\Practica12\

184

Informtica II

Consola 2 de MS-DOS (simula Servidor 2):


servletrunner -p 8082 -d G:\Infor2\Practica12\

Para iniciar la aplicacin se debe invocar el servlet Facturacion.java desde la barra del navegador
mediante la instruccin:
http://localhost:8081/servlet/Facturacion
que muestra una pantalla como la de la figura 12.2.

Figura 12.2. Pantalla de inicio, resultado del servlet Facturacion.java

Anlisis de los servlets


El servlet Servidor1.java que se encuentra en el primer servidor (comprobar la consola 1 de MS-DOS
para ver que dicho servlet ha sido inicializado) recibe a travs de HTTP el identificador del cliente del
cual se quiere la factura e invoca a su vez al servlet Servidor2.java que se encuentra en el segundo
servidor (comprobar la consola 2 de MS-DOS para ver que dicho servlet ha sido inicializado), pasndole
como parmetro dicho identificador de cliente.
El servlet Servidor2.java accede a la Base de Datos, obtiene los datos del carrito de la compra de
ese cliente, transforma la informacin de dicho carrito a XML y se la devuelve al servlet
Servidor1.java en este mismo formato.
Es entonces cuando el servlet Servidor1.java analiza el documento XML recibido mediante un
parser que usa el modelo DOM y pone la informacin de la factura en formato HTML, que devuelve
posteriormente al cliente a travs de HTTP.

ANEXOS

ANEXO 1

A1. Introduccin a SQL


A1.1. Introduccin
SQL (Structured Query Language o Lenguaje Estructurado de Consultas) es un lenguaje empleado
para crear, manipular, examinar y manejar bases de datos relacionales. Proporciona una serie de
sentencias estndar que permiten realizar las tareas antes descritas. SQL fue estandarizado segn las
normas ANSI (American National Standards Institute) en 1992, paliando de alguna forma la
incompatibilidad de los productos de los distintos fabricantes de bases de datos (Oracle, Sybase,
Microsoft, Informix, etc.). Esto quiere decir que una misma sentencia permite a priori manipular los
datos recogidos en cualquier base de datos que soporte el estndar ANSI, con independencia del tipo de
base de datos.
La mayora de los programas de base de datos ms populares soportan el estndar SQL-92, y
adicionalmente proporcionan extensiones al mismo, aunque stas ya no estn estandarizadas y son
propias de cada fabricante. JDBC soporta el estndar ANSI SQL-92 y exige que cualquier driver JDBC sea
compatible con dicho estndar.
Para poder enviar sentencias SQL a una base de datos, es preciso que un programa escrito en Java
est previamente conectado a dicha base de datos, y que haya un objeto Statement disponible.

A1.2. Reglas sintcticas


SQL tiene su propia sintaxis que hay que tener en cuenta, pues a veces puede ocurrir que sin
producirse ningn problema en la compilacin, al tratar de ejecutar una sentencia se produzca algn error
debido a una incorrecta sintaxis en la sentencia. Por tanto, ser necesario seguir las siguientes normas:

SQL no es sensible a los espacios en blanco. Los retornos de carro, tabuladores y espacios en
blanco no tienen ningn significado especial. Las palabras clave y comandos estn delimitados por
comas (,), y cuando sea necesario, debe emplearse el parntesis para agruparlos.

Si se van a realizar mltiples consultas a un mismo tiempo, se debe utilizar el punto y coma (;)
para separar cada una de las consultas. Adems, todas las sentencias SQL deben finalizar con el
carcter punto y coma (;).

Las consultas son insensibles a maysculas y minsculas. Sin embargo, los valores almacenados
en las bases de datos s que son sensibles a las mismas, por lo que habr que tener cuidado al
introducir valores, efectuar comparaciones, etc.

Para caracteres reservados como % o _ pueden y deben emplearse los caracteres escape. As
por ejemplo en lugar de % habr de emplearse \%.

A la hora de introducir un String, ste deber ir encerrado entre comillas simples, ya que de lo
contrario se producirn errores en la ejecucin.

A1.3. Ejecucin de sentencias SQL


La interface Statement proporciona dos mtodos distintos de ejecucin de sentencias SQL en funcin
del tipo de sentencia que se vaya a ejecutar:

executeQuery(String): Sirve para recuperar informacin contenida en una base de datos. Ejecuta
la consulta (query) pasada como parmetro y devuelve un objeto Resultset como resultado de la
consulta.

188

Informtica II

executeUpdate(String): Anlogo al anterior, con la diferencia de que este mtodo no sirve para
realizar una consulta, sino para modificar o introducir datos en la base de datos. Tiene como
valor de retorno un int, que indica el nmero de filas actualizadas.

A1.3.1. Tipos de datos SQL y equivalencia


SQL emplea unos tipos (String, int, etc) distintos a los de Java. La Tabla 1 muestra los tipos ms
empleados y su equivalencia:
A1.3.2. Creacin de tablas
Tipo de dato Java
Int
Long
Float
Double
BigDecimal
Bolean
String
String
Date
Time

Tipo de dato SQL


INTEGER
BIG INT
REAL
FLOAT
DECIMAL
BIT
VARCHAR
CHAR
DATE
TIME

Tabla 1. Relacin entre los tipos de datos de Java y SQL.


Para la creacin de tablas se emplea la sentencia CREATE TABLE. El formato de la sentencia es:
CREATE TABLE <nombre de tabla> (<elemento columna> [<elemento columna>]...)
donde el elemento columna se declara en la forma:
<nombre columna> <tipo de dato> [DEFAULT <expresin>]
Todo aquello encerrado entre corchetes representa elementos opcionales, no necesarios. As, para
crear un tabla de nombre ALUMNOS que contuviera el nombre y apellidos del alumno como Strings y el
nmero de carnet como un long, se tendra que ejecutar la siguiente sentencia:
CREATE TABLE ALUMNOS (Nombre CHAR(15), Apellidos VARCHAR (30), Carnet INTEGER);
Esta sentencia crea una tabla de nombre ALUMNOS con tres campos:

Nombre, que es de tipo CHAR y admite hasta 15 caracteres

Apellidos, que es de tipo VARCHAR y admite hasta 30 caracteres

Carnet, que es de tipo INTEGER (int)

La diferencia entre CHAR y VARCHAR es que si el valor introducido en un campo es inferior al tamao
asignado al mismo (15 y 30 en este caso), en el primer caso rellena el espacio con espacios, y en el
segundo lo deja tal y como est.
Obsrvese por otra parte que tal y como se ha mencionado antes, las maysculas/minsculas no
influyen en el resultado final. En efecto:
CREATE TABLE ALUMNOS (Nombre CHAR(15), Apellidos VARCHAR (30), Carnet INTEGER);
tiene el mismo resultado que la primera sentencia. En la Figura 1 puede observarse el resultado de la
ejecucin de la sentencia CREATE TABLE:

Figura 1. Resultado de ejecutar la sentencia CREATE TABLE.

Anexo 1. Introduccin a SQL

189

A1.3.3. Recuperacin de informacin


La sentencia SELECT es la que se utiliza cuando se quieren recuperar datos de la informacin
almacenada en un conjunto de columnas. Las columnas pueden pertenecer a una o varias tablas y se
puede indicar el criterio que deben seguir las filas de informacin que se extraigan. Muchas de las
clusulas que permite esta sentencia son simples, aunque se pueden conseguir capacidades muy complejas
a base de una gramtica ms complicada.
La sintaxis de la sentencia es:
SELECT [ALL | DISTINCT] <seleccion>
FROM <tablas>
WHERE <condiciones de seleccion>
[ORDER BY <columna> [ASC | DESC]
[,<columna> [ASC | DESC]]...]
La seleccin contiene normalmente una lista de columnas separadas por comas (,), o un asterisco (*)
para seleccionarlas todas. Un ejemplo ejecutado contra una de las tablas creadas anteriormente podra
ser:
SELECT * FROM ALUMNOS;
que devolvera el contenido completo de la tabla ALUMNOS. Si solamente se quiere conocer los datos
del alumno cuyo nmero de carnet es 12345, la consulta sera:
SELECT * FROM ALUMNOS WHERE Carnet = 12345;
Se quiere ahora saber cuntos alumnos hay de nombre Mikel. Para ordenar la lista resultante por
apellidos, por ejemplo, se usara la directiva ORDER BY:
SELECT * FROM ALUMNOS
WHERE Nombre = Mikel
ORDER BY Apellidos;
Puede especificarse que esta ordenacin es realizada de forma ascendente (clusula ASC) o
descendente (clusula DESC). As, si se quiere ordenar de forma ascendente:
SELECT * FROM ALUMNOS
WHERE Nombre = Mikel
ORDER BY Apellidos ASC;
Si lo que se quiere, adems de que la lista est ordenada por apellidos, es ver solamente el nmero de
carnet, se consultara de la forma:
SELECT Carnet FROM ALUMNOS
WHERE Nombre = Mikel
ORDER BY Apellidos;
Si se quieren resultados de dos tablas a la vez, tampoco hay problema en ello, tal como se muestra en
la siguiente sentencia:
SELECT ALUMNOS.*, PROFESORES.* FROM ALUMNOS, PROFESORES;
Obsrvese que se especifica el nombre de la tabla (ALUMNOS o PROFESORES) a la hora de acceder a
los campos de una tabla. As:
SELECT
ALUMNOS.CampoDeAlumnos,PROFESORES.CampoDeProfesores
PROFESORES;

FROM

ALUMNOS,

Por otra parte, puede utilizarse el carcter % como comodn para especificar trminos de consulta que
empiecen por un determinado valor. As, para recuperar todos los datos de los alumnos cuyo nombre
comienza por M:

190

Informtica II

SELECT * FROM ALUMNOS WHERE Nombre LIKE 'M%';


Obsrvese que M% est encerrado entre comillas simples ('). Puede asimismo emplearse la clusula
NOT LIKE, para indicar por ejemplo que se quieren recuperar todos los datos de los alumnos cuyo nombre
no empiece por B:
SELECT * FROM ALUMNOS WHERE Nombre NOT LIKE 'B%';
Adicionalmente pueden emplearse los operadores relacionales recogidos en la Tabla 2:
Operador relacional
=
<> o !=
<
>
<=
>=

Significado
Igual
Distinto
Menor
Mayor
Menor o igual
Mayor o igual

Tabla 2. Operadores relacionales.


As, para obtener los nombres de aquellos alumnos cuyo nmero de carnet sea mayor que 70000, se
empleara la siguiente sentencia:
SELECT Nombres FROM ALUMNOS WHERE Carnet>70000;
Por otra parte, pueden emplearse las clusulas lgicas AND, OR y/o NOT. As, si se quisiera obtener
todos los datos de los alumnos cuyo nmero de carnet es superior a 70000 y cuyo nombre es Mikel, se
debera emplear:
SELECT * FROM ALUMNOS WHERE Carnet>70000 AND Nombre='Mikel';
El orden de los operadores lgicos es el siguiente:
NOT
AND
OR
Por ltimo, indicar que el empleo de la clusula DISTINCT elimina cualquier fila duplicada que pueda
obtenerse como resultado de una consulta a varias tablas relacionadas entre s.
A1.3.4. Almacenar informacin
La sentencia INSERT se utiliza cuando se quieren insertar filas de informacin en una tabla. Aqu
tambin se pueden presentar diferentes capacidades, dependiendo del nivel de complejidad soportado. La
sintaxis de la sentencia es:
INSERT INTO <nombre tabla>
[(<nombre columna> [,<nombre columna>]...)]
VALUES (<expresion> [,<expresion>]...)
Por ejemplo, en la tabla de los ALUMNOS se podra ingresar uno nuevo con la siguiente informacin:
INSERT INTO ALUMNOS VALUES ( Juan, Prez Etxeberria, 23456);
A1.3.5. Eliminacin de datos
La sentencia DELETE es la que se emplea cuando se quieren eliminar filas de las columnas, y su
gramtica tambin es muy simple:
DELETE FROM <nombre tabla> WHERE <condicion busqueda>
Si no se especifica la clusula WHERE, se eliminar el contenido de la tabla completamente, sin
eliminar la tabla, por ejemplo:

Anexo 1. Introduccin a SQL

191

DELETE FROM ALUMNOS;


vaciar completamente la tabla, dejndola sin ningn dato en las columnas, es decir, esencialmente lo
que hace es borrar todas las columnas de la tabla. Especificando la clusula WHERE, se puede introducir
un criterio de seleccin para el borrado, por ejemplo:
DELETE FROM ALUMNOS WHERE Carnet=12345;
A1.3.6. Actualizacin de datos
Para actualizar filas ya existentes en las columnas, se utiliza la sentencia UPDATE, cuya gramtica es
la siguiente:
UPDATE <nombre tabla> SET <nombre columna> = ( <expresion> | NULL )
[, <nombre columna> = ( <expresion> | NULL )]... WHERE <condicion busqueda>
Este comando permite cambiar uno o ms campos existentes en una fila. Por ejemplo, para cambiar
el nombre de un alumno en la tabla de ALUMNOS, se hara:
UPDATE ALUMNOS SET Nombre = 'Amaia' WHERE Carnet=12345;

También podría gustarte