El Aprendizaje Electrónico Como Complemento del Tradicional en la Enseñanza - Aprendizaje de las Redes de Datos.

Anuncio
Universidad Nacional del Nordeste
Facultad de Ciencias Exactas, Naturales y Agrimensura
Trabajo Final de Aplicación
El Aprendizaje Electrónico Como
Complemento del Tradicional en la
Enseñanza - Aprendizaje de las Redes de
Datos
Mariela Itatí Pizzichini - L.U.: 21580
Prof. Orientador: Mgter. David Luis la Red Martínez
Licenciatura en Sistemas
Corrientes - Argentina
2006
A Dios por poner en mi camino a personas que realmente
me apoyaron en la Carrera.
Prefacio
En el contexto actual de la llamada Sociedad de la Información y del Conocimiento resulta cada vez más necesario disponer de sistemas informáticos
distribuidos, multiplataforma, con acceso desde las Intranets y/o la Internet,
para mejorar la educación a distancia, la transparencia de las mismas, la participación de los usuarios en la educación, la automatización de los exámenes
y la gestión de información a través de las redes de datos, especialmente las
Intranets de las organizaciones y la Internet, mejorando asimismo la toma de
decisiones y el uso eficiente de los recursos.
Todo lo señalado precedentemente sería ilusorio si no se dispusiera de las
metodologías y de los sistemas informáticos que facilitaran la información entre las distintas organizaciones, utilizando diversos medios de comunicación y
diferentes plataformas de hardware y de software.
Este trabajo se basa en el estudio de software de base que permite el
desarrollo de aplicaciones Web multiplataforma con acceso a bases de datos y
en el desarrollo de una aplicación Web de autoevaluación y seguimiento de
exámenes propios de una asignatura universitaria de Teleproceso y Sistemas
Distribuidos.
Contempla el registro y seguimiento de la información propia de las evaluaciones de la asignatura, es decir la información emergente del registro de
los alumnos, evaluaciones y notas que se generan en las mismas, la distribución de los temas pertinentes a la asignatura, el seguimiento detallado de cada
evaluación registrada, paso a paso, a los efectos de brindar información a los
alumnos de las notas de las evaluaciones realizados hasta el momento y su
situación dentro de la materia, también a su vez facilitar información a los
profesores, de los alumnos evaluados y sus notas.
Esto significa la posibilidad de registrar las evaluaciones que luego podrán
llegar a la cátedra desde la Web, como así también el seguimiento de dichas
evaluaciones, brindando la posibilidad de una consulta desde la Internet.
Objetivos
El objetivo inicialmente planteado fue la realización de una aplicación Web
multiplataforma desarrollada en Java, mediante la cual el alumno de la materia pudiera contar con un medio de ayuda para evaluar a distancia su nivel de
conocimientos, mediante autoevaluaciones, sobre los contenidos de la asignatura. La aplicación podría ser operada desde la Intranet de la Facultad o bien
vi
desde la Internet.
Estos objetivos planteados al inicio del trabajo, fueron totalmente cumplidos.
Etapas de Desarrollo
• Se ha efectuado una amplia recopilación bibliográfica específica de los
temas pertinentes a la tarea planificada y a los productos de software
que se emplearon para la concreción del Trabajo Final.
• Se realizaron las traducciones de los manuales correspondientes a la herramienta de desarrollo WebSphere Studio Application Developer, versión 5.0 para Windows.
• Como consecuencia de las gestiones realizadas por el Profesor Orientador ante IBM Argentina se han recibido materiales tanto en CD’s como
en libros de dicha empresa, en el marco del Scholars Program de la misma, destinado a Universidades de todo el mundo; se destacan por ser
necesarios para la realización del presente Trabajo Final los referentes a
productos de software tales como el WebSphere Studio Application Developer versión 5.0 y 5.1.2, como así también el DB2 UDB WorkGroup
Server Edition versión 8.1.0 y DB2 UDB Personal Edition versión 8.1.0.
• Se ha realizado un detallado estudio del lenguaje Java, utilizándose la
versión JDK 1.5.
• Se ha realizado un detallado estudio del entorno de trabajo Scientific
WorkPlace 2.5.0 para la escritura del libro correspondiente al informe
final.
• Se ha realizado un detallado estudio del software para el desarrollo de
la aplicación, es decir el estudio de la plataforma integrada de desarrollo
de aplicaciones Web, WebSphere Studio Application Developer.
• Se ha realizado el estudio del Manejador de Bases de Datos (DBMS)
multiplataforma DB2 UDB.
• Se ha realizado el desarrollo de la aplicación utilizando páginas HTML
y Servlets de Java en el marco de la herramienta WebSphere Studio
Application Developer en el entorno Windows.
vii
• Se ha realizado el correspondiente testeo de la aplicación, utilizando una
máquina como servidor y otra como cliente ingresando a la base de datos
del servidor a través de la Intranet de la Facultad.
• Una vez finalizada la aplicación se realizó la grabación en DVD de todo
el material correspondiente al trabajo final: una versión de la aplicación,
otra referente al libro en formato LaTex y el PDF generado. También
se icluyó los instaladores de los productos utilizados para el desarrollo,
es decir DB2 UDB y WebSphere Studio Application Developer.
Objetivos Logrados
Se han alcanzado plenamente la totalidad de los objetivos planteados para
el presente trabajo.
Organización del Informe Final
El informe final comprende un libro impreso y un DVD, además de un
resumen y de un resumen extendido.
El libro impreso está organizado en capítulos, los que se indican a continuación:
• Capitulo 1 - Introducción al E-learning: Se presenta una visión general de los conceptos sobre el aprendizaje electrónico.
• Capitulo 2 - Introducción a DB2: Se señalan los principales conceptos
referidos al lenguaje de programación.
• Capitulo 3 - Introducción a Java: Se indican los principales aspectos
y destacadas características referidas al lenguaje.
• Capitulo 4 - Introd. a WebSphere Applicación Server: Se resumen
los aspectos y características más destacadas de estas facilidades.
• Capitulo 5 - Servlet: Se detallan las más relevantes características de
los servlets.
• Capitulo 6 - Descripción de la Aplicación: Se presentan los principales aspectos del trabajo efectuado.
• Capitulo 7 - Códigos Utilizados en la aplicación: Se señalan algunos
ejemplos referidos a servlets.
viii
• Capitulo 8 - Conclusiones: Se detallan las conclusiones más significativas respecto de la aplicación desarrollada utilizando las facilidades antes
mencionadas.
El DVD, adjunto al libro impreso, contiene lo siguiente:
• Instaladores del software utilizado.
• Resúmenes del trabajo realizado.
• Libro del informe final.
• Presentación para la defensa final.
• Copia de seguridad de la base de datos de la aplicación.
• Aplicación desarrollada.
Pizzichini Mariela Itati
Licenciatura en Sistemas
Universidad Nacional del Nordeste
L.U.: 21580
Prof. Orientador: Mgter. David Luis La Red Martínez
Corrientes; Noviembre de 2006
Índice General
1 Soc. de la Infor. y Gestión del Conocim.
1.1 Introducción . . . . . . . . . . . . . . . . .
1.1.1 Tipos de Conocimientos . . . . . .
1.1.2 Ciclo de Vida del Conocimiento . .
1.2 Internet . . . . . . . . . . . . . . . . . . .
1.2.1 Servicios de Internet . . . . . . . .
1.3
1.4
.
.
.
.
.
1
1
4
5
6
7
Aprendizaje Electrónico . . . . . . . . . . . . . . . . . . . . . .
1.3.1 Combinación del Aprendizaje en Línea y Presencial . .
7
9
.
.
.
.
.
.
.
.
.
.
1.3.2 Instrumentos del Aprendizaje en Línea
1.3.3 Problemas y Limitaciones . . . . . . .
1.3.4 Objetivos y Ventajas . . . . . . . . . .
Educación a Distancia . . . . . . . . . . . . .
1.4.1 El Papel de la Educación . . . . . . .
1.4.2 Tendencias en la Educación . . . . . .
1.4.3 Ventajas de la Enseñanza Virtual . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
10
11
12
13
15
16
17
2 Introducción a DB2
19
2.1 Grandes Ventajas del DB2 Univ. Database (UDB) . . . . . . . 19
2.2 Características del DB2 Universal DataBase . . . . . . . . . . . 22
2.3 Funciones Complementarias . . . . . . . . . . . . . . . . . . . 23
2.4 Integridad Referencial . . . . . . . . . . . . . . . . . . . . . . . 26
2.4.1 Restricciones . . . . . . . . . . . . . . . . . . . . . . . . 26
2.4.2 Restricciones Preferenciales . . . . . . . . . . . . . . . . 27
2.5 Tabla de Restricciones . . . . . . . . . . . . . . . . . . . . . . . 30
2.5.1 Restricción Única . . . . . . . . . . . . . . . . . . . . . 31
2.5.2 Tabla de Control de Restricciones (Table Check Constraints) . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.5.3 Funciones Incorporadas . . . . . . . . . . . . . . . . . . 32
2.6 Funciones Definidas por el Usuario . . . . . . . . . . . . . . . . 34
ix
x
ÍNDICE GENERAL
2.7
2.8
2.9
2.10
2.11
2.12
2.13
2.14
Funciones de Tablas . . . . . . . . . . . . . . . . . . . . .
Anidar o Establecer Tablas de Expresión . . . . . . . . . .
2.8.1 Tablas de Expresión . . . . . . . . . . . . . . . . .
2.8.2 Tablas de Expresión Común . . . . . . . . . . . . .
2.8.3 Outer Join . . . . . . . . . . . . . . . . . . . . . .
Triggers en DB2 . . . . . . . . . . . . . . . . . . . . . . .
Comandos Adicionales de SQL . . . . . . . . . . . . . . .
Hardware Soportado por DB2 . . . . . . . . . . . . . . . .
2.11.1 Partición Simple Sobre un Único Procesador . . .
2.11.2 Partición Simple con Múltiples Procesadores . . .
2.11.3 Distintas Configuraciones de Particiones Múltiples
Herramientas de Administración . . . . . . . . . . . . . .
2.12.1 DB2 Administración de Servidores . . . . . . . . .
2.12.2 Asistente para la Configuración de Clientes . . . .
Administrador . . . . . . . . . . . . . . . . . . . . . . . .
SmartGuides . . . . . . . . . . . . . . . . . . . . . . . . .
3 Introducción a JAVA
3.1 ¿De Dónde Surge Java? . . . . . . . . . . . . . . . . . .
3.2 La Simplicidad de Java . . . . . . . . . . . . . . . . . . .
3.3 Principales Características del Lenguaje . . . . . . . . .
3.4 Entorno de Desarrollo de Java . . . . . . . . . . . . . .
3.5 El Compilador de Java . . . . . . . . . . . . . . . . . . .
3.6 Java Virtual Machine . . . . . . . . . . . . . . . . . . .
3.7 Applets en Java . . . . . . . . . . . . . . . . . . . . . . .
3.7.1 Construcción de Applets . . . . . . . . . . . . . .
3.7.2 Cómo Incorporar un Applet en una Página Web
3.7.3 Portabilidad de Applets . . . . . . . . . . . . . .
3.7.4 El Problema de la Seguridad . . . . . . . . . . .
3.7.5 Seguridad del Monitor . . . . . . . . . . . . . . .
3.7.6 Seguridad del Código Intermedio . . . . . . . . .
3.8 Las Variables Path y ClassPath . . . . . . . . . . . . . .
3.9 Arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.10 El Kit Gráfico: AWT . . . . . . . . . . . . . . . . . . . .
3.10.1 Jerarquía de Clases de AWT . . . . . . . . . . .
3.11 Constructores . . . . . . . . . . . . . . . . . . . . . . . .
3.12 Encapsulamiento de Clases . . . . . . . . . . . . . . . .
3.12.1 Visibilidad de Campos y Métodos . . . . . . . .
3.12.2 Visibilidad de Clases . . . . . . . . . . . . . . . .
3.13 Interacción con el Usuario . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
37
37
37
38
39
40
43
44
45
45
46
49
49
49
50
51
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
53
53
55
55
56
57
57
58
59
60
61
61
62
63
63
66
68
69
69
71
72
74
74
ÍNDICE GENERAL
xi
3.14
3.15
3.16
3.17
Instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Objetos y Clases . . . . . . . . . . . . . . . . . . . . . . . . . .
Subclases y Herencia . . . . . . . . . . . . . . . . . . . . . . . .
Operadores en Java . . . . . . . . . . . . . . . . . . . . . . . .
3.17.1 Operadores Aritméticos . . . . . . . . . . . . . . . . . .
3.17.2 Operadores de Asignación . . . . . . . . . . . . . . . . .
3.17.3 Operadores Unarios . . . . . . . . . . . . . . . . . . . .
3.17.4 Operadores Incrementales . . . . . . . . . . . . . . . . .
3.17.5 Operadores Relacionales . . . . . . . . . . . . . . . . . .
3.17.6 Operador de Concatenación de Cadenas de Caracteres
(+) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.17.7 Precedencia de Operadores . . . . . . . . . . . . . . . .
3.18 Java Para Aplicaciones Corporativas . . . . . . . . . . . . . . .
3.18.1 Aplicaciones Efectivas o Eficientes . . . . . . . . . . . .
3.18.2 Mantenimiento y Soporte . . . . . . . . . . . . . . . . .
3.19 Estructuras de Programación . . . . . . . . . . . . . . . . . . .
3.19.1 Sentencias o Expresiones . . . . . . . . . . . . . . . . . .
3.19.2 Comentarios . . . . . . . . . . . . . . . . . . . . . . . .
3.19.3 Bifurcaciones . . . . . . . . . . . . . . . . . . . . . . . .
3.19.4 Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.20 Errores Frecuentes de Programación . . . . . . . . . . . . . . .
3.20.1 Scheduling de Hilos de Ejecución . . . . . . . . . . . . .
3.20.2 Errores en el Uso de las Características de Portabilidad
de Java . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.20.3 Uso de Directorios Definidos . . . . . . . . . . . . . . .
3.20.4 Carga de Drivers JDBC . . . . . . . . . . . . . . . . . .
3.20.5 Terminación de Líneas . . . . . . . . . . . . . . . . . . .
3.20.6 Entrada/Salida por Archivo . . . . . . . . . . . . . . . .
3.20.7 Fuentes de Caracteres . . . . . . . . . . . . . . . . . . .
4 Introd. a Websphere Aplicación Server
4.1 ¿Que es WebSphere? . . . . . . . . . . . . . . . . . .
4.2 Incremento del Desempeño de las Aplicaciones . . .
4.3 El WebSphere para la Integración en el e-business on
4.4 Plataforma de Software . . . . . . . . . . . . . . . .
4.5 Application Server . . . . . . . . . . . . . . . . . . .
4.5.1 Application Server. Advanced Edition . . . .
4.5.2 Application Server. Enterprise Edition . . . .
4.5.3 Application Server. Standard Edition . . . .
4.5.4 Servidor HTTP . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
demand
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
76
80
85
87
88
88
88
89
89
90
91
91
92
94
94
94
94
95
97
100
100
102
102
105
106
107
107
109
109
111
111
112
114
114
115
116
116
xii
ÍNDICE GENERAL
4.5.5 Servidor de Aplicaciones . . . . . . . . .
4.5.6 Contenedor de EJB . . . . . . . . . . .
4.5.7 Contenedor Web . . . . . . . . . . . . .
4.5.8 Contenedor de Clientes de Aplicaciones
4.5.9 Contenedor de Applets . . . . . . . . . .
4.5.10 Sistema Principal Virtual . . . . . . . .
Arquitecturas de Tres Niveles . . . . . . . . . .
Familias del Producto . . . . . . . . . . . . . .
La Familia de Herramientas WebSphere Studio
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
117
117
117
118
118
119
119
121
123
Servlet
5.1 Desarrollando Servlets . . . . . . . . . . . . . .
5.1.1 Principios de Codificación de Servlet .
5.1.2 Ciclo de Vida del Servlet . . . . . . . .
5.1.3 Instanciación e Inicialización . . . . . .
5.1.4 Servicio de Demanda . . . . . . . . . . .
5.1.5 Terminación . . . . . . . . . . . . . . . .
5.1.6 Modelos de Acceso JSP . . . . . . . . .
5.1.7 Procesadores JSP . . . . . . . . . . . . .
5.1.8 Compilación Batch de Archivos JSP . .
5.1.9 Desarrollando Aplicaciones . . . . . . .
5.1.10 Fases de Inicialización y de Terminación
5.1.11 Rasgos de Java Servlet API . . . . . . .
5.1.12 Patrones y Guías de Servlets/JSP . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
127
127
128
129
129
130
130
131
132
133
134
134
135
135
.
.
.
.
.
.
139
139
140
140
146
155
163
.
.
.
.
.
.
171
171
194
212
216
220
233
4.6
4.7
4.8
5
6 Descripción de la Aplicación
6.1 Descripción General . . . . . .
6.2 Módulos . . . . . . . . . . . . .
6.2.1 Alumno . . . . . . . . .
6.2.2 Profesor . . . . . . . . .
6.2.3 Ayuda . . . . . . . . . .
6.3 Estructuras de Datos Utilizadas
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7 Cód. Utilizados en la Aplicación
7.1 Código (Java). Alta del Alumno . . . . . . . . .
7.2 Código (Java). Identificación del Profesor . . . .
7.3 Código (Html). Alta del Alumno . . . . . . . . .
7.4 Código (Html). Identificación del Profesor . . . .
7.5 Código (Java).Modificar Pregunta . . . . . . . .
7.6 Código (Html).Pantalla Estadísticas del Profesor
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
ÍNDICE GENERAL
xiii
8 Conclusiones
237
8.1 Conclusiones Acerca de las Tecnologías y Software Utilizados . 237
8.2 Líneas Futuras de Acción . . . . . . . . . . . . . . . . . . . . . 238
Bibliografía
241
Índice de Materias
245
Índice de Figuras
1.1
1.2
Ciclo de vida del conocimiento. . . . . . . . . . . . . . . . . . .
Proyección del crecimiento mundial en el uso de Internet entre
el año 2000 y 2005. . . . . . . . . . . . . . . . . . . . . . . . . .
Ejemplo de una plataforma integral de aprendizaje de WebCT.
Integración de sistemas de gestión del contenido en los programas universitarios. . . . . . . . . . . . . . . . . . . . . . . . . .
6
10
2.1
2.2
2.3
2.4
2.5
Almacenamiento de documentos XML en DB2.
Esquema conceptual de los almacenes de datos.
Funciones definidas por el usuario. . . . . . . .
Ejemplo de código definido por el usuario. . . .
Demostración de un triggers. . . . . . . . . . .
24
25
35
36
42
4.1
Plataforma de WebSphere. . . . . . . . . . . . . . . . . . . . . . 110
5.1
5.2
5.3
Ciclo de vida de un servlet. . . . . . . . . . . . . . . . . . . . . 130
Requerimiento de un archivo JSP. . . . . . . . . . . . . . . . . 131
Requerimiento de un servlet. . . . . . . . . . . . . . . . . . . . 132
6.1
6.2
6.3
6.4
6.5
6.6
6.7
6.8
6.9
6.10
6.11
6.12
Página principal de la aplicación. . . . . . . . .
Identificación del alumno. . . . . . . . . . . . .
Alta del alumno. . . . . . . . . . . . . . . . . .
Opciones del alumno. . . . . . . . . . . . . . . .
Temas de la evaluación. . . . . . . . . . . . . .
Preguntas con sus opciones para la evaluación.
Resultado de la evaluación. . . . . . . . . . . .
Temas para el exámen. . . . . . . . . . . . . . .
Preguntas con sus respuesta para el exámen. .
Resultado del exámen. . . . . . . . . . . . . . .
Consulta del alumno. . . . . . . . . . . . . . . .
Identificación del profesor. . . . . . . . . . . . .
1.3
1.4
xv
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5
11
140
141
142
142
143
144
145
145
146
147
147
148
xvi
ÍNDICE DE FIGURAS
6.13
6.14
6.15
6.16
6.17
6.18
6.19
6.20
6.21
6.22
6.23
6.24
6.25
6.26
6.27
6.28
6.29
6.30
6.31
6.32
6.33
6.34
6.35
6.36
6.37
6.38
6.39
6.40
6.41
Alta del profesor. . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Pantalla temas del profesor. . . . . . . . . . . . . . . . . . . . . 149
Agregar pregunta y sus opciones. . . . . . . . . . . . . . . . . . 150
Modificar una pregunta y sus opciones. . . . . . . . . . . . . . . 151
Eliminar pregunta y sus opciones. . . . . . . . . . . . . . . . . . 151
Consulta del profesor. . . . . . . . . . . . . . . . . . . . . . . . 152
Opciones de estadísticas. . . . . . . . . . . . . . . . . . . . . . . 153
Promedio general de evaluaciones por año. . . . . . . . . . . . . 153
Cantidad de alumnos que se evaluaron por año. . . . . . . . . . 154
Promedio de notas de todos lo exámenes de todos los temas. . . 154
Promedio de aprobados y desaprobados. . . . . . . . . . . . . . 155
Página principal de la ayuda. . . . . . . . . . . . . . . . . . . . 156
Página de ayuda de identificación del alumno. . . . . . . . . . . 157
Página de ayuda del alta del alumno. . . . . . . . . . . . . . . . 157
Ayuda para la evaluación. . . . . . . . . . . . . . . . . . . . . . 158
Página de ayuda para el exámen del alumno. . . . . . . . . . . 158
Página de ayuda para la consulta del alumno. . . . . . . . . . . 159
Página de ayuda para la identificación del profesor. . . . . . . . 160
Página de ayuda del alta del profesor. . . . . . . . . . . . . . . 161
Página de ayuda para agregar, modificar y eliminar una pregunta.161
Página de ayuda de la consulta del profesor. . . . . . . . . . . . 162
Página de ayuda de las estadísticas del profesor. . . . . . . . . 162
Estructura de base de datos utilizada para la aplicación. . . . . 163
Tabla del alumno. . . . . . . . . . . . . . . . . . . . . . . . . . 165
Tabla evaluación. . . . . . . . . . . . . . . . . . . . . . . . . . . 166
Tabla de preguntas. . . . . . . . . . . . . . . . . . . . . . . . . 167
Tabla profesor. . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Tabla de respuesta. . . . . . . . . . . . . . . . . . . . . . . . . . 169
Tabla de temas. . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Índice de Tablas
3.1
3.2
3.3
Operadores de asignación. . . . . . . . . . . . . . . . . . . . . .
Operadores relacionales. . . . . . . . . . . . . . . . . . . . . . .
Precedencia de Operadores. . . . . . . . . . . . . . . . . . . . .
xvii
88
90
92
Capítulo 1
Sociedad de la Información y
Gestión del Conocimiento
1.1
Introducción
Mucho se habla en la actualidad de la “Sociedad de la Información y del
Conocimiento” (SIC), entendiendo por tal el estado de evolución de una sociedad, la actual, caracterizada por un importantísimo desarrollo y progreso
científico y tecnológico. Esta SIC se define en relación a mecanismos como la
producción, el tratamiento y la distribución de la información, exigiendo desde
un punto de vista técnico, la infraestructura necesaria para su utilización en
todos los ámbitos de la economía y de la vida social [28].
La actual SIC aumentará su demanda de competencias en ambientes de
aprendizaje electrónico, de tal manera que la tecnología aplicada en educación
sirva de ayuda para eliminar obstáculos
No obstante, es necesario hacer notar que el concepto de “Sociedad de la
Información” se encuentra íntimamente relacionado, con la idea de la “Sociedad del Conocimiento”. [12]
Hoy día, en la sociedad en la cual estamos inmersos se “vende” la información como un elemento accesible, que se puede poseer, que da poder, que da
conocimiento. La información se ha convertido en un culto, en un mito, algo
que otorga autoridad, ventajas, superioridad, dominio,... Sin embargo, no se
1
2
CAPÍTULO 1. SOC. DE LA INFOR. Y GESTIÓN DEL CONOCIM.
considera que la información tenga carácter informativo, por el simple hecho
de ser poseída, o de poder ser asimilada por un sujeto. Se ha producido un
cambio en el concepto de la información [17].
Al mismo tiempo, la información ha pasado a ser un bien de consumo.
Pero no sólo este producto entra dentro de esta categoría sino que los modos
de vida de las personas de los países más desarrollados se han transformado
de una manera radical. Asistimos al nacimiento de una nueva sociedad donde
la calidad, la gestión y la velocidad del flujo de la información se convierten en
factor clave de la competitividad tanto para el conjunto de los oferentes como
para los demandantes.
Por otra parte, nos encontramos ante la presencia de conceptos e ideas
diferentes, pues, si bien actualmente es posible un fácil y rápido acceso a
cualquier tipo de información, de la clase y naturaleza que sea, ello no supone
necesariamente la obtención de un conocimiento estricto de la misma, ya que
por tal se entiende, “la acción de averiguar por el ejercicio de las facultades
intelectuales la naturaleza, cualidades y relaciones de las cosas”.
No obstante, también estamos en presencia de conceptos e ideas íntimamente relacionadas, ya que la SIC ofrece herramientas técnicas no sólo para
la recopilación de información, sino también para su adecuado tratamiento y
estructuración.
La información son datos que podemos tener a nuestro alcance y comprender. Sus características básicas son:
• Es de naturaleza intelectual, inmaterial, aunque se registra y presenta
en soportes físicos.
• No es escasa, cada vez es más abundante, hasta se puede considerar que
es ilimitada.
• Puede ser compartida sin disminuir su utilidad para ninguna de las personas que la utilizan.
• Se enriquece con el intercambio de ideas entre sus usuarios.
• No es apropiable, o no debería serlo.
• La información no exige un uso excluyente, la pueden utilizar varias personas a la vez, salvo cuando su valor está precisamente en la privacidad
y exclusividad.
1.1. INTRODUCCIÓN
3
• A veces tiene una vigencia corta, sufre la obsolescencia con el paso del
tiempo.
El conocimiento siempre es una elaboración personal, fruto de las asociaciones que nuestro cerebro es capaz de hacer a partir de su experiencia, de
la información que ya tenemos, y de la que hemos seleccionado y analizado.
El conocimiento se elabora para dar respuesta a alguna cuestión de nuestro
interés. Por lo tanto siempre supone más que la información de la que hemos
partido para construirlo, tiene una funcionalidad. Los principales tipos de
conocimiento son:
• Declarativo (qué es).
• Procedimental (cómo hacer algo).
• Condicional (cuándo aplicarlo, control...).
Las personas construyen continuamente conocimientos útiles para afrontar
las situaciones que se les presentan a partir de la información de que se dispone
en la memoria y de la que se puede encontrar en el entorno. En la sociedad
actual, que suministra cantidades ingentes de información de todo tipo, una
de las competencias básicas de todos los ciudadanos debe ser saber aprovechar
esta información para construir conocimientos.
Por otra parte, la “Gestión del Conocimiento” (GC) busca la optimización
en los procesos de creación de conocimiento y de aplicación del conocimiento
en circunstancias concretas.
En la SIC la competitividad de las organizaciones está en función de lo
que saben (su conocimiento acumulado), de cómo utilizan lo que saben y de su
capacidad para aprender cosas nuevas (crear nuevo conocimiento).
Los procesos en la GC son:
• Generación.
• Codificación.
• Organización.
• Almacenamiento.
4
CAPÍTULO 1. SOC. DE LA INFOR. Y GESTIÓN DEL CONOCIM.
• Acceso.
• Transferencia.
Las herramientas que se utilizan en la GC son:
• Metodologías adecuadas.
• EPSS : Electronic Perfomance Support Systems: son entornos digitales que facilitan a sus usuarios la realización de determinados trabajos,
suministrándoles información y/o conocimiento cuando se detecta esta
necesidad.
1.1.1
Tipos de Conocimientos
De las muchas clasificaciones que se pueden encontrar interesa la que divide
al conocimiento en tácito y explícito:
• Conocimiento tácito: Este tipo de conocimiento es el que no está registrado por ningún medio y que sólo se obtiene mediante la adquisición de
conocimientos de manera práctica y sólo es posible transmitir y recibir
consultando directa y específicamente al poseedor de estos conocimientos.
• Conocimiento explícito: Se trata del conocimiento basado en datos concretos, con los que sería suficiente su conocimiento para el aprovechamiento de los mismos, sin necesidad de interpretación alguna, expresándolo de una manera simple, es “la teoría”.
El conocimiento tácito no se puede instrumentalizar y se transmite en
determinados contextos y acciones. Es muy personal y difícil de verbalizar o
comunicar. Este tipo de conocimiento, ya sean aptitudes físicas o esquemas
mentales, está muy enraizado en la experiencia individual, del mismo modo
que los ideales o escala de valores de cada uno. El conocimiento tácito es el
conocimiento que poseen las personas y que es inseparable de su experiencia y
que puede ser compartido e intercambiado, principalmente mediante contactos
directos.
1.1. INTRODUCCIÓN
5
Figura 1.1: Ciclo de vida del conocimiento.
El conocimiento explícito se puede expresar mediante palabras y números,
y es fácil de transmitir. Es un conocimiento formal, además define la identidad, las competencias, y los activos intelectuales de una organización con
abstracción de sus empleados. Esto es, el conocimiento organizativo por excelencia, pero que apenas tiene utilidad si no se combina con el conocimiento
tácito. Las combinaciones entre estos dos tipos de conocimiento son la esencia
de la creación de conocimiento. [2]
1.1.2
Ciclo de Vida del Conocimiento
El punto esencial del ciclo de vida del conocimiento radica en que el conocimiento que no fluye, no crece y a menudo envejece y se vuelve obsoleto e inútil;
por el contrario, el conocimiento que fluye, se comparte y se intercambia, genera nuevo conocimiento. El flujo de conocimiento posibilita la interacción
entre el conocimiento tácito que poseen e intercambian las personas con el
conocimiento explícito que reside en documentos y librerías. Es por esto que,
el flujo del conocimiento constituye el aspecto fundamental de la gestión del
conocimiento (ver Figura 1.1 de la pág. 5).
6
CAPÍTULO 1. SOC. DE LA INFOR. Y GESTIÓN DEL CONOCIM.
Figura 1.2: Proyección del crecimiento mundial en el uso de Internet entre el
año 2000 y 2005.
1.2
Internet
Internet es uno de los medios de comunicación más importantes, con mayor
caudal de información y de todo tipo, accesible en tiempo real, compartida por
usuarios con diferentes necesidades de información, pudiendo la misma ser accedida desde cualquier parte del mundo; ofrece una plataforma para intercambiar conocimientos, su utilización va adquiriendo una creciente importancia
en todos los aspectos.
La web nos permite autoinstruirnos, capacitarnos, formarnos, realizar cursos a distancia, interactuar con personas de cualquier parte del planeta, adquirir los conocimientos suficientes y necesarios para competir tanto a nivel
laboral, social como cultural, en esta sociedad competitiva en la que vivimos
hoy día que cada vez nos exige mayores conocimientos de toda índole.
En el gráfico se puede ver cómo va creciendo con el transcurso del tiempo
el uso de este medio en todo el mundo (ver Figura 1.2 de la pág. 6).
A su vez, Internet constituye un conjunto de redes de ordenadores y equipos
físicamente unidos mediante enlaces que conectan puntos de todo el mundo.
1.3. APRENDIZAJE ELECTRÓNICO
7
El fundamento de Internet es el protocolo TCP/IP, que asigna a cada
máquina que se conecta un número específico, llamado “número IP”, y se
utiliza para establecer una comunicación entre dos puntos remotos mediante
el envío de información en paquetes.
Asimismo contamos con un servicio automático llamado “DNS ”, que convierte automáticamente esos crípticos números IP a palabras más inteligibles.
Internet es la red de computadoras más amplia del mundo, y permite que
usuarios de cualquier parte del planeta se conecten a la red con el fin de
compartir información y recursos en tiempo real, sin importar el espacio a
cubrir.
1.2.1
Servicios de Internet
Entre los servicios que nos brinda Internet, los más conocidos son:
• Enviar mensajes a cualquier parte del mundo por medio del correo electrónico.
• Obtener información sobre algún tema en especial por medio de la World
Wide Web (WWW).
• Consultar bibliotecas que están conectadas a la red.
• Acceder a la información almacenada en otros servidores.
• Dialogar con otras personas conectadas a Internet por medio de IRC
(Internet Relay Chat, Charla Alternada en Internet).
• Escuchar emisoras o ver televisión.
• Acceder a juegos interactivos, entre otras cosas.
• Compra y venta de bienes y servicios “online” (en línea).
1.3
Aprendizaje Electrónico
La expresión genérica “Aprendizaje Electrónico” (AE) describe toda forma
de aprendizaje por medios electrónicos, desde la utilización de programas de
8
CAPÍTULO 1. SOC. DE LA INFOR. Y GESTIÓN DEL CONOCIM.
enseñanza en un ordenador personal al empleo de una Intranet o de Internet
para la interacción en un sistema de redes (formación basada en la Web).
Los sistemas de aprendizaje electrónico varían por la forma de presentación de los datos, el potencial de interacción, la flexibilidad de los medios
de enseñanza y los métodos didácticos utilizados. Todos los sistemas tienen
en común la utilización de recursos multimedia que combinan texto, sonido,
gráficos o video en una plataforma informática. [23]
El concepto de AE surgió en los años ochenta con programas de aprendizaje y de juegos relativamente sencillos para sostener una enseñanza básica.
Seguidamente, se adoptaron programas de enseñanza más complejos que satisfacían las necesidades individuales de aprendizaje y ofrecían un entorno virtual
para la autoinstrucción.
La expansión de las funcionalidades de Internet, especialmente la interacción y la comunicación por correo electrónico, chat y transmisión de videos,
permiten el intercambio de información entre los estudiantes y el diálogo con
los profesores en tiempo real. De esta forma, el aprendizaje electrónico ya no
carece del componente de interacción humana.
El aprendizaje virtual (AV), las universidades virtuales y las realidades
virtuales son eslóganes de una industria en la que continuamente se registran
novedades. Sin embargo, en los últimos años ha remitido la euforia impulsada
por la tecnología al intensificarse la experiencia y la evaluación. Las críticas
de que ha sido objeto el AE han consistido en la pobre calidad didáctica de
los productos, el elevado costo derivado del tamaño reducido de los grupos
a los que se dirigen, la insuficiencia de los conocimientos informáticos de los
instructores y usuarios y la escasez o ausencia de interacción personal. Se ha
reconocido que en las iniciativas de AE es necesario centrarse en los conceptos
didácticos y ello se ha plasmado en el aprendizaje híbrido o mezclado, una
combinación del aprendizaje basado en medios informáticos y de la enseñanza
presencial.
Hoy en día la cuestión no estriba en si el AE se puede utilizar eficazmente
para complementar el proceso de aprendizaje humano y mejorar la calidad de
la educación, sino antes bien en qué condiciones y con qué medios didácticos
se pueden obtener mejores resultados. ¿Es útil recurrir a la enseñanza por
métodos informáticos en un entorno universitario satisfactorio en el que la
interacción de persona a persona, el trabajo colectivo, la formación práctica y
los seminarios pueden resultar más eficaces?. ¿Debe sustituir o complementar
1.3. APRENDIZAJE ELECTRÓNICO
9
el ordenador a los profesores, los libros de texto o los apuntes?.
Desde el punto de vista del proceso de aprendizaje, la enseñanza a través
de Internet puede incidir favorablemente en las técnicas de comunicación y los
conocimientos informáticos de los estudiantes, la competencia en los distintos modos de comunicación y la motivación personal. Puede servir también
para satisfacer necesidades específicas de los estudiantes e incluso permitirles
trabajar en realidades virtuales.
Los componentes interactivos revisten especial importancia, pues permiten
a los profesores complementar el proceso de aprendizaje de los alumnos e
intervenir activamente en su progreso. [14]
1.3.1
Combinación del Aprendizaje en Línea y Presencial
Es posible incorporar la enseñanza a través de Internet en los programas
de estudios para formar a los estudiantes y reforzar la capacitación de los
profesionales combinando el aprendizaje en línea con el aprendizaje presencial
de diversas formas.
En el caso de los estudiantes residentes, se puede recurrir a Internet para
facilitar material didáctico en línea para el estudio individualizado y para
preparar o repetir el material que se presenta tradicionalmente. De esta forma
se refuerzan las distintas formas de aprendizaje de los alumnos. Los grupos
de debate y el contacto con el tutor a través del correo electrónico pueden ser
un componente más del proceso de autoaprendizaje de cada estudiante.
La enseñanza presencial se puede complementar con la enseñanza a través de Internet, lo que puede hacer posible, por ejemplo, impartir un curso
sincronizado en dos lugares distantes entre sí. El material didáctico se puede
presentar en línea y la interacción entre los estudiantes de ambos lugares se
facilita mediante el correo electrónico, los chats o los foros de debate.
Los cursos a distancia pueden resultar adecuados para aquellos estudiantes
que viven en zonas remotas y no pueden trasladarse a un centro educativo. Se
pueden ofrecer también como un instrumento adicional de formación asentados
en distintas partes del país para conseguir una cualificación específica.
10
CAPÍTULO 1. SOC. DE LA INFOR. Y GESTIÓN DEL CONOCIM.
Figura 1.3: Ejemplo de una plataforma integral de aprendizaje de WebCT.
1.3.2
Instrumentos del Aprendizaje en Línea
El cambio tecnológico ha impactado en el entorno educativo, produciéndose
cambios tanto en los estudiantes, como en los métodos de enseñanza, de esta
manera se habla de estudiantes ausentes en las aulas y presentes en el entorno
electrónico a través de clases on - line, dando lugar a cambios en los modelos
pedagógicos.
Para que los cursos impartidos a través de Internet sean eficaces se necesitan una serie de instrumentos de aprendizaje en línea. Se necesita una
plataforma de aprendizaje que integre los programas del curso y el contenido
del curso multimedia, así como instrumentos de comunicación, intercambio de
documentos y de autoevaluación y examen (ver Figura 1.3 de la pág. 10).
Otra función básica de una plataforma de aprendizaje es un sistema de
administración, que permite a los profesores organizar el curso en línea, ofreciendo la transferencia de ficheros, bases de datos de preguntas o el seguimiento
de los alumnos (ver Figura1.4 de la pág. 11). Durante los últimos años se han
elaborado distintos sistemas de gestión del aprendizaje o de los contenidos que
ofrecen una interfaz para los cursos en línea.
1.3. APRENDIZAJE ELECTRÓNICO
11
Figura 1.4: Integración de sistemas de gestión del contenido en los programas
universitarios.
1.3.3
Problemas y Limitaciones
La preparación de material didáctico y de cursos a través de ordenador debe
ser siempre una labor de equipo, pues exige una gran experiencia en materia de
didáctica, informática, contenido de los cursos y gestión de proyectos. Cualquier profesor tiene dificultades para llevar adelante por sí solo un curso a
través de Internet, aunque disponga de la ayuda de un buen sistema de gestión. Si el enfoque didáctico del curso no es el adecuado, la curiosidad y el
entusiasmo de los alumnos empezarán enseguida a desvanecerse y desaparecerán completamente, lo cual dará lugar a una frustración general respecto del
aprendizaje por medios informáticos.
Con frecuencia los estudiantes no están habituados al autoaprendizaje,
muchos estudiantes prefieren todavía los métodos de enseñanza receptivos (por
ejemplo, las clases), que no dan buenos resultados en el marco del aprendizaje
a través de Internet. Por ello, los profesores deben utilizar los nuevos medios,
el ordenador e Internet, a fin de motivar a los alumnos para que lleven a cabo
un aprendizaje independiente responsable. El desarrollo de aptitudes en un
entorno de la comunicación y la tecnología de la información es un beneficio
añadido del AE y puede ser una cualificación esencial para los graduados
que preparan su futura carrera profesional. La adquisición de esas aptitudes
también es beneficiosa para los profesores y tutores, que en muchos casos
poseen poca experiencia en esos entornos.
12
CAPÍTULO 1. SOC. DE LA INFOR. Y GESTIÓN DEL CONOCIM.
El AE no es un sistema que permita ahorrar tiempo y dinero. Se necesitan
grandes cantidades de ambos para crear, mantener y actualizar un curso en
línea estimulante y con contenidos adecuados. A lo largo del curso, los alumnos
esperan poder contar con un profesor en línea todos los días e incluso a todas
horas. Una ventaja de ello es la interacción intensiva entre los estudiantes y
el profesor.
El contenido del curso se ha de diseñar de forma que facilite la transferencia entre distintos sistemas de gestión de los contenidos, pues no existen
actualmente sistemas uniformes, aunque es de esperar que esto cambie durante
los próximos años.
El intercambio de cursos a través de Internet entre distintas instituciones puede contribuir a superar las limitaciones de capacidad y, en particular,
permitir a los países en desarrollo participar en la SIC. No obstante, hay que
tener en cuenta que los alumnos de diferente procedencia social y cultural y con
niveles distintos de conocimientos básicos necesitarán métodos de enseñanza
diferentes, y que el contenido del curso deberá ser adaptado para facilitar el
proceso de aprendizaje de los distintos estudiantes.
1.3.4
Objetivos y Ventajas
Los principales objetivos son los siguientes:
• Metodología Multimedia de Vanguardia y en constante actualización integrada por un conjunto de herramientas que, a disposición de un profesor multidisciplinar, convierten las aulas convencionales de informática
en auténticos laboratorios tecnológicos.
• Metodología de Aula Abierta (remota a través de Internet y presencial).
• Actualización constante e incorporación de nuevos cursos que responden
a nuevas necesidades que se crean en el mercado.
Las ventajas más destacadas se mencionan seguidamente:
• Ritmo personal y activo de aprendizaje.
• Adaptación a cada nivel de conocimientos.
1.4. EDUCACIÓN A DISTANCIA
13
• Libertad y flexibilidad de horarios.
• Entorno profesional de aprendizaje.
• Contar con profesores conectados en tiempo real que les permita solucionar inconvenientes o dudas que se presenten en el momento.
• Dinamismo en la formación.
• Predominio de la práctica sobre la teoría.
• Asimilar conocimientos de toda índole.
• Satisfacer sus necesidades de conocimientos.
1.4
Educación a Distancia
Por educación a distancia entendemos aquella en la que no es preciso el
contacto físico entre profesor y alumno para que tenga lugar el proceso de
aprendizaje. Este tipo de enseñanza, surgida en Inglaterra en el siglo XIX
y que llegó a nuestro país a principios del siglo XX, nació para atender las
necesidades de los obreros industriales que así podían adquirir la necesaria
especialización, sin dejar por ello su puesto de trabajo.
Hasta hace poco, la única alternativa que tenían los alumnos que, por
razones laborales o físicas, no podían completar su formación en un centro
presencial tradicional era la enseñanza a distancia. Ésta, además de cara en
muchas ocasiones, era por lo general poco atractiva, pues se confiaba en que el
alumno, en casa, con el apoyo lejano de un tutor, siguiera el curso contenido
en un manual impreso, complementado, en el mejor de los casos, con algunas
cintas de casette o de video.
La actual revolución tecnológica, y en particular Internet, han venido a renovar en profundidad el actual panorama de la educación a distancia, añadiendo la interactividad y rapidez que las nuevas tecnologías de la información
(NTI) aportan.
Son varios los términos acuñados para definir el nuevo tipo de enseñanza
que así surge: educación virtual, enseñanza virtual, teleformación, etc. Pero
al final todos vienen a referirse a lo mismo: la posibilidad de acceder a una
amplia oferta formativa, sin que el tiempo o el espacio sean ya una barrera.
14
CAPÍTULO 1. SOC. DE LA INFOR. Y GESTIÓN DEL CONOCIM.
El uso del término “redes” se ha generalizado y hoy en día sus peculiaridades y posibilidades se han convertido en tópicos, creyendo en su mayoría que
es un concepto revolucionario, sin caer en la cuenta de que las redes siempre
han existido y han constituido elemento indispensable para las comunicaciones. [30]
No es de extrañar que las redes tecnológicas basadas en las telecomunicaciones hayan encontrado oportunidades importantes en la instrucción. Nuevos
“lugares” comienzan a configurar el ámbito educativo: campus en línea, clase
virtual... y con ellos la teleenseñanza ofrece sus posibilidades de interacción
entre estudiante y profesor.
La teleenseñanza es el resultado de “la aplicación de la tecnología audiovisual y telemática en la enseñanza a distancia”. Por lo tanto, en primer
lugar, la teleenseñanza se puede definir como un modo peculiar de educación
a distancia que se aleja considerablemente de la concepción tradicional de este término, principalmente en todo lo que supone ofrecer un nuevo tipo de
educación transmitida a través de nuevas redes de comunicación, soportadas
por canales artificiales imprescindibles para que se pueda producir la comunicación en el proceso de enseñanza - aprendizaje de esta modalidad educativa;
de ahí que se esté presenciando el desarrollo de una nueva tecnología de la
comunicación y de la información.
Se entiende por teleeducación al desarrollo del proceso de formación a distancia (reglada o no reglada), basado en el uso de las TICs, que posibilitan
la realización de un aprendizaje interactivo, flexible y accesible a cualquier
receptor potencial.
De esta manera, el aprendizaje a distancia modifica el ritmo, la frecuencia, las coordenadas espacio-temporales... favoreciendo una educación más
individual y flexible. [28]
Es conveniente indicar que clase convencional y clase virtual, enseñanza
presencial y teleenseñanza, son modalidades de enseñanza distintas, con objetivos, metodología, coordenadas espacio-temporales que difieren; por lo tanto,
la comparación entre ellas es, cuanto menos, irrelevante. Sin embargo, sí debemos reconocer las ventajas, carencias, problemas de uno y otro, llegando a
cotejar sus cualidades en forma de enseñanzas distintas ya que de lo contrario
estaremos perpetuando el sistema tradicional de las aulas convencionales.
1.4. EDUCACIÓN A DISTANCIA
1.4.1
15
El Papel de la Educación
La escuela, uno de los principales agentes educativos, también está envuelta
en todo este maremagnum que caracteriza la sociedad de la información. Por
ello, debe atender a las demandas sociales que desde distintos ámbitos se realizan. Una de estas demandas es la educación multimedia, entendiendo como
educación multimedia aquella que facilita el uso de las nuevas tecnologías a los
alumnos, lo que les permite conseguir las destrezas y actitudes necesarias para
comunicarse (interpretar y producir mensajes) utilizando distintos lenguajes y
medios.
Por lo tanto, una de las tareas de la escuela es la alfabetización tecnológica
integral porque sólo así podremos llegar a hablar de una cultura tecnológica
como una parte real de la cultura social. Esta cultura se caracterizaría por la
participación del pueblo y la sociedad en su evolución y desarrollo, seleccionando las alternativas más enriquecedoras que palíen el determinismo tecnológico.
Es decir, que la toma de decisiones sólo sean emprendidas por especialistas que
guíen según sus intereses el cambio dentro de las mismas.
Otra de las transformaciones que está sufriendo la escuela recae en la actitud que los profesores tienen ante la inclusión de las nuevas tecnologías en el
aula. Se pueden diferenciar dos actitudes:
• Pragmática, que se caracteriza por la utilización y aceptación de las
nuevas tecnologías sin cuestionarlas.
• Crítica, que acepta las nuevas tecnologías y es consciente de lo que implica comprometiéndose en el análisis de la bondad y conveniencia de los
medios para la sociedad procurando no caer en descalificaciones gratuitas que no conllevarían más que a estancamientos, a posiciones vacías y
a anular espacio de comunicación y consenso.
Se considerada más conveniente la segunda postura, ya que sólo desde
esta perspectiva se puede llegar a que realmente la inclusión de las nuevas
tecnologías en la escuela sirva para contribuir a un ennriquecimiento cultural,
aportando “nuestro granito de arena” que junto con otros más nos lleve de
una sociedad de la información a una sociedad del conocimiento.
16
1.4.2
CAPÍTULO 1. SOC. DE LA INFOR. Y GESTIÓN DEL CONOCIM.
Tendencias en la Educación
La educación dentro de veinte años será tridimensional, virtual y metafísica, ya que los alumnos explorarán todos los conocimientos posibles en vivo,
interactuando con moléculas, átomos, galaxias y universos paralelos a través
de entornos simulados que les permitirán ver, oír, oler y tocar los objetos virtuales. Estos sistemas educativos estimularán aún más la curiosidad científica
e impulsarán el avance del conocimiento humano.
Este desarrollo tecnológico aplicado a la educación, demandará la unión
de diferentes disciplinas académicas y educativas para desarrollar los contenidos del nuevo mundo que se abre a la educación basada en las presentes
e inmediatas tecnologías, en cuyo diseño los profesionales deberán también
implicarse.
Estas tecnologías aplicadas a la educación permitirán individualizar la formación hasta extremos hoy inconcebibles, al mismo tiempo que integrarán la
dimensión sensorial del conocimiento como nunca hasta ahora se ha conseguido
con los sistemas de enseñanza más avanzados.
Otra de las ventajas es que el conocimiento se convertirá en algo irresistible por la forma en que se accede a sus contenidos, al mismo tiempo que
el nuevo sistema será una fuente inagotable de excitación de la curiosidad, lo
que en teoría arrasaría con la indiferencia que hoy atrapa a generaciones de
estudiantes, desmotivados por un sistema educativo rígido y frío.
Las tecnologías que cambiarán la información y la comunicación en el sistema educativo son el sistema de visualización autoesteroscópico, el sonido en
3D, la realidad virtual y la correspondiente maquinaria, móvil o fija, que conserva y potencia la información del sistema con acceso simultáneo de todos los
agentes implicados en la educación y a los más adecuados bancos de datos.
Los mundos virtuales permiten además experiencias en equipo para solucionar problemas complejos de la vida real.
El encuentro virtual tiene además la ventaja añadida que permite reunir
en el ciberespacio a estudiantes de procedencias geográficas diferentes, lo que
abre la puerta a colaboraciones mucho más intensas que en la actualidad entre
universidades y escuelas de diferentes continentes y culturas, unidas entre sí
por sistemas de banda ancha mucho más potentes que los que hoy se aplican
a la enseñanza.
1.4. EDUCACIÓN A DISTANCIA
1.4.3
17
Ventajas de la Enseñanza Virtual
Para el alumno:
• Se siente personalizado en el trato con el profesor y sus compañeros.
• Puede adaptar el estudio a su horario personal.
• Puede realizar sus participaciones de forma meditada gracias a la posibilidad de trabajar off-line.
• Podrá seguir el ritmo de trabajo marcado por el profesor y por sus compañeros de curso.
• El alumno tendrá un papel activo, que no se limita a recibir información
sino que forma parte de su propia formación.
• Todos los alumnos tienen acceso a la enseñanza, no viéndose perjudicados
aquellos que no pueden acudir periódicamente a clase por motivos como
el trabajo, la distancia, etc.
• Se beneficia de las ventajas de los distintos métodos de enseñanza y medios didácticos tradicionales, evitando los inconvenientes de los mismos.
Para la Universidad:
• Permite a la universidad ofertar formación a las empresas sin los añadidos
que suponen los desplazamientos, alojamientos y viáticos de sus trabajadores.
• Permite a la universidad ampliar su oferta de formación a aquellas personas o trabajadores que no pueden acceder a los cursos presenciales.
• Permite superar la calidad de los cursos presenciales.
• Aumenta la efectividad de los presupuestos destinados a la educación.
• Responsabilidad del sistema educativo: los gobiernos no sólo esperan
que las instituciones educativas mejoren su relación coste-eficacia, sino
que también esperan que éstas justifiquen el uso que hacen del dinero
público.
18
CAPÍTULO 1. SOC. DE LA INFOR. Y GESTIÓN DEL CONOCIM.
Es necesario mencionar que educación a distancia y aprendizaje electrónico son conceptos similares, la educación a distancia como la palabra lo dice
es a distancia, permitiendo a personas que viven en lugares alejados, que no
pueden asistir a un centro de educación, autoinstruirse, capacitarse, formarse
como personas, realizar cursos de interés sin tener que estar presente físicamente en un aula ubicada en una determinada zona geográfica, contando con
un aula virtual, con personas (profesores) que están conectados en tiempo
real, otorgando los mismos la facilidad a los alumnos conectados de realizar
preguntas, dudas o inconvenientes que se presenten el momento, esto también
constituye aprendizaje electrónico pero la diferencia radica en que este último
puede realizarse en forma local como también a distancia.
Se puede decir que la enseñanza virtual es el reto que plantea la sociedad
a las instituciones educativas para ampliar la enseñanza a toda la sociedad,
para incrementar sus contenidos, para expandir el trabajo en equipo, en suma,
para incrementar la calidad a todos los niveles y hacer posible una sociedad
más abierta orientada hacia el aprendizaje, hacia el conocimiento.
Capítulo 2
Introducción a DB2
2.1
Grandes Ventajas del DB2 Univ. Database (UDB)
Las mayores ventajas del DB2 se pueden resumir como sigue:
Fácil y simple
Muchos expertos de la industria y usuarios han elogiado las nuevas herramientas que IBM desarrolló para facilitar la administración y uso del DB2
Universal Database. Utiliza una interfase gráfica, estilo browser, para acceder
y manejar objetos de la base de datos. Incluye smart.guides que facilitan la
tarea de configuración, guiándolo paso a paso para lograr un rendimiento óp19
20
CAPÍTULO 2. INTRODUCCIÓN A DB2
timo de la base de datos y para asistir al usuario en la creación de teclas con
plantillas predefinidas. Las herramientas mencionadas, más otras incluidas en
DB2 Universal Database, están listas para ser integradas a Tivoli.
Aplicaciones existentes
Más del 70% de las empresas top del mundo confían en DB2 Universal Database para manejar aplicaciones críticas. Si se trata de una de ellas, se puede
aprovechar el conocimiento existente para poner en funcionamiento todas estas
aplicaciones de negocios:
• On-line Transaction Processing (OLTP) [6] [5] [13].
• Data Warehousing [15] [19].
• Decision Support [18] [8].
• Data Mining [25] [26].
Si se está evaluando DB2 Universal Database por primera vez, se debe considerar los beneficios a corto y largo plazo al utilizar un código base unificado
para todas sus aplicaciones, y para todas sus plataformas, desde laptops hasta
sistemas de procesamiento paralelo.
Además, se dispone de numerosas aplicaciones desarrolladas a nivel mundial, entre ellas las de SAP, People Soft. y Baan.
Herramientas de replicación
La replicación de datos es la tecnología clave para aprovechar todo el poder
de los ambientes distribuidos ya que le permite enviar los datos a cualquier sitio
para cubrir todos los requerimientos de su empresa; desde oficinas centrales a
sucursales, usuarios móviles, proveedores, clientes y socios de negocios.
DB2 Universal Database incluye todo lo necesario para implementar una
solución de replicación de datos en cualquier tipo de ambiente distribuido o
heterogéneo.
Soporte OLAP
DB2 Universal Database ofrece nuevas capacidades para ayudar a realizar
análisis multidimensional y procesamiento analítico en línea (OLAP). Incluye
funciones de ROLLUP, CUBE y grouping sets. Soporta STAR JOINS. Estas
2.1. GRANDES VENTAJAS DEL DB2 UNIV. DATABASE (UDB)
21
facilidades son utilizadas normalmente en todas las aplicaciones de Business
Intelligence (BI).
Lista para Internet
Gracias a su alcance global y bajo costo, Internet puede ser una solución de
negocios muy poderosa. Si se quiere realmente aprovechar las oportunidades
de negocios utilizando la Web, se debe considerar la mejor manera de llegar a
un mercado que está esperando 1as 24 horas de los 7 días de la semana. La base
de datos que se seleccione debe estar preparada para brindar acceso rápido y
alta disponibilidad a información que requiere actualización constante. DB2
Universal Database provee la capacidad de hacer backups en línea, evitando
interrupciones en la disponibilidad del sistema. Permite realizar operaciones
comerciales garantizando un alto nivel de seguridad y confiabilidad.
DB2 cumple con todos estos requerimientos y mucho más:
• Soporta el paradigma de network-computing utilizando Java y JDBC.
• Permite el acceso a DB2 Universal Database desde una amplia variedad
de plataformas de clientes, utilizando JDBC vía Java applets desde cualquier Web Browser. Adicionalmente, se puede desarrollar una aplicación
Fen Java y acceder a DB2 utilizando directamente JDBC. También permite codificar stored procedures en Java.
• Brinda excelente nivel de seguridad.
• Brinda servicios de autenticación y autorización que pueden ser fácilmente integrados a servicios de redes y sistemas operativos.
• Net.Data brinda acceso a los datos corporativos desde la Web.
• Ofrece un alto nivel de performance y escalabilidad en el acceso de datos
residentes en DB2 Universal Database, incorporando multimedia.
Multimedia, una ventaja a tener en cuenta
DB2 Universal Database incluye la capacidad nativa de almacenar variados
tipos de datos: alfanuméricos, video, imagen, audio y los que se defina. La escalabilidad de DB2 Universal Database permite el almacenamiento de grandes
volúmenes de datos aprovechando al máximo la capacidad de las plataformas
22
CAPÍTULO 2. INTRODUCCIÓN A DB2
soportadas. Estas facilidades ayudarán a minimizar los costos y tiempos relacionados con el manejo usual de la documentación que fluye en la empresa.
DB2 Universal Database permite realizar búsquedas sofisticadas e inteligentes
en cualquier documento utilizando innumerables criterios.
Además, permite que el usuario defina funciones -llamadas UDFs- y tipos
de datos propios -llamados UDTs-. Estos facilitan enormemente la tarea de
administración de datos por parte de los desarrolladores, asegurando la consistencia de los mismos y minimizando los errores por operaciones inválidas.
Formida Software Corp. ha desarrollado una solución para la industria de
la salud, que incluye las capacidades multimedia de DB2 Universal Database. La aplicación maneja datos complejos, tales como: imágenes de rayos X,
gráficos, video, mapas para la localización de médicos y hospitales, además de
archivos de historias clínicas e información de seguros.
2.2
Características del DB2 Universal DataBase
DB2 Universal Database es una base de datos universal. Es completamente
escalable, veloz y confiable. Ejecuta en modo nativo en casi todas las plataformas, como Windows NT, Sun Solaris, HP-UX, AIX u OS/2.
Características y funciones
DB2 UDB es el producto principal de la estrategia de Data Management
de IBM.
DB2 UDB es un sistema para administración de bases de datos relacionales (RDBMS) multiplataforma, especialmente diseñada para ambientes distribuidos, que permite que los usuarios locales compartan información con los
recursos centrales.
Integridad
DB2 UDB incluye características de integridad, asegurando la protección
de sus datos aún en caso de que los sistemas sufran un colapso; y de seguridad,
permitiendo realizar respaldos en línea con distintos grados de granularidad,
sin que esto afecte la disponibilidad de acceso a los datos por parte de los
usuarios.
Múltiples usos
2.3. FUNCIONES COMPLEMENTARIAS
23
Provee la capacidad de hacer frente a múltiples necesidades, desde procesamiento transaccional de misión crítica (OLTP), hasta análisis exhaustivo de
los datos para el soporte a la toma de decisiones (OLAP).
Escalabilidad
Sus características distintivas de escalabilidad le permiten almacenar información en un amplio rango de equipos, desde una PC portátil hasta un
complejo ambiente de mainframes procesando en paralelo.
Web enabled para E-business
Incluye tecnología basada en Web que permite generar aplicaciones en los
Intranets y responder a las oportunidades de negocios disponibles en Internet.
Además, DB2 UDB provee soporte a Java (ver Figura 2.1 de la pág. 24).
Facilidad de instalación y uso
La primera versión de DB2 para NT fue reconocida en el mercado como
una base de datos muy poderosa, pero difícil de instalar y usar. En las últimas
versiones IBM agregó muchas herramientas gráficas para facilitar el uso tanto
de usuarios, como administradores y desarrolladores. Incluye guías para operaciones como instalación, configuración de performance, setup, etc. Además,
se agregaron herramientas para facilitar las tareas de integración con otras
bases de datos, tecnologías de networking y desarrollo de aplicaciones.
Universalidad
DB2 UDB es, además, la única base de datos realmente universal: es
multiplataforma (16 plataformas - 10 no IBM), brinda soporte a un amplio
rango de clientes, soporta el acceso de los datos desde Internet y permite
almacenar todo tipo de datos incluyendo texto, audio, imágenes y video o
cualquier otro definido por el usuario.
2.3
Funciones Complementarias
Conectividad
Las herramientas de conectividad permiten acceder a los datos más allá de
donde ellos se encuentren. El slogan “cualquier cliente, a cualquier servidor,
en cualquier red” está completamente sustentado por la funcionalidad que sus
24
CAPÍTULO 2. INTRODUCCIÓN A DB2
Figura 2.1: Almacenamiento de documentos XML en DB2.
herramientas ofrecen. EL DB2 Connect permiten acceder a los datos de DB2
en mainframe o AS/400, desde Windows NT, Windows 95 / 98, OS / 2 o
cualquiera de los Unix soportados. Además, el producto Datajoiner posibilita
acceder de forma única y transparente a los datos residentes en Oracle, Sybase,
Informix, Microsoft SQL Server, IMS, VSAM y otros.
Data Warehousing
DB2 UDB provee la infraestructura necesaria para soportar el proceso de
toma de decisiones en cualquier tamaño y tipo de organización. Es el producto
dirigido a resolver la problemática a nivel departamental (Data Marts), ya
que un único producto provee la capacidad para acceder a datos en Oracle,
Sybase, Informix, Microsoft SQL Server, VSAM o IMS, además de la familia
DB2. Permite de forma totalmente gráfica acceder, transformar y distribuir
los datos automáticamente y sin programar una línea de código (ver Figura
2.2 de la pág. 25).
Data Mining
DB2 UDB posibilita el análisis orientado al descubrimiento de información escondida en los datos, realizando modelización predictiva, segmentación
2.3. FUNCIONES COMPLEMENTARIAS
25
Figura 2.2: Esquema conceptual de los almacenes de datos.
de la base de datos, análisis de vínculos, o detección de desviaciones. Incluye las siguientes técnicas: clustering (segmentación), clasificación, predicción,
descubrimiento asociativo, descubrimiento secuencial de patrones y secuencias
temporales. Todas las técnicas mencionadas permiten realizar segmentación
de clientes, detección de fraudes, retención de clientes, ventas cruzadas, etc.
Partición Simple sobre un Único Procesador
Este entorno se basa en memoria y disco, conteniendo una única CPU.
Este ambiente se ha denominado de diversas maneras: base de datos aislada
(standalone database), base de datos cliente/servidor (client / server database), base de datos serial (serial database), sistema uniprocesador (uniprocessor
system), y entorno nodo simple / no paralelo (single node / non parallel).
La Base de Datos en este ambiente sirve para cubrir todas las necesidades de un departamento o de una pequeña oficina de una empresa donde los
datos y los recursos del sistema (incluyendo un único procesador o CPU) son
administrados por un único administrador de la base.
Capacidad y Escalabilidad
26
CAPÍTULO 2. INTRODUCCIÓN A DB2
A este ambiente se le pueden agregar mas discos. Al tener uno o más
servidores de entrada/salida para mas de un disco permite que más de una
operación de entrada/salida osurra al mismo tiempo.
Un sistema de procesador único está limitado por la cantidad de espacio
en disco que pueda manejar dicho procesador. Sin embargo, como la carga de
trabajo aumenta, una sola CPU puede llegar a ser insuficiente para satisfacer
las peticiones solicitadas por los usuarios, aún sin importar cuántos discos y /
o memoria adicional hayan sido agregados.
Si se ha alcanzado la máxima capacidad y / o escalibilidad, se podría considerar cambiarse a un sistema con partición única con múltiples procesadores.
2.4
2.4.1
Integridad Referencial
Restricciones
Las restricciones son reglas que el administrador de la base de datos establece.
Hay tres tipos de restricciones:
• Restricción Única. Es una regla que prohíbe que haya valores duplicados
en una o en más columnas en una tabla. La restricción de un único valor
y las claves primarias no son tomadas como restricciones. Por ejemplo:
una restricción única podría definirse para identificar a un proveedor, y
asegurarse de esta forma que no haya un mismo identificador para dos
proveedores.
• Restricción Referencial. Es una regla lógica sobre valores en una o en
más columnas, en una o más tablas. Por ejemplo, un conjunto de tablas que comparten información sobre los proveedores de una empresa.
Ocasionalmente, el nombre de un proveedor podría cambiar. Este tipo
de restricciones permite que se actualicen ese grupo de tablas, permitiendo resultados que puedan ocasionar la pérdida de información del
proveedor.
• Una Tabla de Control de Restricciones : Es un grupo de restricciones
que se agregan a los datos de una tabla específica. Por ejemplo: Se
podría definir el sueldo de un empleado, tal que nunca deba ser menor
a $200. Estos tipos de integridad referencial pueden ser activados o no.
2.4. INTEGRIDAD REFERENCIAL
2.4.2
27
Restricciones Preferenciales
La integridad referencial es el estado en el que todas las claves foráneas
de una base de datos deben ser válidas. Una clave foránea es una columna o
un grupo de columnas en una tabla cuyos valores son necesarios para poder
referenciar a una clave primaria o un único valor de una fila de la tabla de la
cual se desprende. La restricción referencial es la regla que permite que una
clave foránea sea válida solamente si:
• Ellas se aparecen como valores de una clave de la tabla maestra, o
• Algún componente de la clave foránea es nulo.
La tabla que contiene la clave maestra, se define como Tabla Padre de
la integridad referencial, y la tabla que contiene la clave foránea se llama
dependiente. Esta restricción referencial es opcional y puede definirse con el
comando CREATE TABLE y ALTER TABLE.
Esta restricción es forzada por el Administrador de la base de datos durante la ejecución de los comandos INSERT, DELETE, ALTER TABLE ADD
CONSTRAIST y SET CONSTRAITS. Esto es puesto en práctica eficazmente
al realizar la declaración.
Nota: La integridad referencial, las restricciones de control y los triggers
pueden combinarse durante la ejecución.
Conceptos
Clave maestra: Es la clave principal o clave única de una restricción preferencial.
Fila maestra: Es la fila que tiene al menos una fila dependiente.
Tabla maestra o padre: La tabla que es Padre en por lo menos una restricción referencial. Esta tabla puede ser definida como Padre en un número
arbitrario de restricciones referenciales. Una tabla Padre puede ser también
una tabla dependiente.
Tabla dependiente: Es aquella tabla que depende de al menos una restricción referencial. Una tabla dependiente puede ser también una tabla Padre.
Tabla descendente: Una tabla es descendente de una tabla T, si ésta es
dependiente de T.
28
CAPÍTULO 2. INTRODUCCIÓN A DB2
Fila descendente: Una fila es descendente de una fila F, si ésta es dependiente de F.
Ciclo referencial: Es un conjunto de restricciones referenciales, tal que
cada tabla es descendente de sí misma.
Fila auto-referenciada: Es la fila que es Padre de ella misma.
Tabla auto-referenciada: Es la tabla que es padre y dependiente en la
misma restricción referencial.
Rule-insert (Regla de inserción): La regla de inserción en una restricción
referencial significa que al colocar un valor no nulo como clave foránea, éste
debe coincidir con algún valor de la clave Padre en la tabla de la cual ésta
depende. El valor en una clave foránea es nulo si algún componente es nulo.
Esta regla está implícita cuando se especificó la clave foránea.
Update rule (Regla de actualización): La regla de actualización de una
restricción referencial se especifica al definir dicha restricción. Las opciones
son NO ACTION y RESTRICT. Las reglas de actualización se aplican cuando
una fila de la tabla Padre o una fila de la tabla dependiente se actualiza.
Si alguna fila en la tabla dependiente concuerda con el original de la clave,
esta actualización se rechaza cuando la regla de actualización está en RESTRICT.
Si alguna fila en la tabla dependiente no tiene su correspondiente clave
Padre cuando el comando de actualización se completó, esta actualización se
rechaza si la regla se encuentra en NO ACTION.
La regla de actualización está implícita cuando la clave foránea se especifica como NO ACTION significa que un valor no nulo que se actualice, debe
corresponder a algún valor de la clave padre o de la tabla padre, cuando el
comando de actualización se ejecuta.
Delete rule (Regla de eliminación): Esta regla se específica cuando la restricción referencial se define.
Las opciones son NO ACTION, RESTRICT, CASCADE, or SET NULL.
SET NULL puede especificarse solo si alguna columna de la clave foránea
admite valores nulos.
2.4. INTEGRIDAD REFERENCIAL
29
Esta regla se aplica cuando una fila de la tabla es eliminada. Más precisamente, cuando una fila de la tabla padre se intenta borrar y ésta tiene filas
dependientes en tablas dependientes.
Supongamos que P es la tabla padre, D sea la tabla dependiente, p sea la
fila padre que es objeto de eliminar y propagar así su eliminación a las filas
dependientes.
Si la regla de eliminación se determina como:
• RESTRICT or NO ACTION : ocurre un error y las filas no son eliminadas.
• CASCADE : La operación de eliminación se propaga de la fila dependiente p a D.
• SET NULL: Cada valor que es factible de anular en la columna correspondiente a la clave foránea de la tabla D es puesto como NULO.
Cada restricción referencial en el cual una tabla es padre, tiene sus propias
reglas de eliminación. Y todas las reglas de eliminación son utilizadas para
determinar el resultado de una operación de borrado.
De esta forma, una fila no puede eliminarse si tiene dependientes y se
restringe con RESTRICT o NO ACTION, o la eliminación en cascada de
cualquiera de sus dependientes con las reglas RESTRICT o NO ACTION.
Eliminar una fila de la tabla Padre P que involucra a otras tablas y puede
afectar a las filas de esas tablas se guía según el siguiente criterio:
Si la tabla D que es dependiente de P y la regla es RESTRICT o NO
ACTION, D está involucrada en la operación, pero no es afectado por la
operación.
Si la tabla D depende de P y la regla es SET NULL, D está involucrada
en la operación, y las filas D pueden actualizarse durante la operación.
Si la tabla D, es dependiente de P y la regla de eliminación se indica como
CASCADE, D está incluida en la operación y las filas de D pueden eliminarse
durante la misma.
Si las filas de D son eliminadas, la operación de eliminado en P se dice que
se extendió a D. Si D, también es una tabla Padre, las acciones descriptas en
30
CAPÍTULO 2. INTRODUCCIÓN A DB2
esta lista, a su vez, se aplican a los dependientes de D.
Cualquier tabla en la que se pueda involucrar una operación de eliminar
en P, se dice que está conectada para eliminar a P. Así, una tabla se dice que
está conectada para eliminar a una tabla P, si ésta es dependiente de P o una
tabla dependiente que se encuentra con indicación de operaciones en cascada
de P.
2.5
Tabla de Restricciones
Existen tres tipos de restricciones:
Una restricción única o unique constraint es un modelo que excluye valores duplicados en una o más columnas dentro de una tabla. Unique y clave
primaria son los soportes de singular constraints. Por ejemplo, un singular
constraint puede ser definido sobre el identificador proveedor (supplier identifier ) dentro de la tabla proveedora (supplier table) para garantizar que el
mismo identificador proveedor (supplier identifier ) no está siendo dado a dos
proveedores.
Una restricción referencial o referential constraint es una norma lógica
sobre los valores en una o más columnas y en una o más tablas. Por ejemplo, un conjunto de tablas comparten información sobre proveedores de una
corporación.
De vez en cuando, el nombre de un proveedor cambia. Una restricción
referencial (referential constraint) puede ser definida declarando que el ID del
proveedor en la tabla debe estar unido a un proveedor ID en la información
del proveedor. Este constraint previene de inserciones, modificaciones o eliminaciones que permitan de otra manera resultar en pérdida de información de
proveedores (supplier information).
Una tabla de control de restricciones table check constraint establece restricciones en la inserción de datos a una tabla específica. Por ejemplo, se puede
definir el nivel de salario para un empleado que nunca debe ser menor que $
20.000, cuando el salario es agregado o modificado en la tabla que contiene la
información personal.
Referential y table check constraints pueden ser cambiados a on u off.
2.5. TABLA DE RESTRICCIONES
2.5.1
31
Restricción Única
Un unique constraint es la regla que permite que un solo valor de la clave sea
válido en una tabla.
Unique constraints es opcional y puede ser definida en el create table o alter
table usando la opción de clave primaria o la opción de unique. La columna
especificada en un unique constraint debe ser definida como no nula. El unique
index es usado por el administrador de base de datos para reforzar la unicidad
de la clave durante los cambios a la columna de la unique constraint.
La tabla puede tener números arbitrarios de restricción únicas, con más de
una restricción única definida como clave primaria. La tabla puede no tener
más que una restricción única en el mismo set de columnas.
La restricción única que es referenciada como una clave foránea de una
referential constraint es llamada como clave pariente.
Cuando una restricción única es definida en la opción create table, un
unique index es automáticamente creado por el administrador de base de datos
y designado como primary o unique system-required index.
Cuando la restricción única es definida en el opción alter table y un indexado existe en la misma columna, ese indexado es designado como unique and
system-requied. Si tal indexado no existe, el unique index es automáticamente
creado por el administrador de base da datos y designado como primary or
unique system-required index.
Se debe notar que existe una diferencia entre definir una restricción única
y crear un único índice.
2.5.2
Tabla de Control de Restricciones (Table Check Constraints)
Una Table check constraints es una norma que especifica el valor permitido en
una o más columnas de cada fila de una tabla. Son opcionales y pueden ser
definidas usando la sentencia SQL create table y alter table. La especificación
de table check constraints es un formulario de restricciones de una condición
de búsqueda. Una de las restricciones es que el nombre de la columna en la
table check constraint de la tabla T debe identificar a la columna de T.
32
CAPÍTULO 2. INTRODUCCIÓN A DB2
La tabla puede tener un número arbitrario de table check constraints. Son
forzadas cuando:
• Una fila se agrega dentro de la tabla.
• Una fila de la tabla se modifica.
La table check constraint se ve obligada por la aplicación a condiciones de
búsqueda para cada fila que es agregada o modificada. Un error ocurrirá si el
resultado de la condición de búsqueda es falso para alguna fila.
Cuando una o más table check constraints son definidas con el comando
ALTER TABLE para una tabla con datos existentes, los datos existentes son
verificados nuevamente por la nueva condición antes que alter table suceda.
La tabla se puede poner en estado de verificación pendiente, el que permitirá
ingresar datos sin verificarlos. El set constraint es usado para poner la tabla
dentro del estado pendiente de verificación. Esto también se usa para abreviar
la verificación de cada fila de la restricción nuevamente.
2.5.3
Funciones Incorporadas
Hay numerosas nuevas funciones incorporadas en el UDB de DB2. Esta sección
mostrara sólo unos pequeños ejemplos de las funciones que están disponibles
para ser usadas.
Funciones Aritméticas
Hay abundantes nuevas funciones en DB2 UDB. Las siguientes sentencias SQL
demuestran muchas de las nuevas funciones matemáticas que están disponibles
para el usuario:
VALUES
(’SQRT(2) ’,SQRT(2)),
(’EXP(2) ’,EXP(2)),
(’SIN(.5) ’,SIN(.5)),
(’COS(.5) ’,COS(.5)),
2.5. TABLA DE RESTRICCIONES
33
(’TAN(1) ’,TAN(1)),
(’LOG(57) ’,LOG(57)),
(’ATAN(0) ’,ATAN(0)),
(’RAND() ’,RAND()),
(’CEIL(4.3) ’,CEIL(4.3)),
(’FLOOR(3.6)’,FLOOR(3.6)),
(’QUARTER() ’,QUARTER(CURRENT DATE)),
(’WEEK() ’,WEEK(CURRENT DATE))
Funciones de Texto
Existen algunas funciones más que manejan texto. Se debe notar que éstos
son algunos ejemplos de las funciones que están disponibles:
VALUES
(’REPEAT(”*”,5) ’,REPEAT(’*’,5)),
(’LTRIM(” *”) ’,LTRIM(’ *’)),
(’LCASE(”ABCDEF”) ’,LCASE(’ABCDEF’)),
(’REPLACE(”x1x1x”,”1”,”2”) ’,REPLACE(’x1x1x’,’1’,’2’)),
(’MONTHNAME(CURRENT DATE),MONTHNAME (CURRENT DATE
(’DAYNAME(CURRENT DATE) ’,DAYNAME(CURRENT DATE))
Funciones Soundex
Las funciones soundex toman como un argumento un string de caracteres o
retornan un valor de 4-bytes que representan el sonido del string. Por supuesto,
esta función es altamente dependiente del idioma inglés, por lo tanto puede
no ser necesariamente el retorno correcto en otro idioma. Sin embargo, una
función como esta es muy utilizada cuando se está intentando encontrar un
34
CAPÍTULO 2. INTRODUCCIÓN A DB2
valor que suene como algo. El siguiente ejemplo lista todos los empleados de
la compañía que tengan nombres que suenen similares:
SELECT A.LASTNAME, B.LASTNAME
FROM EMPLOYEE A, EMPLOYEE B
WHERE SOUNDEX(A.LASTNAME) = SOUNDEX(B.LASTNAME)
AND A.LASTNAME <> B.LASTNAME
Funciones Soundex (2◦ ejemplo)
En este ejemplo de soundex, se está buscando gente de la compañía que tengan
un apellido que suene parecido a SMITH:
SELECT LASTNAME FROM EMPLOYEE
WHERE SOUNDEX(LASTNAME) = SOUNDEX(’SMITH’)
2.6
Funciones Definidas por el Usuario
Las funciones definidas por el usuario son extensiones a lo que ya está creado
en las funciones del lenguaje SQL (ver Figura 2.3 de la pág. 35). Las funciones
creadas por el usuario pueden ser:
• Función escalar, la cual devuelve un valor cada vez que se la invoca.
• Función columna, donde se pasa un conjunto de valores y devuelve un
valor único para el conjunto.
• Función tabla, que devuelve una tabla.
Una función definida por el usuario del tipo escalar o en columna registrada
en la base de datos puede ser referenciada en el mismo contexto que cualquier
función predefinida.
Una función definida por el usuario del tipo de tabla registrada en la base
de datos puede ser referenciada sólo en el FROM de la cláusula SELECT.
2.6. FUNCIONES DEFINIDAS POR EL USUARIO
35
Figura 2.3: Funciones definidas por el usuario.
Una función definida por el usuario se invoca con su nombre, seguido de
los argumentos entre paréntesis (si los hay).
Los argumentos de la función deben corresponder en número y posición
con los parámetros especificados en la función definida por el usuario como
fueron registrados en la base de datos. En resumen, los argumentos deben ser
del tipo de datos correspondientes a los parámetros definidos.
El resultado de la función es, como en la cláusula RETURN, especificado
cuando la función definida por el usuario fue registrada. La cláusula RETURN
determina si una función es del tipo tabla o no.
Si la cláusula NOT NULL CALL fue especificada (o está por defecto)
cuando la función fue registrada, y si algún argumento es nulo, entonces el
resultado es nulo. Para las funciones del tipo tabla, esto significa el retorno
de una tabla sin registros (tabla vacía).
Ejemplos:
Se supone que una función escalar llamada ADDRESS fue escrita para
extraer la dirección de un formato de script. La función ADDRESS recibe
36
CAPÍTULO 2. INTRODUCCIÓN A DB2
Figura 2.4: Ejemplo de código definido por el usuario.
un argumento CLOB y devuelve un VARCHAR(4000). El siguiente ejemplo
muestra la llamada a la función ADDRESS:
SELECT EMPNO, ADDRESS(RESUME) FROM EMP_RESUME
WHERE RESUME_FORMAT = ’SCRIPT’
Se supone que tenemos una tabla T2 con una columna numérica A y la
función ADDRESS del ejemplo anterior. El siguiente ejemplo demuestra la
intención de invocar a la función ADDRESS con un argumento incorrecto:
SELECT ADDRESS(A) FROM T2
Un error (SQLSTATE 42884) aparece porque no hay una función con el
mismo nombre y con un parámetro correcto desde el argumento.
Se supone que una función del tipo tabla WHO fue escrita para devolver
información sobre las sesiones en la máquina del servidor que estaban activas
en el momento de la ejecución. El siguiente ejemplo muestra la llamada de
WHO en una cláusula FROM :
SELECT ID, START_DATE, ORIG_MACHINE
2.7. FUNCIONES DE TABLAS
37
FROM TABLE( WHO() ) AS QQ
WHERE START_DATE LIKE ’MAY%’
Los nombres de columna de la tabla WHO están definidos en el estado de
CREAR FUNCION.
2.7
Funciones de Tablas
Una función de tabla es una UDF externa. Una función de tabla referenciada
es sólo válida en una cláusula FROM de un SELECT ; usando la función de
tabla de funciones, se observa lo siguiente:
Aun cuando una función de tabla entrega una tabla, la interfase física entre
el DB2 y la UDF es one-row-at-a-time (una fila a la vez). Hay tres tipos de
formas de llamar una función de tabla: OPEN, FETCH y CLOSE. El mismo
mecanismo call-type que puede ser usado para funciones escalares es usado
para distinguir estos llamados.
La interfase estándar usada entre DB2 y las funciones escalares definidas
por usuarios se extiende hasta acomodarse en la tabla de funciones. El SQLresult se repite por función de tabla, en cualquier instancia correspondiendo
a una columna que puede ser retornada con lo que se define una cláusula
RETURNS TABLE de la CREATE FUNCTION. El argumento SQL-resultind asimismo se repite; cualquiera de las instancias relatadas se corresponden
con la instancia SQL-result.
CREATE FUNCTION para una función de tabla tiene una CARDINALITY n especifica. Esta especificación se define para informar al optimizador
del DB2 del tamaño aproximado del resultado de modo que el optimizador
pueda tomar mejores decisiones cuando la función es referenciada.
2.8
2.8.1
Anidar o Establecer Tablas de Expresión
Tablas de Expresión
Una tabla de expresión crea una tabla de resultados temporales desde una
simple consulta.
38
CAPÍTULO 2. INTRODUCCIÓN A DB2
Por ejemplo, una tabla de expresión podría ser una consulta que selecciona
a todos los directores de los departamentos críticos y otras especificaciones,
como aquellos que tienen más de 15 años de experiencia y trabajan en las
oficinas de la sucursal New York.
2.8.2
Tablas de Expresión Común
Una tabla de estas características se relaciona con querer tener una vista temporal dentro de una consulta compleja y puede ser referenciada en otros lugares
dentro de la misma consulta.
Cualquier uso de una tabla específica de expresión común dentro de una
consulta compleja comparte la misma vista temporal.
El uso recursivo de la tabla de expresión común dentro de una consulta
pueden ser utilizado para soportar aplicaciones tales como conteo de materiales, sistemas de reservación aéreo y planeamiento de una red.
Usando la recursividad del nombre de una tabla de expresión común se
puede emplear la misma tabla de resultados en cualquier momento.
El aprovechamiento del uso y una mejor performance son equivalentes a
aquellas con tablas de expresión anidadas. La performance puede ser mejorada
por la reutilización del resultado del set de una tabla de expresión común
cuando las referencias múltiples son hechas dentro del fullselect.
Por ejemplo, en el seguimiento de consultas se utiliza el mismo resultado
de la tabla dos veces:
WITH DTSUM (WORKDEPT, AVGSAL) AS (
SELECT WORKDEPT, AVG(SALARY) FROM EMPLOYEE
WHERE EDLEVEL > :hv1
GROUP BY WORKDEPT
) D1,
SELECT D1.WORKDEPT, D1.AVGSAL, D2.WORKDEPT, D2.AVGSALDTSUM
D2
WHERE D1.AVGSAL > 1.1 * D2.AVGSAL;
2.8. ANIDAR O ESTABLECER TABLAS DE EXPRESIÓN
39
En esta consulta se lista un par de departamentos, donde los empleados
considerados en cualquier departamento han logrado algún mínimo nivel de
educación, y donde el salario promedio del primer departamento sea el 10%
mayor que el salario promedio del segundo departamento.
En cualquier ejecución de la consulta se puede especificar diferentes niveles
de educación mínimo. Para ejecutar cualquier resultado utilizando vistas, una
vista diferente podría haber sido creada para cualquier nivel de educación
requerida.
2.8.3
Outer Join
Es un tipo de consulta en donde aparecen todos los datos de las tablas aunque
no estén cumpliendo las condiciones de join. Es diferente del join convencional
o inner join pues aparecen las filas no macheadas con la otra tabla.
Existen 3 tipos de outer join:
Outer join izquierdo: incluyendo las filas de la tabla izquierda que no están
macheadas con valores de la tabla derecha. A éstas filas se les asigna el valor
nulo por la información perdida.
Outer join derecho: incluye filas de la tabla derecha que no estan macheadas con valores de la tabla izquierda. A estas filas se les asigna el valor nulo
por la información perdida.
Outer join completo: incluye ambas clases de filas.
El inner join puede lograrse como tablas cruzadas de producto (combinando cada fila de la tabla izquierda con todas las filas de la tabla derecha)
manteniendo solamente las filas donde la condición de join es verdadera.
La tabla resultante puede perder filas de una o ambas tablas utilizadas.
Outer joins incluye el inner join y preserva esas filas perdidas.
Los join pueden estar anidados dentro de otros joins. El orden generalmente va de izquierda a derecha, pero depende de las condiciones requeridas
por los joins.
Resultados de operaciones entre T1 y T2 :
El resultado de T1 INNER JOIN T2 consiste en los pares de filas donde
40
CAPÍTULO 2. INTRODUCCIÓN A DB2
la condición del join es verdadera.
El resultado de T1 LEFT OUTER JOIN T2 consiste en los pares de filas
donde la condición del join es verdadera y por cada fila sin par de T1, la
concatenación de esa fila con la fila nula de T2.
El resultado de T1 RIGHT OUTER JOIN T2 consiste en las filas pares
donde la condición del join es verdadera y, por cada fila sin par de T2, la
concatenación de esas filas con las filas nulas de T1.
El resultado de T1 FULL OUTER JOIN T2 consiste en las filas pares y
por cada fila sin par de T2, la concatenación de esas filas con las filas nulas de
T1, y por cada fila sin par de T1, la concatenación de esas filas con las filas
nulas de T2.
Todas las columnas de T1 y T2 permiten valores nulos.
2.9
Triggers en DB2
Triggers se define como un conjunto de acciones que se ejecutan o se disparan,
por ejemplo eliminar, insertar o actualizar una tabla.
Cuando este tipo de operación en SQL se ejecuta, consideramos que el
triggers está activado.
Los triggers pueden usarse en conjunto con restricciones referenciales o
restricciones de control para dar fuerza a las reglas de integridad de los datos.
También pueden usarse triggers para actualizar otras tablas, automáticamente pueden generarse valores, actualizar, insertar filas, e invocar funciones
que realicen tareas de control.
Los triggers son un mecanismo muy utilizado para enfatizar las reglas de
integridad definidas por el DBA (por ejemplo el sueldo no puede aumentarse
más de un 10%).
Usar triggers ubica a la lógica para enfatizar las reglas de negociación de
datos en una base de datos.
Esta lógica utilizada en todas las tablas implicará un fácil mantenimiento
posterior, y que no sea necesario cambiar los programas de aplicación cuando
se cambie la lógica de la misma.
2.9. TRIGGERS EN DB2
41
Los triggers son opcionales y se definen mediante la instrucción CREATE
TRIGGER.
Hay varios criterios que se deben de tener en cuenta al crear un trigger,
que se utilizará para determinar cuándo un trigger debe activarse.
En una tabla, se define la tabla que llamaremos objeto para la cual el
triggers se utilizará.
Al evento que se ejecutará se lo codifica en SQL, y éste modificará la tabla.
Las operaciones pueden ser:
• Borrar.
• Insertar.
• Actualizar.
El triggers activation time se define cuando el trigger debe ser activado.
En la declaración del trigger se deberá incluir cuáles serán las filas que
afectará. Cuáles de las tablas están siendo borradas, insertadas o actualizadas.
El trigger granularity define si las acciones que se ejecuten se realizarán
una vez para la declaración, o una vez para cada una de las filas para las cuales
se definió.
La acción del trigger consiste en una condición de búsqueda opcional y un
conjunto de declaraciones en SQL que se ejecutarán cada vez que el trigger se
active.
Las declaraciones de SQL sólo se ejecutarán si la condición de búsqueda es
verdadera.
Cuando el tiempo en que el trigger debe activarse es anterior al evento
mismo, la acción de activarlo debe incluir las declaraciones de selección de
las variables y las señales de condición de SQL. Cuando el tiempo en que
se debe activar el trigger es posterior al mismo evento, el activarlo puede
incluir declaraciones de selección, borrado, actualización, insertar o señales de
condición del SQL.
El activar un trigger puede referirse a un conjunto de valores que serán
afectados en ciertas filas de la tabla. Esto es posible a través del uso de
42
CAPÍTULO 2. INTRODUCCIÓN A DB2
Figura 2.5: Demostración de un triggers.
variables. Estas variables usan el nombre de las columnas de la tabla y con
un indicador que marca si se refiere a un viejo valor (antes de modificar) o un
nuevo valor (después de modificar) . El nuevo valor puede cambiarse utilizando
el comando SET transition variable antes de actualizar o modificar.
Otra forma de referenciarse a valores en un grupo de filas es utilizando
tablas transitorias que operan en forma similar a las variables.
Varios trigger pueden especificarse para una combinación de tablas, eventos
o tiempos en que deben activarse. El orden en que los triggers se ejecutarán
será el mismo en el que fueron creados. Por lo tanto, el trigger recientemente
creado será el último en activarse.
La activación de un trigger puede generar una cascada de triggers. Esto
sucede si el resultado de ejecutar algún trigger produce que se active otro o
incluso se active a sí mismo.
2.10. COMANDOS ADICIONALES DE SQL
2.10
43
Comandos Adicionales de SQL
Hay algunos comandos adicionales de SQL que hacen mucho más fácil la codificación. A continuación se muestra algunos ejemplos:
1. Case
Un Case ayuda para el caso en el que se tenga que cambiar valores en una
entrada o salida.
Se supone que se tiene una tabla con los tamaños de las remeras (S, M,
L) y quiere que se vean como Small, Medium, Large en la salida. Se lo puede
hacer usando el Case para cambiar el valor de salida. También se puede usar
el Case si se quisiera convertir valores (como Small) en S para un insert.
SELECT LASTNAME, SALARY,
CASE
WHEN SALARY <= 20000 THEN ‘Poor’
WHEN SALARY <= 25000 THEN ‘Fair’
WHEN SALARY <= 30000 THEN ‘Average’
WHEN SALARY <= 35000 THEN ‘Good’
WHEN SALARY <= 40000 THEN ‘Excellent’
ELSE ‘Outstanding’
END AS COMPENSATION_LEVEL
FROM EMPLOYEE
ORDER BY SALARY
2. Cláusula AS
La cláusula AS se usa cuando se asigna un nombre a un cálculo. Puede
ser usada para dar un nombre significativo a un cálculo en una columna de
SQL, pero también puede ser usada para evitar errores.
Para ordenar un cálculo, se necesitaba dar el número relativo de la columna
en la cláusula ORDER BY.
44
CAPÍTULO 2. INTRODUCCIÓN A DB2
Ejemplo:
SELECT SALARIO + COMISION FROM EMPLEADOS ORDER BY 1
Ahora se puede asignar un nombre a este cálculo y usar este nombre en el
ORDER BY:
SELECT SALARIO + COMISION AS PAGO FROM EMPLEADOS ORDER BY PAGO
2.11
Hardware Soportado por DB2
Entornos de hardware soportados por DB2 :
• Partición simple sobre un único procesador (uniprocesador ).
• Partición simple con múltiples procesadores (SMP: Single Partition with
Multiple Processors).
• Distintas configuraciones de partición múltiple :
— Particiones con un procesador (MPP: Múltiple Partitions with
one Processor ).
— Particiones con múltiples procesadores (cluster de SMPs).
— Particiones lógicas de base de datos, también conocidas como
Nodos Lógicos Múltiples (MLN: Multiple Logical Nodes ) en la
edición paralela de DB2 para la versión 1 de AIX.
A continuación, en cada ambiente de hardware, se describen las consideraciones respecto de la capacidad y escalabilidad :
• La Capacidad se refiere al número de usuarios y aplicaciones que acceden a la base de datos, la cual está en gran parte determinada por la
capacidad de memoria, agentes, locks, entradas-salidas y administración
del almacenamiento.
• La Escalabilidad se refiere a la habilidad que posee la base de datos de
expandirse y continuar exhibiendo las mismas características operacionales y tiempos de respuesta.
2.11. HARDWARE SOPORTADO POR DB2
2.11.1
45
Partición Simple Sobre un Único Procesador
Este entorno se basa en memoria y disco, conteniendo una única CPU. Este
ambiente ha sido denominado de diversas maneras :
• Base de datos aislada (standalone database).
• Base de datos cliente / servidor (client / server database).
• Base de datos serial (serial database).
• Sistema uniprocesador (uniprocessor system).
• Entorno nodo simple / no paralelo (single node / non-parallel ).
La base de datos en este ambiente sirve para cubrir todas las necesidades
de un departamento o de una pequeña oficina de una empresa donde los datos y los recursos del sistema (incluyendo un único procesador o CPU ) son
administrados por un único administrador de la base.
Capacidad y Escalabilidad
A este ambiente se le pueden agregar más discos. Al tener uno o más
servidores de entrada / salida para más de un disco permite que más de una
operación de entrada / salida ocurra al mismo tiempo.
Un sistema de procesador único está limitado por la cantidad de espacio
en disco que pueda manejar dicho procesador. Sin embargo, como la carga de
trabajo aumenta, una sola CPU puede llegar a ser insuficiente para satisfacer
las peticiones solicitadas por los usuarios, aun sin importar cuantos discos y /
o memoria adicional hayan sido agregados.
Si se ha alcanzado la máxima capacidad o escalabilidad, se podría considerar cambiar a un sistema de partición única con múltiples procesadores.
2.11.2
Partición Simple con Múltiples Procesadores
Este entorno se compone de varios procesadores de igual potencia dentro de
la misma máquina, llamándose a este ambiente Sistema Simétrico Multiprocesador (Symmetric Multi-Processor o SMP ). Los recursos tales como espacio
de disco y memoria son compartidos. En esta máquina se encuentran más
46
CAPÍTULO 2. INTRODUCCIÓN A DB2
discos y memoria en comparación a una base de datos de partición simple, en
el ambiente de procesador único.
Este entorno es de fácil administración, debido a que todo está ubicado en
una sola máquina y además los discos y memoria están compartidos.
Con varios procesadores disponibles, diferentes operaciones de la base de
datos pueden ser completadas significativamente más rápido que en bases de
datos asignadas a un solo procesador. DB2 también puede dividir el trabajo
de una consulta simple entre los procesadores disponibles para mejorar la
velocidad de procesamiento.
Otras operaciones de la base de datos, tales como el resguardo (backup)
y creación de índices sobre datos existentes pueden también aprovechar la
ventaja de trabajar con múltiples procesadores.
Capacidad y Escalabilidad
En este entorno se pueden agregar más procesadores. Sin embargo, es posible que los distintos procesadores traten de acceder al mismo dato al mismo
tiempo, lo cual generará la aparición de limitaciones a medida que las operaciones del negocio (organización) se incrementen. Con discos y memoria
compartidos, se puede efectivamente compartir todos los datos de la base.
Una aplicación en un procesador puede estar accediendo un dato al mismo
tiempo que otra aplicación lo hace en otro procesador, causando así que la
segunda aplicación espere para acceder a ese dato.
Se puede incrementar la capacidad de entrada / salida de la partición de la
base de datos asociada a un procesador, así como también el número de discos.
También se pueden establecer servidores de entrada / salida para repartir las
solicitudes de entrada / salida. Al tener uno o más servidores de entrada /
salida para cada disco se permite que una o más operaciones de entrada /
salida tengan lugar al mismo tiempo.
Si se ha alcanzado la máxima capacidad o escalabilidad, se puede considerar la idea de cambiar la base a un sistema de partición múltiple.
2.11.3
Distintas Configuraciones de Particiones Múltiples
Además de los entornos antes mencionados, se puede dividir la base de datos
en particiones múltiples, cada una en su propia máquina. Y además varias
2.11. HARDWARE SOPORTADO POR DB2
47
máquinas con particiones múltiples de una base de datos, pueden ser agrupadas.
Se describe a continuación las configuraciones de particiones posibles:
• Particiones en sistemas cada uno con un procesador.
• Particiones en sistemas cada uno con múltiples procesadores.
• Particiones lógicas de base de datos.
Particiones con un Procesador
En este entorno existen varias particiones de base de datos, cada una de las
cuales sobre su propia máquina y con su propio procesador, memoria y discos.
Una máquina consiste de una CPU, memoria, y disco con todas las máquinas
conectadas mediante una instalación de comunicación. Otros nombres dados
a este entorno son los siguientes:
• Cúmulo (cluster ).
• Cúmulo de uniprocesadores (cluster of uniprocessors).
• Entorno de procesamiento masivo en paralelo (massively parallel procesing o MPP).
• Configuración compartido-nada (shared-nothing configuration).
El último nombre refleja exactamente el arreglo de recursos en este ambiente.
A diferencia de un entorno SMP ( Sistema Simétrico Multiprocesador ),
un entorno MPP (Particiones Múltiples con un Procesador ) no tiene discos ni
memoria compartidos. El entorno MPP elimina las limitaciones introducidas
al compartir memoria y disco.
Un entorno de base de datos particionado permite que una base de datos
continúe siendo un conjunto lógico mientras que físicamente está dividida a
través de más de una partición. Para los usuarios y / o aplicaciones, la base
de datos puede ser utilizada como un todo y el hecho de que los datos están
particionados es transparente. El trabajo a ser realizado con los datos puede
ser dividido para cada administrador de base de datos, de esta forma cada
administrador de la base de datos en cada partición, trabaja sobre su propia
parte de la base de datos.
48
CAPÍTULO 2. INTRODUCCIÓN A DB2
Capacidad y Escalabilidad
En este entorno se pueden agregar más particiones de base de datos (nodos)
a la configuración. En algunas plataformas, por ejemplo RS/6000, el máximo
es de 512 nodos. Sin embargo, podría existir un problema práctico relacionado
con la administración de tal número de máquinas e instancias.
Si se ha llegado a la máxima escalabilidad y capacidad, se puede considerar la opción de migrar a un sistema donde cada partición posea múltiples
procesadores.
Particiones con Múltiples Procesadores
Como alternativa de una configuración en la cual cada partición tiene un
procesador único, se puede utilizar una en la cual una partición posea múltiples
procesadores. A esto se lo denomina Cúmulo SMP ( SMP Cluster ).
Esta configuración combina las ventajas de un SMP y el paralelismo de
un MPP. Esto significa que una consulta (query) puede ser realizada en una
partición simple a través de múltiples procesadores. Además esto implica
que una consulta (query) puede ser hecha en paralelo a través de particiones
múltiples.
Capacidad y Escalabilidad
En este entorno se pueden adicionar más particiones a la base de datos,
como se indicó anteriormente. También se pueden agregar más procesadores
a las particiones existentes en la base de datos.
Particiones Lógicas de Base de Datos
La partición lógica de una base de datos se diferencia de una partición
física en que no se logra el control total de la máquina. A pesar de que la
máquina comparte sus recursos, la partición no lo hace. Esto significa que los
procesadores son compartidos pero no lo son el / los discos y la memoria.
Una razón lógica para utilizar particiones lógicas es la de brindar escalabilidad. El administrador de base de datos múltiple que se ejecuta en particiones lógicas múltiples, puede hacer un uso más completo de los recursos
disponibles que un administrador de una base de datos simple. Se gana mayor escalabilidad sobre una máquina SMP mediante la adición de particiones,
particularmente en aquellas máquinas con varios procesadores.
2.12. HERRAMIENTAS DE ADMINISTRACIÓN
49
Mediante la partición de la base de datos, se puede administrar y recuperar
cada partición por separado.
Se nota también que la habilidad de tener dos o más particiones coexistiendo en la misma máquina (sin importar el número de procesadores) permite
una mayor flexibilidad al diseñar configuraciones avanzadas de disponibilidad
y estrategias para hacer frente a caídas del sistema.
2.12
Herramientas de Administración
Desde el punto de vista del administrador de base de datos, el DB2 incluye
una larga lista de herramientas DBA. Además de esto hay utilidades para B
/ R, reorganizador, importar / exportar y alta velocidad de llamadas, las que
están incluidas y pueden ser ejecutadas a través de un objeto GUI Browser.
2.12.1
DB2 Administración de Servidores
El DB2 Administración de Servidores (DAS ) es una instancia de DB2 que
habilita administración remota de servidores DB2. Esta instancia es creada y
usada en una forma similar a cualquier instancia de DB2. Se puede tener una
sola DAS sobre su máquina.
2.12.2
Asistente para la Configuración de Clientes
El asistente de configuración de clientes ayuda a manejar las conexiones de las
bases de datos con servidores de base de datos remotas.
Este puede correr bajo servidores OS/2 y Windows NT, así como el cliente
corre bajo OS/2, Windows NT y Windows 95. Con el asistente de configuración de clientes se podrá:
• Definir conexiones a base de datos de modo que éstas pueden ser utilizadas por aplicaciones. Existen tres métodos:
• Examinar la red por base de datos disponibles y seleccionar una.
El cliente automáticamente se configura para esa base de datos.
50
CAPÍTULO 2. INTRODUCCIÓN A DB2
• Usar los perfiles de acceso a base de datos que provee el administrador para definir automáticamente las conexiones.
• Configuración manual de conexiones a base de datos para modificar
algunos parámetros de conexión requeridos.
• Remover bases de datos catalogadas o modificar sus propiedades.
• Testear la conexión con la base de datos identificada en su sistema para
asegurarse que puede establecerse la conexión con el servidor que necesita.
• Enlazar aplicaciones a una base de datos seleccionando utilidades o enlazar archivos de una lista.
• Establecer conexiones con servidores DRDA (Distributed Relational Database Architecture) si la conexión DB2 está instalada.
2.13
Administrador
El administrador es usado para monitorear y cambiar el rendimiento de aplicaciones que corren a través de la base de datos.
Consiste en dos partes:
• Una utilidad de frente-final.
• Un dominio.
Cuando arranca el administrador, se ejecuta el comando de inicio del administrador de utilidades de front-end, quienes ejecutan el dominio. Por defecto,
el dominio es iniciado sobre toda partición en una base de datos particionada, pero se puede también usar la utilidad front-end para iniciar un dominio
simple de una partición específica para monitorear la actividad a través de la
partición de bases de datos encontradas allí. O un dominio puede monitorear
la actividad sobre una partición simple de base de datos.
Además un administrador de dominio colecciona estadísticas sobre las aplicaciones que corren a través de la base de datos.
Éstas son chequeadas a través de reglas que pueden ser especificadas en
el archivo de configuración del administrador aplicadas a esa base de datos
2.14. SMARTGUIDES
51
específica. El administrador actúa de acuerdo a éstas reglas. Por ejemplo:
una regla puede indicar que la aplicación está usando demasiados recursos.
En este caso el administrador puede cambiar las prioridades de la aplicación
o forzarla a dejar la base de datos, de acuerdo con las instrucciones específicas
en el archivo de configuración del administrador.
Si la acción asociada con ésta regla cambia las prioridades de la aplicación,
el administrador cambia las prioridades del solicitante sobre la partición de la
base de datos en la que el administrador detecta la violación del recurso.
Si la acción asociada con la regla es de forzar la aplicación, ésta será forzada siempre que el administrador que ha detectado la violación del recurso
esté corriendo sobre el nodo coordinador de la aplicación o en un entorno
particionado de la base de datos.
El administrador también registra (logs) cualquier acción que tome, se
pueden consultar éstos archivos logs para rever las acciones tomadas por el
administrador.
2.14
SmartGuides
Éstas son parte de las herramientas de administración de DB2 y guían a través
de las tareas de administración. Las siguientes están habilitadas:
• Creación de base de datos: ayuda sobre la creación de base de datos,
asignación de almacenamientos y selección de las opciones básicas más
adecuadas. Para invocarla, cliquear sobre el ícono de database en el
control center y seleccionar create-new.
• Creación de espacio de tablas: ayuda a crear nuevos espacios de tablas y configurar las opciones básicas de almacenamiento óptimo. Para
invocarla cliquear sobre el ícono de table space en el control center, y
seleccionar create table space usando smartguide.
• Creación de tablas: ayuda a diseñar columnas (usando planillas de columnas pre-definidas si se desea), crear una clave primaria para la tabla
y asignar la tabla a uno o más espacios. Para invocarla cliquear sobre
el ícono de table en el control center y seleccionar create table usando
smartguide.
52
CAPÍTULO 2. INTRODUCCIÓN A DB2
• Backup de base de datos: hace preguntas básicas sobre la información de
disponibilidad de las bases de datos, las restricciones horarias y requisitos
de recuperabilidad. Esto sugiere un plan de backup, creación de scripts de
trabajo y su schedules. Para invocarlo cliquear el ícono que representa
alguna de las bases de datos en el control center y seleccionar backup
database usando smartguide.
• Recupero de base de datos: ayuda sobre el proceso de recuperación de
base de datos. Para invocarlo cliquear sobre el ícono que representa una
de sus bases de datos en el control center y seleccionar backup database
usando smartguide.
• Optimización de la configuración: hace preguntas sobre la base de datos,
su información y los propósitos del sistema y entonces sugiere nuevos
parámetros de configuración para la base de datos y automáticamente
los aplica a las bases de datos, si se lo desea. Para invocarlo cliquear en
el ícono que representa una de las bases de datos en el control center y
seleccionar optimización de la configuración.
Capítulo 3
Introducción a JAVA
3.1
¿De Dónde Surge Java?
Java surgió en 1991 cuando un grupo de ingenieros de Sun Microsystems
trataron de diseñar un nuevo lenguaje de programación destinado a electrodomésticos. La reducida potencia de cálculo y memoria de los electrodomésticos
llevó a desarrollar un lenguaje sencillo capaz de generar código de tamaño 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 utilizada.
Desarrollaron un código “neutro”que no depende del tipo de electrodoméstico, el cual se ejecuta sobre una “máquina hipotética o virtual ” denominada
53
54
CAPÍTULO 3. INTRODUCCIÓN A JAVA
Java Virtual Machine (JVM ). Es la JVM quien interpreta el código neutro
convirtiéndolo a código particular de la CPU utilizada. Esto permitía lo que
luego se ha convertido en el principal lema del lenguaje: “Write Once, Run
Everywhere” [29].
A pesar de los esfuerzos realizados por sus creadores, ninguna empresa de
electrodomésticos se interesó por el nuevo lenguaje.
Java, como lenguaje de programación para computadores, se introdujo a
finales de 1995. La clave fue la incorporación de un intérprete Java en el programa Netscape Navigator, versión 2.0, produciendo una verdadera revolución
en Internet. [1]
Java 1.1 apareció a principios de 1997, mejorando sustancialmente la primera versión del lenguaje.
Al programar en Java no se parte de cero. Cualquier aplicación que se
desarrolle “cuelga” (o se apoya, según como se quiera ver) en un gran número
de clases preexistentes. Algunas de ellas las ha podido hacer el propio usuario,
otras pueden ser comerciales, pero siempre hay un número muy importante de
clases que forman parte del propio lenguaje (el API o Application Programming Interface de Java).
Java incorpora muchos aspectos que en cualquier otro lenguaje son extensiones propiedad de empresas de software o fabricantes de ordenadores
(threads, ejecución remota, componentes, seguridad, acceso a bases de datos,
etc.). Por eso es un lenguaje ideal para aprender la informática moderna, porque incorpora todos estos conceptos de un modo estándar, mucho más sencillo
y claro que con las citadas extensiones de otros lenguajes. Esto es consecuencia
de haber sido diseñado más 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 información, éste está situada en el ordenador
local, en un servidor de Web, en una base de datos o en cualquier otro lugar.
Java es un lenguaje muy completo (se está convirtiendo en un macrolenguaje: Java 1.0 tenía 12 packages; Java 1.1 tenía 23 y Java 1.2 tiene 59).
En cierta forma casi todo depende de casi todo.
Por ello, hay que aprenderlo de modo iterativo: primero una visión 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
3.2. LA SIMPLICIDAD DE JAVA
55
características más importantes.
La compañía Sun describe el lenguaje Java como “simple, orientado a
objetos, distribuido, interpretado, robusto, seguro, de arquitectura neutra, portable, de altas prestaciones, multitarea y dinámico”. Además 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.
3.2
La Simplicidad de Java
Java ha sido diseñado de modo de eliminar las complejidades de otros lenguajes como C y C++.
Si bien este lenguaje posee una sintaxis similar a C, con el objeto de facilitar
la migración de C hacia Java, el mismo es semánticamente muy distinto a C :
• Java no posee aritmética de punteros: La aritmética de punteros es el
origen de muchos errores de programación que no se manifiestan durante
la depuración y que una vez que el usuario los detecta son difíciles de
resolver.
• No se necesita hacer delete: Determinar el momento en que se debe
liberar el espacio ocupado por un objeto es un problema difícil de resolver
correctamente. Esto también es el origen a errores difíciles de detectar
y solucionar.
• No hay herencia múltiple: En C++ esta característica da origen a muchas situaciones de borde en donde es difícil predecir cuál será el resultado. Por esta razón en Java se opta por herencia simple que es mucho
más simple de aprender y dominar.
3.3
Principales Características del Lenguaje
Sus principales características son: [4] [21]
• Lenguaje multiplataforma (Windows, Macintosh, Unix).
• Estructura similar al C++.
56
CAPÍTULO 3. INTRODUCCIÓN A JAVA
• Orientado a objeto.
• Simple y elegante.
• Facilita la labor del programador eliminando dos de los problemas de
otros lenguajes:
• Gestión de la memoria.
• Punteros.
• Lenguaje multitarea.
• Penetración en Internet.
• Prestaciones multimedia (texto, gráficos, sonido, animaciones,etc.).
• Fácilmente accesible.
• Esas características han hecho de Java uno de los lenguajes líderes y de
mayor crecimiento en el mercado.
3.4
Entorno de Desarrollo de Java
Existen distintos programas comerciales que permiten desarrollar código
Java. La compañía Sun, creadora de Java, distribuye gratuitamente el Java
Development Kit (JDK). Se trata de un conjunto de programas y librerías que
permiten desarrollar, compilar y ejecutar programas en Java.
Incorpora además la posibilidad de ejecutar parcialmente el programa, deteniendo la ejecución en el punto deseado y estudiando en cada momento el
valor de cada una de las variables (es el denominado Debugger ). Cualquier
programador con un mínimo de experiencia sabe que una parte muy importante (muchas veces la mayor parte) del tiempo destinado a la elaboración de
un programa se destina a la detección y corrección de errores.
Existe también una versión reducida del JDK, denominada JRE (Java
Runtime Environment) destinada únicamente a ejecutar código Java (no permite compilar).
Los IDEs (Integrated Development Environment), tal y como su nombre
indica, son entornos de desarrollo integrados. En un mismo programa es posible escribir el código Java, compilarlo y ejecutarlo sin tener que cambiar de
3.5. EL COMPILADOR DE JAVA
57
aplicación. Algunos incluyen una herramienta para realizar Debug gráficamente, frente a la versión que incorpora el JDK basada en la utilización de
una consola (denominada habitualmente ventana de comandos de Ms-Dos, en
Windows NT / 95 / 98 ) bastante difícil y pesada de utilizar.
Estos entornos integrados permiten desarrollar las aplicaciones de forma
mucho más rápida, incorporando en muchos casos librerías con componentes
ya desarrollados, los cuales se incorporan al proyecto o programa. Como inconvenientes se pueden señalar algunos fallos de compatibilidad entre plataformas
y ficheros resultantes de mayor tamaño que los basados en clases estándar.
3.5
El Compilador de Java
Se trata de una de las herramientas de desarrollo incluidas en el JDK.
Realiza un análisis de sintaxis del código escrito en los ficheros fuente de Java
(con extensión *.java). Si no encuentra errores en el código genera los ficheros
compilados (con extensión *.class).
En otro caso muestra la línea o líneas erróneas. En el JDK de Sun dicho
compilador se llama javac.exe. Tiene numerosas opciones, algunas de las cuales
varían de una versión a otra. Se aconseja consultar la documentación de
la versión del JDK utilizada para obtener una información detallada de las
distintas posibilidades.
3.6
Java Virtual Machine
La existencia de distintos tipos de procesadores y ordenadores llevó a los
ingenieros de Sun a la conclusión de que era muy importante conseguir un
software que no dependiera del tipo de procesador utilizado.
Se plantea la necesidad de conseguir un código capaz de ejecutarse en cualquier tipo de máquina. Una vez compilado no debería ser necesaria ninguna
modificación por el hecho de cambiar de procesador o de ejecutarlo en otra
máquina.
La clave consistió en desarrollar un código “neutro” el cual estuviera preparado para ser ejecutado sobre una “máquina hipotética o virtual ”, denominada
Java Virtual Machine (JVM).
58
CAPÍTULO 3. INTRODUCCIÓN A JAVA
Es esta JVM quien interpreta este código neutro convirtiéndolo a código
particular de la CPU o chip utilizada. Se evita tener que realizar un programa diferente para cada CPU o plataforma. La JVM es el intérprete de
Java. Ejecuta los “bytecodes” (ficheros compilados con extensión *.class) creados por el compilador de Java (javac.exe). Tiene numerosas opciones entre
las que destaca la posibilidad de utilizar el denominado JIT (Just-In-Time
Compiler ), que puede mejorar entre 10 y 20 veces la velocidad de ejecución de
un programa.
3.7
Applets en Java
El funcionamiento del Web está basado en el paradigma cliente/servidor.
Un servidor almacena páginas Web en formato HTML y los clientes las consultan. Los clientes corresponden a programas de navegación en el Web como
por ejemplo Netscape, Internet Explorer, etc. Una página Web se transmite
del servidor al cliente por medio de la red Internet, en el momento en que el
cliente la consulta.
Una página Web puede contener varios medios audio/visuales:
• Texto.
• Imágenes.
• Sonido..
• Video.
• Applets.
Un applet es un programa escrito en Java que anima una porción de la
página Web. Al igual que el resto de los medio audio/visuales, el applet está
almacenado en el servidor y se transmite al cliente por medio de Internet.
La ventaja de los applets con respecto a otros medios audio/visuales es
que el usuario puede interactuar con un applet, gracias a que se trata de
un programa. Un applet puede desplegar texto, imágenes, sonido y realizar
animaciones gráficas, pero todo esto bajo el control de un programa que se
transmite por la red y que interactúa con el usuario.
3.7. APPLETS EN JAVA
59
El mismo se ejecuta completamente en el cliente. Esto significa que una vez
que fue transmitido, la velocidad de la interacción no depende de la velocidad
y latencia de la red. Si es necesario, el applet también se puede comunicar con
el servidor.
Para que un programa de navegación en el Web pueda ejecutar un applet
es necesario que posea un intérprete de Java. Actualmente Netscape, Internet
Explorer y Hotjava cumplen con este requisito.
3.7.1
Construcción de Applets
Los applets usan artefactos de AWT. En particular un applet puede crear
botones, ventanas independientes, canvas para despliegue general, etc.
Lo que no puede hacer un applet es acceder archivos o abrir conexiones
con cualquier computador en la red. Sólo puede abrir conexiones con el computador desde donde se recuperó el applet.
A futuro, los browsers Web incorporarán mecanismos para permitir que
un applet tenga distintos grados de privilegio para correr. De este modo uno
podría recuperar un applet que es un hoja de cálculo la cual podrá escribir en
archivos locales.
Este es un nuevo enfoque para la distribución del software. Incluso, no será
difícil hacer applets que midan el tiempo de uso de la aplicación para cobrar
proporcionalmente.
Definición de un applet
Un applet se crea extendiendo la clase applet, que a su vez es una subclase
de panel. Un applet se distingue porque posee los siguientes métodos:
• init(): Se invoca cuando se carga el applet y se usa para inicializar el
applet. Aquí se crean todos los artefactos del applet.
• start(): Se invoca cada vez que el usuario visita la página Web. El applet
permanece cargado.
• stop(): Se invoca cuando el usuario abandona la página Web. Si el
usuario revisa la página y el applet todavía esta cargado, entonces se
invocará start (sin init).
60
CAPÍTULO 3. INTRODUCCIÓN A JAVA
• destroy(): Se invoca justo antes de que el browser Web destruya el applet.
Sirve para cerrar archivos, cerrar conexiones y realizar otras labores. No
es necesario liberar objetos porque el recolector de basura sabe hacerlo.
• String getParameter(String nombre): se usa para recuperar parámetros
que se especifican en la página Web en donde se ubica el applet.
Es importante que el applet procese rápidamente los eventos originados de
la interacción con el usuario. En particular en ninguno de estos métodos, ni
en los métodos de AWT, se puede realizar cálculos que tomen varios segundos,
puesto que esto hará que no se muestren las componentes en el momento
adecuado. Para realizar cálculos prolongados se deben crear threads.
3.7.2
Cómo Incorporar un Applet en una Página Web
Un applet se incorpora en una página Web usando los siguientes comandos
html:
<applet codebase=examples code=GuiApplet.class width=550 height=200>
... (parámetros)
</applet>
En donde:
• codebase: es el directorio que contiene la clase del applet. En este caso el
directorio es relativo al directorio en donde se encuentra la página Web.
• code: es el nombre del archivo que contiene el bytecode de la clase ya
compilada.
• width y height: es el tamaño del rectángulo que ocupará el applet en la
página Web.
Entre los comandos applet y /applet se pueden colocar parámetros para el
applet con:
<param name=UNARGUMENTO value=”valor”>
Estos parámetros se reciben en el applet con:
3.7. APPLETS EN JAVA
61
String arg= miApplet.getParameter(”UNARGUMENTO”);
3.7.3
Portabilidad de Applets
A medida que la computación va madurando como tecnología de diversión
y de aumento de la productividad, la tendencia es que cada vez el software
debe ser más fácil de usar.
El sueño de Internet es que un usuario apunte y seleccione un ítem en la
pantalla para recuperar y ejecutar en el instante un programa de cualquier
parte del mundo. Éste es el sueño que Java pretende realizar.
Sin embargo esto no es fácil de lograr. El primer problema que se presenta
es el de la portabilidad. Existe una amplia gama de plataformas con procesadores y sistemas operativos incompatibles entre sí. Sería impensable tener en
cada servidor programas binarios para todas las plataformas existentes.
Java resuelve el problema de la incompatibilidad de los procesadores haciendo que los applets se almacenen en los servidores en un código intermedio
independiente de la plataforma (el byte-code). Es este byte-code el que se
transmite hacia los cliente y los clientes ejecutan este código por medio de un
intérprete que sí es dependiente de la plataforma.
Para cuando se requiere mayor eficiencia, ya existen clientes que son capaces de compilar el byte-code hacia el código nativo de la máquina del cliente,
en el momento de recibir el código. Este compilador también es dependiente
de la plataforma, pero lo importante es que los applets sean independientes de
la plataforma.
3.7.4
El Problema de la Seguridad
El segundo problema que se presenta para hacer realidad el sueño de
Internet es el riesgo que corre un usuario cuando recupera programas por
medio de Internet.. Después de ejecutarlo se puede encontrar con la sorpresa:
> DIR
FILE NOT FOUND
Es decir el applet puede ser un programa malicioso que destruye el con-
62
CAPÍTULO 3. INTRODUCCIÓN A JAVA
tenido de los discos del usuario. Entonces el usuario afectado puede quejarse
ante el administrador del servidor Web que contenía el applet malicioso.
Pero la respuesta puede ser tan simple como pedir disculpas: lo siento,
fuimos atacados por un hacker.
Java resuelve el problema de la seguridad de los usuarios haciendo que un
applet no tenga acceso a:
• Los archivos del cliente.
• Los dispositivos del cliente (por ejemplo la impresora).
• La red.
Esto se logra colocando un monitor entre el applet y los recursos que posee
el computador del cliente.
Actualmente el monitor prohibe el acceso al disco, la red y la impresora,
pero a futuro el usuario podrá dar acceso gradual a estos dispositivos, dependiendo de la confianza que tenga del applet que está ejecutando. El usuario
podría considerar que los applets de su proveedor de Software son absolutamente confiables.
3.7.5
Seguridad del Monitor
Un programa en C puede modificar cualquier parte de la memoria aprovechándose de que no hay chequeo de punteros nulos o índices fuera de rango.
char *p= 0;
p[1000]= 15;
Este programa coloca un 15 en la dirección 1000.
Si Java es sintácticamente similar a C, ¿Puede un hacker confeccionar un
applet que altere el monitor para conseguir acceso a los dispositivos prohibidos?
No, el lenguaje Java fue diseñado de modo que un applet sólo puede consultar y modificar la memoria que pidió legalmente para sus objetos.
Esto se logra porque Java es semánticamente muy distinto a C:
3.8. LAS VARIABLES PATH Y CLASSPATH
63
• Java chequea los índices en arreglos.
• Java no posee aritmética de punteros.
• Java realiza chequeo estático y dinámico de tipos.
Por lo tanto Java es un lenguaje seguro: prohibe cualquier tipo de operación que pueda afectar la integridad del ambiente en que se ejecutan sus
programas.
3.7.6
Seguridad del Código Intermedio
Si bien un programa escrito en Java no puede ejecutar operaciones peligrosas, ¿Puede un hacker fabricar un applet, escribiendo directamente su código
intermedio sin pasar por el fuente escrito en Java? Entonces: ¿Qué tan seguro
es el código intermedio?
Sí, el código intermedio puede ser fabricado a mano. Además el código
intermedio no es seguro. Pero el código intermedio ha sido diseñado para
que pueda ser validado. La validación consiste en verificar que en el código
intermedio no se realicen operaciones peligrosas. Todos los programas para
navegar en Internet incluyen un validador del código intermedio. El programa
navegante rechaza aquellos programas que no pasan este proceso de validación.
Formalmente se puede decir que el validador demuestra que existe un programa en Java cuya compilación es el código intermedio que se recuperó por
la red. En este caso se ejecuta el applet sin problemas. Pero si el validador encuentra secuencias de instrucciones que no pueden ser generadas por el
compilador de Java entonces el applet se rechaza.
3.8
Las Variables Path y ClassPath
El desarrollo y ejecución de aplicaciones en Java exige que las herramientas
para compilar
(javac.exe) y ejecutar (java.exe) se encuentren accesibles. El ordenador,
desde una ventana de comandos de Ms-Dos, sólo es capaz de ejecutar los
programas que se encuentran en los directorios indicados en la variable Path
del ordenador.
64
CAPÍTULO 3. INTRODUCCIÓN A JAVA
Si se desea compilar o ejecutar código en Java en estos casos el directorio
donde se encuentran estos programas (java.exe y javac.exe) deberán encontrarse en el Path. Tecleando set Path en una ventana de comandos de Ms-Dos
se muestran los nombres de directorios incluidos en dicha variable de entorno.
Java utiliza además una nueva variable de entorno denominada ClassPath,
la cual determina dónde buscar tanto las clases o librerías de Java (el API de
Java) como otras clases de usuario. A partir de la versión 1.1.4 del JDK no es
necesario indicar esta variable, salvo que se desee añadir 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. En el caso de los ficheros
*.zip hay que indicar que los ficheros en él incluidos no deben estar comprimidos. En el caso de archivos *.jar existe una herramienta (jar.exe), incorporada
en el JDK, que permite generar estos ficheros a partir de los archivos compilados *.class. Los ficheros *.jar son archivos comprimidos y por lo tanto
ocupan menos espacio que los archivos *.class por separado o que el fichero
*.zip equivalente.
Una forma general de indicar estas dos variables es crear un fichero batch
de Ms-Dos (*.bat) donde se indiquen los valores de dichas variables. Cada
vez que se abra una ventana de Ms-Dos será necesario ejecutar este fichero
*.bat para asignar adecuadamente estos valores. Un posible fichero llamado
jdk117.bat, podría ser como sigue:
El desarrollo y ejecución de aplicaciones en Java exige que las herramientas
para compilar
(javac.exe) y ejecutar (java.exe) se encuentren accesibles. El ordenador,
desde una ventana de comandos de Ms-Dos, sólo es capaz de ejecutar los
programas que se encuentran en los directorios indicados en la variable Path
del ordenador.
Si se desea compilar o ejecutar código en Java en estos casos el directorio
donde se encuentran estos programas (java.exe y javac.exe) deberán encontrarse en el Path. Tecleando set Path en una ventana de comandos de Ms-Dos
se muestran los nombres de directorios incluidos en dicha variable de entorno.
Java utiliza además una nueva variable de entorno denominada ClassPath, la
cual determina dónde buscar tanto las clases o librerías de Java (el API de
Java) como otras clases de usuario.
3.8. LAS VARIABLES PATH Y CLASSPATH
65
A partir de la versión 1.1.4 del JDK no es necesario indicar esta variable,
salvo que se desee añadir 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. En el caso de los
ficheros *.zip hay que indicar que los ficheros en él incluidos no deben estar
comprimidos. En el caso de archivos *.jar existe una herramienta (jar.exe),
incorporada en el JDK, que permite generar estos ficheros a partir de los
archivos compilados *.class. Los ficheros *.jar son archivos comprimidos y
por lo tanto ocupan menos espacio que los archivos *.class por separado o que
el fichero *.zip equivalente.
Una forma general de indicar estas dos variables es crear un fichero batch
de Ms-Dos (*.bat) donde se indiquen los valores de dichas variables. Cada
vez que se abra una ventana de Ms-Dos será necesario ejecutar este fichero
*.bat para asignar adecuadamente estos valores. Un posible fichero llamado
jdk117.bat, podría ser como sigue:
set JavaPath=C:\jdk1.1.7
set Path=.;%JavaPath%\bin;%Path%
set ClassPath=.\;%JavaPath%\lib\classes.zip;%ClassPath%
lo cual sería válido en el caso de que el JDK estuviera situado en el directorio C:\jdk1.1.7.
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 entre Windows 95 / 98 y Windows NT. En Windows 95 / 98 es necesario modificar el fichero Autoexec.bat situado en C:\,
añadiendo las líneas antes mencionadas. Una vez rearrancado el ordenador estarán presentes en cualquier consola de Ms-Dos que se cree. La modificación
al fichero Autoexec.bat en Windows 95 / 98 será la siguiente:
set JavaPath=C:\jdk1.1.7
set Path=.;%JavaPath%\bin;%Path%
set ClassPath=
En el caso de utilizar Windows NT se añadirá la variable Path en el cuadro
de diálogo que se abre con Start -> Settings -> Control Panel -> System ->
Environment -> User Variables for
66
CAPÍTULO 3. INTRODUCCIÓN A JAVA
NombreUsuario:
También es posible utilizar la opción ClassPath en el momento de llamar
al compilador
javac.exe o al intérprete java.exe. Los ficheros *.jar deben ponerse con el
nombre completo en el ClassPath: no basta poner el Path o directorio en el que
se encuentra. Por ejemplo, si se desea compilar y ejecutar el fichero contiene
Main.java, y éste necesitara la librería de clases G:\MyProject\OtherClasses.jar,
además de las incluidas en el ClassPath, la forma de compilar y ejecutar sería:
javac -classpath .\;G:\MyProject\OtherClasses.jar ContieneMain.java
java -classpath .\;G:\MyProject\OtherClasses.jar ContieneMain
Se aconseja consultar la ayuda correspondiente a la versión que se esté
utilizando, debido a
que existen pequeñas variaciones entre las distintas versiones del JDK.
Cuando un fichero filename.java se compila y en ese directorio existe ya
un fichero
filename.class, se comparan las fechas de los dos ficheros. Si el fichero filename.java es más antiguo que el filename.class no se produce un nuevo fichero
filename.class. Esto sólo es válido para ficheros *.class que se corresponden
con una clase public.
3.9
Arreglos
• Declaración de un arreglo
int A[]; // A es un arreglo de enteros
int A[10]; // error, el tamaño no va aquí
int[] A; // A es un arreglo de enteros
int A,B[]; // A es un entero, B un arreglo
int[] A,B; // A y B son arreglos
String S[]; // S es un arreglo de strings
3.9. ARREGLOS
S[1]=”” // error, el arreglo no ha sido
// creado
• Creación de un arreglo
int A[]= new int[10]; // 10 enteros
Subindicación de un arreglo:
A[0], A[1], ..., A[9] // correcto
A[10] // error, índice fuera
// de rango
• Modificación de un arreglo
A[3]= 8;
• Tamaño de un arreglo
A.length // correcto
A.length() // error, sin paréntesis
• Inicialización de un arreglo
for (int i=0; i<A.length; i++)
A[i]= i;
• Asignación de punteros a arreglos
int B[];
B= A; // A y B son el mismo arreglo
if (A==B) // Comparación de punteros
67
68
CAPÍTULO 3. INTRODUCCIÓN A JAVA
// true!
...
A[0]= 10;
B[0] // también 10
Copia de un arreglo:
B= (int[])A.clone();
3.10
El Kit Gráfico: AWT
AWT permite hacer interfaces gráficas mediante artefactos de interacción
con el usuario, como botones, menús, texto, botones para selección, barras de
deslizamiento, ventanas de diálogo, selectores de archivos, etc. y por supuesto
despliegue gráfico general.
Estos artefactos de interacción se denominan widgets . En la ventana los
artefactos se organizan en una jerarquía de componentes gráficas:
• En la parte superior hay una etiqueta que dice label. La aplicación usa
las etiquetas para mostrar texto.
• A la izquierda hay un área para texto que contiene:
• Una superficie para ingresar texto.
• Una barra de deslizamiento vertical.
• Una barra de deslizamiento horizontal.
• A la derecha se observa una lista de ítems que contiene:
• Una superficie para mostrar texto.
• Una barra de deslizamiento (sólo aparece si es necesario).
• Al centro hay un canvas, donde la aplicación dibuja figuras geométricas
y/o texto.
3.11. CONSTRUCTORES
69
• Abajo hay un panel de componentes con:
• Un campo para ingreso de texto (una sola línea).
• Un botón.
• Un botón de encendido/apagado que dice checkbox.
Es el programador de la interfaz gráfica el que diseña esta jerarquía de
componentes.
3.10.1
Jerarquía de Clases de AWT
Cada una de las componentes de una ventana en AWT se representa mediante uno o más objetos de la aplicación. Estos objetos pertenecen a las
clases que se observan en la siguiente jerarquía de clases para AWT.
La clase de los contenedores sirve para crear áreas en la ventana cuyo único
fin es colocar otras componentes en su interior.
Hay dos tipos de contenedores:
• Panel : sirve para colocar botones, etiquetas, etc. En particular un applet
es un panel.
• Window : sirve para crear nuevas ventanas independientes del browser
Web. Es decir ventanas que serán manejadas por el administrador de
ventanas de la plataforma (Motif, Windows, etc.). Una ventana independiente puede ser:
• Frame es un tipo de ventana en donde se pueden colocar menús.
• Dialog es un tipo de ventana para dialogar con el usuario. Se usan
para colocar botones, etiquetas, etc. Es decir cumple la misma
función que un panel, pero en una ventana independiente. En particular FileDialog es un artefacto para que el usuario escoja un
archivo.
3.11
Constructores
El constructor de una clase es un método estándar para inicializar los
objetos de esa clase Se invoca automáticamente cuando new crea un objeto
70
CAPÍTULO 3. INTRODUCCIÓN A JAVA
de esa clase.
Los constructores se declaran en el momento de definir la clase.
class A {
int x, y;
A() { x=0; y=0; } // el constructor
...
}
A a= new A();
a.Print(); // 0 0
El constructor puede tener parámetros. En este caso, se deben colocar los
argumentos respectivos al crear el objeto:
class A {
int x, y;
A(int ix, int iy)
{ x=ix; y=iy; } // el constructor
...
}
A a= new A(1,2);
a.Print(); // 1 2
a= new A(); // error, hay que colocar
// los argumentos
a.A(1,2); // error, no se puede
// invocar el constructor
Se pueden colocar varios constructores. Durante la creación de un objeto,
se invoca aquel que calza con los argumentos dados:
3.12. ENCAPSULAMIENTO DE CLASES
71
class A {
int x, y;
A() { x=0; y= 0; }
A(int ix, int iy)
{ x=ix; y=iy; }
A(A from)
{ x= from.x; y= from.y; }
...
}
A a1= new A();
a1.Print(); // 0 0
A a2= new A(1,2);
a2.Print(); // 1 2
A a3= new A(a2);
a3.Print(); // 1 2
Un destructor es un método que se invoca automáticamente cuando el
objeto se destruye. Java no posee destructores, porque tiene recolección de
basuras. C++ posee destructores.
3.12
Encapsulamiento de Clases
Un paquete es una colección de clases que se encuentran en el mismo
directorio.
Las clases permiten implementar tipos de datos abstractos. El problema
que se presenta es que desde cualquier clase se puede accesar los campos de
un objeto perteneciente a otra clase. Esto es una violación al principio de
abstracción que dice que un tipo de datos abstracto sólo puede ser manipulado
a través de las operaciones que se definen para éste.
72
CAPÍTULO 3. INTRODUCCIÓN A JAVA
3.12.1
Visibilidad de Campos y Métodos
En Java al definir una clase se puede controlar la visibilidad que tendrán
sus campos y métodos al exterior de la clase. Este control se efectúa de la
siguiente forma:
class A
{
private int privx;
protected int protb;
public int pubc;
int paqd;
private void MetPriv() { ... }
protected void MetProt() { ... }
public void MetPub(A a)
{
// Un campo siempre es visible
// en la clase en donde se define
... privx ... a.privx ...
... protb ... a.protb ...
... pubc ... a.pubc ...
// Un método siempre es visible
// en la clase en donde se define
MetPriv(); a.MetPriv();
}
void MetPaq() { ... }
}
3.12. ENCAPSULAMIENTO DE CLASES
73
Las palabras private, protected y public son atributos de un campo o un
método y su significado es el siguiente:
• Private: El campo o método sólo es visible dentro de la clase donde se
define.
• Protected: El campo o método es visible en la clase en donde se define
y en cualquiera de sus subclases.
• Public: El campo o método es visible en cualquier clase.
• Ninguna de las anteriores: El campo o método es visible en cualquiera
de las clases pertenecientes al paquete en donde se define.
Ejemplo:
class B
{
public void MetB()
{
A a= new A();
a.pubc= 1; // Ok
a.priva= 2; // error, privado
a.protb= 3; // error, B no es
// subclase de A
a.MetPub(); // Ok
a.MetPriv(); // error, privado
}
}
74
CAPÍTULO 3. INTRODUCCIÓN A JAVA
3.12.2
Visibilidad de Clases
Al declarar una clase se puede especificar que es pública usando el atributo
public . De este modo la clase podrá ser usada por cualquier otra clase. Si la
clase no es pública entonces la clase sólo puede ser usada dentro del paquete
que la contiene.
public class Box extends GraphObj
{ ... }
Se puede hacer un resumen de los atributos que pueden tener campos,
métodos o clases:
• Campo: {private | public | protected} {final} {static}
• Método: {private | public | protected} {final | abstract} {static}
• Clase: {public} {final | abstract}
Sólo se puede especificar uno de los atributos puestos en la misma llave.
3.13
Interacción con el Usuario
En AWT la aplicación se entera de cómo interactúa el usuario con los
artefactos a través de eventos.
Un evento es un objeto de la clase event que indica:
• El artefacto (un objeto de la clase del artefacto) que accionó el usuario.
• La identificación del evento que indica la naturaleza del evento.
• La posición del mouse al momento de la interacción.
• Teclas modificadores presionadas por el usuario, como la tecla control,
la tecla shift, la tecla meta, etc.
• Otros.
3.13. INTERACCIÓN CON EL USUARIO
75
La aplicación recibe los eventos ya sea a nivel de los mismos artefactos
o también a nivel de los contenedores. Por ejemplo para detectar cuando el
usuario presiona un botón específico se redefine el método action del botón.
Es decir será necesario crear una clase derivada de la clase Button.
class MyButton extends Button
{
Button(String nombre) { super(nombre); }
public boolean action(Event evt, Object artefacto)
{
... ; // código de la aplicación
return true;
}
}
En artefacto se indica el objeto con que interactuó el usuario. Cuando éste
método retorna false se indica que el evento no pudo ser procesado por este
método y que debe ser propagado hacia el contenedor de este artefacto. Esto
significa que entonces se invocará el método action del contenedor.
En este método se retorna true para que el contenedor no vuelva a procesar
el mismo evento. Cuando no se redefine action, el método provisto por button
retorna false y por lo tanto debe ser el contenedor el que procesa el evento.
Por lo tanto la otra forma de recibir eventos es en la raíz. El problema
de la raíz es que recibe los eventos de todos los artefactos y por lo tanto hay
que comparar el artefacto recibido con cada uno de los artefactos contenidos
en la raíz, para poder determinar cuál es la acción que debe llevar a cabo la
aplicación.
Por lo tanto otra forma de recibir eventos es:
class Gui extends Frame // contenedor raíz
{
...
76
CAPÍTULO 3. INTRODUCCIÓN A JAVA
public boolean action(Event evt, Object art)
{
if (art==boton) ...
else if (art==check) ...
else if (art==texto) ...
else ... // otro
return true;
}
}
Existe una última forma no recomendada de captar eventos usando handleEvent. Lo delicado de este método es que recibe todos los eventos, por lo
tanto es fácil introducir errores atrapando eventos que deberían procesarse en
otro punto en la jerarquía de componentes.
3.14
Instrucciones
Java posee prácticamente las mismas instrucciones de C. A continuación
se presenta las instrucciones más usadas:
• Declaración
tipo variables;
int a, b=1, c;
boolean v, w=true;
• Asignación
var= expresión; // asignación
a= b + 1;
3.14. INSTRUCCIONES
• Grupo de instrucciones
{ inst1 inst2 ... instn }
• Ejecución condicional
if (expresión booleana)
instrucción
int a, b;
...
if (a==1) b= 2;
if (expresión booleana)
instrucción
else
instrucción
Ejemplos:
boolean v;
int a, b;
...
if (v) b= 2;
else b= 3;
if (a) b= 2; // error, a no es boolean
if (a=1) b=4; // error, a=1 no es boolean
// es una asignación
• Ciclos simples
while (expresión booleana)
77
78
CAPÍTULO 3. INTRODUCCIÓN A JAVA
instrucción
int a=1;
while (a<=5) a++;
O también:
do { instrucciones }
while (expresión booleana);
• Salida de ciclos y término de iteraciones
Dentro de los ciclos se pueden usar las instrucciones break para salir del
ciclo y continúe para terminar una iteración y comenzar la próxima.
Ejemplo:
while (i<MAX)
{
...
if ( Found(”key”) ) break;
...
}
• Ciclo abreviado
for (instrucción; expresión booleana; instrucción)
instrucción
Ejemplo:
for (int a=1; a<=5; a++)
b++;
• Selección: switch/case
3.14. INSTRUCCIONES
79
switch (expresión)
{
case expresión-constante: instrucciones
case expresión-constante: instrucciones
...
default: instrucciones
}
Ejemplo:
char c= ... ;
switch (c)
{
case ’a’:
case ’b’:
case ’c’:
System.out.println(”a, b o c”);
break;
case ’d’:
System.out.println(”d”); // No termina en break
case ’e’:
System.out.println(”d o e!!”);
break;
}
Para mantener la compatibilidad con C, si no se especifica break al final de
un caso, se continúa ejecutando las instrucciones del siguiente caso. De esta
forma se puede colocar un sólo grupo de instrucciones para un conjunto de
casos.
80
CAPÍTULO 3. INTRODUCCIÓN A JAVA
• Retorno de un método
return expresión;
3.15
Objetos y Clases
• Un objeto en Java cumple las funciones que realiza un record en Pascal o una estructura en C. En Java las variables sólo pueden contener
referencias a objetos, es decir punteros a objetos.
• Todos los objetos se crean con new :
A a1= new A();
A es el tipo del objeto creado. También se dice que A es la clase del objeto
o que el objeto es una instancia de la clase A. La variable a1 también es de
tipo A, o análogamente a1 es de la clase A, porque a1 debe contener siempre
referencias a objetos que pertenecen a la clase A.
• Un objeto posee variables de instancia o campos que se pueden consultar
o asignar. Los campos que posee un objeto se definen al momento de
declarar la clase a la cual pertenece:
class A { int x, y; }
A a= new A();
a.x= 1;
a.y= 2;
System.out.println(a.x+” ”+a.y); // 1 2
• Un objeto también puede poseer métodos. Un método es un procedimiento cuya invocación siempre va asociada a un objeto. Los métodos
se definen en la declaración de la clase:
class A {
3.15. OBJETOS Y CLASES
81
int x, y; // variables de instancia
// Métodos
void Set(int vx, int vy) { x= vx; y= vy; }
void Incx() { x++; }
void Print() { System.out.println(x+” ”+y); }
}
A a= new A();
a.Set(10, 20);
a.Print(); // 10 20
a.Incx();
a.Print(); // 11 20
Incx(); // error, falta indicar el objeto
A a2= new A();
a2.Set(5, 6);
a2.Print(); // 5 6
a.Print(); // 11 20
• La definición de un método tiene las siguiente sintaxis:
tipo-retorno nombre-método
( tipo-parámetro nombre, ... )
{ instrucciones }
Si el procedimiento no retorna nada se coloca void. En las instrucciones
las variables que se accesen que no sean parámetros o variables locales del
procedimiento deben ser variables de instancia del objeto.
• Una variable de tipo objeto es una referencia (puntero) a un objeto:
82
CAPÍTULO 3. INTRODUCCIÓN A JAVA
A a1= new A();
A a2= new A();
A a3= a2;
a1.Set(1,2);
a2.Set(5,6);
a3.Set(8,9);
a1.Print(); // 1 2
a2.Print(); // 8 9
a3.Print(); // 8 9
En este caso las variables a2 y a3 referencian el mismo objeto, mientras
que a1 y a2 referencian objetos distintos.
• Una referencia puede ser pasada como argumento y puede ser retornada
por un método.
class A {
...
void CopyFrom(A from) { x= from.x; y= from.y }
A MakeCopy()
{
A acopy= new A();
acopy.Set(x, y);
return acopy;
}
}
A a1= new A();
a1.Set(1,2);
3.15. OBJETOS Y CLASES
83
A a2= new A();
a2.CopyFrom(a1);
a2.IncX();
a2.Print(); // 2 2
a1.Print(); // 1 2
A a3=a1.MakeCopy();
a3.Print(); // 1 2
• Dentro de un método, el identificador this contiene una referencia al
objeto con que se invocó este método.
class A {
...
void CopyTo(A to)
{ to.CopyFrom(this); }
}
• En Java no existe enlace directo entre identificador y objeto como en C
o Pascal :
En C o C++
A a; // a es el objeto
A *pa; // pa es una referencia al objeto
En Pascal
var a: A; // a es el record
a: A^; // a es una referencia al objeto
• Las variables se pueden inicializar con la referencia nula:
84
CAPÍTULO 3. INTRODUCCIÓN A JAVA
A a;
a= null;
a.x= 0; // error, a es la ref. nula
• Un objeto puede referenciar otros objetos:
class Eslabon {
Eslabon next;
A a;
void Encadenar(Eslabon anext) { next= anext; }
}
...
for(Eslabon e= prim; e!=null; e= e.next)
e.a.Print();
• Los arreglos y strings son objetos predefinidos.
String s= null;
s.substring(1,2); // error
int[] a= null;
a[0]=0; // error
• Se pueden crear arreglos de referencias a objetos. No se pueden crear
arreglos de objetos.
A[] aArr= new A[10];
aArr[0].x=1; // error, aArr[0] es nulo
for (int i=0; i<aArr.length; i++)
aArr[i]= new A();
3.16. SUBCLASES Y HERENCIA
85
• Ningún objeto se destruye explícitamente: No hay free ni delete.
A a= new A();
a= new A();
El objeto que se creó primero ya no es alcanzable y por lo tanto el recolector
de basura recuperará el espacio que ocupa.
3.16
Subclases y Herencia
Los métodos y variables que posee un objeto definen la clase a la cual
pertenece. Por ejemplo, todos los objetos de la clase A poseen los métodos
Set, Incx y Print y las variables x e y. En cambio los objetos de la clase
eslabon poseen el método encadenar y las variables next y a.
Una variable de tipo eslabon no puede contener una referencia a un objeto
de la clase A.
Eslabon e= new A(); // error de tipos
Puede existir una clase B de objetos que poseen todos los métodos y todas
las variables de A, pero además poseen otros métodos y/o variables que no
poseen los objetos de A. En ese caso se dice que B es una subclase de A.
Los objetos de la clase B también pertenecen a la clase A.
El principio es que todo el código que se haya escrito para objetos de la
clase A también funcionará con objetos de la clase B.
Una subclase se define mediante:
class B extends A
{
// variables que B agrega a A
int z;
// Métodos que B agrega a A
// Observe que B también posee x
86
CAPÍTULO 3. INTRODUCCIÓN A JAVA
void Incz() { z= z+x; }
}
Se dice que la clase B hereda todas las variables y métodos de A. También
se dice que B se deriva de A o que A es la clase base para B.
La jerarquía de clases permite apreciar fácilmente qué clases son subclases
de otras.
Observe que todos los objetos pertenecen a la clase Object.
Consideraciones importantes al usar subclases:
• Una variable de la clase A, también puede contener referencias a objetos
de la clase B, porque estos objetos pertenecen a la clase B y a la clase
A. Este concepto se denomina proyección.
A a;
a= new B(); // Proyección
Se dice que A es el tipo estático de la variable a y B es el tipo dinámico de
a. El tipo estático siempre se determina en tiempo de compilación mientras
que el tipo dinámico en general sólo se puede conocer en tiempo de ejecución
y puede cambiar.
• Dada una variable a, Java sólo permite invocar los métodos y accesar
las variables conocidas para el tipo estático de a.
a.Incx(); // Ok
a.x; // Ok
a.Incz(); // error, Incz no está definido para A
Del mismo modo, Java sólo permite asignar una expresión a una variable
de tipo A si el tipo de la expresión es A o una subclase de A:
B b= new A(); // error, el objeto no pertence a
// la clase B
3.17. OPERADORES EN JAVA
87
A a= new B(); // Ok
...
B b= a; // error, la clase estática de a
// no es una subclase de B.
• Un objeto se puede convertir a una referencia de la clase B mediante un
cast:
A a=new B();
B b=(B)a;
b.Incz(); // Ok
( (B)a ).Incz(); // Ok
No todo objeto se puede convertir a la clase B.
A a= new A();
...
B b=(B)a; // Ok, en compilación, pero
// error en tiempo de ejecución
Java chequea durante la ejecución todas las conversiones explícitas (casts).
Si el objeto no pertence a la clase a la cual se pretende convertir, entonces se
produce una excepción.
3.17
Operadores en Java
Java es un lenguaje rico en operadores, que son casi idénticos a los de C/C++.
Estos operadores se describen brevemente a continuación.
88
CAPÍTULO 3. INTRODUCCIÓN A JAVA
3.17.1
Operadores Aritméticos
Son operadores binarios (requieren siempre dos operandos) que realizan las
operaciones aritméticas habituales: suma (+), resta (-), multiplicación (* ),
división (/ ) y resto de la división (% ).
3.17.2
Operadores de Asignación
Los operadores de asignación permiten asignar un valor a una variable. El
operador de asignación por excelencia es el operador igual (=). La forma
general de las sentencias de asignación con este operador es:
variable = expression;
Java dispone de otros operadores de asignación. Se trata de versiones
abreviadas del operador (=) que realizan operaciones “acumulativas” sobre
una variable.
La siguiente Tabla 3.1 de la pág. 88, muestra estos operadores y su equivalencia con el uso del operador igual (=).
Operador
+=
-=
=*
=/
%=
Utilización
op1 + = op2
op1 - = op2
op1 * = op2
op1 / = op2
op1% = op2
ExpresiónEquivalente
op1 = op1 + op2
op1 = op1 - op2
op1 = op1 * op2
op1 = op1 / op2
op1 = op1 % op2
Tabla 3.1: Operadores de asignación.
3.17.3
Operadores Unarios
Los operadores más (+) y menos (-) unarios sirven para mantener o cambiar
el signo de una
variable, constante o expresión numérica. Su uso en Java es el estándar
de estos operadores.
3.17. OPERADORES EN JAVA
3.17.4
89
Operadores Incrementales
Java dispone del operador incremento (++) y decremento (—). El operador
(++) incrementa en una unidad la variable a la que se aplica, mientras que (—)
la reduce en una unidad. Estos operadores se pueden utilizar de dos formas:
1. Precediendo a la variable (por ejemplo: ++i). En este caso primero se
incrementa la
variable y luego se utiliza (ya incrementada) en la expresión en la que
aparece.
2. Siguiendo a la variable (por ejemplo: i++). En este caso primero se
utiliza la variable en la expresión (con el valor anterior) y luego se incrementa.
En muchas ocasiones estos operadores se utilizan para incrementar una variable fuera de una expresión. En este caso ambos operadores son equivalente.
Si se utilizan en una expresión más complicada, el resultado de utilizar estos
operadores en una u otra de sus formas será indiferente. La actualización de
contadores en bucles for es una de las aplicaciones más frecuentes de estos
operadores.
3.17.5
Operadores Relacionales
Los operadores relacionales sirven para realizar comparaciones de igualdad,
desigualdad y relación de menor o mayor. El resultado de estos operadores
es siempre un valor boolean (true o false) según se cumpla o no la relación
considerada. La siguiente Tabla 3.2 de la pág. 90 muestra los operadores
relacionales de Java.
Estos operadores se utilizan con mucha frecuencia en las bifurcaciones y
en los bucles, que se verán luego.
Ejemplo de Operadores Incrementales y Operadores Relacionales en un
método.
public void cambiarParesEntrenamiento(double[ ] paresEntrenamiento){
90
CAPÍTULO 3. INTRODUCCIÓN A JAVA
Operador
>
>=
<
<=
==
! =
Utilización
op1 > op2
op1 >= op2
op1 < op2
op1 <= op2
op1 == op2
op1 != op2
El resultado es true
si op1 es mayor que op2
si op1 es mayor o igual que op2
si op1 es menor que op 2
si op1 es menor o igual que op2
si op1 y op2 son iguales
sio p1 y op2 son diferentes
Tabla 3.2: Operadores relacionales.
/* inicialización de sus valores a partir de los valores pasados como argumentos
*/
for(int i = 0; i< paresEntrenamiento.length; i++)
{for(int j = 0; j< numeroNeuronasEntrada; j++)
{entradaEntrenamiento[i][j] = paresEntrenamiento[i][j];
}
for(int j = 0; j< numeroSalidas; j++)
{salidaEntrenamiento[i][j] = paresEntrenamiento[i][j+numeroNeuronasEntrada];
}
}
}
3.17.6
Operador de Concatenación de Cadenas de Caracteres
(+)
El operador más (+) se utiliza también para concatenar cadenas de caracteres. Por ejemplo, para escribir una cantidad con un rótulo puede utilizarse la
sentencia:
editor.append(“Error Obtenido:” + String.valueOf(imprimoError) + “\n”);
3.18. JAVA PARA APLICACIONES CORPORATIVAS
91
editor.append(“Iteraciones:”+ String.valueOf(imprimoIteraciones) + “\n”);
editor.append(“Inicio: ” + horaInicial.toString() + “\n”);
editor.append(“Final: ” + horaFinal.toString() + “\n”);
donde el operador de concatenación se utiliza dos veces para construir la
cadena de caracteres que se desea imprimir. Las variables imprimoErrror,
imprimoIteraciones, horaInicial, horaFinal son convertidas en cadena de caracteres para poder concatenarlas.
3.17.7
Precedencia de Operadores
El orden en que se realizan las operaciones es fundamental para determinar
el resultado de una expresión. Por ejemplo, el resultado de x/y*z depende de
qué operación (la división o el producto) se realice primero. La Tabla 3.3 de
la pág. 92 muestra el orden en que se ejecutan los distintos operadores en una
sentencia, de mayor a menor precedencia:
En Java, todos los operadores binarios, excepto los operadores de asignación, se evalúan de izquierda a derecha. Los operadores de asignación se
evalúan de derecha a izquierda, lo que significa que el valor de la izquierda se
copia sobre la variable de la derecha.
3.18
Java Para Aplicaciones Corporativas
Java e Intranet actualmente son palabras de moda. Y Java particularmente
es una buena tecnología para desarrollar aplicaciones corporativas, ya que
en donde la red sea algo crítico, Java facilita tremendamente la vida de la
programación corporativa.
Las más grandes compañías se han convencido de que la Red corporativa
es la Empresa. Ya que la Red es un canal importante por donde fluye la
información que mantiene vivo el negocio. La información fluye desde el gran
servidor de las oficinas centrales, hasta los servidores de las delegaciones, las
estaciones de trabajo de los programadores y las PC’s.
92
CAPÍTULO 3. INTRODUCCIÓN A JAVA
Nombre
Postfijos
Unarios
De creación
Multiplicativo
Adición
Shift
Relacional
Igualdad
AND
Or Excluyente
Or Incluyente
Logico AND
Logico OR
Condicional
Asignación
Sintáxis
[ ] .(params) expr++ expr++expr —expr +expr -expr !
(type) expr
*/%
+<< >> >>>
<> <= >= instanceof
== ! =
&
^
|
&&
||
?:
= += -= *= /= %= &= ^= |= <<= >>= >>>=
Tabla 3.3: Precedencia de Operadores.
Si esta red no se mantiene, los pedidos no llegan, el inventario no se actualiza, el software no se desarrolla adecuadamente, los clientes no están satisfechos
y, fundamentalmente, el dinero no entra.
La necesidad de diagnosticar y reducir los problemas que puedan surgir en
la red, hace que se esté incorporando continuamente nuevas metodologías que
subsanen este grave problema.
Java es el lenguaje apto para Internet; pero, para las aplicaciones corporativas, allí donde la red es el punto crítico, sería una buena tecnología, si
se compararan las capacidades de Java con la lista de necesidades de la red
corporativa.
3.18.1
Aplicaciones Efectivas o Eficientes
Las aplicaciones que se crean en grandes empresas deben ser más efectivas
que eficientes; es decir, conseguir que el programa funcione y el trabajo salga
adelante es más importante que el hacerlo eficientemente. Esto es una realidad
3.18. JAVA PARA APLICACIONES CORPORATIVAS
93
de la programación corporativa.
Java al ser un lenguaje más simple que cualquiera de los que ahora están
de moda para los programadores, permite concentrarse en la mecánica de la
aplicación, en vez de pasarse horas y horas incorporando API’s “Interface de
Programación de Aplicaciones” para el control de las ventanas, controlando
minuciosamente la memoria, sincronizando los ficheros de cabecera y corrigiendo los mensajes del linker.
Java tiene su propio toolkit para interfaces, maneja por sí mismo la memoria que utilice la aplicación, no permite ficheros de cabecera separados (en
aplicaciones puramente Java) y solamente usa enlace dinámico.
Muchas de las implementaciones de Java actuales son puros intérpretes.
Los bytecodes son interpretados por el sistema run-time de Java, la Máquina
Virtual Java (JVM ), sobre el ordenador del usuario.
Hay proveedores que ofrecen compiladores nativos Just-In-Time (JIT ).
Si la Máquina Virtual Java dispone de un compilador instalado, las secciones
(clases) del bytecode de la aplicación se compilarán hacia la arquitectura nativa
del ordenador del usuario.
Los programas Java competirán con el rendimiento de programas en C++.
Los compiladores JIT no se utilizan en la forma tradicional de un compilador;
los programadores no compilan y distribuyen binarios Java a los usuarios.
La compilación JIT tiene lugar a partir del bytecode Java, en el sistema del
usuario, como una parte (opcional) del entorno run-time local de Java.
Java permite algunas técnicas innovadoras de optimización. Como se mensionó anteriormente, Java es inherentemente multithreaded, a la vez que ofrece
posibilidades de multithread como la clase Thread y mecanismos muy sencillos
de usar de sincronización; Java en sí utiliza threads.
Los desarrolladores de compiladores inteligentes pueden utilizar esta característica de Java para lanzar un thread que compruebe la forma en que se está
utilizando la aplicación. Más específicamente, este thread podría detectar qué
métodos de una clase se están usando con más frecuencia e invocar a sucesivos
niveles de optimización en tiempo de ejecución de la aplicación. Cuanto más
tiempo esté corriendo la aplicación o el applet, los métodos estarán cada vez
más optimizados.
Si un compilador JIT está embebido en el entorno run-time de Java, el
94
CAPÍTULO 3. INTRODUCCIÓN A JAVA
programador no se preocupa de hacer que la aplicación se ejecute óptimamente.
3.18.2
Mantenimiento y Soporte
Uno de los problemas más conocidos que ocurre con el software corporativo
es la demanda de mantenimiento y realimentación. Java no es, ciertamente,
la solución para el problema del mantenimiento, pero es un lenguaje que posée varias características que harán la vida más fácil a los desarrolladores y
mantenedores de aplicaciones.
3.19
Estructuras de Programación
Las estructuras de programación o estructuras de control permiten tomar decisiones y realizar un proceso repetidas veces. Son los denominados bifurcaciones y bucles. En la mayoría de los lenguajes de programación, este tipo de
estructuras son comunes en cuanto a concepto, aunque su sintaxis varía de un
lenguaje a otro. La sintaxis de Java coincide prácticamente con la utilizada
en C/C++, lo que hace que para un programador de C/C++ no suponga
ninguna dificultad adicional.
3.19.1
Sentencias o Expresiones
Una expresión es un conjunto variables unidos por operadores. Son órdenes
que se le dan al computador para que realice una tarea determinada.
Una sentencia es una expresión que acaba en punto y coma (;). Se permite
incluir varias sentencias en una línea, aunque lo habitual es utilizar una línea
para cada sentencia. A continuación se muestra un ejemplo de una línea
compuesta de tres sentencias:
i = 0; j = 5; x = i + j;
3.19.2
Comentarios
Existen dos formas diferentes de introducir comentarios entre el código de Java
(en realidad son tres, como pronto se verá). Son similares a la forma de reali-
3.19. ESTRUCTURAS DE PROGRAMACIÓN
95
zar comentarios en el lenguaje C/C++. Los comentarios son tremendamente
útiles para poder entender el código utilizado, facilitando de ese modo futuras
revisiones y correcciones. Además permite que cualquier persona distinta al
programador original pueda comprender el código escrito de una forma más
rápida. Se recomienda acostumbrarse a comentar el código desarrollado. De
esta forma se simplifica también la tarea de estudio y revisión posteriores.
Java interpreta que todo lo que aparece a la derecha de dos barras “//
” en una línea cualquiera del código es un comentario del programador y no
lo tiene en cuenta. El comentario puede empezar al comienzo de la línea o
a continuación de una instrucción que debe ser ejecutada. La segunda forma
de incluir comentarios consiste en escribir el texto entre los símbolos “ /* */
”. Este segundo método es válido para comentar más de una línea de código.
Por ejemplo:
// Esta línea es un comentario
int a=1; // Comentario a la derecha de una sentencia
// Esta es la forma de comentar más de una línea utilizando
// las dos barras. Requiere incluir dos barras al comienzo de cada línea
/* Esta segunda forma es mucho más cómoda para comentar un número elevado de líneas ya que sólo requiere modificar el comienzo y el final. */
En Java existe además una forma especial de introducir los comentarios
(utilizando /***/ más algunos caracteres especiales) que permite generar automáticamente la documentación sobre las clases y packages desarrollados por el
programador. Una vez introducidos los comentarios, el programa javadoc.exe
(incluido en el JDK) genera de forma automática la información de forma similar a la presentada en la propia documentación del JDK. La sintaxis de estos
comentarios y la forma de utilizar el programa javadoc.exe se puede encontrar
en la información que viene con el JDK.
3.19.3
Bifurcaciones
Las bifurcaciones permiten ejecutar una de entre varias acciones en función
del valor de una expresión lógica o relacional. Se tratan de estructuras muy
importantes ya que son las encargadas de controlar el flujo de ejecución de un
programa. Se exponen dos variantes del de tipo if.
96
CAPÍTULO 3. INTRODUCCIÓN A JAVA
Bifurcación if
Esta estructura permite ejecutar un conjunto de sentencias en función del valor
que tenga la expresión de comparación. Ejemplo: se ejecuta si la expresión de
comparación (error < errorMinimo) tiene valor true:
protected void comprobarNuevoMinimo() {
if (error < errorMinimo)
{errorMinimo = error;
vectorDisMinimo = (double[ ])(vectorDis.clone());
} /* fin del if */
}
Las llaves {} sirven para agrupar en un bloque las sentencias que se han
de ejecutar, y no son necesarias si sólo hay una sentencia dentro del if.
Bifurcación if else
Análoga a la anterior, de la cual es una ampliación. Las sentencias incluidas
en el else se ejecutan en el caso de no cumplirse la expresión de comparación
(false),
Ejemplo:
public double decirSalidaActual(int indiceEtapa) {
if(pila != null)
{return pila[indiceEtapa];}
else
{System.out.println(“Fallo: Pila no creada”);
return 0;
}
}
3.19. ESTRUCTURAS DE PROGRAMACIÓN
3.19.4
97
Bucles
Un bucle se utiliza para realizar un proceso repetidas veces. Se denomina
también lazo o loop. El código incluido entre las llaves {} (opcionales si el
proceso repetitivo consta de una sola línea), se ejecutará mientras se cumpla
unas determinadas condiciones. Hay que prestar especial atención a los bucles
infinitos, hecho que ocurre cuando la condición de finalizar el bucle (booleanExpression) no se llega a cumplir nunca. Se trata de un fallo muy típico,
habitual sobre todo entre programadores poco experimentados.
Bucle while
En el siguiente ejemplo se muestra que se ejecutará la sentencia fin++ mientras
la expresión (capas.charAt(fin)!=‘,’ && capas.charAt(fin)!=-1) sea verdadera.
for (int j=0; j < numeroCapas; j++)
{int fin = principio;
try {
while (capas.charAt(fin) != ‘,’ && capas.charAt(fin) != -1)
{fin++;
}
}
}
Bucle for
A continuación se podrá apreciar la utilización del bucle for:
/* calcular el nuevo vector de diseño */
for (int i = 0; i < vectorDis.length; i++)
{vectorDis[i] = vectorDis[i] + learningRate * S[i];
}
98
CAPÍTULO 3. INTRODUCCIÓN A JAVA
La sentencia int i = 0 (inicialización) se ejecuta al comienzo del for, e
i++ (incremento) después de vectorDis[i] = vectorDis[i] + learningRate * S[i]
(sentencia). La expresión booleana (vectorDis.length) se evalúa al comienzo
de cada iteración; el bucle termina cuando la expresión de comparación toma
el valor false.
Bucle do while
Es similar al bucle while pero con la particularidad de que el control está al
final del bucle (lo que hace que el bucle se ejecute al menos una vez, independientemente de que la condición se cumpla o no). Una vez ejecutados las
sentencias, se evalúa la condición: si resulta true se vuelven a ejecutar las
sentencias incluidas en el bucle, mientras que si la condición se evalúa a false
finaliza el bucle.
do{
/* calcular el gradiente del vector fijar el vector de diseño */
problema.fijoVector(vectorDis);
/* incrementar el contador de iteraciones*/
step++;
} while (error > errorDeseado && step < iteracionesMaximas);
/* ... hasta que el error sea menor o igual que el deseado o */
/* se alcance el número de iteraciones pasado como argumento */
problema.fijoVector(vectorDis);
Sentencia return
Una forma de salir de un bucle es utilizar la sentencia return. Esta sentencia
sale también de un método o de una función. En el caso de que la función
devuelva alguna variable, este valor se deberá poner a continuación del return.
3.19. ESTRUCTURAS DE PROGRAMACIÓN
99
public double devuelveErrorMinimo()
{return errorMinimo;
}
Bloque try{...} catch{...} finally{...}
Java incorpora en el propio lenguaje la gestión de errores. El mejor momento
para detectar los errores es durante la compilación. Sin embargo prácticamente
sólo los errores de sintaxis son detectados en esta operación. El resto de
problemas surgen durante la ejecución de los programas.
En el lenguaje Java, una Exception es un cierto tipo de error o una condición anormal que se ha producido durante la ejecución de un programa.
Algunas excepciones son fatales y provocan que se deba finalizar la ejecución
del programa. En este caso conviene terminar ordenadamente y dar un mensaje explicando el tipo de error que se ha producido. Otras excepciones, 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 (dando por ejemplo un nuevo path del fichero
no encontrado).
Los errores se representan mediante clases derivadas de la clase Throwable,
pero los que tiene que chequear un programador derivan de Exception (java.lang.Exception que a su vez deriva de Throwable). Existen algunos tipos
de excepciones que Java obliga a tener en cuenta. Esto se hace mediante el
uso de bloques try, catch y finally.
El código dentro del bloque try está “vigilado”: Si se produce una situación
anormal y se lanza como consecuencia una excepción, el control pasa al bloque
catch que se hace cargo de la situación y decide lo que hay que hacer. Se pueden
incluir tantos bloques catch como se desee, cada uno de los cuales tratará un
tipo de excepción. Finalmente, si está presente, se ejecuta el bloque finally,
que es opcional, pero que en caso de existir se ejecuta siempre, sea cual sea el
tipo de error.
En el caso en que el código de un método pueda generar una Exception
y no se desee incluir en dicho método la gestión del error (es decir los bucles
try/catch correspondientes), es necesario que el método pase la Exception al
método desde el que ha sido llamado. Esto se consigue mediante la adición de
100
CAPÍTULO 3. INTRODUCCIÓN A JAVA
la palabra throws seguida del nombre de la Exception concreta, después de la
lista de argumentos del método. A su vez el método superior deberá incluir
los bloques try/catch o volver a pasar la Exception. De esta forma se puede ir
pasando la Exception de un método a otro hasta llegar al último método del
programa, el método main().
3.20
Errores más Frecuentes en la Programación
con Java
A continuación se presenta una varios ejemplos de errores, vistos desde el
punto de vista de la portabilidad, porque quizá el sine qua non de Java, en
última instancia sea perseguir una verdadera independencia de plataforma.
Los errores no tienen ningún orden de dificultad, no son más que algunos
de ellos en los que puede caer cualquier programador.
Hay muchísimas formas cometer fallos a la hora de programar en Java; algunas se deben simplemente a malos hábitos y son muy difíciles de encontrar,
mientras que otros saltan a la vista al instante. Los errores de programación
más obvios, también son los que con más frecuencia cometen los programadores.
Quizás muchos de los fallos se evitarían si los programadores intentarán
aplicar calidad a sus programas desde el momento mismo de concebir el programa, y no la tendencia de aplicar pureza a la aplicación en el último momento.
3.20.1
Scheduling de Hilos de Ejecución
El scheduling de los hilos de ejecución, es decir, el tiempo que el sistema
destina a la ejecución de cada uno de los hilos de ejecución, puede ser distinto
en diferentes plataformas. Si no se tienen en cuenta las prioridades o se deja
al azar la prevención de que dos hilos de ejecución accedan a un mismo objeto
al mismo tiempo, el programa no será portable.
El siguiente programa, por ejemplo, no es portable:
class Contador implements Runnable
{
3.20. ERRORES FRECUENTES DE PROGRAMACIÓN
101
static long valor = 0;
public void run() {
valor += 1;
}
public static void main( String args[] )
{
try
{
Thread hilo1 = new Thread( new Contador() );
hilo1.setPriority( 1 );
Thread hilo2 = new Thread( new Contador() );
hilo2.setPriority( 2 );
hilo1.start();
hilo2.start();
hilo1.join();
hilo2.join();
Systtem.out.println( valor );
} catch( Exception e ) {
e.printStackTrace();
}
}
}
Este programa puede no imprimir “2” en todas las plataformas, porque los
dos hilos de ejecución no están sincronizados y, desgraciadamente, este es un
problema muy profundo y no hay forma de detectar su presencia ni adivinar
el momento en que va a ocurrir.
Una solución simple, y drástica, es hacer todos los métodos sincronizados.
Pero esto también tiene problemas porque puede presentar como puntos sin
retorno obvios, lo que en realidad es una corrupción de datos.
102
CAPÍTULO 3. INTRODUCCIÓN A JAVA
El scheduling de los hilos de ejecución es uno de los aspectos más problemáticos de la programación Java, porque la naturaleza del problema se vuelve
global, al intervenir varios hilos de ejecución. No se puede buscar el problema
en una parte del programa, es imprescindible entender y tratar el programa
en su globalidad.
Además, hay ejemplos de contención de hilos que no serán detectados. Por
ejemplo, en la clase Contador anterior no se detectará el problema ya que la
contención está en el acceso al campo, en lugar de en el acceso al método.
3.20.2
Errores en el Uso de las Características de Portabilidad
de Java
Hay características de portabilidad en el API de Java. Es posible, pero menos
portable, escribir código que no haga uso de estas características. Muchas de
las propiedades del sistema proporcionan información sobre la portabilidad;
por ejemplo, se pueden utilizar las propiedades del sistema para conocer cuál
es el carácter definido como fin de línea o el que se emplea como terminador del
archivo, para emplear el adecuado a la plataforma en que se está ejecutando
el programa.
Java proporciona dos métodos para facilitar la escritura de programas
portables en este sentido. Por un lado, utilizar el método println() en vez de
imprimir las cadenas seguidas del terminador de cadena embebido; o también,
utilizar la expresión System.getProperty(“line.separator”) para conocer cuál es
el terminado de línea que se utiliza en la plataforma en que se está ejecutando
el programa.
En general, el uso de las propiedades facilita en gran modo la portabilidad
y debería extenderse su uso siempre que fuese aplicable.
3.20.3
Uso de Directorios Definidos
Un error muy común y fácil de cometer entre los programadores, aunque igual
de fácil de corregir es la designación en el código de nombre de los archivos, que
pueden dar lugar a problemas de portabilidad, pero cuando se añade el directorio en que se sitúan, seguro que estos problemas aparecerán. Estos fallos son
más comunes entre programadores con viejos hábitos, que eran dependientes
del sistema operativo, y que son difíciles de olvidar.
3.20. ERRORES FRECUENTES DE PROGRAMACIÓN
103
La forma más portable de construir un File para un fichero en un directorio es utilizar el constructor File(File,String). Otra forma sería utilizar las
propiedades para conocer cuál es el separador de ficheros y el directorio inicial;
o también, preguntarle al operador a través de una caja de diálogo.
Otro problema es la noción de camino absoluto, que es dependiente del
sistema.
En Unix los caminos absolutos empiezan por /, mientras que en Windows
pueden empezar por cualquier letra. Por esta razón, el uso de caminos absolutos que no sean dependientes de una entrada por operador o de la consulta
de las propiedades del sistema no será portable.
El ejemplo siguiente proporciona una clase útil para la construcción de
nombres de archivos. La última versión del JDK es mucho más exhaustiva, y
detecta más fácilmente los errores cometidos en los directorios y nombres de
ficheros.
import java.io.File;
import java.util.StringTokenizer;
public class UtilFichero {
/* Crea un nuevo fichero con el nombre de otros. Si la base inicial es
* nula, parte del directorio actual
*/
public static File dirInicial( File base,String path[] ) {
File valor = base;
int i=0;
if( valor == null && path.length == 0 ) {
valor = new File( path[i++] );
}
for( ; i < path.length; i++ ) {
valor = new File( valor,path[i] );
}
return( valor );
104
CAPÍTULO 3. INTRODUCCIÓN A JAVA
}
public static File desdeOrigen( String path[] ) {
return( dirInicial( null,path ) );
}
public static File desdeProp( String nombrePropiedad ) {
String pd = System.getProperty( nombrePropiedad );
return( new File( pd ) );
}
// Utilizando la propiedad del sistema “user.dir”
public static File userDir() {
return( desdeProp( “user.dir” ) );
}
// Utilizando la propiedad del sistema “java.home”
public static File javaHome() {
return( desdeProp( “java.home” ) );
}
// Utilizando la propiedad del sistema “user.home”
public static File userHome() {
return( desdeProp( “user.home” ) );
}
3.20. ERRORES FRECUENTES DE PROGRAMACIÓN
105
/* Separa el primer argumento, utilizando el segundo argumetno como
* carácter separador.
* Es muy útil a la hora de crear caminos de ficheros portables
*/
public static String[] split( String p,String sep ) {
StringTokenizer st = new StringTokenizer( p,sep );
String valor[] = new String[st.countTokens()];
for( int i=0; i < valor.length; i++ ) {
valor[i] = st.nextToken();
}
return( valor );
}
}
3.20.4
Carga de Drivers JDBC
El interfaz JDBC, definido por el paquete java.sql, proporciona gran flexibilidad a la hora de codificar la carga del driver JDBC a utilizar. Esta flexibilidad
permite la sustitución de diferentes drivers sin que haya que modificar el código, a través de la clase DriverManager, que selecciona entre los drivers disponibles en el momento de establecer la conexión. Los drivers se pueden poner a
disposición de DriverManager a través de la propiedad del sistema jdbc.drivers
o cargándolos explícitamente usando el método java.lang.Class.forName().
También es posible la carga de una selección de drivers, dejando que el mecanismo de selección de DriverManager encuentre el adecuado en el momento
de establecer la conexión con la base de datos.
Hay que tener siempre en cuenta los siguientes puntos:
106
CAPÍTULO 3. INTRODUCCIÓN A JAVA
• La prueba de drivers se intenta siempre en el orden en que se han registrado, por lo que los primeros drivers tienen prioridad sobre los últimos cargados, con la máxima prioridad para los drivers listados en
jdbc.drivers.
• Un driver que incluya código nativo fallará al cargarlo sobre cualquier
plataforma diferente de la que fue diseñado; por lo que el programa
deberá recoger la excepción ClassNotFoundException.
• Un driver con código nativo no debe registrarse con DriverManager hasta que no se sepa que la carga ha tenido éxito.
• Un driver con código nativo no está protegido por la caja negra de Java,
así que puede presentar potenciales problemas de seguridad.
3.20.5
Terminación de Líneas
Las distintas plataformas de sistemas operativos tienen distintas convenciones
para la terminación de líneas en un fichero de texto. Por esto debería utilizarse
el método println(), o la propiedad del sistema line.separator, para la salida;
y para la entrada utilizar los métodos readLine().
Java internamente utiliza Unicode, que al ser un estándar internacional,
soluciona el problema a la hora de codificar; pero el problema persiste al leer
o escribir texto en un archivo.
En el JDK 1.1 se utilizan las clases java.io.Reader y java.io.Writer para
manejar la conversión del set de caracteres, pero el problema puede surgir
cuando se leen o escriben archivos ASCII planos, porque en el ASCII estándar
no hay un carácter específico para la terminación de líneas; algunas máquinas
utilizan \n, otras usan \r, y otras emplean la secuencia \r\n.
Enarbolando la bandera de la portabilidad, deberían utilizarse los métodos
println() para escribir una línea de texto, o colocar un marcador de fin de línea.
También, usar el método readLine() de la clase java.io.BufferedReader para
recoger una línea completa de texto.
Los otros métodos readLine() son igualmente útiles, pero el de la clase
BufferedReader proporciona al código también la traslación.
3.20. ERRORES FRECUENTES DE PROGRAMACIÓN
3.20.6
107
Entrada/Salida por Archivo
Las clases de entrada y salida del JDK 1.0 no son portables a plataformas que
no soporten formatos nativos de archivos no-ASCII. Es fácil para el programador suponer alegremente que todo el mundo es ASCII. Pero la realidad no
es esa, los chinos y los japoneses, por ejemplo, no puedes escribir nada con los
caracteres ASCII. Hay que tener esto en cuenta si se quiere que los programas
viajen fuera del país propio.
3.20.7
Fuentes de Caracteres
El tamaño y disponibilidad de varios tipos de fuentes varía de pantalla a pantalla, incluso en una misma plataforma hardware, dependiendo de la instalación
que se haya hecho. Esto es algo que no descalifica totalmente el programa,
porque se verá defectuosamente, pero el programa podrá seguir usándose; pero debería prevenirse, porque se presupone que el programador desea que su
software aparezca de la mejor manera posible en cualquier plataforma.
El modo mejor de evitar todo esto es no codificar directamente el tamaño
de los textos, dejar que los textos asuman su tamaño en relación al layout, y
utilizar los métodos de la clase FontMetrics para encontrar el tamaño en que
aparecen los caracteres de una cadena sobre un Canvas. Cuando se coloca una
fuente que no se encuentra entre las de defecto, hay que asegurarse siempre
de colocar alguna de respaldo en el bloque catch.
Cuando se crea un menú para seleccionar fuentes de caracteres, se debería
utilizar el método java.awt.Toolkit.getFontList(), en lugar de especificar una
lista de fuentes.
Cuando se actualice un programa del JDK 1.0 al JDK 1.1, hay que tener
en cuenta que los nombre de las fuentes de caracteres se han actualizado, tal
como se indica en la documentación del método getFontList().
Capítulo 4
Introducción a WebSphere
Aplicación Server
4.1
¿Que es WebSphere?
• WebSphere es una plataforma de Software para e-business.
• IBM WebSphere es una plataforma de IBM para desarrollo y gestión
de sitios web y aplicaciones destinadas al comercio electrónico y a otros
usos.
109
110
CAPÍTULO 4. INTROD. A WEBSPHERE APLICACIÓN SERVER
Figura 4.1: Plataforma de WebSphere.
• WebSphere posee una amplia gama de servidores y aplicaciones para
proporcionar todo tipo de capacidades de negocio y ayuda al desarrollo
de las aplicaciones.
• La Plataforma de Software WebSphere está compuesta por un conjunto
de herramientas de e-business integradas y basadas en estándares abiertos de mercado.
• WebSphere es ideal para todas las fases de un e-business, comenzando
desde pequeños sitios Web a mega sitios.
La figura 4.1 de la pág. 110 representa la plataforma virtual de WebSphere.
4.2. INCREMENTO DEL DESEMPEÑO DE LAS APLICACIONES
4.2
111
Incremento del Desempeño de las Aplicaciones
• Distribuye carga de trabajo entre los servidores sin interrupción del servicio a los visitantes del sitio de la Web.
• Provee servicios a cliente de calidad superior y mejor desempeño del sitio
Web.
El extraordinario crecimiento de la web ha hecho que una infraestructura
fiable, disponible y escalable sea más necesaria que nunca. Una interrupción,
aunque sea breve, o reducción de servicio puede causar que los clientes web,
cada vez más sofisticados y exigentes, se dirijan inmediatamente a la competencia.
Cuando clientes frustrados pueden abandonar un sitio web con un click,
las nociones tradicionales sobre lealtad de clientes se ven severamente desafiadas. Por eso, los propietarios de contenido necesitan una infraestructura en la
web que sea capaz de proporcionar excelentes tiempos de respuesta de forma
consistente, tratar flash crowds (multitud de visitas rápidas) y reconocer los
clientes leales con tratamiento preferente.
La plataforma de software WebSphere proporciona una completa gama de
habilidades que permiten a los clientes la entrega de altos niveles de servicio
a todos los visitantes del sitio en la web.
Administra cargas pico en los servidores web, mantiene la disponibilidad
del sitio en la web, y reconoce contenido de solicitudes de la web para calidadde-servicio mejor. También permite la diferenciación de niveles de servicio
con base en el tipo de cliente.
4.3
El WebSphere para la Integración en el e-business
on demand
En el núcleo del e-business on demand se encuentra la integración de negocios,
que comprende lo siguiente:
• Transformarse en un negocio on demand requiere construir una infraestructura dinámica basada en procesos de negocio críticos estrechamente
integrados y racionalizados.
112
CAPÍTULO 4. INTROD. A WEBSPHERE APLICACIÓN SERVER
• Procesos eficientemente conectados en toda la compañía y con las de
socios comerciales claves, proveedores y clientes.
• Procesos de negocio integrados que proporcionan flexibilidad, la capacidad de responder inmediatamente a casi todas las demandas de clientes,
oportunidad de mercado o amenaza externa.
Para obtener esta flexibilidad, la clave es una estrategia de integración bien
planificada, basada en una plataforma robusta. Una plataforma para:
• Automatizar y administrar procesos de la cadena de valor.
• Cortar drásticamente tiempos de ciclo y costos.
• Dar más velocidad al time-to-market.
• Aumentar la agilidad del negocio frente a las presiones competitivas.
Las compañías que evolucionan hacia el e-business on demand hacen del
WebSphere Business Integration el principio básico de su estrategia de integración. WebSphere proporciona una sólida base de integración con las capacidades completas de e-business que se necesitan en una era on demand.
Estas cinco capacidades incluyen:
• Modelar : Diseñar, simular y planificar procesos de negocio.
• Integrar : Vincular personas, procesos, aplicaciones, sistemas y datos.
• Conectar : Expandir procesos a sus clientes y socios.
• Monitorear: Controlar y rastrear procesos de negocio.
• Administrar: Revisar, analizar y mejorar procesos y desempeño.
4.4
Plataforma de Software
La complejidad creciente de los aplicativos de e-business crea muchos desafíos.
Es necesario conseguir que los aplicativos le permitan comercializar rápidamente, con contenido relevante y personalizado [27].
4.4. PLATAFORMA DE SOFTWARE
113
Se necesita una plataforma completa, escalable y flexible que proporcione
soporte a la construcción y diseminación de aplicativos de e-learning.
Las soluciones de software WebSphere ofrecen las herramientas necesarias
para alcanzar los objetivos de e-learning.
Al proporcionar un banco de trabajo abierto que integre y simplifique
diferentes tareas, roles y herramientas, el software WebSphere ayuda a que el
equipo desarrolle, entregue y administre los aplicativos de e-learning [16].
El ambiente de desarrollo del software WebSphere:
• Da soporte al desarrollo y cambios rápidos de nuevos aplicativos utilizando un paradigma de desarrollo basado en reglas, permitiendo que
todos utilicen el mismo ambiente y reduciendo costes de entrenamiento.
• Proporciona código pre-construido, pre-testeado.
• Proporciona herramientas especializadas para página Web y desarrollo
de módulos migrables.
Adicionalmente, servicios basados en estándares Web permiten mezclar y
combinar componentes funcionales de diferentes orígenes de tal forma que se
puede proveer nuevos procesos y servicios al mercado rápida y eficientemente.
La capacidad de un portal de aprendizaje tiene importancia crítica para
permitir que las personas interactúen y transaccionen de forma personalizada
con diversos recursos de aprendizaje.
114
4.5
CAPÍTULO 4. INTROD. A WEBSPHERE APLICACIÓN SERVER
Application Server
La plataforma de alto desempeño y extrema escalabilidad para diseminar
aplicativos dinámicos, WebSphere Application Server, Versión 4.0, proporciona las funciones esenciales de manipulación de transacciones y ampliación
de datos back-end de aplicativos para la Web. La plataforma ayuda a construir aplicativos que ejecutan esas funciones con seguridad sólida, fiabilidad y
escalabilidad.
4.5.1
Application Server. Advanced Edition
La Edición Avanzada es la oferta del principal servidor de aplicativo dirigido
a desarrolladores profesionales de tecnología Java que necesitan funcionalidad
de servicios J2EE y Web para aplicativos dinámicos.
La Edición Avanzada del WebSphere Application Server Versión 4.0, está
disponible en tres configuraciones distintas:
• Edición Avanzada:
Proporciona integración sólida a las bases de datos, middleware orientado
a mensajes, y sistemas preexistentes y aplicativos, en conjunto con soporte de
4.5. APPLICATION SERVER
115
agrupación. Esta configuración se ajusta a la mayoría de los escenarios de la
empresa e interesa a los negocios que necesitan construir aplicativos altamente
transaccionales, administrables, disponibles y escalables que ofrecen seguridad
distribuida y administración remota.
• Edición Avanzada del Single Server:
Proporciona el mismo modelo de programación esencial J2EE y Web Services con administración simplificada. Esta configuración interesa a departamentos, negocios de tamaño mediano y aplicativos piloto que necesitan un
coste bajo, opción de ejecución rápida, distribución de carga de trabajo o
administración remota asociados a administración de multi-servidor.
• Edición Avanzada del IBM WebSphere Application Server V4.0, para
Linux en zSeries:
La Edición Avanzada del WebSphere Application Server V4.0, para Linux
en zSeries continúa cumpliendo el compromiso de IBM en cuanto a mantener
cobertura amplia para plataformas para el WebSphere Application Server.
Este producto WebSphere tiene la combinación potente de un conjunto de
dispositivos rico y soporte a estándares abiertos del WebSphere Application
Server y el ambiente operacional familiar del sistema operativo Linux.
También contiene los recursos de administración, alta fiabilidad, y la intensa velocidad de comunicación de datos internos del hardware de la plataforma
zSeries.
4.5.2
Application Server. Enterprise Edition
La Edición empresarial del IBM WebSphere Application Server Versión 4.1, en
conjunto con IBM WebSphere Studio Application Developer Integration Edition, ofrece una combinación potente de tiempo de ejecución y herramienta
que permite integrar activos IT existentes, mejorar la productividad del desarrollador y crear y mantener aplicativos flexibles.
Juntos, el IBM’s WebSphere Application Server 4.1 Enterprise Edition y
el WebSphere Studio Application Developer Integration Edition ofrecen ahora
a los desarrolladores la capacidad de:
116
CAPÍTULO 4. INTROD. A WEBSPHERE APLICACIÓN SERVER
• Coreografiar visualmente y componer servicios de la Web y componentes
de aplicativo J2EE a través de una interfase de simple drag-and-drop.
• Construir potentes adaptadores de aplicativo basados en J2EE Connector Architecture (JCA) para integrar sistemas back-end con servicios
Web y aplicativos J2EE.
• Crear una paleta de componentes de aplicativos que puede ser rápidamente montada para desarrollar nuevos aplicativos fácilmente publicada
como servicio Web.
• Evitar la repetición del desarrollo y diseminación de aplicativos debido a
condiciones cambiantes del mercado, separando las políticas del negocio
de la lógica de aplicativos esenciales.
• Obtener una infraestructura completa de servicios Web que impulse un
ambiente único, eficaz en cuanto a coste de tiempo de ejecución del
servidor de aplicativo administrativo y operacional.
4.5.3
Application Server. Standard Edition
La Edición Estándar para desarrolladores de la web y autores de contenido
incluye mejorías de facilidad de uso en toda su extensión, comprendiendo un
Quick Installation que elimina conjeturas en cuanto al Enhanced Java, impulsando el Software Development Kit del Java 2 V1.2.2 en todos los sistemas
operativos soportados.
4.5.4
Servidor HTTP
IBM WebSphere Application Server trabaja con un servidor HTTP para manejar las peticiones de servlets y otros contenidos dinámicos desde las aplicaciones Web.
El servidor HTTP y el servidor de aplicaciones se comunican utilizando
el plug-in HTTP de WebSphere para el servidor HTTP. El plug-in HTTP
utiliza un archivo de configuración XML de fácil lectura para determinar si la
petición la debe gestionar el servidor Web o el servidor de aplicaciones. Utiliza
el protocolo HTTP estándar para comunicarse con el servidor de aplicaciones.
4.5. APPLICATION SERVER
117
También se puede configurar para implementar seguridad en el servidor
HTTP, si fuera necesario. El plug-in HTTP está disponible para los servidores
Web más conocidos.
4.5.5
Servidor de Aplicaciones
El servidor de aplicaciones colabora con el servidor Web intercambiando peticiones de clientes y respuestas de aplicaciones. Puede definir varios servidores
de aplicaciones, cada uno de ellos ejecutándose en su propia Máquina Virtual
Java (JVM).
4.5.6
Contenedor de EJB
El contenedor de EJB proporciona los servicios de tiempo de ejecución necesarios para desplegar y gestionar componentes EJB, de ahora en adelante
conocidos como enterprise beans. Es un proceso de servidor que maneja peticiones para beans de sesión y beans de entidad.
Los enterprise beans (dentro de los módulos EJB) instalados en un servidor de aplicaciones no se comunican directamente con el servidor; en su lugar,
el contenedor de EJB ofrece una interfaz entre los enterprise beans y el servidor. Juntos, el contenedor y el servidor proporcionan el entorno de tiempo de
ejecución del bean.
El contenedor proporciona muchos servicios de bajo nivel, incluido el soporte de hebras y transacciones. Desde un punto de vista administrativo, el
contenedor gestiona el almacenamiento y la recuperación de datos para los
beans que contiene. Un solo contenedor puede gestionar más de un archivo
JAR de EJB.
4.5.7
Contenedor Web
Los servlets y los archivos JSP (Java Server Pages) son componentes del servidor que se utilizan para procesar peticiones de clientes HTTP como, por
ejemplo, navegadores Web. Se encargan de la presentación y el control de
la interacción del usuario con los datos de aplicación subyacentes y la lógica
empresarial. También pueden generar datos formateados, como XML, para
que los utilicen otros componentes de aplicación.
118
CAPÍTULO 4. INTROD. A WEBSPHERE APLICACIÓN SERVER
El contenedor Web procesa servlets, archivos JSP y otros tipos de inclusiones de servidor. Los servlets anteriores a J2EE se ejecutarán en un motor
de servlets. Cada contenedor Web contiene automáticamente un único gestor
de sesiones.
Cuando se manejan los servlets, el contenedor Web crea un objeto de
petición y un objeto de respuesta, e invoca el método de servicio de servlets.
El contenedor Web invoca el método destroy() del servlet cuando corresponda
y descarga el servlet, y después la JVM ejecuta la recolección de basura.
4.5.8
Contenedor de Clientes de Aplicaciones
Los clientes de aplicaciones son programas Java que se ejecutan normalmente
en un sistema de sobremesa con una interfaz gráfica de usuario (GUI) . Tienen
acceso a toda la gama de componentes y servicios de servidor J2EE.
El contenedor de clientes de aplicaciones maneja programas de aplicaciones de Java que acceden a los beans enterprise, Java Database Connectivity
(JDBC) y las colas de mensajes de Java Message Service. El programa Cliente
de aplicaciones J2EE se ejecuta en las máquinas cliente.
Este programa sigue el mismo modelo de programación Java que otros
programas Java; no obstante, el cliente de aplicaciones J2EE depende del
tiempo de ejecución del cliente de aplicaciones para configurar su entorno de
ejecución, y utiliza el espacio de nombres JNDI (Java Naming and Directory
Interface) para acceder a los recursos.
4.5.9
Contenedor de Applets
Un applet es una clase Java de cliente que se ejecuta normalmente en un
navegador Web, pero que también se pueden ejecutar en otros dispositivos y
aplicaciones de cliente.
Los applets se utilizan a menudo junto con páginas HTML para mejorar
la experiencia de usuario que ofrece el navegador Web. También se pueden
utilizar para pasar parte de la carga de trabajo de proceso del servidor al
cliente.
El contenedor de applets maneja applets de Java incorporados en documentos HTML (HyperText Markup Language) que residen en una máquina
4.6. ARQUITECTURAS DE TRES NIVELES
119
cliente remota respecto al servidor de aplicaciones. Con este tipo de cliente,
el usuario accede a un bean enterprise en el servidor de aplicaciones mediante
el applet de Java en el documento HTML.
4.5.10
Sistema Principal Virtual
Un sistema principal virtual es una configuración que permite que una única
máquina de sistema principal parezca varias máquinas de sistema principal.
Los recursos asociados con un sistema principal virtual no pueden compartir
datos con recursos asociados con otro sistema principal virtual, incluso si los
sistemas principales virtuales comparten la misma máquina física.
Los sistemas principales virtuales permiten al administrador asociar aplicaciones Web con un sistema principal particular configurado para la máquina
que ejecuta la aplicación.
4.6
Arquitecturas de Tres Niveles
WebSphere Application Server proporciona la capa de la lógica de aplicación
en una arquitectura de tres niveles, lo que permite a los componentes de cliente
interactuar con los recursos de datos y las aplicaciones heredadas.
De manera colectiva, las arquitecturas de tres niveles son modelos de programación que permiten la distribución de la funcionalidad de la aplicación
entre tres sistemas independientes, normalmente:
• Componentes de cliente que se ejecutan en estaciones de trabajo locales
(nivel uno).
• Procesos que se ejecutan en servidores remotos (nivel dos).
• Una colección discreta de bases de datos, gestores de recursos y aplicaciones de sistema principal (nivel tres).
Primer nivel:
— La responsabilidad de la presentación y la interacción con el usuario
reside en los componentes del primer nivel. Estos componentes de
120
CAPÍTULO 4. INTROD. A WEBSPHERE APLICACIÓN SERVER
cliente permiten al usuario interactuar con los procesos del segundo
nivel de forma segura e intuitiva. WebSphere Application Server da
soporte a varios tipos de clientes.
— Los clientes no acceden directamente a los servicios del tercer nivel.
Por ejemplo, un componente de cliente proporciona un formulario
en el que el cliente solicita los productos.
— El componente de cliente entrega este pedido a los procesos del
segundo nivel, que comprueban las bases de datos del producto y
realizan las tareas necesarias para la facturación y el envío.
Segundo nivel (capa de la lógica de aplicación):
— Los procesos del segundo nivel se conocen normalmente como la
capa de la lógica de aplicación. Estos procesos gestionan la lógica
empresarial de la aplicación y pueden acceder a los servicios del
tercer nivel.
— La capa de la lógica de aplicación es donde se produce la mayor
parte del trabajo de los procesos.
— Varios componentes de cliente pueden acceder simultáneamente a
los procesos del segundo nivel, por lo que esta capa de la lógica de
aplicación debe gestionar sus propias transacciones.
— Si varios clientes intentan realizar un pedido del mismo artículo,
del que sólo queda uno, la capa de la lógica de aplicación debe
determinar quién tiene derecho a ese artículo, actualizar la base
de datos para reflejar la compra e informar a los otros clientes de
que el artículo ya no está disponible. Sin una capa de la lógica de
aplicación, los componentes de cliente acceden a la base de datos
del producto directamente.
— La base de datos es necesaria para gestionar sus propias conexiones,
normalmente bloqueando un registro que se está procesando. El
bloqueo se puede realizar simplemente cuando un artículo se coloca
en un carro de compra, para evitar que los demás clientes consideren
la posibilidad de compra.
— La separación del segundo y el tercer nivel reduce la carga en los
servicios del tercer nivel, puede mejorar el rendimiento general de
la red y permite una gestión de conexiones más elocuente.
Tercer nivel:
4.7. FAMILIAS DEL PRODUCTO
121
— Los servicios del tercer nivel están protegidos del acceso directo de
los componentes de cliente al residir en una red segura.
— La interacción debe producirse a través de los procesos del segundo
nivel.
Los tres niveles deben poder comunicarse entre ellos. Los protocolos abiertos estándar y las API expuestas simplifican esta comunicación. Los componentes de cliente se pueden escribir en cualquier lenguaje de programación
como, por ejemplo, Java o C++, y se puedan ejecutar en cualquier sistema
operativo, siempre que pueden comunicarse con la capa de la lógica de aplicación.
De la misma forma, las bases de datos del tercer nivel pueden tener cualquier diseño, siempre que la capa de la lógica de aplicación pueda consultarlas
y manipularlas. La clave de esta arquitectura es la capa de la lógica de aplicación.
4.7
Familias del Producto
El ambiente operativo principal debe ser una base confiable que permita de forma segura, transacciones e implementaciones de servicios en la Web
de forma abierta. En otras palabras, debe ser una infraestructura abierta,
122
CAPÍTULO 4. INTROD. A WEBSPHERE APLICACIÓN SERVER
basada en servicios, como la proporcionada por la familia del WebSphere Application Server, un mecanismo de alto desempeño, extremadamente escalable
para aplicaciones de e-business dinámicos.
En el caso en que nuevas aplicaciones tengan que ser desarrolladas, estas
necesitan ser creadas de forma que capturen el conocimiento de negocio de
forma eficaz, y construidas para integrarse, de manera que se ajusten rápidamente al ambiente existente, y a impulsarlo. Esta capacidad de desarrollo de
aplicaciones es proporcionada por la familia WebSphere Studio.
Las inversiones existentes en sistemas y aplicaciones, tan dispares cuanto
puedan ser, deben ser utilizadas por el e-business para bajar costos y preservar
inversiones. Esta capacidad de modernización de la empresa es proporcionada
por herramientas especializadas de desarrollo de la familia WebSphere Studio
y a través de la familia WebSphere Host Integration, que es software destinado
a impulsar y extender los activos legados para nuevas soluciones de e-business.
El WebSphere Host Integration Solution puede llevar sus aplicativos preexistentes a la Web, rápidamente extiende los aplicativos de host a la Web
y proporciona software para la creación y diseminación de nuevos aplicativos
para host, sin necesidad de cambios a los propios aplicativos existentes.
Tanto si se necesita una simple entrega de página Web, darle un nuevo aspecto a un aplicativo preexistente, o crear soluciones Java sofisticadas, el IBM
WebSphere Host Integration Solution permite rápida y flexiblemente integrar
datos críticos de la empresa la Web.
El WebSphere Host Publisher proporciona la manera más rápida, más fácil
para implementar e-business mediante la ampliación del alcance de aplicativos
a los usuarios de browsers en la web y nuevos aplicativos WebSphere, sin
alteraciones a aplicativos existentes.
Las características clave son:
• Proporciona integración Web con Terminal Virtual 3270, 5250(VT), Java
Database Connectivity (JDBC) y aplicativos Java host sin necesidad de
cambios al propio aplicativo existente.
• Permite la fácil consolidación de múltiples aplicativos en un aplicativo
compuesto único o página Web para presentación a usuarios de la Web.
• Se integra con la Edición Avanzada del WebSphere Application Server
e incluye el WebSphere Studio para proporcionar una solución completa
4.8. LA FAMILIA DE HERRAMIENTAS WEBSPHERE STUDIO
123
para la entrega de datos del host a usuarios de la Web y para nuevos
aplicativos WebSphere.
• Opera con el Websphere Transcoding Publisher para extender datos del
host a tecnologías penetrantes como los dispositivos SmartPhone y asistentes digitales personales.
• Proporciona una amplia gama de opciones de acceso al Host: HTML a
browsers de la Web, XML Gateway para aplicativos Java, y Host Publisher Integration Objects reutilizables para aplicativos de Java applets
aplicativos.
• Ayuda a impulsar la inversión en Host Publisher utilizando objetos de
integración basados en estándares abiertos de la industria que se pueden reutilizar en nuevos aplicativos, reduciendo el coste y los riesgos
asociados al desarrollo de nuevos aplicativos.
• Puede ser implementado sin programación utilizando una simple interface gráfica del tipo wizard (asistente).
• Remote Integration Objects (RIO) permite que Integration Objects sean
ejecutados en el servidor Host Publisher para ser accedido por aplicativos
con tecnología Java siendo ejecutados en cualquier lugar de la red.
• El XML Gateway torna datos existentes de aplicativos de host disponibles para aplicativos cliente o Business Partner Java en un formato
XML.
• El 3270/5250 HTML Mapper proporciona un emulador HTML de nivel
de entrada load-and-go dentro de una ventana de browser de la Web.
4.8
La Familia de Herramientas WebSphere Studio
WebSphere Studio proporciona un conjunto de herramientas para facilitar el
desarrollo de aplicaciones Web. Posee un entorno visual para la distribución
de los elementos de una página web usando Java Server Pages (JSPs), HTML,
Java Script, y DHTML, ayudando además, a un rápido desarrollo de aplicaciones de comercio electrónico con contenido dinámico.
Una fácil integración entre WebSphere Studio, Java VisualAge, y WebSphere Application Servers hace que la comunicación y el trabajo en grupo para
124
CAPÍTULO 4. INTROD. A WEBSPHERE APLICACIÓN SERVER
la creación de aplicaciones de comercio electrónico basadas en Web, sea mucho
más sencillo.
La familia IBM WebSphere Studio consta de una serie de productos basados en Eclipse, que es una plataforma de código abierto para crear herramientas de desarrollo de aplicaciones.
Cada producto de la familia WebSphere Studio presenta el mismo entorno
de desarrollo integrado (IDE) y una base común de herramientas, por ejemplo
para el desarrollo Java y Web. La diferencia entre estos productos radica en
las herramientas de conector que están disponibles en cada configuración.
WebSphere Studio es un único entorno de desarrollo completo diseñado
para satisfacer todas las necesidades de desarrollo, desde interfaces Web a
aplicaciones del lado del servidor, desde el desarrollo individual a desarrollos
avanzados en equipo, desde el desarrollo Java a la integración de aplicaciones.
Con varias configuraciones disponibles, así como extensiones de IBM y de
terceros, la familia WebSphere Studio permite a los desarrolladores utilizar un
único entorno de desarrollo diseñado para satisfacer sus necesidades específicas.
Esta visión general describe las siguientes configuraciones:
• IBM WebSphere Studio Site Developer.
• IBM WebSphere Studio Application Developer.
• IBM WebSphere Studio Application Developer Integration Edition.
• IBM WebSphere Studio Enterprise Developer.
• IBM WebSphere Homepage Builder.
Tanto para los usuarios que estén construyendo páginas Web como para
los grandes equipos que construyan aplicaciones Web avanzadas, la familia
WebSphere Studio proporciona herramientas y asistentes para simplificar las
tareas de desarrollo Web.
El entono incluye una interfaz intuitiva de tipo WYSIWYG (....lo que se
ve es lo que se obtiene....) que permite a los diseñadores Web novatos crear
y publicar sitios Web al tiempo que incorpora lo último en tecnología Web,
incluyendo Java Script, HTML dinámico y hojas de estilo en cascada.
4.8. LA FAMILIA DE HERRAMIENTAS WEBSPHERE STUDIO
125
El entorno completo y fácil de utilizar de la familia WebSphere Studio
permite construir aplicaciones Java, adaptadores de aplicaciones y servicios
Web. También puede integrar la aplicación con sistemas de fondo utilizando herramientas visuales para crear adaptadores de aplicaciones y desarrollar
componentes de GUI Java (Swing y AWT) mediante el Editor visual para
Java.
Para construir aplicaciones J2EE complejas y escalables con una calidad
homogénea en menor tiempo, la familia WebSphere Studio proporciona configuraciones para el desarrollo rápido de aplicaciones que utilizan el poder de la
automatización de lógica empresarial para proporcionar sistemas de empresa
altamente configurables y escalables con una codificación manual mínima.
Esta familia de productos ofrece un entorno de desarrollo integrado que
abarca todos los cometidos de desarrollo de aplicaciones: desarrollador Web,
desarrollador Java, programador de aplicaciones, analista de gestión y arquitecto de sistemas.
Capítulo 5
Servlet
5.1
Desarrollando Servlets
Los servlets son programas de Java que construyen respuestas dinámicas para
el cliente, tal como páginas Web. Los servlets reciben y responden a las
demandas de los clientes Web, normalmente por HTTP.
Los servlets son más eficientes que los programas (CGI) porque son cargados de una sola vez en la memoria, y cada demanda es manejada por un hilo
127
128
CAPÍTULO 5.
SERVLET
de la máquina virtual de Java, no por el sistema operativo.
Además los servlets son escalables, dando soporte para una multi-aplicación
de configuración del servidor. [16, IBM Press]
Permiten utilizar datos caché, acceso a información de base de datos, y
compartir datos con otro servlets, archivos JSP y (en algunos ambientes) con
los bean empresariales.
5.1.1
Principios de Codificación de Servlet
Para crear un servlet de HTTP, es necesario extender las clases:
javax.servlet.HttpServlet y sustituir cualquier método que se desee implementar en el servlet. Por ejemplo, un servlet reemplaza el método doGet para
manejar las demandas Get de los clientes.
El HttpServletRequest representa los requerimientos de un cliente. Este
objeto da acceso al servlet, a la información incluida como datos en formato
HTML, encabezados HTTP, etc.
El HttpServletResponse representa la respuesta del servlet.
El servlet usa este objeto para devolverle datos al cliente como errores
de HTTP (200, 404, y otros), encabezados de respuesta (Content-Type, SetCookie, y otros), y datos de salida para escribir cadenas de salida de respuesta
o salida impresa.
El principio de un servlet podría parecerse al siguiente ejemplo:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
5.1. DESARROLLANDO SERVLETS
5.1.2
129
Ciclo de Vida del Servlet
Las clases javax.servlet.http.HttpServlet definen métodos tales como:
• Iniciar un servlet.
• Solicitar servicios.
• Quitar un servlet del servidor.
Éstos son conocidos como métodos del ciclo de vida y son llamados en la
siguiente secuencia:
• Se construye el servlet.
• Se inicializa con el método INIT.
• Se manejan llamadas de los clientes al método de servicio.
• Se saca el servlet de servicio.
• Se destruye con el método destruir.
• Se finaliza el servlet y la basura es recolectada.
(Ver Figura 5.1 de la pág. 130).
5.1.3
Instanciación e Inicialización
El motor del servlet (la función del Servidor de Aplicaciones que procesa servlets, archivos JSP, y otros tipos de server-side incluyendo codificación) crea
una instancia del servlet. El motor del servlet crea el objeto de configuración
del servlet y lo usa para pasar los parámetros de inicialización del servlet al
método INIT. La inicialización de los parámetros persiste hasta que el servlet se destruye y es aplicada a todas las invocaciones de ese servlet hasta
destruirse.
Si la inicialización tiene éxito, el servlet está disponible para el servicio. Si
la inicialización falla, el motor del servlet descarga el servlet. El administrador
puede inhabilitar una aplicación y el servlet para el servicio. En tales casos,
la aplicación y el servlet permanecen inhabilitados hasta que el administrador
los habilite.
130
CAPÍTULO 5.
SERVLET
Figura 5.1: Ciclo de vida de un servlet.
5.1.4
Servicio de Demanda
Una demanda del cliente llega al servidor de aplicaciones. El motor del servlet
crea un objeto demanda y un objeto respuesta. El motor del servlet invoca
al método de servicio del servlet, procesa el requerimiento y usa métodos del
objeto respuesta para crear la respuesta para el cliente.
El método de servicio recibe información sobre el requerimiento del objeto
demanda, procesa el requerimiento, y usa los métodos del objeto respuesta
para crear la contestación para el cliente. El método de servicio puede invocar
otros métodos para procesar el requerimiento, tales como doGet (), doPost (),
o métodos del usuario.
5.1.5
Terminación
El motor del servlet invoca al método destroy () del servlet cuando apropia
y descarga el servlet. La Máquina Virtual de Java realiza la recolección de
basura después de la destrucción del servlet.
Cuando el contenedor Web ya no necesita que el servlet o una nueva ins-
5.1. DESARROLLANDO SERVLETS
131
Figura 5.2: Requerimiento de un archivo JSP.
tancia del servlet se recarguen, invoca al método destroy () del servlet. El
contenedor Web también puede llamar al método destroy () si el motor necesita conservar recursos o una llamada pendiente a un método service () del
servlet excediendo el timeout. La Máquina Virtual de Java realiza recolección
de basura después del destroy.
5.1.6
Modelos de Acceso JSP
Se puede acceder a los archivos JSP de dos maneras:
El browser envía un requerimiento para los archivos JSP.
Los archivos JSP acceden a los beans u otros componentes que generan
contenido dinámico para ser enviado al browser (Ver Figura 5.2 de la pág.
131).
Cuando el servidor Web recibe un requerimiento para un archivo JSP, el
servidor envía ese requerimiento al servidor de aplicaciones. El servidor de
aplicaciones analiza el archivo JSP y genera código fuente de Java que se
compila y se ejecuta como un servlet.
El requerimiento se envía a un servlet que genera contenido dinámico y
llama a un archivo JSP para enviar el contenido a un browser (Ver Figura 5.3
de la pág. 132).
Este modelo de acceso facilita la generación de contenido separado del
132
CAPÍTULO 5.
SERVLET
Figura 5.3: Requerimiento de un servlet.
despliegue de contenido.
El servidor de aplicaciones proporciona un juego de métodos en el objeto
HttpServiceRequest object y el objeto HttpServiceResponse. Estos métodos
permiten una invocación de servlet para colocar un objeto (normalmente un
bean) en un objeto demanda y pasa ese requerimiento a otra página (normalmente un archivo JSP) para el despliegue. La página invocada recupera el
beans del objeto demanda y genera el HTML que recibe el cliente.
5.1.7
Procesadores JSP
Cada procesador de JSP es un servlet que se puede adherir a una aplicación
Web para manejar todos los requerimientos JSP pertenecientes a la misma.
Cuando se instala el Application Server en un servidor Web, la configuración del servidor Web pasa los requerimientos HTTP para los archivos JSP
(archivos con la extensión .jsp) al Application Server.
El procesador de JSP crea y compila un servlet desde cada archivo JSP.
El procesador produce estos archivos para cada JSP:
• Archivos Java que contienen el código del lenguaje Java para el servlet.
• Archivos de clase que se compilan en el servlet.
5.1. DESARROLLANDO SERVLETS
133
El procesador de JSP pone los archivos .java, y .class en un camino específico al procesador. Los archivos .java y .class tienen el mismo nombre de
archivos. El procesador usa una convención de denominación que incluye el
agregado de subrayado de los caracteres y un sufijo para el nombre del archivo
JSP.
Por ejemplo, si el nombre del archivo JSP es simple.jsp, los archivos generados son: _simple_xjsp.java y _simple_xjsp.class.
Como todos los servlets, un servlet generado desde un archivo JSP se extiende desde javax.servlet.http.HttpServlet. El código Java de servlet contiene
declaraciones de importación para las clases necesarias y una declaración de
paquete, si la clase del servlet es parte de un paquete.
Si el archivo JSP contiene sintaxis de JSP (como directivas y scriptlets), el
procesador de JSP convierte la sintaxis de JSP al código Java equivalente. Si
el archivo JSP contiene etiquetas HTML, el procesador agrega el código Java
a fin de que el servlet realice la salida de HTML carácter por carácter.
5.1.8
Compilación Batch de Archivos JSP
WebSphere Application Server proporciona un compilador batch de JSP. Al
usar la función del compilador batch de archivos JSP, se habilitan respuestas
más rápidas al requerimiento inicial del cliente para los archivos JSP en el
servidor Web de producción.
El compilador batch ahorra recursos del sistema y proporciona seguridad en
el servidor de aplicaciones, especificando cuándo el servidor está chequeando
un archivo de clase o recompilando un archivo JSP. El servidor de aplicaciones
supervisará la compilación de los archivos JSP para cambios, y automáticamente compilará y recargará los archivos JSP, siempre que el servidor de aplicaciones descubra que el archivo JSP ha cambiado. Modificando este proceso,
se puede ahorrar tiempo y recursos consumidos por las compilaciones y asegurar que se tenga el control de la compilación de los archivos JSP. También es
útil como una manera rápida al sincronizar todos los archivos JSP para una
aplicación.
134
5.1.9
CAPÍTULO 5.
SERVLET
Desarrollando Aplicaciones
Para WebSphere Application Server, las aplicaciones son combinaciones de
bloques que trabajan conjuntamente para el logro de una función de la lógica
comercial. Las aplicaciones Web son grupos de uno o más servlets, más el
contenido estático.
Aplicaciones Web = servlets + archivos JSP + archivos XML + archivos
HTML + gráficos.
El modelo de programación de WebSphere Application Server está basado
en la plataforma Java de Sun (J2SE). El ambiente J2SE soporta la base para
construir redes centrales de aplicaciones empresariales para correr sobre una
variedad de sistemas. El software J2SE consiste en los Java SDK Standard
Edition y el Java Runtime Environment (JRE) Standard Edition.
5.1.10
Fases de Inicialización y de Terminación
Un motor del servlet crea una instancia de un servlet en los siguientes momentos:
• Automáticamente en el arranque de la aplicación, si esa opción se configura para el servlet.
• En la primera demanda del cliente para el servlet después del arranque
de la aplicación.
• Cuando el servlet se vuelve a cargar.
El método INIT ejecuta sólo una vez durante la vida del servlet. Ejecuta
cuando el motor del servlet carga el servlet. Con el Application Server se
puede configurar el servlet para ser cargado cuando comienza la aplicación o
cuando un cliente accede por primera vez al servlet. El método INIT no se
repite a menos que muchos clientes accedan al servlet.
El método destroy () ejecuta sólo una vez durante la vida del servlet. Eso
pasa cuando el motor del servlet detiene el servlet. Típicamente, se detienen
servlets como parte del proceso de detener la aplicación.
5.1. DESARROLLANDO SERVLETS
5.1.11
135
Rasgos de Java Servlet API
Algunos puntos de interés del Java Servlet API son:
• Un despachador de requerimientos asociado a cada recurso (servlet).
Un despachador de requerimientos de recursos que pueden procesar demandas HTTP (como servlets y archivos JSP) y los archivos relacionados a
esos recursos (como HTML estático y GIFs). El motor del servlet genera un
solo despachado de requerimiento por cada servlet o JSP cuando se produce
una instanciación. El despachador recibe el pedido del cliente y despacha la
demanda al recurso.
• Un contexto del servlet para la aplicación.
5.1.12
Patrones y Guías de Servlets/JSP
En esta sección se proporciona las pautas específicas sobre cómo organizar una
aplicación que usa servlets y JSPs.
• Patrones Servlet/JSP.
Con este modelo es posible organizar una aplicación Web en el servlets y
JavaServer Pages de manera tal que es fácil de mantener el código.
• Motivación.
Para aplicaciones que requieren modelado complejo sobre el nodo del servidor de aplicación Web, no es fácil definir la granularidad de servlets y cómo
interactúan los servlets. Pero sin un buen diseño para el servlets y JSP es
difícil mantener la aplicación.
Además en la fase del análisis de un proyecto, usa casos y diagramas de
transición de estados ampliamente usados para describir el resultado de la fase
del análisis. Podría ser útil trazar esos resultados en el diseño e implementación
de la fase.
136
CAPÍTULO 5.
SERVLET
En un caso se puede contemplar el servlet como el evento central y procesa
todas las demandas del cliente. Ejecuta la acción necesaria para ese evento
y envía el requerimiento a uno (de muchos) JavaServer Page por desplegar el
resultado. Usando esta solución, puede ser difícil de desarrollar ese servlet.
Así como es responsable para un conjunto de casos de uso, se puede tener que
llevar a cabo mucha lógica en ese servlet.
En otro caso se puede tener tantos servlets como JavaServer Pages y encadenarlos. Esto significa que un servlet obtiene un requerimiento, ejecuta la
acción correcta, y llama al JavaServer Page específico para ese servlet, para
desplegar el resultado. Un requerimiento de ese JSP entonces obtiene otro servlet, y así sucesivamente. Será difícil mantener muchos servlets y JSP, puede
confundirse al intentar entender el flujo de la aplicación.
Una solución que tiene una granularidad entre esos extremos es dividiendo la aplicación en estados diferentes. Se intenta transferir un diagrama de
transición de estados (por ejemplo, modelado con RationalRose) en páginas
HTML, servlets y JavaServer Pages.
• Applicabilidad.
Este modelo puede usarse en toda aplicación servlet /JSP. Es recomendable este modelo sobre todo en las aplicaciones Web complejas donde muchas
páginas Web y transiciones de páginas tienen que ser desarrolladas.
• Componentes.
Los componentes en esta estructura son:
— Servlet: un requerimiento dado recoge los datos requeridos para el
despliegue de un estado dado o invoca la acción que causa una transición fuera del estado. Esta responsabilidad lo hace el controlador
en un Modelo-Vista-Controlador (MVC) basado en la aplicación.
— JavaServerPage: es el indicador de la generación de código HTML
para un resultado del requerimiento dado.
— Wrapper de Tareas: encapsula el acceso al proceso empresarial de
negocios (datos back-end y función). Esta función realiza el modelo
de wrapper de tareas en una aplicación MVC.
5.1. DESARROLLANDO SERVLETS
137
— Páginas HTML: en caso de contenido estático y transiciones de estado, no es necesario tecnologías complejas. Un indicador de estado
estático de página HTML.
• Colaboradores.
Un flujo de aplicación Web puede capturarse en un diagrama de transición
de estado (que es, a propósito, una documentación buena para el flujo de la
aplicación). Un diagrama de transición de estado contiene nombres de estado
conectados con los nombres de las ramas.
La solución,es trazar cada componente del diagrama de transición de estado
a un componente de la arquitectura de e-business para que pueda manejarse
mediante WebSphere Aplication Server.
Se separa en el diagrama los estados estáticos y los estados dinámicos.
Las transiciones de estado estáticos son inherentes. Como ellos son estáticos en el controlador y en las transiciones, se puede codificar un estado como
una página HTML que debe ser nombrado después del estado: < el Estado
>.html.
Cuando hereda estados dinámicos, es un tanto más dificultoso. Conforme
a la arquitectura e-business, se divide el estado en modelo, vista y controlador.
• Controlador.
El servlet actúa como el controlador de estado en este escenario. Esto
significa que se captura un servlet por estado dinámico. Nombrando la convención, el servlet es llamado después del estado: < State>Servlet. Haciendo
esto se consigue un método fácil de documentación.
Pensando sobre cada interacción entre el navegador y el servidor de aplicaciones Web (por ejemplo, el servlet) como una sola unidad de trabajo, de
sólo lectura o de actualización. Hay dos flujos básicos de modelos de control,
ambos, llevado a cabo por el servlet. Uno se ocupa del despliegue para un
estado dado, y el otro maneja las acciones que causan un cambio de estado.
• Despliegue de Patrones.
138
CAPÍTULO 5.
SERVLET
Este modelo normalmente se manifiesta dentro de HTML como un link,
resultando en un requerimiento Get. El flujo de control para este modelo es:
— El servlet invoca el método apropiado de sólo lectura en el modelo
de estado (ese es el wrapper de la tarea) y selecciona el JSP para
ocuparse del resultado.
— El servlet inicializa el objeto de datos asociado con el JSP, carga el
resultado y coloca la vista del bean en un atributo HttpRequest.
— El servlet remite la demanda al JSP escogido.
— La Página de JavaServer genera el código del HTML.
— El servlet envía el requerimiento al JSP seleccionado.
— El JSP genera el código HTML.
• Vistas.
Las vistas se implementan como un JSP.
• Cosecuencias.
Usando este modelo, es posible conseguir un acercamiento bueno para diseñar una aplicación Web, mediante la utilización de servlets, JSPs, wrapper
de tareas y páginas HTML.
Capítulo 6
Descripción de la Aplicación
6.1
Descripción General
El presente trabajo se basa en el estudio de software de base que permite
el desarrollo de aplicaciones Web multiplataforma con acceso a base de datos
distribuida. Consiste en el desarrollo de una Aplicación Web que pueda ser
implementada como método de evaluación y exámenes finales para la materia
“Teleproceso y Sistemas Distribuidos”.
El objetivo fue realizar una aplicación Web multiplataforma desarrollada en
Java, mediante la cual el alumno pueda evaluarse en forma local como también
a distancia, como asímismo rendir un exámen en forma local ante la presencia
física de un profesor; de esta manera el alumno puede llevar un control de
sus propios conocimientos. Esta aplicación correrá en distintas plataformas
mediante el uso de software multiplataforma.
El software desarrollado permite registrar de manera efectiva las notas
obtenidas de los alumnos ya sea de las evaluaciones realizadas como también
de los exámenes rendidos por los mismos; esto permite al profesor realizar
consultas y obtener estadísticas de todo lo concerniente al alumno. De esta
manera los profesores de la materia podrán reducir el tiempo estimado para
cada exámen.
En la figura 6.1 de la página 140 se puede observar la página principal de
la aplicación.
139
140
CAPÍTULO 6. DESCRIPCIÓN DE LA APLICACIÓN
Figura 6.1: Página principal de la aplicación.
6.2
Módulos
El sistema consiste básicamente en tres módulos bien definidos:
1. Alumno
2. Profesor
3. Ayuda
6.2.1
Alumno
Este módulo está destinado al el uso de los alumnos y contiene las especificaciones necesarias para que los mismos sepan cómo identificarse, darse de alta,
evaluarse, etc.
Se divide en:
6.2. MÓDULOS
141
• Alumno Registrado: en esta sección el alumno ya registrado debe ingresar su L.U. y contraseña, de esta manera el mismo puede acceder a la
pantalla que contiene los temas para realizar una evaluación o examen
dependiendo de lo que el alumno especifique (ver Figura 6.2 de la pág.
141).
Figura 6.2: Identificación del alumno.
• Alumno Nuevo: en esta sección el alumno debe registrarse, ingresando
los datos pedidos en pantalla; de esta manera el mismo queda registrado
en la base de datos, permitiéndole ingresar al sistema con la L.U. y
contraseña ingresada (ver Figura 6.26 de la pág. 157).
Pueden visualizarse las siguientes pantallas:
• Opciones
En esta pantalla se visualizan dos opciones donde el alumno debe seleccionar una de ellas; por ambos caminos el mismo ingresa a la pantalla de temas
(ver Figura 6.4 de la pág. 142).
142
CAPÍTULO 6. DESCRIPCIÓN DE LA APLICACIÓN
Figura 6.3: Alta del alumno.
Figura 6.4: Opciones del alumno.
6.2. MÓDULOS
143
• Temas de Evaluación
En esta pantalla se puede visualizar la lista de temas de la cual el alumno
debe seleccionar uno de ellos para realizar una evaluación (ver Figura 6.5 de
la pág. 143).
Figura 6.5: Temas de la evaluación.
• Evaluación
En esta pantalla se pueden visualizar las preguntas con sus respectivas
opciones para que el alumno pueda evaluarse; el mismo debe responderlas para
que el sistema lo evalúe. Cuando se inicia la pantalla empieza a marchar un
cronómetro, mediante el cual el alumno puede visualizar cuánto tiempo lleva
evaluándose, cuando cliclea el botón aceptar el cronómetro deja de marchar
(ver Figura 6.6 de la pág. 144).
• Resultado de la Evaluación
144
CAPÍTULO 6. DESCRIPCIÓN DE LA APLICACIÓN
Figura 6.6: Preguntas con sus opciones para la evaluación.
En esta pantalla el sistema muestra el resultado obtenido de la evaluación
realizada por el alumno, indicando la L.U., el tema y puntaje obtenido (ver
Figura 6.7 de la pág. 145).
• Temas de Examen
En esta pantalla se puede visualizar la lista de temas de la cual el alumno
debe seleccionar uno de ellos para realizar un examen (ver Figura 6.8 de la
pág. 145).
• Examen
En esta pantalla se pueden visualizar las preguntas con sus respectivas
opciones para que el alumno pueda rendir el examen; el mismo debe responderlas para que el sistema lo evalúe. Cuando se inicia la pantalla empieza a
marchar un cronómetro mediante el cual el alumno puede visualizar cuánto
tiempo lleva evaluándose, cuando cliclea el botón aceptar el cronómetro deja
de marchar (ver Figura 6.9 de la pág. 146).
6.2. MÓDULOS
145
Figura 6.7: Resultado de la evaluación.
Figura 6.8: Temas para el exámen.
146
CAPÍTULO 6. DESCRIPCIÓN DE LA APLICACIÓN
Figura 6.9: Preguntas con sus respuesta para el exámen.
• Resultado del Examen
En esta pantalla el sistema muestra el resultado obtenido del examen realizado por el alumno, indicando la L.U., el tema y puntaje obtenido (ver Figura
6.10 de la pág. 147).
• Consulta
En esta pantalla se puede visualizar la consulta que el alumno puede realizar, por ejemplo puede obtener información acerca de la nota, la fecha y el
tiempo que el alumno obtuvo en todas sus evaluaciones como así también en
los exámenes (ver Figura 6.11 de la pág. 147).
6.2.2
Profesor
Este módulo está destinado para el uso de los profesores, contiene las opciones
necesarias para que los mismos puedan realizar distintas actividades.
6.2. MÓDULOS
147
Figura 6.10: Resultado del exámen.
Figura 6.11: Consulta del alumno.
148
CAPÍTULO 6. DESCRIPCIÓN DE LA APLICACIÓN
Se divide en:
• Profesor Registrado: en esta sección el profesor ya registrado debe ingresar su nombre de usuario y contraseña, de esta manera puede ingresar
al sistema realizando las actividades que requiera (ver Figura 6.12 de la
pág. 148).
Figura 6.12: Identificación del profesor.
• Profesor Nuevo: en esta sección el profesor debe registrarse, ingresando los datos pedidos en pantalla, de esta manera se da de alta en el
sistema permitiéndole ingresar con su nombre de usuario y contraseña
especificados por el mismo (ver Figura 6.13 de la pág. 149).
Pueden visualizarse las siguientes pantallas:
• Temas: en esta pantalla el profesor puede visualizar los temas que corresponden a la materia en cuestión, en la cual el mismo debe elegir uno
de ellos para realizar las distintas actividades (ver Figura 6.14 de la pág.
149).
6.2. MÓDULOS
149
Figura 6.13: Alta del profesor.
Figura 6.14: Pantalla temas del profesor.
150
CAPÍTULO 6. DESCRIPCIÓN DE LA APLICACIÓN
En dicha pantalla pueden visualizarse los siguientes botones:
• Agregar : permite agregar una pregunta con sus opciones marcando la
opción correcta del tema seleccionado (ver Figura 6.15 de la pág. 150).
Figura 6.15: Agregar pregunta y sus opciones.
• Modificar: permite modificar una pregunta con sus opciones del tema
seleccionado (ver Figura 6.16 de la pág. 151).
• Eliminar : permite eliminar una pregunta con sus opciones del tema
seleccionado (ver Figura 6.17 de la pág. 151).
En la parte inferior de la pantalla temas se pueden ver dos botones:
• Atrás: vuelve a la página de identificación del profesor.
• Consultas: permite visualizar las preguntas, las respuestas y cuál es la
opción correcta del tema elegido (ver Figura 6.18 de la pág. 152).
6.2. MÓDULOS
Figura 6.16: Modificar una pregunta y sus opciones.
Figura 6.17: Eliminar pregunta y sus opciones.
151
152
CAPÍTULO 6. DESCRIPCIÓN DE LA APLICACIÓN
Figura 6.18: Consulta del profesor.
• Estadísticas: permite visualizar las distintas estadísticas que puede consultar el profesor (ver Figura 6.19 de la pág. 153).
— Promedio general de evaluaciones por año: el sistema proporciona
un promedio general de todos los alumnos que rindieron exámenes
en un año específico (ver Figura 6.20 de la pág. 153).
— Cantidad de alumnos que se evaluaron por año: el sistema proporciona la cantidad de alumnos que rindieron para un rango de fechas
especificado (ver Figura 6.21 de la pág. 154).
— Promedio de notas de todos los exámenes de todos los temas: el
sistema proporciona el promedio de notas de todas las evaluaciones
y exámenes de todos los temas (ver Figura 6.22 de la pág. 154).
— Promedio de aprobados y desaprobados: en esta pantalla se puede visualizar el promedio de aprobados y desaprobados como así
6.2. MÓDULOS
153
Figura 6.19: Opciones de estadísticas.
Figura 6.20: Promedio general de evaluaciones por año.
154
CAPÍTULO 6. DESCRIPCIÓN DE LA APLICACIÓN
Figura 6.21: Cantidad de alumnos que se evaluaron por año.
Figura 6.22: Promedio de notas de todos lo exámenes de todos los temas.
6.2. MÓDULOS
155
también la cantidad de alumnos que se evaluaron y rindieron y que
fueron aprobados y desaprobados (ver Figura 6.23 de la pág. 155).
Figura 6.23: Promedio de aprobados y desaprobados.
6.2.3
Ayuda
En la figura 6.24 de la página 156 se puede observar la página principal de la
ayuda. Este módulo se divide en:
Ayuda para el Alumno
Contiene las especificaciones necesarias para que el alumno sepa cómo identificarse, darse de alta, evaluarse, rendir, etc., en el sistema en cuestión.
Se pueden visualizar las siguientes pantallas:
• Identificación del alumno: contiene las especificaciones necesarias para
156
CAPÍTULO 6. DESCRIPCIÓN DE LA APLICACIÓN
Figura 6.24: Página principal de la ayuda.
que el alumno sepa cómo ingresar al sistema (ver Figura 6.25 de la pág.
157).
• Alta del Alumno: contiene las especificaciones necesarias para que el
alumno sepa cómo darse de alta en el sistema y de esta manera ingresar
al mismo.(ver Figura 6.26 de la pág. 157).
• Evaluación: el módulo de evaluación está destinado al uso por parte
de los alumnos. El mismo contiene las opciones necesarias para que el
alumno pueda elegir el tema en el que desea evaluarse y luego realizar la
misma acerca del tema elegido, mediante un cuestionario de 10 preguntas, con ocho posibles opciones como respuestas, de las cuales sólo una
es la correcta (ver Figura 6.27 de la pág. 158).
• Examen: contiene las especificaciones necesarias para que el alumno
sepa cómo realizar un examen y visualizar los resultados arrojados por
el sistema (ver Figura 6.28 de la pág. 158).
6.2. MÓDULOS
Figura 6.25: Página de ayuda de identificación del alumno.
Figura 6.26: Página de ayuda del alta del alumno.
157
158
CAPÍTULO 6. DESCRIPCIÓN DE LA APLICACIÓN
Figura 6.27: Ayuda para la evaluación.
Figura 6.28: Página de ayuda para el exámen del alumno.
6.2. MÓDULOS
159
• Consulta: contiene las especificaciones necesarias para que el alumno
sepa cómo realizar una consulta (ver Figura 6.29 de la pág. 159).
Figura 6.29: Página de ayuda para la consulta del alumno.
Ayuda para el Profesoṙ
Contiene la información necesaria para la realización de operaciones concernientes al manejo de las preguntas y respuestas que se utilizan en los cuestionarios de la evaluación o examen.
También se comentan las distintas consultas que puede hacer el profesor
a la hora de sacar conclusiones. Pueden ser, agregar, modificar o eliminar
preguntas.
Se pueden visualizar las siguientes pantallas:
• Identificación del profesor : contiene las especificaciones necesaria para
que el profesor sepa cómo identificarse e ingresar al sistema (ver Figura
6.30 de la pág. 160).
160
CAPÍTULO 6. DESCRIPCIÓN DE LA APLICACIÓN
Figura 6.30: Página de ayuda para la identificación del profesor.
• Alta del profesor : contiene las especificaciones necesaria para que el
profesor sepa cómo darse de alta en el sistema (ver Figura 6.31 de la
pág. 161).
• Agregar, eliminar o modificar una pregunta y sus opciones: contiene la
información necesaria para que el profesor sepa cómo incorporar, modificar o eliminar una pregunta que esté en la base de datos con sus opciones
para las evaluaciones o exámenes (ver Figura 6.32 de la pág. 161).
• Consultas: contiene la información necesaria para que el profesor sepa cómo realizar una consulta referente a las preguntas de un tema en
particular (ver Figura 6.33 de la pág. 162).
• Estadísticas: contiene la información necesaria para que el profesor pueda visualizar algunas estadísticas que le proporciona el sistema (ver Figura 6.34 de la pág. 162).
6.2. MÓDULOS
161
Figura 6.31: Página de ayuda del alta del profesor.
Figura 6.32: Página de ayuda para agregar, modificar y eliminar una pregunta.
162
CAPÍTULO 6. DESCRIPCIÓN DE LA APLICACIÓN
Figura 6.33: Página de ayuda de la consulta del profesor.
Figura 6.34: Página de ayuda de las estadísticas del profesor.
6.3. ESTRUCTURAS DE DATOS UTILIZADAS
6.3
163
Estructuras de Datos Utilizadas
A continuación se mostrarán las estructuras utilizadas por la aplicación y las
distintas tablas, las cuales hacen uso del motor de base de datos multiplataforma DB2 UDB.
Se puede observar la estructura completa utilizada por la aplicación (ver
Figura 6.35 de la pág. 163).
Figura 6.35: Estructura de base de datos utilizada para la aplicación.
Las tablas que la integran la base de datos son las siguientes:
Alumno: contiene la información necesaria referente a los alumnos registrados en el sistema. Está compuesta por los siguientes campos de datos:
164
CAPÍTULO 6. DESCRIPCIÓN DE LA APLICACIÓN
LU: Contiene el número de libreta universitaria del alumno, que el sistema utiliza como
clave.
NYA: Contiene el apellido y nombre del alumno.
DIR: Contiene la dirección del alumno.
TEL: Contiene el teléfono del alumno.
EMAIL: Contiene la dirección de correo elelectrónico del alumno.
CLAVE: Contiene el número de clave elegido por el alumno para el ingreso al sistema.
Se puede observar la estructura, con datos de ejemplo (ver Figura 6.36 de
la pág. 165).
Evaluación: contiene la información referente a las evaluaciones realizadas por el alumno. Está compuesta por los siguientes campos de datos:
LU: Contiene el número de libreta universitaria del alumno.
NOTA: Contiene la nota obtendia por el alumno en dicha evaluación.
TEMAS: Contiene el tema en el que el alumno se autoevalúo.
FECHA: Contiene la fecha en que se realizó la autoevaluación.
CODEXAMEN: Contiene el código de evaluación o examen dependiemdo de lo seleccionado por el alumno.
TIEMPO: Contiene el tiempo que el alumno tardó en evaluarse.
Se puede observar la estructura, con datos de ejemplo (ver Figura 6.37 de
la pág. 166).
Pregunta: contiene la información referente a las distintas preguntas a
utilizar en los cuestionarios. Está compuesta por los siguientes campos de
datos:
CODPREG: Contiene un número autogenerado para las preguntas, que es utilizado como
clave por el sistema.
DESC: Contiene la descripción de la pregunta.
TEMA: Contiene el número de tema correspondiente al código de pregunta.
Se puede observar la estructura, con datos de ejemplo (ver Figura 6.38 de
6.3. ESTRUCTURAS DE DATOS UTILIZADAS
Figura 6.36: Tabla del alumno.
165
166
CAPÍTULO 6. DESCRIPCIÓN DE LA APLICACIÓN
Figura 6.37: Tabla evaluación.
6.3. ESTRUCTURAS DE DATOS UTILIZADAS
167
la pág. 167).
Figura 6.38: Tabla de preguntas.
Profesor: contiene la información necesaria referente a los profesores que
utilizarán la aplicación. Está compuesta por los siguientes campos de datos:
CODUSU: Contiene un código autogenerado para el profesor, que el sistema utiliza como
clave.
AYN: Contiene el apellido y el nombre del profesor.
CLAVE: Contiene la clave elegido por el profesor para el ingreso al sistema.
USUARIO: Contiene el nombre de usuario elegido por el profesor para ingresar al sistema.
168
CAPÍTULO 6. DESCRIPCIÓN DE LA APLICACIÓN
Se puede observar la estructura, con datos de ejemplo (ver Figura 6.39 de
la pág. 168).
Figura 6.39: Tabla profesor.
Respuesta: contiene la información referente a las respuestas opcionales
de cada pregunta que podría utilizarse en los cuestionarios. Está compuesta
por los siguientes campos de datos:
CODRESP: Contiene un número autogenerado para las distintas respuestas, que el sistema utiliza como clave.
CODPREG: Contiene el número correspondiente a la pregunta a la cual pertenece la
respuesta.
DESC: Contiene la descripción de la respuesta.
6.3. ESTRUCTURAS DE DATOS UTILIZADAS
169
CORRECTA: Contiene la información sobre si la respuesta es correcta o no.
Se puede observar la estructura, con datos de ejemplo (ver Figura 6.40 de
la pág. 169).
Figura 6.40: Tabla de respuesta.
Tema: contiene la información referente a los distintos temas que conforman la asignatura de Teleproceso y Sistemas Distribuidos. Está compuesta
por los siguientes campos de datos:
CODTEMA: Contiene el número de tema que le corresponde dentro de la asignatura.
DESC: Contiene la descripción de el tema.
Se puede observar la estructura, con datos de ejemplo (ver Figura 6.41 de
170
CAPÍTULO 6. DESCRIPCIÓN DE LA APLICACIÓN
la pág. 170).
Figura 6.41: Tabla de temas.
Capítulo 7
Códigos Utilizados en la
Aplicación
7.1
Código (Java). Alta del Alumno
A continuación se muestra el ejemplo de un servlet que contiene el código java
para el alta del alumno:
package alu;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
public class Alta extends HttpServlet {
Connection conn;
private int longitudlu;
/*
* En el metodo Init se realizará la conexión a la BD
* por lo que las peticiones no producirán ningun
171
172
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
retardo de conexión
*/
public void init(ServletConfig cf) throws ServletException {
super.init(cf);
// Se carga el driver a continuación
try {
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
}catch (ClassNotFoundException e) {
System.out.println(“Imposible encontrar el driver:” +
e.getMessage());
}
//Se intenta realizar la conexión a la base de datos
try {
conn = DriverManager.getConnection(“jdbc:odbc:TP”);
}catch (SQLException e) {
System.out.println(“Imposible crear conexion”
+ e.getMessage());
}
}// fin init
/*
* En el metodo destroy() una vez que el
* servlet se esta apagando,desconectaremos
* de la base de datos
*/
7.1. CÓDIGO (JAVA). ALTA DEL ALUMNO
public void destroy() {
super.destroy();
//Llamada al destroy de la superclase
try {
conn.close();
}catch (SQLException e){
System.out.println(“Imposible cerrar conexion:”
+ e.getMessage());
}
} //fin destroy()
/*
*Redefinimos el metodo doPost ya
que las peticiones se realizaran porese metodo
*/
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException, IOException {
String lu;
String nya;
String direccion;
String telefono;
String email;
String clave;
//Obtenemos los valores de los parámetros
173
174
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
lu = request.getParameter(“lu”);
nya = request.getParameter(“nya”);
direccion = request.getParameter(“direccion”);
telefono = request.getParameter(“telefono”);
email = request.getParameter(“email”);
clave = request.getParameter(“clave”);
int longitudclave= clave.length();
int longitudlu= lu.length();
if(telefono.equals(“”)){
telefono =“0”;
}
int mail = email.length();
String arrova =“”;
for (int i = 1; i < mail ; i++) {
String caract = email.substring(i,i+1);
if (caract.equals(”@”)){
arrova=“Si”;
}
}
if (lu.equals(“”)) {
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
7.1. CÓDIGO (JAVA). ALTA DEL ALUMNO
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“</P>”);
pagina.println(“<FORM>”);
pagina.println(“<CENTER><TABLE border=0
bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#bfbfff>”);
pagina.println(“<TD><FONT size=4
color=#000000 face=Palatino Linotype>Debe”);
pagina.println(“ingresar el número
de LU</FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD align=center
175
176
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
bgcolor=#ddddff><INPUT type=button
name=Aceptar value=Aceptar
onclick=history.back()></TD>”);
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE></CENTER></FORM>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
}else if (longitudlu < 5){
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
7.1. CÓDIGO (JAVA). ALTA DEL ALUMNO
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“</P>”);
pagina.println(“<FORM>”);
pagina.println(“<CENTER><TABLE border=0
bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#bfbfff>”);
pagina.println(“<TD><FONT size=4 color=#000000
face=Palatino Linotype>”);
pagina.println(“La longitud de su LU
debe ser 5.</FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD align=center
bgcolor=#ddddff><INPUT type=button name=Aceptar
value=Aceptar onclick=history.back()></TD>”);
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE></CENTER></FORM>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
177
178
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
}else if(nya.equals(“”)){
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“</P>”);
pagina.println(“<FORM>”);
pagina.println(“<CENTER><TABLE border=0
bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#bfbfff>”);
pagina.println(“<TD><FONT size=4 color=#000000
face=Palatino Linotype>Debe”);
7.1. CÓDIGO (JAVA). ALTA DEL ALUMNO
pagina.println(“ingresar el nombre
del alumno</FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD align=center
bgcolor=#ddddff><INPUT type=button name=Aceptar
value=Aceptar onclick=history.back()></TD>”);
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE></CENTER></FORM>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
} else if(direccion.equals(“”)){
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
179
180
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“</P>”);
pagina.println(“<FORM>”);
pagina.println(“<CENTER><TABLE border=0
bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#bfbfff>”);
pagina.println(“<TD><FONT size=4 color=#000000
face=Palatino Linotype>Debe”);
pagina.println(“ingresar su dirección.</FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD align=center
bgcolor=#ddddff><INPUT type=button name=Aceptar
value=Aceptar onclick=history.back()></TD>”);
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE></CENTER></FORM>”);
pagina.println(“</BODY>”);
7.1. CÓDIGO (JAVA). ALTA DEL ALUMNO
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
}else if (arrova.equals(“”)) {
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“</P>”);
pagina.println(“<FORM>”);
pagina.println(“<CENTER><TABLE border=0
bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
181
182
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
pagina.println(“<TR bgcolor=#bfbfff>”);
pagina.println(“<TD><FONT size=4 color=#000000
face=Palatino Linotype>Debe”);
pagina.println(“ingresar un mail válido</FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD align=center
bgcolor=#ddddff><INPUT type=button name=Aceptar
value=Aceptar onclick=history.back()></TD>”);
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE></CENTER></FORM>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
}else if(lu.equals(”00000”)){
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
7.1. CÓDIGO (JAVA). ALTA DEL ALUMNO
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“</P>”);
pagina.println(“<FORM>”);
pagina.println(“<CENTER><TABLE border=0
bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#bfbfff>”);
pagina.println(“<TD><FONT size=4
color=#000000 face=Palatino Linotype>Debe”);
pagina.println(“ingresar un número
de lu válido.</FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD align=center
bgcolor=#ddddff><INPUT type=button name=Aceptar
value=Aceptar onclick=history.back()></TD>”);
pagina.println(“</TR>”);
183
184
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
pagina.println(“</TBODY>”);
pagina.println(“</TABLE></CENTER></FORM>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
}else if(clave.equals(“”)){
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“</P>”);
pagina.println(“<FORM>”);
7.1. CÓDIGO (JAVA). ALTA DEL ALUMNO
pagina.println(“<CENTER><TABLE border=0
bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#bfbfff>”);
pagina.println(“<TD><FONT size=4 color=#000000
face=Palatino Linotype>Debe”);
pagina.println(“ingresar su clave.</FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD align=center bgcolor=#ddddff><INPUT
type=button name=Aceptar value=Aceptar
onclick=history.back()></TD>”);
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE></CENTER></FORM>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
}if(longitudclave < 8){
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
185
186
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“</P>”);
pagina.println(“<FORM>”);
pagina.println(“<CENTER><TABLE border=0
bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#bfbfff>”);
pagina.println(“<TD><FONT size=4 color=#000000
face=Palatino Linotype>”);
pagina.println(“La longitud de su clave
debe ser 8.</FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD align=center
7.1. CÓDIGO (JAVA). ALTA DEL ALUMNO
bgcolor=#ddddff><INPUT type=button name=Aceptar
value=Aceptar onclick=history.back()></TD>”);
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE></CENTER></FORM>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
}else {
try {
Statement sentencia = conn.createStatement();
ResultSet consulta = sentencia.execute
Query(”SELECT * FROM ALUMNO
WHERE lu (”= +lu+” or clave=“’+clave+””’);
String valor=“”;
String valorclave=“”;
while (consulta.next()){
valor= consulta.getString(”lu”);
valorclave= consulta.getString(”clave”);
}
if (valor.equals(“”)){
Statement alta = conn.createStatement();
int actualizacion = alta.executeUpdate
187
188
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
(”insert into alumno(lu,nya,dir,tel,email,clave)values
(”+lu+”,”’+nya+”’,”’+direccion+”’,
”+telefono+”,”’+email+”’,”’+clave+”’)”);
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“</P>”);
pagina.println(“<FORM>”);
pagina.println(“<CENTER><TABLE border=0
bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#bfbfff>”);
7.1. CÓDIGO (JAVA). ALTA DEL ALUMNO
pagina.println(“<TD><FONT size=4
color=#000000 face=Palatino Linotype>”);
pagina.println(“Actualización Exitosa</FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD align=center
bgcolor=#ddddff><INPUT
type=button name=Aceptar value=Aceptar
onclick=history.back()></TD>”);
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE></CENTER></FORM>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
}else if (valorclave.equals(clave.substring(0))) {
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
189
190
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY
bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“</P>”);
pagina.println(“<FORM>”);
pagina.println(“<CENTER><TABLE border=0
bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#bfbfff>”);
pagina.println(“<TD><FONT size=4
color=#000000 face=Palatino Linotype>”);
pagina.println(“HA INGRESADO
AL SISTEMA</FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD align=center bgcolor=#ddddff><INPUT
type=button name=Aceptar value=Aceptar
onclick=history.back()></TD>”);
7.1. CÓDIGO (JAVA). ALTA DEL ALUMNO
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE></CENTER></FORM>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
}else {
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
content=text/html;
charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
191
192
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
pagina.println(“</P>”);
pagina.println(“<FORM>”);
pagina.println(“<CENTER><TABLE border=0
bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#bfbfff>”);
pagina.println(“<TD><FONT size=4 color=#000000
face=Palatino Linotype>”);
pagina.println(“Su clave es incorrecta.</FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD align=center
bgcolor=#ddddff><INPUT type=button name=Aceptar
value=Aceptar onclick=history.back()></TD>”);
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE></CENTER></FORM>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
}
}catch (Exception e) {
System.out.println(“Error en la actualización”
7.1. CÓDIGO (JAVA). ALTA DEL ALUMNO
+ e.getMessage());
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“</P>”);
pagina.println(“<FORM>”);
pagina.println(“<CENTER><TABLE border=0
bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#bfbfff>”);
pagina.println(“<TD><FONT size=4 color=#000000
face=Palatino Linotype>”);
193
194
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
pagina.println(“error general</FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD align=center bgcolor=#ddddff>
<INPUT type=button name=Aceptar value=Aceptar
onclick=history.back()></TD>”);
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE></CENTER></FORM>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
}
}
}
}
7.2
Código (Java). Identificación del Profesor
A continuación se muestra el ejemplo de un servlet que contiene el código java
para la identificación del profesor:
package profesor;
import java.io.*;
import javax.servlet.*;
7.2. CÓDIGO (JAVA). IDENTIFICACIÓN DEL PROFESOR
import javax.servlet.http.*;
import java.sql.*;
public class ProfesorRegistrado extends
HttpServlet {
Connection conn;
/*
* En el metodo Init se realizará la conexión a la BD
* por lo que las peticiones no producirán ningun
* retardo de conexión
*/
public void init(ServletConfig cf) throws
ServletException {
super.init(cf);
// Se carga el driver a continuación
try {
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
}catch (ClassNotFoundException e) {
System.out.println(“Imposible encontrar el driver:” +
e.getMessage());
}
//Se intenta realizar la conexión a la base de datos
try {
conn = DriverManager.getConnection(“jdbc:odbc:TP”);
}catch (SQLException e) {
195
196
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
System.out.println(“Imposible crear conexion:”
+ e.getMessage());
}
}// fin init
/*
* En el metodo destroy() una vez que el
*servlet se esta apagando,desconectaremos
* de la base de datos
*/
public void destroy() {
super.destroy();
//Llamada al destroy de la superclase
try {
conn.close();
}catch (SQLException e){
System.out.println(“Imposible cerrar conexion:”
+ e.getMessage());
}
} //fin destroy()
/*
*Redefinimos el metodo doPost ya que las
peticiones se realizaran por
ese metodo
*/
7.2. CÓDIGO (JAVA). IDENTIFICACIÓN DEL PROFESOR
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException, IOException {
String usu;
String clave;
//Obtenemos los valores de los parámetros
usu = request.getParameter(“usu”);
clave = request.getParameter(“clave”);
int longitudclave = clave.length();
if (usu.equals(“”)) {
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY
bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
197
198
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“</P>”);
pagina.println(“<FORM>”);
pagina.println(“<CENTER><TABLE border=0
bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#bfbfff>”);
pagina.println(“<TD><FONT size=4
color=#000000 face=Palatino Linotype>Debe”);
pagina.println(“ingresar su nombre
de usuario</FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD align=center
bgcolor=#ddddff><INPUT
type=button name=Aceptar value=Aceptar
onclick=history.back()></TD>”);
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE>
</CENTER></FORM>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
7.2. CÓDIGO (JAVA). IDENTIFICACIÓN DEL PROFESOR
pagina.flush();
pagina.close();
}else if(clave.equals(“”)){
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“</P>”);
pagina.println(“<FORM>”);
pagina.println(“<CENTER><TABLE border=0
bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#bfbfff>”);
199
200
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
pagina.println(“<TD><FONT size=4 color=#000000
face=Palatino Linotype>Debe”);
pagina.println(“ingresar su
contraseña.</FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD align=center
bgcolor=#ddddff><INPUT type=button name=Aceptar
value=Aceptar onclick=history.back()></TD>”);
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE></CENTER></FORM>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
}else if(longitudclave < 8){
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
7.2. CÓDIGO (JAVA). IDENTIFICACIÓN DEL PROFESOR
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“</P>”);
pagina.println(“<FORM>”);
pagina.println(“<CENTER><TABLE border=0
bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#bfbfff>”);
pagina.println(“<TD><FONT size=4 color=#000000
face=Palatino Linotype>”);
pagina.println(“La longitud de su
contraseña debe ser 8.</FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD align=center
bgcolor=#ddddff><INPUTtype=button name=Aceptar
value=Aceptar onclick=history.back()></TD>”);
pagina.println(“</TR>”);
201
202
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
pagina.println(“</TBODY>”);
pagina.println(“</TABLE></CENTER></FORM>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
}else {
try {
Statement sentencia = conn.createStatement();
ResultSet consulta = sentencia.executeQuery
(“SELECT * FROM PROFESOR
WHERE usuario =“’+usu+”’ or clave =“’+clave+””’);
String valor=“”;
String valorclave=“”;
while (consulta.next()){
valor= consulta.getString(“usuario”);
valorclave= consulta.getString(“clave”);
}
if (valor.equals(“”)){
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
7.2. CÓDIGO (JAVA). IDENTIFICACIÓN DEL PROFESOR
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“</P>”);
pagina.println(“<FORM>”);
pagina.println(“<CENTER><TABLE border=0
bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#bfbfff>”);
pagina.println(“<TD><FONT size=4 color=#000000
face=Palatino Linotype>”);
pagina.println(“El usuario ”’+usu+”’ no existe.
</FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD align=center bgcolor=#ddddff>
<INPUT type=button name=Aceptar value=Aceptar
203
204
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
onclick=history.back()></TD>”);
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE></CENTER></FORM>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
}else if (valorclave.equals(clave.substring(0))) {
Statement temas = conn.createStatement();
ResultSet consultatema = temas.executeQuery
(“SELECT * FROM TEMA ORDER BY CODTEMA”);
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
content=IBM WebSphere Studio>”);
pagina.println(“<META http-equiv=Content-Style-Type
content=text/css>”);
pagina.println(“<TITLE>Temas Profesor.html</TITLE>”);
pagina.println(“</HEAD>”);
7.2. CÓDIGO (JAVA). IDENTIFICACIÓN DEL PROFESOR
pagina.println(“<BODY bgcolor=#d5d5ff>”);
pagina.println(“<P>.<BR>”);
pagina.println(“</P>”);
pagina.println(“<CENTER>”);
pagina.println(“<TABLE border=0
bgcolor=#f4f4ff width=480 height=50>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR>”);
pagina.println(“<TD width=473 align=center
bgcolor=#c1c1ff><FONT”);
pagina.println(“color=#000000 face=Palatino Linotype
size=4><BLINK><B>Seleccione”);
pagina.println(“el tema que desea Modificar,
Agregar o Eliminar</B>
</BLINK></FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE>”);
pagina.println(“</CENTER>”);
pagina.println(“<CENTER></CENTER>”);
pagina.println(“”);
pagina.println(“<FORM action = AgregarPregunta
method = post>”);
pagina.println(“<CENTER>”);
205
206
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
pagina.println(“<TABLE border=0
bgcolor=#fbfbff width=480 height=190>”);
pagina.println(“<TBODY align=center>”);
pagina.println(“<TR>”);
pagina.println(“<TD width=329 align=center
height=30 bgcolor=#d7d7ff><SELECT”);
pagina.println(“name=tema>”);
while (consultatema.next()){
pagina.println(“<OPTION value=“+consultatema.getString
(“codtema”)+”>”+consultatema.getString(“desc”)+”</OPTION>”);
}
consultatema.close();
temas.close();
pagina.println(“</SELECT></TD>”);
pagina.println(“<TD width=151 align=center height=30
bgcolor=#eaeaff><INPUT”);
pagina.println(“type=submit name=agregar
value=Agregar></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD width=329 height=33
bgcolor=#d7d7ff></TD>”);
pagina.println(“<TD width=151 align=center height=33
bgcolor=#eaeaff><INPUT”);
7.2. CÓDIGO (JAVA). IDENTIFICACIÓN DEL PROFESOR
pagina.println(“type=submit name=modificar
value=Modificar></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD width=329 height=7
bgcolor=#d7d7ff></TD>”);
pagina.println(“<TD width=151 align=center height=7
bgcolor=#eaeaff><INPUT”);
pagina.println(“type=submit name=eliminar
value=Eliminar></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD width=329 height=7
bgcolor=#d7d7ff></TD>”);
pagina.println(“<TD width=151 align=center height=7
bgcolor=#eaeaff><INPUT”);
pagina.println(“type=submit name=eliminar
value=consultar></TD>”);
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE>”);
pagina.println(“</CENTER>”);
pagina.println(“</FORM>”);
pagina.println(“<P><BR>”);
207
208
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
pagina.println(“<BR>”);
pagina.println(“</P><CENTER>”);
pagina.println(“<TABLE border=0
bgcolor=#b9b9ff width=245>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#b3b3ff>”);
pagina.println(“<TD align=center height=26
bgcolor=#e1e1ff width=109><A”);
pagina.println(“href=Profesor/Identif%20Profesor.html
target=_self><IMG border=0”);
pagina.println(“src=Profesor/Botones/Atras.gif width=117
height=22></A></TD>”);
pagina.println(“<TD align=center height=26 bgcolor=#e1e1ff
width=135><A”);
pagina.println(“href=Profesor/Temas%20Consultar.html
target=_self><IMG border=0”);
pagina.println(“src=Profesor/Botones/Consulta.gif width=117
height=22></A></TD>”);
pagina.println(“<TD align=center height=26
bgcolor=#e1e1ff width=135><A”);
pagina.println(“href=Profesor/Estadisticas.html
target=_self><IMG border=0”);
pagina.println(“src=Profesor/Botones/Estadisticas.gif
width=123 height=22></A></TD>”);
7.2. CÓDIGO (JAVA). IDENTIFICACIÓN DEL PROFESOR
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE>”);
pagina.println(“</CENTER>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
}else {
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
209
210
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
pagina.println(“</P>”);
pagina.println(“<FORM>”);
pagina.println(“<CENTER><TABLE border=0
bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#bfbfff>”);
pagina.println(“<TD><FONT size=4 color=#000000
face=Palatino Linotype>”);
pagina.println(“Su clave es incorrecta.</FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD align=center
bgcolor=#ddddff><INPUT type=button name=Aceptar
value=Aceptar onclick=history.back()></TD>”);
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE></CENTER></FORM>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
}
}catch (Exception e) {
System.out.println(“Error en la actualización”+
7.2. CÓDIGO (JAVA). IDENTIFICACIÓN DEL PROFESOR
e.getMessage());
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“</P>”);
pagina.println(“<FORM>”);
pagina.println(“<CENTER><TABLE border=0
bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#bfbfff>”);
pagina.println(“<TD><FONT size=4 color=#000000
face=Palatino Linotype>”);
211
212
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
pagina.println(“Error general</FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD align=center bgcolor=#ddddff>
<INPUT type=button name=Aceptar value=Aceptar
onclick=history.back()></TD>”);
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE></CENTER></FORM>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
}
}
}
}
7.3
Código (Html). Alta del Alumno
A continuación se muestra el código HTML utilizado para el alta del alumno:
<HTML>
<HEAD>
<META http-equiv=“Content-Type” content=“text/html;
charset=ISO-8859-1”>
7.3. CÓDIGO (HTML). ALTA DEL ALUMNO
<META name=“GENERATOR” content=“IBM
WebSphere Studio”>
<META http-equiv=“Content-Style-Type” content=“text/css”>
<TITLE>Advertencia.html</TITLE>
</HEAD>
<BODY bgcolor=“#d5d5ff”>
<P><BR>
<BR></P>
<FORM action=“/TesisMariela/Alta” method=“post”>
<CENTER><TABLE border=“0” bgcolor=“#ffffff”>
<TBODY align=“center”>
<TR bgcolor=“#ccccff”>
<TD height=“36” width=“92”></TD>
<TD height=“36” width=“267”><FONT face=“Palatino Linotype”
size=“3”><B>Ingrese los Siguientes Datos para Darse de Alta
</B></FONT></TD>
</TR>
<TR>
<TD bgcolor=“#e1e1ff” align=“left” height=“26”
width=“92”><B><FONT
face=“Book Antiqua”></FONT><FONT face=
”Palatino Linotype” size=“3”
color=“black”>L.U</FONT>.</B></TD>
<TD bgcolor=“#dfdfff” align=“left” height=“26”
213
214
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
width=“267”><INPUT type=“text” name=“lu” size=“5”
maxlength=“5”></TD>
</TR>
<TR>
<TD bgcolor=“#e1e1ff” align=“left” height=“21”
width=“92”><B><FONT
size=“3” color=“#000000” face=“Palatino Linotype”>
AyN</FONT></B></TD>
<TD bgcolor=“#dfdfff” align=“left” height=“21”
width=“267”><INPUT
type=“text” name=“nya” size=“30”></TD>
</TR>
<TR>
<TD bgcolor=“#e1e1ff” align=“left” height=“32”
width=“92”><B><FONT size=“3” color=“#000000”
face=“Palatino Linotype”>Dirección</FONT></B></TD>
<TD bgcolor=“#dfdfff” align=“left” height=“32”
width=“267”><INPUTtype=“text” name=“direccion”
size=“25”></TD>
</TR>
<TR>
<TD bgcolor=“#e1e1ff” align=“left” height=“23”
width=“92”><B><FONT size=“3” color=“#000000”
face=“Palatino Linotype”>Tel.</FONT></B></TD>
7.3. CÓDIGO (HTML). ALTA DEL ALUMNO
215
<TD bgcolor=“#dfdfff” align=“left” height=“23”
width=“267”><INPUT type=“text” name=“telefono” size=“20”></TD>
</TR>
<TR>
<TD bgcolor=“#e1e1ff” align=“left” height=“26”
width=“92”><B><FONT size=“3” color=“#000000”
face=“Palatino Linotype”>E-mail</FONT></B></TD>
<TD bgcolor=“#dfdfff” align=“left” height=“26”
width=“267”><INPUT
type=“text” name=“email” size=“30”></TD>
</TR>
<TR>
<TD bgcolor=“#e1e1ff” height=“25” width=“92”><B>
<FONT size=“3”color=“#000000”
face=“Palatino Linotype”>Contraseña</FONT>
</B></TD><TD bgcolor=“#dfdfff” align=“left” height=“25”
width=“267”><INPUT type=“password” name=“clave” size=“8”
maxlength=“8”> (debe tener 8 caracteres)</TD>
</TR>
<TR bgcolor=“#ccccff” align=“center” valign=“middle”>
<TD height=“32” width=“92”></TD>
<TD valign=“middle” height=“32” width=“267”>
<INPUT type=“submit” name=“Aceptar”
value=“Aceptar”> <INPUT
216
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
type=“reset” name=“Cancelar” value=“Cancelar”></TD>
</TR>
</TBODY>
</TABLE></CENTER></FORM><P><BR>
</P>
<P align=“center”><IMG type=“button” value=“go back”
onclick=“history.back()” border=“0”
src=“../Profesor/Botones/Atras1.gif” width=“89” height=“22”>
<BR>
<BR>
</P>
</BODY>
</HTML>
7.4
Código (Html). Identificación del Profesor
A continuación se muestra el código HTML utilizado para la identificación del
profesor:
<HTML>
<HEAD>
<META http-equiv=“Content-Type”
content=“text/html; charset=WINDOWS-1252”>
<META name=“GENERATOR” content=“IBM
WebSphere Studio”>
<META http-equiv=“Content-Style-Type”
7.4. CÓDIGO (HTML). IDENTIFICACIÓN DEL PROFESOR
content=“text/css”>
<TITLE>Identif Profesor.html</TITLE>
</HEAD>
<BODY bgcolor=“#d5d5ff”>
<P>.<BR>
<BR>
<BR>
<BR>
<BR>
</P>
<FORM action=“/TesisMariela/ProfesorRegistrado”
method=“post”>
<CENTER>
<TABLE border=“0” width=“441” bgcolor=“#ffffff”>
<TBODY>
<TR bgcolor=“#aaaaff”>
<TD colspan=“2” align=“center” bgcolor=“#bbbbff”
height=“15”><FONTsize=“4” color=“#000000”
face=“Palatino Linotype”><B></B></FONT><FONT
size=“4” color=“#000000” face=“Tahoma”>
Profesor Registrado</FONT></TD><TD align=“center”
bgcolor=“#bbbbff” height=“15” width=“199”><FONT
size=“4” color=“#000000” face=“Tahoma”>
Profesor Nuevo</FONT></TD>
217
218
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
</TR>
<TR bgcolor=“#d2d2ff”>
<TD align=“center” bgcolor=“#d5d5ff”
colspan=“2” height=“27”><FONTsize=“3” color=“#000000”
face=“Palatino Linotype”><FONT size=“3”color=“#000000”
face=“Palatino Linotype”><B>Ingrese sus Datos</B>
</FONT></FONT></TD>
<TD align=“center” bgcolor=“#d2d2ff”
width=“199” height=“27”></TD>
</TR>
<TR bgcolor=“#ceceff”>
<TD align=“left” bgcolor=“#ececff” height=“32”
width=“108”><B><FONT size=“3” color=“#000000”
face=“Palatino Linotype”>Nbre Usuario</FONT>
</B></TD>
<TD align=“left” bgcolor=“#ececff”
valign=“middle” height=“32” width=“126”>
<INPUT type=“text” name=“usu” size=“15”></TD>
<TD align=“center” bgcolor=“#d2d2ff” valign=“middle” width=“199”
height=“32”><FONT face=“Tahoma” size=“4”><A
href=“Prof Inexistente.html” target=“_self”>Registrarse</A>
</FONT></TD>
</TR>
<TR bgcolor=“#9797ff”>
7.4. CÓDIGO (HTML). IDENTIFICACIÓN DEL PROFESOR
219
<TD align=“left” bgcolor=“#ececff” height=“32” width=“108”>
<B><FONTsize=“3” color=“#000000”
face=“Palatino Linotype”>Contraseña</FONT></B></TD>
<TD align=“left” bgcolor=“#ececff” valign=“middle” height=“32”
width=“126”><INPUT type=“password” name=“clave” size=“8”
maxlength=“8”></TD>
<TD align=“left” bgcolor=“#d2d2ff” valign=“middle” width=“199”
height=“32”></TD>
</TR>
<TR bgcolor=“#d9d9ff”>
<TD colspan=“2” bgcolor=“#bfbfff” valign=“middle” align=“center”
height=“23”><INPUT type=“submit” name=“Aceptar”
value=“Aceptar”> <INPUT
type=“reset” value=“Cancelar” name=“Cancelar”><FONT size=“4”
color=“#000000” face=“Palatino Linotype”></FONT></TD>
<TD bgcolor=“#d2d2ff” valign=“middle” align=“center” width=“199”
height=“23”></TD>
</TR>
</TBODY>
</TABLE>
</CENTER>
</FORM>
</BODY>
</HTML>
220
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
7.5
Código (Java).Modificar Pregunta
A continuación se muestra el ejemplo del servlet que contiene el código java
utilizado para que el profesor modifique una pregunta:
package profesor;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
public class ModificarPregunta extends
HttpServlet {
Connection conn;
private int longitudlu;
/*
* En el metodo Init se realizará la conexión a la BD
* por lo que las peticiones no producirán
ningun retardo de conexión
*/
public void init(ServletConfig cf) throws
ServletException {
super.init(cf);
// Se carga el driver a continuación
try {
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
}catch (ClassNotFoundException e) {
7.5. CÓDIGO (JAVA).MODIFICAR PREGUNTA
System.out.println(“Imposible encontrar el driver:” +
e.getMessage());
}
//Se intenta realizar la conexión a la base de datos
try {
conn = DriverManager.getConnection
(“jdbc:odbc:TP”);
}catch (SQLException e) {
System.out.println(“Imposible crear
conexion:” + e.getMessage());
}
}// fin init
/*
* En el metodo destroy() una vez
que el servlet se esta apagando,
desconectaremos
* de la base de datos
*/
public void destroy() {
super.destroy();
//Llamada al destroy de la superclase
try {
conn.close();
}catch (SQLException e){
221
222
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
System.out.println(“Imposible cerrar conexion:”
+ e.getMessage());
}
} //fin destroy()
/*
*Redefinimos el metodo doPost ya
que las peticiones se realizaran por
ese metodo
*/
public void doPost(HttpServletRequest
request,HttpServletResponse response)
throws ServletException, IOException,
IOException {
String pregunta;
String usu;
String clave;
String tema;
//Obtenemos los valores de los parámetros
pregunta = request.getParameter(“pregunta”);
usu = request.getParameter(“usu”);
clave = request.getParameter(“clave”);
tema = request.getParameter(“tema”);
if (pregunta == null) {
PrintWriter pagina = response.getWriter();
7.5. CÓDIGO (JAVA).MODIFICAR PREGUNTA
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“</P>”);
pagina.println(“<FORM>”);
pagina.println(“<CENTER><TABLE border=0
bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#bfbfff>”);
pagina.println(“<TD><FONT size=4
color=#000000 face=Palatino Linotype>Debe”);
pagina.println(“seleccionar la pregunta
que desea eliminar.</FONT></TD>”);
223
224
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD align=center bgcolor=#ddddff>
<INPUT type=button name=Aceptar
value=Aceptar onclick=history.back()></TD>”);
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE></CENTER></FORM>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
}else {
try {
Statement sentencia2 = conn.createStatement();
ResultSet consulta2 = sentencia2.executeQuery
(“Select * FROM pregunta where codpreg=“+pregunta+””);
String validar=“”;
while(consulta2.next()){
validar = consulta2.getString(1);
}
if(validar.equals(“”)){
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
7.5. CÓDIGO (JAVA).MODIFICAR PREGUNTA
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“</P>”);
pagina.println(“<FORM>”);
pagina.println(“<CENTER><TABLE
border=0 bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#bfbfff>”);
pagina.println(“<TD><FONT size=4
color=#000000 face=Palatino Linotype>”);
pagina.println(“La pregunta no existe.</FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
225
226
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
pagina.println(“<TD align=center bgcolor=#ddddff>
<INPUT type=button name=Aceptar value=Aceptar
onclick=history.back()></TD>”);
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE></CENTER></FORM>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
}else{
Statement sentencia = conn.createStatement();
ResultSet consulta = sentencia.executeQuery
(“SELECT * FROM pregunta where codpreg=“+pregunta+””);
Statement sentencia1 = conn.createStatement();
ResultSet consulta1 = sentencia1.executeQuery
(“SELECT * FROM respuesta where codpreg=“+pregunta+””);
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
pagina.println(“<META name=GENERATOR
7.5. CÓDIGO (JAVA).MODIFICAR PREGUNTA
content=IBM WebSphere Studio>”);
pagina.println(“<META http-equiv=Content-StyleType content=text/css>”);
pagina.println(“<TITLE>Agregar.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY bgcolor=#d5d5ff>”);
pagina.println(“<FORM action = ModificarPreguntaFinal
method = post>”);
pagina.println(“<input type = hidden
name=tema value =“+tema+”>”);
pagina.println(“<input type = hidden
name=codpreg value =“+pregunta+”>”);
pagina.println(“<input type = hidden
name=usu value =“+usu+”>”);
pagina.println(“<input type = hidden
name=clave value =“+clave+”>”);
pagina.println(“<CENTER>”);
pagina.println(“<TABLE border=0
bgcolor=#f9f9ff height=382>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#d2d2ff>”);
pagina.println(“<TD bgcolor=#bfbfff height=30
align=center width=531><FONT”);
pagina.println(“size=5 color=#000000
227
228
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
face=Palatino Linotype>Modifique la”);
pagina.println(“pregunta </FONT><IMG
border=0 src=Profesor/Botones/marine001an60.gif”);
pagina.println(“width=60 height=46 align=middle></TD>”);
while(consulta.next()){
pagina.println(“<TR bgcolor=#d2d2ff>”);
pagina.println(“<TD bgcolor=#ddddff align=center
height=75 width=531><TEXTAREA”);
pagina.println(“rows=3 cols=50 name=pregunta>”
+consulta.getString(“desc”)+”</TEXTAREA></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR bgcolor=#d2d2ff>”);
pagina.println(“<TD bgcolor=#bfbfff
align=center><FONT”);
pagina.println(“size=4 face=Palatino Linotype
color=#000000>Modifique las”);
pagina.println(“opciones y marque la
respuesta correcta</FONT></TD>”);
pagina.println(“</TR>”);
}
String correcta=“”;
int valor=0;
while(consulta1.next()){
String lavel =“”;
7.5. CÓDIGO (JAVA).MODIFICAR PREGUNTA
valor = valor + 1;
if (valor == 1){
lavel=“A”;
}else if(valor ==2){
lavel=“B”;
}else if(valor ==3){
lavel=“C”;
}else if(valor ==4){
lavel=“D”;
}else if(valor ==5){
lavel=“E”;
}else if(valor ==6){
lavel=“F”;
}else if(valor ==7){
lavel=“G”;
}else{
lavel=“H”;
}
correcta = consulta1.getString(“correcta”);
if (correcta.equals(“Sí”)){
pagina.println(“<TR>”);
pagina.println(“<TD bgcolor=#ddddff
height=49 align=center width=531><INPUT”);
pagina.println(“type=radio name=opciones
229
230
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
value=“+valor+” checked><FONT size=4
color=#000000”);
pagina.println(“face=Palatino Linotype>
”+lavel+”. </FONT><TEXTAREA rows=2 cols=50”);
pagina.println(“name=opcion”+valor+”>
+consulta1.getString(“desc”)+”</TEXTAREA></TD>”);
pagina.println(“</TR>”);
}else{
pagina.println(“<TR>”);
pagina.println(“<TD bgcolor=#ddddff height=49
align=center width=531><INPUT”);
pagina.println(“type=radio name=opciones
value=“+valor+”><FONT size=4
color=#000000”);
pagina.println(“face=Palatino Linotype>
”+lavel+”. </FONT><TEXTAREA rows=2 cols=50”);
pagina.println(“name=opcion”+valor+”>
”+consulta1.getString(“desc”)+”</TEXTAREA></TD>”);
pagina.println(“</TR>”);
}
}
pagina.println(“<TR bgcolor=#f2f2ff>”);
pagina.println(“<TD align=center
bgcolor=#c1c1ff height=47 width=531><INPUT”);
7.5. CÓDIGO (JAVA).MODIFICAR PREGUNTA
pagina.println(“type=submit name=modificar
value=Modificar> <INPUT type=button”);
pagina.println(“name=Cancelar value=Cancelar
onclick=history.back()></TD>”);
pagina.println(“</TR>”);
pagina.println(“</TBODY>”);
pagina.println(“</TABLE>”);
pagina.println(“</CENTER></FORM>
<P align=center><BR>”);
pagina.println(“</P>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
}
}catch (Exception e) {
System.out.println(“Error en la actualización”
+ e.getMessage());
PrintWriter pagina = response.getWriter();
//Devolvemos una pagina de error
pagina.println(“<HTML>”);
pagina.println(“<HEAD>”);
pagina.println(“<META http-equiv=Content-Type
content=text/html; charset=ISO-8859-1>”);
231
232
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
pagina.println(“<META name=GENERATOR
content=IBM WebSphere Studio>”);
pagina.println(“<TITLE>Cant Caract
Incorrectos.html</TITLE>”);
pagina.println(“</HEAD>”);
pagina.println(“<BODY bgcolor=#d5d5ff><P><BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“<BR>”);
pagina.println(“</P>”);
pagina.println(“<FORM>”);
pagina.println(“<CENTER><TABLE border=0
bgcolor=#f4f4ff height=79>”);
pagina.println(“<TBODY>”);
pagina.println(“<TR bgcolor=#bfbfff>”);
pagina.println(“<TD><FONT size=4
color=#000000 face=Palatino Linotype>”);
pagina.println(“error general</FONT></TD>”);
pagina.println(“</TR>”);
pagina.println(“<TR>”);
pagina.println(“<TD align=center bgcolor=#ddddff>
<INPUT type=button name=Aceptar value=Aceptar
onclick=history.back()></TD>”);
pagina.println(“</TR>”);
7.6. CÓDIGO (HTML).PANTALLA ESTADÍSTICAS DEL PROFESOR233
pagina.println(“</TBODY>”);
pagina.println(“</TABLE></CENTER></FORM>”);
pagina.println(“</BODY>”);
pagina.println(“</HTML>”);
pagina.flush();
pagina.close();
}
}
}
}
7.6
Código (Html).Pantalla Estadísticas del Profesor
A continuación se muestra el código HTML utilizado para visualizar la pantalla
estadísticas del profesor:
<!DOCTYPE HTML PUBLIC ”-//W3C//DTD HTML 4.01
Transitional//EN”>
<HTML>
<HEAD>
<META http-equiv=“Content-Type” content=“text/html;
charset=ISO-8859-1”>
<META name=“GENERATOR”
content=“IBM WebSphere Studio”>
<TITLE>Estadisticas.html</TITLE>
</HEAD>
234
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
<BODY bgcolor=“#d5d5ff”>
<P><BR>
<BR>
<BR>
<BR>
<BR>
</P>
<FORM action=“/TesisMariela/Estadisticas”
method=“post” target=“_self”>
<CENTER>
<TABLE border=“0” bgcolor=“#ffffff”>
<TBODY>
<TR bgcolor=“#b9b9ff”>
<TD align=“center” height=“31”><FONT
face=“Palatino Linotype”
size=“4”>¿Qué consulta desea hacer?<
/FONT></TD>
</TR>
<TR>
<TD height=“18” bgcolor=“#ddddff”><FONT
face=“Palatino Linotype”><INPUT
type=“radio” name=“opciones” value=“opcion1”>
Promedio general de evaluaciones por año.
</FONT></TD>
7.6. CÓDIGO (HTML).PANTALLA ESTADÍSTICAS DEL PROFESOR235
</TR>
<TR>
<TD bgcolor=“#ddddff”><FONT
face=“Palatino Linotype”><INPUT
type=“radio” name=“opciones”
value=“opcion2”>Cantidad de alumnos
que se evaluaron por año.</FONT></TD>
</TR>
<TR>
<TD bgcolor=“#ddddff”><FONT
face=“Palatino Linotype”><INPUT
type=“radio” name=“opciones”
value=“opcion3”>Promedio de notas de
todos los exámenes de todos los
temas.</FONT></TD>
</TR>
<TR>
<TD bgcolor=“#ddddff”><FONT
face=“Palatino Linotype”><INPUT
type=“radio” name=“opciones”
value=“opcion4”>Promedio de aprobados y
desaprobados</FONT></TD>
</TR>
<TR bgcolor=“#b9b9ff”>
236
CAPÍTULO 7. CÓD. UTILIZADOS EN LA APLICACIÓN
<TD height=“33” align=“center”><INPUT
type=“submit” name=“Aceptar”
value=“Aceptar”> <INPUT
type=“button” name=“Cancelar”
value=“Cancelar”
onclick=history.back()></TD>
</TR>
</TBODY>
</TABLE>
</CENTER>
</FORM>
<P align=“center”></P></BODY>
</HTML>
Capítulo 8
Conclusiones
8.1
Conclusiones Acerca de las Tecnologías y Software Utilizados
Se ha podido comprobar las grandes ventajas de la utilización de tecnologías
y software, tanto de base de datos como de desarrollo de aplicaciones, que
soportan sistemas distribuidos multiplataforma.
Esto ha resultado de gran utilidad al momento de desarrollar una aplicación
con WebSphere Application Developer v.5.0 y DB2 UDB WorkGroup Server
Edition v. 8.1, bajo Windows XP Service Pack 2, utilizando Java 1.5, para
implementarla en un entorno Windows, que ha resultado sumamente sencilla,
rápida y eficiente.
Java nace en un intento de resolver simultáneamente los problemas que
se planteaban los desarrolladores de software por la difusión de arquitecturas
incompatibles, tanto entre las diferentes máquinas como entre los diversos
sistemas operativos.
El uso de Java se destaca en la Web y también sirve para crear todo tipo
de aplicaciones (locales, Intranet o Internet).
En cuanto a las facilidades en el desarrollo de aplicaciones Java para entornos multiplataforma, se pudo apreciar que WebSphere puede ser usado desde
la Intranet de una organización y/o desde la Internet, con lo cual el sistema
resulta más eficiente, más flexible y adaptable al cambio y, además, con un
237
238
CAPÍTULO 8. CONCLUSIONES
soporte menos complejo.
Con respecto al motor de bases de datos DB2, se debe destacar la escalabilidad, integridad y seguridad permitiendo realizar respaldos en línea con
distintos grados de granularidad sin que esto afecte la disponibilidad de acceso a los datos por parte de los usuarios; interfaces sencillas y entendibles,
completas, intuitivas y con diversos asistentes, permitiendo de esa manera una
mejor comprensión en la utilización de la herramienta.
Asimismo se pudo apreciar las facilidades del Scientific WorkPlace para
escribir libros, por la calidad del producto obtenido, la automatización en el
manejo de índices, la gestión dinámica de espacios, listas de figuras, de tablas,
referencias dinámicas a objetos, bibliografia, etc.
Se destaca la gran potencialidad de este conjunto de herramientas para el
desarrollo de aplicaciones de gran porte y alta complejidad, para su acceso
desde las Intranets de las organizaciones o desde la Internet.
Se hace notar además que los docentes a cargo de la cátedra de Teleproceso y Sistemas Distribuidos de la Facultad, han manifestado su interés
en el producto desarrollado, debido a que pudieron observar las facilidades y
buen desempeño de la aplicación y las sencillas interfaces gráficas; también se
vieron muy interesados por la facilidad que brinda el sistema al ser operado
completamente desde la Intranet y/o Internet.
8.2
Líneas Futuras de Acción
Se considera que las principales líneas futuras de acción derivadas del presente
trabajo serían las siguientes:
• Desarrollar un esquema de seguridad más elaborado, incorporando criptografía en la gestión de las claves.
• Desarrollar un manejo de activadores desde la base de datos, para automatizar la obtención de las copias de seguridad, haciendo más eficiente
la aplicación.
• Incorporar mecanismos de gestión de fechas de ingreso de preguntas y
respuestas.
8.2. LÍNEAS FUTURAS DE ACCIÓN
• Incorporar evaluaciones referidas a los trabajos prácticos.
• Incorporar otras metodologías de autoevaluación.
239
Bibliografía
[1] J. Blanco A. Bernaus. Diseño de Páginas Web con HTML, Javascript y
Vbscript. Inforbooks S. L., España, 1996.
[2] A.Bartolomé. La sociedad audiovisual teleinteractiva Aspectos tecnológicos de nuestra sociedad actual. Praxis, Madrid, 1996.
[3] L. Joyanes Aguilar. Cibersociedad. Mac Graw-Hill, 1997.
[4] L. Joyanes Aguilar. Programación Orientada a Objetos - Segunda Edición. Mc Graw Hill/Interamericana de España, S.A.U., España, 1998.
[5] Jhon Wiley Alan Simon and Sons. Data Warehouse, Data Mining and
OLAP. USA, 1997.
[6] Mc Graw Hill Alex Berson, Stephen J. Smith. Data Warehouse, Data
Mining and OLAP. USA, 1997.
[7] L. Boszörményi. Why Java is not my Favourite First-course Language.
Software - Concepts & Tools, N◦ 19, 141-145, 1998.
[8] James A. O´ Brien. Sistemas de Información Gerencial. Editorial Nomos
S.A., Argentina, 2003.
[9] M. Castells. Flujos, redes e identidades: Una Teoría crítica de la Sociedad
Informacional. Paidós Educador, España, 1994.
[10] J. H. Kingston; B. Cole. Algorithm and Data Structures. Java Edition.
Addison-Wesley, 1999.
[11] A. González del Alba Baraja; V. Yague Galaup; L. Joyanes Aguilar. Impacto de las Tecnologías en la Gestión de los Sistemas de Información en
II Congreso Internacional de Sociedad de la Información y del Conocimiento. McGraw Hill, Madrid-España, 2003.
241
242
BIBLIOGRAFÍA
[12] J. Delors. La Educación encierra un tesoro. Santillana ediciones UNESCO, Madrid, 1996.
[13] Jhon Wileyand Sons Eric Thompson. OLAP Solutios: Building Multidimentional Information Sysmens, Segunda Edición. USA, 1997.
[14] B. Fillip. Distance education in Africa: new technologies and new opportunities. Organismo Japonés de Cooperación Internacional, Oficina en los
Estados Unidos, Estados Unidos, 2000.
[15] IBM Software Group. Enterprise Data Warehousing whit DB2: The 10
Terabyte TPC-H Benchmark. IBM Press, USA, 2003.
[16] IBM. WebSphere Comerse V5.5 Architecture. IBM Press, USA, 2003.
[17] I. ILLICH. La sociedad desescolarizada. Barral Editores, Barcelona, 1974.
[18] María José Ramírez Quintana José Hernández Orallo. Extracción Automática de Conocimiento en Bases de Datos e Ingeniería del Software.
España, 2003.
[19] Manuel Palomar Juan C. Trujilla. Diseño de Almacenes de Datos. España, 2002.
[20] José Antonio Rodero Rodero Mario Piattini Velthuis. Auditoría de los
Data Warehouse. España, 1998.
[21] L. Joyanes Aguilar; I. Zahonero Martínez. Estructura de Datos - Algoritmos, Abstracción y Objetos. Mc Graw Hill/Interamericana de España,
S.A.U., España, 1998.
[22] N.Ñegroponte. El Mundo Digital. Ediciones B, Barcelona-España, 1995.
[23] M.Ñ. Amutabi; M. O. Oketch. Experimenting in distance education: the
African Virtual University (AVU) and the paradox of the World Bank
in Kenya. International Journal of Educational Development, 23: 57-73.
AVU, Kenya, 2003.
[24] IBM Press. IBM DB2 Warehouse Manager Guía de Instalación Version
7. IBM Press, USA, 2001.
[25] IBM Press. IBM DB2 Intelligent Miner for Data: Utilización de Intelligent Miner for Data. IBM Press, USA, 2002.
BIBLIOGRAFÍA
243
[26] IBM Press. IBM DB2 Intelligent Miner Visualization: Using the Intelligent Miner Visualizers. IBM Press, USA, 2002.
[27] Rudyanto Linngar Saida Davies, Surech Amujuri. WebSphere Business
Integration Pub/Sub Solutions. IBM Press, USA, 2004.
[28] J. Salinas. Organización escolar y Redes: Los Nuevos Escenarios de
Aprendizaje. Centro de Estudios Ramón Areces, España, 1995.
[29] E. Castillo; A. Cobo; P. Gómez; C. Solares. JAVA - Un Lenguaje de
Programación Multiplataforma para Internet. Paraninfo, España, 1997.
[30] J. Tiffin;L.Rajasingham. En Busca de la clase virtual. Paidós, Barcelona,
1997.
Índice de Materias
AE
BI
aprendizaje electrónico, 7
análisis
multidimensional, 20
API, 64
Aplicación
descripción, 139
descripción general, 139
aplicación
estructuras de datos utilizadas,
163
módulos, 140
alumno, 140
ayuda, 155
profesor, 146
applets, 58, 123
aprendizaje
electrónico
introducción, 7
objetivos y ventajas, 12
problemas y limitaciones, 11
en línea, 9
instrumentos, 10
en línea y presencial, 9
plataforma de, 10
presencial, 9
autoinstrucción, 8
AV
aprendizaje virtual, 8
AWT, 68
Business Intelligence
Inteligencia de Negocios, 21
break, 78
browsers, 122
backup, 46
DB2
C y C++, 55
C/C++, 95
códigos utilizados, 171
alta del alumno, 171, 212
identificación del profesor, 194,
216
modificar pregunta, 220
pantalla estadísticas del profesor, 233
cast
cast, 87
ciberespacio, 16
clave
foránea, 27
maestra, 27
conclusiones, 237
conocimiento, 3
ciclo de vida, 5
explícito, 4
tácito, 4
tipos, 4
Content-Type, 128
CPU, 53
curso a distancia, 9
245
246
ÍNDICE DE MATERIAS
administrador, 50
anidar o establecer tablas de expresión, 37
outer join, 39
tablas de expresión, 37
tablas de expresión común, 38
capacidad y escalabilidad, 25
características, 22
conectividad, 23
configuraciones de particiones múltiples, 46
data mining, 24
data warehousing, 24
e-business, 23
escalabilidad, 23
funciones complementarias, 23
funciones de tablas, 37
funciones definidas por el usuario, 34
funciones incorporadas
funciones aritméticas, 32
funciones de texto, 33
funciones soundex, 33
funciones soundex 2do ejemplo, 34
hardware soportado por DB2,
44
part. simple con múltiples procesadores, 45
part. simple de un único procesador, 45
herramientas de administración,
49
administración de servidores,
49
asistente para la config. de
clientes, 49
instalación y uso, 23
integridad, 22
integridad referencial, 26
restricciones, 26
restricciones preferenciales, 27
Introducción a, 19
múltiples usos, 22
multiplataforma, 23
partición, 25
smartguides
guías inteligentes, 51
SQL
comandos adicionales, 43
tabla de control de restricciones
funciones incorporadas, 32
tabla de restricciones, 30
restricción única, 31
tabla de control de restricciones, 31
triggers
disparadores, 40
universalidad, 23
ventajas, 19
DBA, 49
data base administrator
administrador de bases de datos, 40
destroy, 130
DHTML, 123
dinámico, 86
DNS, 7
doGet, 128
doGet (), 130
doPost (), 130
DRDA
Distributed Relational Database Architecture
Arquitectura de Bases de Datos Relacionales Distribuidas, 50
ÍNDICE DE MATERIAS
Eclipse, 124
educación
multimedia, 15
papel de la, 15
tendencias, 16
educación a distancia
introducción, 13
ejemplo de
bifurcación if, 96
bifurcación if else, 96
bucle for, 97
bucle while, 97
comentario, 95
do while, 98
línea compuesta por tres sentencias, 94
operadores incrementales y relacionales, 89
tilde nanza
virtual
ventajas, 17
EPSS
Electronic Perfomance Support
Systems, 4
escuela, 15
eslabon, 85
estático, 86
evento, 74
flash crowds, 111
gestión del conocimiento, 3
GUI, 118
HTML, 58, 123
HttpServletRequest, 128
HttpServletResponse, 128
IBM WebSphere, 109
IDE, 56, 124
incx, 85
247
información, 1, 2
INIT, 129
inner join, 39
Internet, 8, 21
introducción, 6
servicios de, 7
intranet, 8
IRC
Internet Relay Chat, 7
IT, 115
J2EE, 114
JAVA
aplicaciones corporativas, 91
efectivas y eficientes, 92
mantenimiento y soporte, 94
apllets
seg. del código intermedio,
63
applets, 58
construcción, 59
incorporación en pág. web,
60
portabilidad, 61
problema de seguridad, 61
seguridad del monitor, 62
arreglos, 66
AWT, 68
jerarquía de clases, 69
compilador, 57
constructores, 69
encapsulamiento de clases, 71
visibilidad de campos y métodos, 72
visibilidad de clases, 74
entorno de desarrollo, 56
errores de programación, 100
carga de drivers JDBC, 105
entrada/salida por archivo, 107
fuentes de caracteres, 107
248
scheduling de los hilos de ejecución, 100
terminación de líneas, 106
uso de características de portabilidad, 102
uso de directorios definidos,
102
estructuras de programación, 94
bifurcaciones, 95
bucles, 97
comentarios, 94
sentencias o expresiones, 94
instrucciones, 76
interacción con el usuario, 74
introducción, 53
historia, 53
objetos y clases, 80
operadores, 87
aritméticos, 88
de asignación, 88
de concatenación de cadenas
de caracteres, 90
incrementales, 89
precedencia de, 91
relacionales, 89
unarios, 88
pricipales características, 55
simplicidad, 55
subclases y herencia, 85
variables PATH y CLASSPATH,
63
virtual machine, 57
Java, 21
javax.servlet.HttpServlet, 128
JCA, 116
JDBC, 21, 118, 122
JDK, 56, 95
JIT, 58
JNDI, 118
ÍNDICE DE MATERIAS
join convencional, 39
JRE, 56
JSP
Java Server Pages, 117
JSPs, 123
JVM, 54, 117
monitor, 62
MPP
Procesamiento Paralelo Masivo,
47
NIT
nuevas tecnologías de la información, 13
OLAP, 20, 23
OLTP, 23
outer join, 39
pascal, 80
plataforma, 112
print, 85
public, 74
RDBMS, 22
record, 80
referencial constraint, 30
RIO, 123
server-side, 129
servlet, 127
desarrollo, 127
API, 135
aplicaciones de, 134
ciclo de vida del servlet, 129
codificación, 128
compilación batch de JSP, 133
inicialización, 129
inicialización terminación, 134
modelos de JSP, 131
ÍNDICE DE MATERIAS
patrones y guías, 135
procesadores de JSP, 132
servicio de demanda, 130
terminación, 130
motor del, 129
set, 85
Set-Cookie, 128
SIC
sociedad de la información y del
conocimiento, 1
SmartPhone, 123
SMP
Sistema Simétrico Multiprocesador, 45
sociedad de la información y del conocimiento
introducción, 1
TCP/IP, 7
teleenseñanza, 14
triggers, 40
UDF, 22, 37
UDT, 22
unique constraint, 30
VT, 122
Web
aplicaciones, 134
WebSphere
application server, 114
advanced edition, 114
enterprise edition, 115
standard edition, 116
arquitecturas
tres niveles de, 119
contenedor
cliente de aplicaciones de, 118
contenedor de applets, 118
contenedor EJB, 117
249
contenedor web, 117
e-business on demand
integración en el, 111
enterprise beans, 117
incremento del rendimiento
aplicaciones de las, 111
introducción, 109
middleware, 114
plataforma de software, 112
plug-in, 116
producto
familias del, 121
qué es, 109
Quick Installation, 116
servidor de aplicaciones, 117
servidor HTTP, 116
servlets, 117
sistema principal virtual, 119
Web Services, 115
WebSphere Studio, 122
Websphere Studio
harramientas de, 123
WebSphere Host Integration, 122
WebSphere Host Publisher, 122
WebSphere Transcoding Publisher,
123
WIDGETS, 68
wizard, 123
WWW, 6
World Wide Web, 7
XML, 123
Descargar