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”>&nbsp;<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