Aplicación Web Para la Gestión Agro-Ganadera.

Anuncio
Universidad Nacional del Nordeste
Facultad de Ciencias Exactas y Naturales y de Agrimensura
Licenciatura en Sistemas de Información
Trabajo Final de Aplicación
Aplicación Web para la Gestión Agro-Ganadera
Alumno: Lisandro Dardo Yaccuzzi - LU:32774
Profs. Orientadores: Mgter. David L. La Red Martinez
y Lic. Valeria E. Uribe
Prof. Coordinador: Agr. Castor F. Herrmann
Corrientes - Argentina
Julio - 2010
A mi familia, esposa e hija.
Prefacio
Los diversos avances tecnológicos derivados del conocimiento y la ciencia
están siendo aplicados en varios países del mundo a distintos sectores nunca antes imaginados, entre ellos el sector de la agricultura y la ganadería en
Argentina. A esto se le suma el empleo de herramientas con tecnología de avanzada que ya se encuentran a disposición de todos en cualquier momento y lugar
que se las requieran, para poder de esta forma mantener la competitividad a
nivel mundial con una producción sustentable en el tiempo.
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 empresariales, utilizando diversos medios de comunicación y diferentes plataformas de hardware y de software, para resolver
el problema de la creciente complejidad de la gestión de un establecimiento
agrícola-ganadero en continua expansión.
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 gestión de un establecimiento
agro-ganadero.
Contempla el registro y seguimiento de la información propia del establecimiento como todas las actividades realizadas en el mismo, es decir la información emergente del registro de cada actividad que se genera en el mismo, el
seguimiento detallado de cada actividad registrada, paso a paso, a los efectos
de brindar información a los usuarios finales de los movimientos realizados,
también a su vez da información, mediante consultas a la aplicación, de los
datos ingresados por cada actividad, como estado actual, stock y demás.
Esto significa la posibilidad de registrar cada actividad con sus datos y
fechas en el mismo momento que ocurren para su posterior gestión o consulta, brindando la posibilidad de una consulta desde la Internet por los demás
usuarios de la aplicación.
Objetivos
El objetivo inicialmente planteado fue la realización de una aplicación Web
multiplataforma desarrollada en Java, mediante la cual el usuario pudiera contar con un medio de gestión para consultar distintos aspectos del establecimiento en sí, mediante la Web. La aplicación podría ser operada desde una
Intranet o bien desde Internet.
Los 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 Eclipse, versión 5.0 para Windows.
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, Eclipse.
Se ha realizado el estudio del Manejador de Bases de Datos (DBMS)
multiplataforma DB2 Express-C 9.
Se ha realizado el desarrollo de la aplicación utilizando páginas HTML
y Servlets de Java en el marco de la herramienta Eclipse en el entorno
Windows.
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 Express-C 9, Eclipse y Tomcat.
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 - La Agro-Ganadería en la Actualidad: Se presenta una
visión general de los conceptos sobre la tecnología aplicada al sector
agro-ganadero.
Capitulo 2 - Conceptos básicos sobre Java: Se señalan los principales
conceptos referidos al lenguaje de programación.
Capitulo 3 - El lenguaje Java: Se indican los principales aspectos y
destacadas características referidas al lenguaje.
Capitulo 4 - Los Servlets: Se resumen los aspectos y características
más destacadas de estas facilidades.
Capitulo 5 - Introducción a DB2 Express-C 9: Se detallan las más
relevantes características de esta familia de productos de gestión de bases
de datos multiplataforma.
Capitulo 6 - Eclipse: Se presentan los principales aspectos de este entorno de desarrollo de aplicaciones complejas.
Capitulo 7 - Introducción al Servidor Tomcat: Se señalan los aspectos más relevantes de este servidor de aplicaciones Web.
Capitulo 8 - Aplicación: Se detallan los aspectos más significativos de
la aplicación desarrollada utilizando las facilidades antes mencionadas.
Capitulo 9 - Conclusiones: Se presentan las conclusiones a las que se
ha llegado al finalizar el presente trabajo y las posibles líneas futuras.
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.
Lisandro Dardo Yaccuzzi
Licenciatura en Sistemas de Información
Universidad Nacional del Nordeste
L.U.: 32774
Profs. Orientadores: Mgter. David Luis La Red Martínez
y Lic. Valeria E. Uribe
Prof. Coordinador: Agr. Castor F. Herrmann
Corrientes; 01 de Mayo de 2010
Índice general
1. La Agro-Ganadería en la Actualidad
1.1. La Agricultura y la Ganadería en el Mundo y en Argentina
1.2. La Agricultura, la Máquina Reemplaza al Músculo . . . . .
1.2.1. Agricultura de Precisión . . . . . . . . . . . . . . . .
1.3. La Evolución de la Ganadería . . . . . . . . . . . . . . . . .
1.3.1. Ganadería Extensiva e Intensiva . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
1
1
2
4
5
7
2. Conceptos Básicos de Java
2.1. ¿Qué es Java y Para qué fue Pensado? . . . . . . .
2.1.1. Características del Lenguaje Java . . . . . .
2.1.2. Desarrollo de las Principales Características
2.1.3. Ventajas de Java . . . . . . . . . . . . . . .
2.1.4. Limitaciones con Java . . . . . . . . . . . .
2.1.5. Errores con Java . . . . . . . . . . . . . . .
2.2. Existen Distintos Tipos de Java . . . . . . . . . . .
2.2.1. JavaScript . . . . . . . . . . . . . . . . . . .
2.2.2. Java Standalone . . . . . . . . . . . . . . .
2.2.3. Applets . . . . . . . . . . . . . . . . . . . .
2.3. Java en los Browsers de la World Wide Web . . . .
2.3.1. Las Applets en la Web . . . . . . . . . . . .
2.3.2. Máquinas Virtuales . . . . . . . . . . . . . .
2.3.3. Java sin Browsers . . . . . . . . . . . . . . .
2.3.4. HotJava . . . . . . . . . . . . . . . . . . . .
2.4. Java en Hebras - Threads . . . . . . . . . . . . . .
2.4.1. La Ventaja de ser Multi-Threaded . . . . .
2.5. Java Para Aplicaciones Corporativas . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
11
11
12
13
18
19
19
20
20
21
21
23
23
26
28
29
29
30
31
. . . . .
. . . . .
de Java
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
3. El Lenguaje Java
34
3.1. Introducción a su Codificación . . . . . . . . . . . . . . . . . . 34
ÍNDICE GENERAL
3.1.1. Bibliotecas de Clases Estándares de Java
3.2. Estructura General de un Programa Java . . . .
3.3. Conceptos Básicos . . . . . . . . . . . . . . . . .
3.3.1. Clase . . . . . . . . . . . . . . . . . . . .
3.3.2. Herencia . . . . . . . . . . . . . . . . . . .
3.3.3. Interface . . . . . . . . . . . . . . . . . . .
3.3.4. Package . . . . . . . . . . . . . . . . . . .
3.4.
3.5.
3.6.
3.7.
3.8.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
36
36
38
38
38
39
40
3.3.5. La Jerarquía de Clases de Java (API) . . . . . . . . . .
3.3.6. Variables Dentro del Lenguaje Java . . . . . . . . . . .
3.3.7. Visibilidad y Vida de las Variables . . . . . . . . . . . .
Operadores en Java . . . . . . . . . . . . . . . . . . . . . . . .
3.4.1. Operadores Aritméticos . . . . . . . . . . . . . . . . . .
3.4.2. Operadores de Asignación . . . . . . . . . . . . . . . . .
3.4.3. Operadores Unarios . . . . . . . . . . . . . . . . . . . .
3.4.4. Operadores Incrementales . . . . . . . . . . . . . . . . .
3.4.5. Operadores Relacionales . . . . . . . . . . . . . . . . . .
3.4.6. Operador de Concatenación de Cadenas de Caracteres
(+) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.4.7. Precedencia de Operadores . . . . . . . . . . . . . . . .
Estructuras de Programación . . . . . . . . . . . . . . . . . . .
3.5.1. Sentencias o Expresiones . . . . . . . . . . . . . . . . . .
3.5.2. Comentarios . . . . . . . . . . . . . . . . . . . . . . . .
3.5.3. Sentencia import . . . . . . . . . . . . . . . . . . . . . .
3.5.4. Longitud de Líneas . . . . . . . . . . . . . . . . . . . . .
3.5.5. Bifurcaciones . . . . . . . . . . . . . . . . . . . . . . . .
3.5.6. Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Clases en Java . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.6.1. Características Importantes de las Clases . . . . . . . .
3.6.2. Métodos o Funciones Miembros . . . . . . . . . . . . . .
Clases de Mayor Utilidad . . . . . . . . . . . . . . . . . . . . .
3.7.1. Clase Arrays . . . . . . . . . . . . . . . . . . . . . . . .
3.7.2. Clases String y StringBuffer . . . . . . . . . . . . . . . .
3.7.3. Clase Double . . . . . . . . . . . . . . . . . . . . . . . .
3.7.4. Clase Integer . . . . . . . . . . . . . . . . . . . . . . . .
El AWT (Abstract Windows Toolkit) . . . . . . . . . . . . . . .
3.8.1. Qué es el AWT . . . . . . . . . . . . . . . . . . . . . . .
3.8.2. Creación de una Interface Gráfica de Usuario . . . . . .
3.8.3. Objetos “event source” y Objetos “event listener” . . .
41
42
44
45
45
46
46
46
47
48
49
50
50
50
52
52
52
53
57
57
58
60
60
61
62
63
63
63
63
64
ÍNDICE GENERAL
3.8.4. Proceso a Seguir Para Crear Una Aplicación Interactiva
(Orientada a Eventos) . . . . . . . . . . . . . . . . . . .
3.9. Errores Frecuentes de Programación . . . . . . . . . . . . . . .
3.9.1. Scheduling de Hilos de Ejecución . . . . . . . . . . . . .
3.9.2. Errores en el Uso de las Características de Portabilidad
de Java . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.9.3. Uso de Directorios Definidos . . . . . . . . . . . . . . .
3.9.4. Carga de Drivers JDBC . . . . . . . . . . . . . . . . . .
3.9.5. Terminación de Líneas . . . . . . . . . . . . . . . . . . .
3.9.6. Entrada/Salida por Archivo . . . . . . . . . . . . . . . .
3.9.7. Fuentes de Caracteres . . . . . . . . . . . . . . . . . . .
4. Los Servlets
4.1. Servlets . . . . . . . . . . . . . . . . . . . . . .
4.1.1. Principios de Codificación de Servlet .
4.1.2. Ciclo de Vida del Servlet . . . . . . . .
4.1.3. Instanciación e Inicialización . . . . . .
4.1.4. Servicio de Demanda . . . . . . . . . . .
4.1.5. Terminación . . . . . . . . . . . . . . . .
4.1.6. Modelos de Acceso JSP . . . . . . . . .
4.1.7. Procesadores JSP . . . . . . . . . . . . .
4.1.8. Compilación Batch de Archivos JSP . .
4.1.9. Desarrollando Aplicaciones . . . . . . .
4.1.10. Fases de Inicialización y de Terminación
4.1.11. Rasgos de Java Servlet API . . . . . . .
4.1.12. Patrones y Guías de Servlets/JSP . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
65
65
66
67
68
71
72
73
73
74
74
75
76
76
78
78
78
79
81
81
82
82
83
5. Introducción al DB2 Express-C 9
87
5.0.13. Servidores DB2 . . . . . . . . . . . . . . . . . . . . . . . 88
5.0.14. Clientes DB2 y Controladores . . . . . . . . . . . . . . . 89
5.0.15. Características y Productos Relacionados . . . . . . . . 90
5.0.16. Características incluídas en otras ediciones de DB2: . . 90
5.0.17. Características Incluidas con la Licencia de Suscripción
de DB2 Express-C . . . . . . . . . . . . . . . . . . . . . 92
5.0.18. Características No Disponibles con DB2 Express-C . . . 94
5.0.19. Productos Pagados Relacionados con DB2 . . . . . . . . 96
5.0.20. Guía de Instalación de DB2 Express C . . . . . . . . . . 97
5.0.21. Herramientas de DB2 . . . . . . . . . . . . . . . . . . . 102
6. Eclipse
109
ÍNDICE GENERAL
6.1. ¿Que es Eclipse? . . . . . . . . . . . . . . . . . . . . . . . . . . 109
6.2. ¿Como Utilizar Eclipse? . . . . . . . . . . . . . . . . . . . . . . 110
7. Tomcat
7.1. Descripción . . . . . . . . .
7.2. Entorno . . . . . . . . . . .
7.3. Estado de su Desarrollo . .
7.4. Estructura de Directorios .
7.5. Características del Producto
7.6. Historia . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
114
114
114
115
115
115
116
8. Descripción de la Aplicación
8.1. Descripción General . . . . . . . . . .
8.2. Análisis . . . . . . . . . . . . . . . . .
8.3. Desarrollo . . . . . . . . . . . . . . . .
8.3.1. Módulos . . . . . . . . . . . . .
8.3.2. Ganadería . . . . . . . . . . . .
8.3.3. Empleados . . . . . . . . . . .
8.3.4. Bancos . . . . . . . . . . . . . .
8.3.5. Clientes . . . . . . . . . . . . .
8.3.6. Proveedores . . . . . . . . . . .
8.3.7. Consultas . . . . . . . . . . . .
8.3.8. Planillas . . . . . . . . . . . . .
8.4. Estructura de Datos . . . . . . . . . .
8.5. Ejemplos de Código Fuente Utilizados
8.5.1. Servlets y HTML embebido . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
118
118
118
119
120
130
135
136
138
139
140
141
142
158
158
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
9. Conclusiones
171
9.1. Conclusiones Acerca de las Tecnologías y Software Utilizados . 171
9.2. Líneas Futuras de Acción . . . . . . . . . . . . . . . . . . . . . 172
Bibliografía
173
Índice alfabético
174
Índice de figuras
1.1.
1.2.
1.3.
1.4.
1.5.
La Agricultura Ayer y Hoy. . . . . . . . . . . . . .
Distintos Dispositivos Tecnológicos Utilizados en la
La Agricultura de Precisión. . . . . . . . . . . . . .
Ganadería de Corral. . . . . . . . . . . . . . . . . .
Ganadería Extensiva e Intensiva. . . . . . . . . . .
. . . . . . .
3
Agricultura. 4
. . . . . . .
5
. . . . . . .
7
. . . . . . . 10
2.1.
2.2.
2.3.
2.4.
2.5.
2.6.
2.7.
Logo de Java. . . . . . . . . . . . . . . .
Arquitectura Cliente - Servidor. . . . . .
Bytecode y JVM. . . . . . . . . . . . . .
Netscape Navigator - Internet Explorer.
JIT - Just In Time. . . . . . . . . . . .
HotJava. . . . . . . . . . . . . . . . . . .
Clase Thread. . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
12
24
26
27
28
29
31
3.1.
3.2.
3.3.
3.4.
Herencia en Java. . . . . . . . .
Típicos Packages Predefinidos.
API de Java. . . . . . . . . . .
JDBC en Java. . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
39
41
42
71
4.1. Ciclo de Vida de un Servlet. . . . . . . . . . . . . . . . . . . . .
4.2. Requerimiento de un Archivo JSP. . . . . . . . . . . . . . . . .
4.3. Requerimiento de un Servlet. . . . . . . . . . . . . . . . . . . .
77
79
80
5.1.
5.2.
5.3.
5.4.
5.5.
5.6.
5.7.
.
.
.
.
Servidores DB2. . . . . . . . . . .
Réplica de SQL. . . . . . . . . .
DB2 Connect. . . . . . . . . . . .
WebSphere Federation Server. . .
Ventana de Progreso en DB2. . .
Herramientas DB2. . . . . . . . .
Herramientas DB2: Menú Inicio.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. 89
. 94
. 96
. 98
. 101
. 102
. 103
ÍNDICE DE FIGURAS
5.8. Centro de Control de DB2. . .
5.9. Icono DB2 en Windows. . . . .
5.10. Editor de Comandos. . . . . . .
5.11. Botón Show SQL. . . . . . . . .
5.12. Salida de un Botón Show SQL.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
104
106
106
107
108
8.1. Diagrama de Contexto . . . . . . . . . . . . . . . . .
8.2. Caso de Uso. . . . . . . . . . . . . . . . . . . . . . .
8.3. Página Principal de la Aplicación. . . . . . . . . . .
8.4. Formulario de Agricultura. . . . . . . . . . . . . . .
8.5. Formulario de Carga Cosecha a Terceros. . . . . . .
8.6. Formulario de Carga Siembra Propia. . . . . . . . .
8.7. Formulario de Carga Rollos Propios. . . . . . . . . .
8.8. Formulario de Modificar Máquinas. . . . . . . . . . .
8.9. Formulario de Carga Pulverizaciones a Terceros. . .
8.10. Formulario de Carga Campos Propios. . . . . . . . .
8.11. Principal de Insumos. . . . . . . . . . . . . . . . . .
8.12. Principal de Ventas. . . . . . . . . . . . . . . . . . .
8.13. Pantalla Principal de Ganadería. . . . . . . . . . . .
8.14. Pantalla Principal de la Sección Ganado. . . . . . . .
8.15. Formularios de Vacunación y Baño de Ganado. . . .
8.16. Formulario de Carga de Inseminaciones de Ganado. .
8.17. Formularios de Reproducción y Balanza. . . . . . . .
8.18. Página Principal de Empleados. . . . . . . . . . . . .
8.19. Página Principal del Módulo Bancos. . . . . . . . . .
8.20. Operaciones Financieras. . . . . . . . . . . . . . . . .
8.21. Principal de Clientes. . . . . . . . . . . . . . . . . . .
8.22. Principal de Proveedores. . . . . . . . . . . . . . . .
8.23. Ejemplos de Listados Arrojados por el Sistema. . . .
8.24. Ejemplo de Planillas Disponibles en el Sistema. . . .
8.25. Estructura de la Base de Datos. . . . . . . . . . . . .
8.26. Tablas de la Base de Datos SAG. . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
119
119
120
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
158
Índice de cuadros
3.1.
3.2.
3.3.
3.4.
3.5.
3.6.
Tipos de Variables. . . . . . . .
Categorías de Variables. . . . .
Tipos Primitivos de Variables. .
Operadores de Asignación. . . .
Operadores Relacionales. . . . .
Precedencia de Operadores. . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
43
43
44
46
47
49
5.1. Comandos Para Iniciar Algunas Herramientas DB2. . . . . . . 103
Capítulo 1
La Agro-Ganadería en la
Actualidad
1.1.
La Agricultura y la Ganadería en el Mundo y
en Argentina
Los diversos avances tecnológicos derivados del conocimiento y la ciencia
están siendo aplicados en varios países del mundo a distintos sectores nunca
antes imaginados, entre ellos el sector de la agricultura y la ganadería en
Argentina. A esto se le suma el empleo de herramientas con tecnología de
avanzada que ya se encuentran a disposición de todos en cualquier momento y
lugar que se la requiera, para poder de esta forma mantener la competitividad
a nivel mundial con una producción sustentable en el tiempo.
1
CAPÍTULO 1. LA AGRO-GANADERÍA EN LA ACTUALIDAD
2
En la actualidad Argentina está obteniendo importantes logros en los sectores de agricultura y ganadería ya que se basan en la incoporación de tecnologías adaptadas exitosamente a la realidad.
1.2.
La Agricultura, la Máquina Reemplaza al Músculo
Anteriormente la actividad agrícola se realizaba con la indispensable ayuda
del hombre como herramienta principal para ésta actividad, ya que mediante
el mismo se hacía el trabajo en la tierra a mano o traccionado por animales.
Hoy en día con la aparición de la maquinaría agrícola, exigentes tareas como
la de sembrar y cosechar se pueden realizar de una manera rápida a una escala
nunca antes imaginable.
Según la Academia Internacional de Ingeniería de EE.UU, la mecanización
agraria es uno de los 20 mayores logros de la ingeniería del siglo XX. A principios del siglo XX, se necesitaba un granjero para alimentar de 2 a 5 personas,
mientras que hoy, gracias a la tecnología, los agroquímicos y las variedades de
cultivos actuales, un granjero puede alimentar a 130 personas.
Además de los avances tecnológicos, como se puede observar en la figura
8.4 de la página 122, también se le suman medios de comunicación, servicio
meteorológico y estudios de mercado que hacen que el crecimiento del sector
agrícola sea exponencial [1].
CAPÍTULO 1. LA AGRO-GANADERÍA EN LA ACTUALIDAD
3
Figura 1.1: La Agricultura Ayer y Hoy.
Las maquinarias que actualmente se utilizan ya traen incoporados dispositivos tecnológicos de una alta gama, permitiendo de ésta forma tener agricultura de precisión, como por ejemplo:
GPS (Global Positioning System).
Banderilleros satelitales.
Computadoras de pulverización.
Higrómetros (miden el grado de humedad).
Monitores de siembra.
Balanzas electrónicas.
Humedímetros y cuenta hectáreas.
Software de mapeo.
Sistemas de gestión para el agro.
CAPÍTULO 1. LA AGRO-GANADERÍA EN LA ACTUALIDAD
4
Figura 1.2: Distintos Dispositivos Tecnológicos Utilizados en la Agricultura.
1.2.1.
Agricultura de Precisión
Consiste en determinar qué requerimientos tienen los suelos, y en qué sitios,
y luego poner exactamente la cantidad necesaria de semilla, fertilizante o agroquímicos en el lugar preciso y junto a éstas herramientas poder tomar las correctas decisiones de manejo acerca del tipo de cultivo a realizar, sus rotaciones
y fechas de siembra.
Hacer Agricultura de Precisión, es hacer lo que siempre se ha estado haciendo pero ahora con mucha mayor precisión, con mucha más información
sobre la parcela y sus características.
Normalmente los agricultores ya tienen una idea de que áreas de su campo
tienen los rendimientos más altos y bajos, pero los trabajos de investigación
en la actualidad han mostrado que aún las tierras de altos rendimientos tienen
condiciones de suelo variables que producen rendimientos variables.
La Agricultura de Precisión usa la Tecnología para medir los rendimientos,
determinar las condiciones del suelo y obtener información de cada parte del
campo, registrando la ubicación exacta de donde proviene cada dato obtenido.
Cada dato de: rendimiento, humedad del grano cosechado, nutrientes del suelo,
etc., puede ser llevado a un mapa generado por la computadora, que permite
ver más claramente la relación entre varios factores. Luego puede usar la información de estos mapas para determinar los tipos, cantidades, y ubicación
de insumos a aplicar.
CAPÍTULO 1. LA AGRO-GANADERÍA EN LA ACTUALIDAD
5
Sin embargo, hasta ahora no era posible estudiar cada uno de estos factores
debido a que no existía la tecnología necesaria para ello. Gracias al desarrollo
de lo que conocemos como “nuevas tecnologías” se puede acometer hoy
día el estudio y la gestión de una explotación agrícola de forma integral, considerando el uso de agroquímicos localizada a la zona que realmente hace falta
y a la dosis correcta.
Figura 1.3: La Agricultura de Precisión.
La Agricultura de Precisión utiliza la tecnología con un objetivo claro
“Que los productores tienen ahora la posibilidad de medir exactamente qué
está sucediendo en su campo, tomar decisiones más acertadas, basadas en este
conocimiento, y así mejorar la eficiencia”.
1.3.
La Evolución de la Ganadería
La Ganadería es una actividad económica de origen muy antiguo que consiste en la crianza de animales para su aprovechamiento. La Argentina ocupa
un importante lugar en el mundo como país ganadero, en lo que se refiere a
bovinos (el quinto lugar por sus existencias y el tercero como Productor de
carne) lo cual le dá una importancia aún mayor.
Mediante la selección y el cruzamiento genético se asegura la calidad de las
CAPÍTULO 1. LA AGRO-GANADERÍA EN LA ACTUALIDAD
6
razas de bovinos Shorthorn, Heresford, Aberdeen Angus y Holando argentino
(para leche); y de ovinos: Merino, Corriedale y Lincoln. En la región Pampeana
se concentra la producción de vacunos, porcinos y equinos. El ovino prevalece
en la Patagonia.
La producción ganadera como sector importantísimo en la economía argentina, tiene además a procesos fundamentales dentro de la cadena como la
refrigeración y procesamiento de carne y subproductos, ya que la producción
anual supera los 3,4 millones de toneladas.
Desde hace mucho tiempo, Argentina es líder mundial en la exportación
de carne cruda, aunque cada vez es más importante la exportación de la carne
procesada y envasada. Por este motivo la incorporación de la tecnología es un
factor importante a la hora de incrementar las producciones de carne, mediante
la utilización del rendimiento expuesto al máximo en sectores como:
La nutrición animal.
La sanidad animal.
La genética e inseminación artificial.
El uso de aplicaciones informáticas para la gestión.
Las tecnologías para la protección del medio ambiente.
Los edificios, equipos y materiales para el ganado.
La logística, manipulación y almacenamiento.
La estabulación del ganado y el desarrollo de nuevas técnicas de alimentación han contribuido para disminuir la dependencia de las condiciones del
medio ambiente. Como principales pautas de manejo que permitien el crecimiento se mencionan técnicas a las que se califica de aplicación sencilla y de
alto impacto, como:
La implantación de pasturas.
La fertilización.
La subdivisión de las grandes extensiones en parcelas para un uso más
eficiente.
CAPÍTULO 1. LA AGRO-GANADERÍA EN LA ACTUALIDAD
7
El adecuado manejo de los rodeos.
Figura 1.4: Ganadería de Corral.
Actualmente la ganadería ocupa más de 105 millones de hectáreas, mientras que la agricultura no supera los 25 millones en el territorio nacional. De
allí la preocupación por la sustentabilidad de los sistemas. Esto se debe a que
en promedio para cada animal se necesita 10 hectáreas para su producción.
Además el ganado puede ser criado en áreas donde el duro clima imposibilita
el crecimiento de los cultivos, como en las altas montañas o las zonas con una
aridez extrema.
1.3.1.
Ganadería Extensiva e Intensiva
Ganadería Extensiva
Los sistemas extensivos, tradicionales o convencionales de producción animal se caracterizan esencialmente por formar parte de un ecosistema natural
modificado por el hombre, es decir, un agroecosistema, y tienen como objetivo
la utilización del territorio de una manera perdurable, o sea, están sometidos
a los ciclos naturales, mantienen siempre una relación amplia con la producción vegetal del agroecosistema de que forman parte y tienen la necesidad de
CAPÍTULO 1. LA AGRO-GANADERÍA EN LA ACTUALIDAD
8
legar a la generación siguiente los elementos del sistema en un estado igual o
superior que los que se recibieron de la generación precedente.
Dentro de la ganadería extensiva se puede incluir a la ganadería sostenible
que es la ganadería perdurable en el tiempo y que mantiene un nivel de producción sin perjudicar al medio ambiente o al ecosistema. La ganadería sostenible
se incluye dentro del concepto de desarrollo sostenible.
La explotación ganadera para la alimentación del ganado utiliza los aprovechamientos a diente de los pastos procedentes de prados, pastizales, hierbas
y rastrojos; propios, ajenos o comunales, de forma permanente o temporal.
Ventajas de la Ganadería Extensiva
Requieren un escaso aporte de energía fósil, en ocasiones se requiere 0,1
kilo o menos para obtener 1 kilo de alimento en la mesa del consumidor.
Contribuyen a mantener los agroecosistemas de los que forman una parte
esencial, manteniendo los agroecosistemas naturales del entorno, como
la biodiversidad.
En climas áridos o semiáridos contribuyen al mantenimiento de la cubierta vegetal, es decir, evitar la erosión.
Prevenir los incendios forestales mediante el control arbustivo, la reducción de biomasa combustible, etc.
Inconvenientes de la Ganadería Extensiva
Menor eficiencia.
No pueden ajustarse fácilmente a la demanda de los consumidores.
No pueden proporcionar productos tan homogéneos como solicita la distribución y el mercado de las grandes superficies comerciales.
Ganadería Intensiva
En la ganadería intensiva el ganado se encuentra estabulado, generalmente
bajo condiciones de temperatura, luz y humedad que han sido creadas en forma
CAPÍTULO 1. LA AGRO-GANADERÍA EN LA ACTUALIDAD
9
artificial, con el objetivo de incrementar la producción en el menor lapso
de tiempo; los animales se alimentan, principalmente, de alimentos enriquecidos. Es por esto que requiere grandes inversiones en aspectos de instalaciones,
tecnología, mano de obra y alimento, entre otros.
Entre sus ventajas se destaca una elevada productividad, que tiene como contraparte la gran contaminación que genera, mediante la aplicación de
múltiples tecnologías y las formas de pensamiento surgidas del capitalismo.
Ventajas de la Ganadería Intensiva
Eficiencia: La ganadería intensiva obtiene la máxima producción con el
dinero invertido en el menor tiempo posible.
Adaptación a la demanda del mercado (consumidores).
Homogeneidad: Es la obtención de productos homogéneos o de características iguales, para satisfacer las necesidades de la distribución y comercialización a gran escala.
Inconvenientes de la Ganadería Intensiva:
Gran consumo de energía, generalmente de procedencia energía fósil, en
ocasiones hasta 20 kilos por kilo del alimento obtenido.
Extremadamente contaminantes, debido a la acumulación de enormes
masas de deyecciones, que no pueden ser recicladas en los agrosistemas
convencionales y que provocan la contaminación atmosférica, la contaminación del suelo y de las aguas con metales pesados, fármacos etc.
Efímero: La ganadería intensiva no es perdurable, es decir, es “insostenible”, que implica que no puede mantenerse indefinidamente en el
tiempo.
CAPÍTULO 1. LA AGRO-GANADERÍA EN LA ACTUALIDAD
10
Figura 1.5: Ganadería Extensiva e Intensiva.
El Feed - Lot (engorde a corral), como se observa en la figura 1.5 de la
página 10, es uno de los claros ejemplos de esta ganadería ya que obtiene
el máximo beneficio, en el menor tiempo posible, concentrando los medios de
producción y mecanizando y racionalizando los procesos, para incrementar
constantemente el rendimiento productivo, mediante la utilización de la tecnología e infraestructura disponible en el mercado.
Capítulo 2
Conceptos Básicos Sobre el
Lenguaje Java
2.1.
¿Qué es Java y Para qué fue Pensado?
Java es un lenguaje de programación sencillo de aprender que originalmente fue desarrollado por un equipo de ingenieros de Sun Microsystems, utilizado por Netscape, por nuevas necesidades, ya que los lenguajes existentes
no cumplían con todas las necesidades para el proyecto en marcha. Pero se
basaron en lo ya hecho y probado. Es por esta razón que el código Java se
expresa en archivos de texto comunes, y tiene una apariencia muy familiar
para los programadores de C/C++ y para los programadores en general [2].
Los creadores de Java partieron de la sintaxis de C++ pero “simplificada”
y trataron de eliminar todo lo que resulte complicado, o permita fuente de
errores.
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 y sistemas de ventanas que funcionaban sobre una misma
máquina, incrementando la dificultad de crear aplicaciones distribuidas en la
Red [2].
El uso del lenguaje Java se destaca en la Web pero sirve para crear todo
tipo de aplicaciones (locales, Intranet o Internet). Java sirvió posteriormente
11
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
12
Figura 2.1: Logo de Java.
como base para JavaScript, que se detallará más adelante .
Una de las utilizaciones más difundida, que justifica a Java como lenguaje
es en pequeños electrodomésticos como microondas, tostadoras y, fundamentalmente, televisión interactiva y otros dispositivos electrónicos de uso diario,
como celulares, PDA’s, palms y pocket pc.
2.1.1.
Características del Lenguaje Java
Las principales son:
Orientado a objetos.
Simple.
Distribuido.
Flexible.
Independiente de la plataforma.
Robusto.
Gestiona la memoria automáticamente.
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
13
No permite el uso de técnicas de programación inadecuadas.
Multithreading.
Cliente-servidor.
Mecanismos de seguridad incorporados.
Herramientas de documentación incorporadas.
2.1.2.
Desarrollo de las Principales Características de Java
Las principales características que ofrece el lenguaje Java respecto a cualquier otro lenguaje son:
Es un lenguaje Orientado a Objetos.
Posiblemente el más orientado a objetos de todos los lenguajes existentes;
en Java todo, a excepción de los tipos fundamentales de variables (int, char,
long), es un objeto.
Las plantillas de objetos son llamadas, como en C++, clases y sus copias,
instancias. Estas instancias, como en C++, necesitan ser construidas y destruidas en espacios de memoria.
Los objetos se definen en clases, con atributos y métodos, agrupándose en
paquetes, y exponiendo interfaces a esos objetos. Soporta las tres características propias del paradigma de la orientación a objetos: encapsulación, herencia
y polimorfismo, implementando así la tecnología de objetos de una manera
muy completa, y a la vez sencilla y agradable.
Se reconocerá al estudiar la semántica, que Java es realmente un lenguaje
que merece ser llamado “totalmente orientado a objetos”.
Java incorpora funcionalidades inexistentes en C++, como por ejemplo,
la resolución dinámica de métodos. En C++ se suele trabajar con librerías
dinámicas (DLL’s) que obligan a recompilar la aplicación cuando se retocan
las funciones que se encuentran en su interior. Este inconveniente es resuelto por Java mediante una interfaz específica llamada RTTI (RunTime Type
Identification) que define la interacción entre objetos excluyendo variables de
instancias o implementación de métodos.
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
14
Las clases en Java tienen una representación en el runtime que permite a
los programadores interrogar por el tipo de clase y enlazar dinámicamente la
clase con el resultado de la búsqueda.
Es simple.
Java ofrece toda la funcionalidad de un lenguaje potente, pero sin las características menos usadas y más confusas de éstos. C++ es un lenguaje que
padece falta de seguridad, pero C y C++ son lenguajes más difundidos, por
ello Java se diseñó para ser parecido a C++ y así facilitar un rápido y fácil
aprendizaje.
Java elimina muchas de las características de otros lenguajes como C++,
para mantener reducidas las especificaciones del lenguaje y añadir características muy útiles.
Java reduce en un 50 % los errores más comunes de programación con
lenguajes como C y C++ al eliminar muchas de las características de éstos.
Es distribuido.
Está orientado al trabajo en red, soportando protocolos como TCP/IP,
HDP, HTTP y FTP. Por otro lado el uso de estos protocolos es bastante
sencillo comparándolo con otros lenguajes que los soportan.
Java se ha construido con extensas capacidades de interconexión TCP/IP.
Existen librerías de rutinas para acceder e interactuar con protocolos como
HTTP y FTP. Esto permite a los programadores acceder a la información a
través de la red con tanta facilidad como a los ficheros locales.
La verdad es que Java en sí no es distribuido, sino que proporciona las
librerías y herramientas para que los programas puedan ser distribuidos, es
decir, que se corran en varias máquinas.
Es robusto.
Se refiere a la forma en que está diseñado ya que el compilador de Java
detecta muchos errores que otros compiladores sólo detectarían en tiempo
de ejecución o incluso nunca. El código generado por el compilador Java es
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
15
independiente de la arquitectura, o sea, puede ejecutarse en un entorno
Unix, Mac o Windows.
Java no permite el manejo directo del hardware ni de la memoria, así
virtualmente es imposible colgar un programa Java. El intérprete siempre tiene
el control. Inclusive el compilador es suficientemente inteligente como para no
permitir cosas que causen problemas, como usar variables sin inicializarlas,
modificar valores de punteros directamente, acceder a métodos o variables en
forma incorrecta, utilizar herencia múltiple, etc.
Posee herramientas de documentación incorporadas.
Además, con el JDK (Java Development Kit) vienen incorporadas muchas
herramientas, entre ellas un generador automático de documentación que, con
un poco de atención al poner los comentarios en las clases, crea inclusive toda
la documentación de las mismas en formato HTML.
Es Seguro.
Los problemas de virus, o de confidencialidad de los datos aparecen masivamente con Internet, y con la distribución de programas por todas las redes,
así el problema de la seguridad ha tomado una nueva dimensión, más grave,
ya que actualmente a nuestra máquina pueden llegar aplicaciones hostiles y
virus malignos, desde cualquier parte del mundo.
Java ha sido adaptado a Internet, pensando mucho en el tema seguridad,
sobre todo un tipo de desarrollo: los applets. Java garantiza que ningún applet
puede escribir o leer de nuestro disco o mandar información del usuario que
accede a la página a través de la red (ej.: e-mail).
Un applet Java se ejecuta en un entorno, que impide su intromisión en la
máquina cliente. En general no permite realizar cualquier acción que pudiera
dañar la máquina o violar la intimidad de quien visita la página Web. Entonces,
no hay posibilidad de un virus Java, viajando por toda la red.
Java implementa mecanismos de seguridad que limitan el acceso a recursos
de las máquinas donde se ejecuta, especialmente en el caso de los Applets
(aplicaciones que se cargan desde un servidor y se ejecutan en el cliente).
También está diseñado específicamente para trabajar sobre una red, de modo
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
16
que incorpora objetos que permiten acceder a archivos en forma remota (via
URL por ejemplo).
Es Portable (multiplataforma).
En Java no hay aspectos dependientes de la implementación, todas las implementaciones de Java siguen los mismos estándares en cuanto a tamaño y
almacenamiento de los datos y corren de igual forma bajo distintas plataformas, mientras que otros lenguajes almacenan datos de formas diferentes según
la plataforma en la que se encuentre.
Esto no sucede con Java ya que el proceso de compilación no produce
código para un procesador en particular, como en los compiladores C/C++,
sino que genera código para un procesador ideal, denominado Máquina Virtual
Java (Java Virtual Machine, o Java VM). La razón de ésto es la necesidad
de poder ejecutarse en cualquier plataforma, sin necesidad de cambiar el
código fuente, ni aun de recompilar.
Todo programa Java se traduce en una serie de códigos (llamados bytecodes
que son el resultado de la compilación de un programa Java) para un procesador imaginario (virtual), el Java VM, que puede ser implementado fácilmente
en cualquier plataforma poderosa. Es así como el lenguaje y sus aplicaciones se
independizan de la máquina destino, a costa de algo de velocidad, provocada
por la necesidad de “simular ” la Java VM, mediante software.
Aún los tipos primitivos de datos quedan definidos de un solo paso, para
todas las plataformas. Se evitan de esta forma los problemas de portabilidad, conocidos por los programadores de C/C++, al cambiar, por ejemplo,
de ambiente a ambiente, el tamaño de los enteros, o el conjunto de caracteres soportados. En Java, esos problemas no existen: sólo existe una máquina
virtual.
Los programas en Java pueden ejecutarse en cualquiera de las siguientes
plataformas, sin necesidad de hacer cambios:
Windows/95 y /NT.
Power/Mac.
Unix (Solaris, Silicon Graphics, ...).
La compatibilidad es total:
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
17
A nivel de fuentes: el lenguaje es exactamente el mismo en todas las
plataformas.
A nivel de bibliotecas: en todas las plataformas están presentes las mismas
bibliotecas estándares.
A nivel del código compilado: el código intermedio que genera el compilador
es el mismo para todas las plataformas. Lo que cambia es el intérprete del
código intermedio.
Manejo automático de memoria.
El lenguaje Java se compone de objetos y estos pueden y deben crearse;
tienen una vida corta, ya que se inicia con la ejecución y dura hasta que se
termina la ejecución, donde es su destrucción.
Mientras que la creación de los objetos se deja bajo la voluntad del programador, la destrucción definitiva de un objeto ocurre cuando no es más
referenciado por otros objetos del programa. De esta forma, se elimina una de
las causas más comunes de error en otros lenguajes, como la destrucción por
el programador de objetos aún en uso en el programa, o la falta de destrucción
de objetos que ya son inútiles, ya que no se usan en el resto de la ejecución,
pero que molestan con empleo de recursos.
Esta técnica de manejo automático de memoria ocupada por los objetos
se denominan garbage collection, es como recolección de basura o reciclador
de memoria dinámica; gracias a ésto no es necesario preocuparse de liberar
memoria, el reciclador se encarga de ello y como es un thread de baja prioridad,
cuando entra en acción, permite liberar bloques de memoria muy grandes, lo
que reduce la fragmentación de la memoria.
El recolector de basuras es un gran aporte a la productividad. Se ha estudiado en casos concretos que los programadores han dedicado un 40 % del
tiempo de desarrollo a determinar en qué momento se puede liberar un trozo
de memoria.
En una aplicación Java hay siempre un proceso, ejecutado como un “thread”
o hilo de ejecución separado, que se ocupa de recorrer la memoria donde se
encuentran los objetos, y determina cuáles pueden liberarse y destruirse.
En Java los programadores ya no necesitan preocuparse de liberar un trozo de memoria cuando no lo necesitan. Es el recolector de basuras el que
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
18
determina cuando se puede liberar la memoria ocupada por un objeto.
Java no se aísla y evoluciona.
Java trata de ser un lenguaje de producción, no un lenguaje académico o
ideal, entonces no intenta comunicarse con librerías de otros lenguajes. Tiene
capacidades definidas para implementar clases y métodos (o funciones), escritos, por ejemplo, en C/C++. Esto permite usar lo que ya está hecho, en
cada plataforma de implementación.
Igualmente, Java es un lenguaje de uso general, y muchas de las rutinas y
librerías que se necesita para un proyecto, pueden ser escritas en Java. Debido
al éxito del lenguaje, y a su difusión, cada día aparecen nuevas herramientas
y paquetes de clases escritas por otros programadores.
Dinámico.
Java se beneficia todo lo posible de la tecnología orientada a objetos. Java
no intenta conectar todos los módulos que comprenden una aplicación hasta
el tiempo de ejecución.
Las librería nuevas o actualizadas no paralizarán las aplicaciones actuales.
Java también simplifica el uso de protocolos nuevos o actualizados. Si el sistema ejecuta una aplicación Java sobre la red y encuentra una pieza (módulo)
de la aplicación que no sabe manejar, Java es capaz de traer automáticamente
cualquiera de esas piezas que el sistema necesita para funcionar.
Para evitar que los módulos de bytecodes o los objetos o nuevas clases,
tengan que ser traídos de la red cada vez que se necesiten, se implementan las
opciones de persistencia, para que no se eliminen cuando se limpie la caché de
la máquina.
2.1.3.
Ventajas de Java
1. No se vuelve a escribir el código si se quiere ejecutar el programa en
otra máquina (multiplataforma). Un solo código funciona para todos los
browsers compatibles con Java o donde se tenga una Máquina Virtual
de Java (Mac’s, PC’s, Sun’s, etc).
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
19
2. Java es un lenguaje de programación orientado a objetos, y tiene todos
los beneficios que ofrece esta metodología de programación..
3. Un browser compatible con Java deberá ejecutar cualquier programa hecho en Java, esto ahorra a los usuarios tener que estar insertando “plugins” y demás programas que a veces quitan tiempo y espacio en disco.
4. Java es un lenguaje y por lo tanto puede hacer todas las cosas que puede
hacer un lenguaje de programación: cálculos matemáticos, procesadores
de palabras, bases de datos, aplicaciones gráficas, animaciones, sonido,
hojas de cálculo, etc.
5. Si lo que interesa son las páginas Web, no tienen que ser estáticas, porque
se les pueden poner toda clase de elementos multimedia, permitiendo un
alto nivel de interactividad, sin tener que invertir tanto en paquetes de
multimedia.
2.1.4.
Limitaciones con Java
1. Una de las más importantes es la velocidad. Los programas hechos en
Java no tienden a ser muy rápidos, pero se está trabajando para mejorar
esto. Como los programas de Java son interpretados nunca alcanzan la
velocidad de un verdadero ejecutable.
2. Java es un lenguaje de programación. Por tratarse de un lenguaje, debe
ser aprendido, lo que es una dificultad para los no programadores.
3. Java es relativamente nuevo. Todavía no se conocen bien todas sus capacidades.
Pero en general, Java posee muchas ventajas y mucha fuerza. Con este
lenguaje se pueden hacer muchas cosas interesantes. Está de moda en cualquier
medio computacional, y se apuesta a futuro con Java.
2.1.5.
Errores con Java
En Java no se pueden cometer algunos errores típicos, ya que:
• Java siempre chequea los índices al acceder a un arreglo.
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
20
• Java realiza chequeo de tipos durante la compilación (al igual que
C). En una asignación entre punteros el compilador verifica que los
tipos sean compatibles.
• Además, Java realiza chequeo de tipos durante la ejecución (cosa
que C y C++ no hacen). Cuando un programa usa un cast para
acceder a un objeto como si fuese de un tipo específico, se verifica
durante la ejecución que el objeto en cuestión sea compatible con
el cast que se le aplica. Si el objeto no es compatible, entonces se
levanta una excepción que informa al programador la línea exacta
en donde está la fuente del error.
• Java posee un recolector de basuras que administra automáticamente la memoria. Es el recolector el que determina cuando se
puede liberar el espacio ocupado por un objeto. El programador no
puede liberar explícitamente el espacio ocupado por un objeto.
• Java no posee aritmética de punteros, porque es una propiedad que
no se necesita para programar aplicaciones. En C sólo se necesita
la aritmética de punteros para programar malloc/free o para programar el núcleo del sistema operativo.
Por lo tanto Java no es un lenguaje para hacer sistemas operativos o
administradores de memoria, pero sí es un excelente lenguaje para programar
aplicaciones.
2.2.
Existen Distintos Tipos de Java
Según donde se lo aplique se puede distinguir entre:
2.2.1.
JavaScript
Es una versión de Java directamente interpretada, que se incluye como
parte de una página HTML, lo que lo hace muy fácil y cómodo para aplicaciones muy pequeñas, pero en realidad tiene muchas limitaciones:
No soporta clases ni herencia.
No se precompila.
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
21
No es obligatorio declarar las variables.
Verifica las referencias en tiempo de ejecución.
No tiene protección del código, ya que se baja en ASCII.
No todos los browsers lo soportan completamente.
JavaScript es una forma de trasladar algunas tareas simples al lado del
cliente. Y tiene una sintaxis que es en general parecida a la de C, excepto que
no hay una función main. Lo que no está dentro de una función se ejecutará
mientras se cargue la página.
JavaScript recibe información a através de eventos y propiedades de objetos, y la entrega mediante propiedades de objetos y métodos.
2.2.2.
Java Standalone
Son programas Java que se ejecutan directamente mediante el intérprete
Java.
2.2.3.
Applets
Son programas Java que corren bajo el entorno de un browser (o del appletviewer, que es el visualizador de applets de Sun.)
En sí los applets y Java standalone son el mismo lenguaje, pero cambia un
poco la forma en que se implementa el objeto principal (la aplicación).
Así los “applets” de una web, son programas diseñados para ser ejecutados
en una página Web; pueden ejecutarse en cualquier máquina que se conecte
a ella independientemente de qué sistema operativo emplee (siempre que el
ordenador en cuestión tenga instalada una JVM (Máquina Virtual de Java)).
La definición más extendida de applet, indica que un applet es “una pequeña aplicación accesible en un servidor Internet, que se transporta por la
red, se instala automáticamente y se ejecuta en ese lugar como parte de un
documento web”. La definición establece el entorno (Internet, Web, etc.).
Un applet trata de ser una aplicación pretendidamente corta (no ocupar
más de un gigabyte) basadándose en un formato gráfico sin representación
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
22
independiente: es decir, es un elemento a embeber en otras aplicaciones (es un
componente en el sentido estricto).
Appletviewer: El Visor de Applets de Sun
El visualizador de applets (appletviewer) es una aplicación que permite
ver en funcionamiento applets, sin necesidad de la utilización de un navegador
World-Wide-Web como HotJava, Microsoft Internet Explorer o Netscape.
El hecho de que se integre estática (embebido en un ejecutable) o dinámicamente (intérpretes, DLL’s, etc.) no afecta en absoluto a la esencia del comportamiento como componente.
Como no existe una base adecuada para soportar aplicaciones industriales Java en las que insertar miniaplicaciones; los applets se han construido
mayoritariamente, y con gran acierto comercial, como pequeñas aplicaciones
interactivas, con movimiento, luces y sonido... en Internet.
Llamadas a Applets con Appletviewer
Dado que un applet es una míni aplicación Java diseñada para ejecutarse
en un navegador Web, no necesita preocuparse por un método main() ni en
dónde se realizan las llamadas. Otra diferencia de Java con el lenguaje C. Es
que no hay función main, ya que los applets no lo necesitan. La función main
se encuentra “escondida” en el programa que cargó la página html. En los
applets no hay una función que sea llamada después de otra, sino que todo
gira en torno al tratamiento de los eventos que se produzcan. Es decir que
un applet está esperando por una serie de eventos, como la pulsación de una
tecla, el movimiento del ratón, o la pulsación de alguna de la teclas del ratón.
Y recibido el evento, responder con el método adecuado.El applet asume que
el código se está ejecutando desde dentro de un navegador.
El appletviewer se asemeja al míni navegador. Espera como argumento el
nombre del fichero HTML que debe cargar, no se le puede pasar directamente
un programa Java. Este fichero HTML debe contener una marca que especifica
el código que cargará el appletviewer.
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
2.3.
23
Java en los Browsers de la World Wide Web
Los programas Java son otro recurso más, como pueden ser una página
HTML o un archivo gráfico. Al igual que estos últimos viajan desde el servidor
a la máquina cliente para ejecutarse en ésta. El lugar más frecuente donde se
encuentra el lenguaje Java, es en los exploradores o navegadores (browsers) de
Internet.
La WWW es la aplicación más popular en Internet, y causante de la explosión de la red de redes. Basa su existencia en dos principales aplicaciones:
Los servidores de Web.
Son programas dedicados e instalados en las máquinas nodos de la red, que
atienden a todos los pedidos de los clientes. Estos solicitan archivos, recursos
de la Web, en general, archivos HTML y gráficos. Los archivos HTML son
archivos de texto, que contienen una descripción de lo que se ve como página
en el browser. La sigla HTML significa Hypertext Markup Languaje (Lenguaje
de Marcación de Hipertexto), y es el lenguaje que describe las páginas Web.
Los clientes.
En las páginas se colocan textos, gráficos y otros recursos. Es trabajo del
cliente, el browser, interpretar esa página, mostrándola en pantalla, y reclamando todo lo que se necesite para armarla, como los gráficos y archivos de
sonido que la pueden acompañar.
En la figura 2.2 de la página 24 se muestra la arquitectura Cliente - Servidor.
2.3.1.
Las Applets en la Web
Al crear algún applet, se exige una construcción, con la marca HTML
‹APPLET...›, que especifica un determinado lugar en una página Web, para
que el browser se posicione y ejecute una aplicación Java. Los archivos Java que
viajan son de un tipo; al tratarse de archivos con extensión .class, contienen
las instrucciones Java ya compiladas y no viajan en código fuente.
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
24
Figura 2.2: Arquitectura Cliente - Servidor.
Un applet se compone, como mínimo, de un archivo .class, pero puede
requerir más archivos .class (con más código para ejecutar), que el browser
recupera, o archivos gráficos, de sonido u otros, que el propio applet se encarga
de recuperar.
Un applet Java no existe por sí mismo (sino dentro de una página .html ),
por esto se lo debe invocar desde una página HTML que se haya creado.
Seguridad
Puede ser riesgoso, por la naturaleza de Internet, traer programas desde
un lugar lejano y no controlado a la computadora, para ejecutarlo.
Pero los applets Java son seguros ya que Sun y los constructores de browsers
han implementado una polí tica de seguridad, que impide a un applet, por
ejemplo, leer o escribir en un disco, o interferir con otras aplicaciones en ejecución.
Es tan grande la seguridad que, puede llegar a molestar a algunos programadores, que en un applet nunca se pueda grabar un archivo local, con datos
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
25
transitorios o de configuración.
Restricción de Seguridad de Java
No se pueden cargar archivos que estén en una máquina distinta a aquella
desde la cual se cargó el applet. El applet se ejecuta en el cliente, e intenta
acceder a un archivo local. Eso provoca una excepción (que, por supuesto,
puede detectarse con un catch y tratarse).
Por razones de seguridad, los applets son más limitados que las aplicaciones
Java locales. Las políticas de seguridad las manejan los browsers (no Java), y
generalmente los límites que se imponen a los applets son:
Un applet no puede cargar bibliotecas (libraries) ni definir métodos nativos.
No puede leer o escribir normalmente archivos en el cliente que lo carga
desde otro server.
No puede establecer conexiones de red, salvo al servidor del que proviene.
No puede arrancar programas en la máquina donde se está ejecutando.
No puede leer algunas propiedades del sistema.
En las ventanas de los applets se indica que se trata de un applet.
Pero también, pueden:
Reproducir sonidos.
Establecer conexiones con el servidor del que provienen.
Llamar fácilmente páginas HTML desde el browser.
Invocar métodos públicos de otros applets de la misma página.
Seguir corriendo aunque se cambie de página en el browser.
Si se cargan desde la máquina local no tienen ninguna de las restricciones
anteriores.
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
26
Figura 2.3: Bytecode y JVM.
En realidad, la especificación de Java permite que los applets lean archivos
en otras máquinas dando la URL completa; sin embargo, los browsers no lo
permiten.
2.3.2.
Máquinas Virtuales
El lenguaje Java se compila, no para una plataforma o procesador en particular, sino produciendo código (que se denomina bytecodes), destinado a ser
interpretado por la llamada Máquina Virtual Java.
En la figura 2.3 de la página 26 se puede apreciar como trabaja.
Esta máquina no es única, sino que hay una por cada plataforma y, en
realidad, cada browser que implementa Java tiene la suya. Así, el Microsoft
Explorer usará una máquina propia en Windows, mientras que el Netscape
Navigator usará otra máquina, que variará de Windows a UNIX.
Todas tienen la misma funcionalidad (o deberían). Tanto el usuario como
los programadores no deberían preocuparse por las distintas implementaciones.
Sin embargo, hay quejas de los desarrolladores, originadas en las pequeñas
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
27
diferencias que se encuentran tanto entre una implementación y otra, como en
el aspecto de la interface gráfica.
Además de la máquina virtual, cada browser instala una serie de clases, listas para usar, que Java espera tener disponibles en cualquier plataforma. Esas
clases tienen una funcionalidad definida, que no debería sufrir modificaciones.
Netscape y Microsoft
La empresa Netscape, creadora del Netscape Navigator, soporta Java desde
la versión 2 del browser. Pero Microsoft no se quedó atrás y soporta Java desde
la versión 2.0 de su browser Internet Explorer.
Ambos browsers instalan y usan una máquina virtual propia Java. No hay
diferencias apreciables en las prestaciones de estos dos browsers, respecto de
Java.
Figura 2.4: Netscape Navigator - Internet Explorer.
Entre Netscape (en múltiples plataformas) y Microsoft (en plataformas
Windows) acaparan casi la totalidad del mercado de los browsers.
En general, los browsers, de cualquier origen, soportan Java en ambientes
que permiten la multitarea y los llamados múltiples hilos de ejecución (multithreading).
Para poder explotar al máximo el potencial de Java se requiere de un
sistema operativo multithreading (como Unix, Windows, OS/2), porque Java
es un lenguaje interpretado y al compilar un programa Java, lo que se genera
es un seudocódigo definido por Sun, para una máquina genérica.
Al ejecutar posteriormente sobre una máquina en particular, el software
de ejecución Java simplemente interpreta las instrucciones, emulando a dicha
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
28
Figura 2.5: JIT - Just In Time.
máquina genérica. Claro que esto no es muy eficiente, entonces Netscape como
Hotjava o Explorer, al ejecutar el código por primera vez, lo van compilando
(mediante un JIT: Just In Time Compiler), así al crear el código ya está
compilado específicamente para la máquina huésped.
El lenguaje de esa máquina genérica es público, y si uno quisiera hacer un
intérprete Java para otro sistema operativo sólo tendría que implementarlo y
pedir a Sun la aprobación (que verifique que cumpla con los requisitos de Java
en interpretación de cada instrucción, seguridad y otros).
2.3.3.
Java sin Browsers
No todo es Internet en Java. Este es un lenguaje de uso general, que sólo
incidentalmente cobró popularidad en Internet. Se puede desarrollar aplicaciones Java que se ejecuten en una máquina propia, sin necesidad de estar
conectados a la red, y sin el auxilio de browsers.
Mientras los programas Java para Internet y páginas HTML se llaman
“applets”, los que pueden ejecutarse fuera de la red se llaman genéricamente
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
29
“aplicaciones”.
2.3.4.
HotJava
HotJava, es un navegador con soporte Java (Java-enabled), desarrollado
en Java.
Como cualquier navegador de Web, HotJava puede decodificar HTML estándar y URL’s estándares, aunque no soporta completamente el estándar
HTML 3.0.
La ventaja sobre el resto de navegadores, sin soporte Java, es que puede
ejecutar programas Java sobre la red.
La diferencia con Netscape es que tiene implementados completamente los
sistemas de seguridad que propone Java, esto significa que puede escribir y leer
en el disco local, aunque esto hace disminuir la seguridad, ya que se pueden
grabar en el disco programas que contengan código malicioso o introducir un
virus, por ejemplo. No obstante, el utilizar esta característica de HotJava es
decisión del usuario.
Figura 2.6: HotJava.
2.4.
Java en Hebras - Threads
La traducción literal de thread es hilo o hebra. Los threads (a veces llamados, procesos ligeros), son básicamente pequeños procesos o piezas independientes de un gran proceso. Pero el concepto de threads en los ambientes
y sistemas operativos es relativamente complejo de explicar: independiente-
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
30
mente del sistema elegido, se puede pensar que un thread es algo así como el
lugar de ejecución de un programa.
Java es multithreading: esto significa que tiene capacidad de “diálogo”, y
permite ejecutar muchas actividades simultáneas en un programa, es decir,
threads en paralelo como si fuera una conversación múltiple y simultánea.
No hay que confundir multithreading con la capacidad de ejecutar varios
programas a la vez. Esta es una posibilidad, pero también un mismo programa puede utilizar varios threads (caminos de ejecución) simultáneamente
y depende fundamentalmente de la capacidad del sistema operativo para soportar multithreading. Por esto Java no puede ejecutarse (al menos en forma
completa) en sistemas que no lo soporten.
Como los threads son construídos con el lenguaje Java, son más fáciles de
usar y más robustos que sus semejantes en C o C++.
El uso de threads nos permite, por ejemplo, ejecutar simultáneamente varios programas que interactúen entre ellos; o, también, que un programa, mientras por ejemplo actualiza la pantalla, simultáneamente realice una serie de
cálculos sin tener que hacer esperar el usuario.
Una forma sencilla de verlo es imaginar que se tiene un grupo de microprocesadores que pueden ejecutar, cada uno, un solo thread; y se asignan
programas (o partes de programas) a cada uno de ellos.
Además, se puede imaginar que los microprocesadores comparten una
memoria común y recursos comunes, de lo que surgirá una serie de problemas importantes a tener en cuenta cuando se usan threads.
2.4.1.
La Ventaja de ser Multi-Threaded
Consiste en un mejor rendimiento interactivo y mejor comportamiento en
tiempo real. Aunque el comportamiento en tiempo real está limitado a las
capacidades del sistema operativo que lo soporte como Unix, Windows u otros,
aún así supera tanto en facilidad de desarrollo como en rendimiento, a los
entornos de flujo único de programa (single-threaded), que todavía se utilizan
en la mayoría de los programas; es decir un programa comienza y su ejecución
sigue un camino único: es un solo thread, como si fuera un “monólogo”.
Los pasos básicos a seguir para usar threads en un programa son tres:
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
31
Figura 2.7: Clase Thread.
La clase que se quiere asignar a un thread debe implementar la interface
Runnable.
Se debe crear una variable (instancia) del tipo Thread, que permita acceder y manejar el thread.
Y crear un método run() que es el que ejecuta el código del programa
propiamente dicho.
Al utilizar la tecnología de navegación concurrente, se sabe lo frustrante
que puede ser esperar que se traiga una gran imagen. En Java, las imágenes
se pueden traer en un thread independiente, permitiendo que el usuario pueda
acceder a la información en la página sin tener que esperar por el navegador.
2.5.
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
CAPÍTULO 2. CONCEPTOS BÁSICOS DE JAVA
32
servidor de las oficinas centrales, hasta los servidores de las delegaciones, las
estaciones de trabajo de los programadores y las PC’s.
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.
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
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 mencionó 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
programador no se preocupa de hacer que la aplicación se ejecute óptimamente.
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 posee
varias características que harán la vida más fácil a los desarrolladores y mantenedores de aplicaciones. [2]
Capítulo 3
El Lenguaje Java
3.1.
Introducción a su Codificación
Java por ser un lenguaje orientado a objetos, posee ciertas características que hoy día se consideran estándares en los lenguajes OO, para esto se
utilizarán los siguientes conceptos:
Objetos.
Clases.
Métodos.
Subclases.
Herencia simple.
Enlace dinámico.
Encapsulamiento.
34
CAPÍTULO 3. EL LENGUAJE JAVA
35
Para programar orientado a objetos es necesario primero diseñar un conjunto de clases. La claridad, eficiencia y mantenibilidad del programa resultante
dependerá principalmente de la calidad del diseño de clases. Un buen diseño de
clases significará una gran economía en tiempo de desarrollo y mantenimiento.
Lamentablemente se necesita mucha habilidad y experiencia para lograr
diseños de clases de calidad. Un mal diseño de clases puede llevar a programas
OO de peor calidad y de más alto costo que el programa equivalente no OO [2,
Castillo-Cobo-Solares].
La gran ventaja de un lenguaje OO son las bibliotecas de clases que se
pueden construir para la aplicación. Una biblioteca de clases cumple el mismo
objetivo de una biblioteca de procedimientos en una lenguaje como C.
Una biblioteca de clases es mucho más fácil de usar que una biblioteca
de procedimientos, incluso para programadores sin experiencia en orientación
a objetos. Esto se debe a que las clases ofrecen mecanismos de abstracción
más eficaces que los procedimientos.
Se puede distinguir entre varios tipos de programadores en Java:
• El diseñador de clases: Es el encargado de definir qué clases ofrece
una biblioteca y cuál es la funcionalidad que se espera de estas
clases. La persona tiene que ser muy hábil y de mucha experiencia.
Un diseño equivocado puede conducir a clases que son incomprensibles para los clientes de la biblioteca.
• El programador de clases de biblioteca: Es el encargado de programar las clases especificadas por el diseñador de clases. La persona
debe entender orientación a objetos, pero no requiere mayor experiencia en diseño de clases.
CAPÍTULO 3. EL LENGUAJE JAVA
36
• El cliente de bibliotecas: Es el programador de aplicaciones, sólamente utiliza las clases que otros han diseñado y programado. Como
en el caso anterior necesita entender orientación a objetos y conocer
la biblioteca que va a usar, pero no necesita mayor experiencia.
Tanto programadores de clases como clientes de bibliotecas pueden llegar
a convertirse en buenos diseñadores de clases en la medida que adquieran
experiencia, comparando los diseños de las bibliotecas que utilicen.
Por lo tanto es importante destacar que no se necesita gran experiencia en
diseño orientado a objetos para poder aprovechar las ventajas de la orientación
a objetos.
3.1.1.
Bibliotecas de Clases Estándares de Java
Toda implementación de Java debe tener las siguientes bibliotecas de
clases:
Manejo de archivos.
Comunicación de datos.
Acceso a la red Internet.
Acceso a bases de datos.
Interfaces gráficas.
La interfaz de programación de estas clases es estándar, es decir en todas
ellas las operaciones se invocan con el mismo nombre y los mismos argumentos.
3.2.
Estructura General de un Programa Java
La estructura habitual de un programa realizado en cualquier lenguaje
orientado a objetos u OOP (Object Oriented Programming) tiene muchas particularidades, principalmente en el lenguaje Java.
En el siguiente ejemplo de código se presenta la estructura general de un
programa en Java:
CAPÍTULO 3. EL LENGUAJE JAVA
37
import java.awt.*;
import java.lang.String;
import java.lang.Integer;
import java.awt.event.WindowEvent;
import java.util.*;
import java.awt.TextField;
public class Simula extends Frame implements ActionListener,ItemListener{
MenuBar barra;
m1 =new Menu(“Archivo”);
barra.add(m1);
m2 =new Menu(“Ver”);
barra.add(m2);
....
public static void main(String argv [ ]){
Simula menus = new Simula();
menus.setTitle(“Simulación de Redes”);
menus.setVisible(true);
}
}
Aparece una clase que contiene el programa principal Simula (aquel que
contiene la función main()) y algunas clases de usuario (las específicas de la
aplicación que se está desarrollando) que son utilizadas por el programa principal. La aplicación se ejecuta por medio del nombre de la clase que contiene
la función main(). Las clases de Java se agrupan en packages, que son librerías de clases. Si las clases no se definen como pertenecientes a un package,
se utiliza un package por defecto (default) que es el directorio activo.
CAPÍTULO 3. EL LENGUAJE JAVA
3.3.
Conceptos Básicos
3.3.1.
Clase
38
Una clase es una agrupación de datos (variables o campos) y de funciones
(métodos) que operan sobre esos datos. A esos datos y funciones pertenecientes
a una clase se les denomina variables y métodos o funciones miembro. La
programación orientada a objetos se basa en la programación de clases. Un
programa se construye a partir de un conjunto de clases.
Una vez definida e implementada una clase, es posible declarar elementos
de esta clase de modo similar a como se declaran las variables del lenguaje (int,
double, String). Los elementos declarados de una clase se denominan objetos
de la clase. De una única clase se pueden declarar o crear numerosos objetos.
La clase es lo genérico: es el patrón o modelo para crear objetos. Cada objeto
tiene sus propias copias de las variables miembro, con sus propios valores, en
general distintos de los demás objetos de la clase. Las clases pueden tener
variables static, que son propias de la clase y no de cada objeto.
Ejemplo:
public abstract class FuncionActivacion implements Cloneable,Serializable{
/*constructor sin argumentos que permite la herencia */
public FuncionActivacion () {
}
}
3.3.2.
Herencia
La herencia permite que se puedan definir nuevas clases basadas en clases
existentes, lo cual facilita reutilizar código previamente desarrollado. Si una
clase deriva de otra (extends) hereda todas sus variables y métodos. La clase
derivada puede añadir nuevas variables y métodos y/o redefinir las variables
y métodos heredados.
CAPÍTULO 3. EL LENGUAJE JAVA
39
Figura 3.1: Herencia en Java.
En Java, a diferencia de otros lenguajes orientados a objetos, una clase sólo
puede derivar de una única clase, con lo cual no es posible realizar herencia
múltiple en base a clases. Sin embargo es posible “simular” la herencia múltiple
en base a las interfaces.
3.3.3.
Interface
Una interface es un conjunto de declaraciones de funciones. Si una clase
implementa (implements) una interface, debe definir todas las funciones especificadas por la interface. Una clase puede implementar más de una interface,
representando una forma alternativa de la herencia múltiple.
Una interface puede derivar de otra o incluso de varias interfaces, en cuyo
caso incorpora todos los métodos de las interfaces de las que deriva.
Ejemplo: La clase TangenteHiperbólica se extiende de la clase FunciónActivación que implementa la interface Serializable.
/*función de activación tangente hiperbólica */
CAPÍTULO 3. EL LENGUAJE JAVA
40
public class TangenteHiperbolica extends FuncionActivacion implements Serializable{
/*constructor sin argumentos */
public TangenteHiperbolica () {
}
}
3.3.4.
Package
Un package es una agrupación de clases. Existen una serie de packages
incluidos en el lenguaje.
Además el programador puede crear sus propios packages. Todas las clases
que formen parte de un package deben estar en el mismo directorio.
Los packages se utilizan con las siguientes finalidades:
1. Para agrupar clases relacionadas.
2. Para evitar conflictos de nombres. En caso de conflicto de nombres entre clases importadas, el compilador obliga a cualificar en el código los
nombres de dichas clases con el nombre del package.
3. Para ayudar en el control de la accesibilidad de clases y miembros.
Por estas razones, durante la etapa de Diseño del Software a desarrollar,
se tiene que crear tantos paquetes como sea necesario, como en el siguiente
ejemplo donde se utiliza la sentencia package.
package myprojects.simula;
import myprojects.calculos.*;
import myprojects.interfase.*;
CAPÍTULO 3. EL LENGUAJE JAVA
41
Figura 3.2: Típicos Packages Predefinidos.
3.3.5.
La Jerarquía de Clases de Java (API)
Durante la generación de código en Java, es recomendable y casi necesario
tener siempre a la vista la documentación on-line del API de Java. En dicha
documentación es posible ver tanto la jerarquía de clases, es decir la relación
de herencia entre clases, como la información de los distintos packages que
componen las librerías base de Java.
Es importante distinguir entre lo que significa herencia y package. Un
package es una agrupación arbitraria de clases, una forma de organizar las
clases. La herencia sin embargo consiste en crear nuevas clases en base a otras
ya existentes. Las clases incluidas en un package no derivan en general de la
misma clase.
En la documentación on-line se presentan ambas visiones: “Package Index”
y “Class Hierarchy”. La primera presenta la estructura del API de Java agrupada por packages, mientras que en la segunda aparece la jerarquía de clases.
Hay que resaltar el hecho de que todas las clases en Java son derivadas de la
clase java.lang.Object, por lo que heredan todos los métodos y variables de
ésta.
Si se selecciona una clase en particular, la documentación muestra una
descripción detallada de todos los métodos y variables de la clase. A su vez
muestra su herencia completa (partiendo de la clase java.lang.Object).
CAPÍTULO 3. EL LENGUAJE JAVA
42
Figura 3.3: API de Java.
3.3.6.
Variables Dentro del Lenguaje Java
Una variable en Java es un identificador que representa una palabra de
memoria que contiene información. El tipo de información almacenado en una
variable sólo puede ser del tipo con que se declaró esa variable.
En Java hay dos tipos principales de variables:
1. Variables de tipos primitivos. Están definidas mediante un valor único
y almacenan directamente ese valor siempre que pertenezca al rango de
ese tipo. Por ejemplo una variable int almacena un valor entero como
1, 2, 0, -1, etc. Esto significa que al asignar una variable entera a otra
variable entera, se copia el valor de la primera en el espacio que ocupa
la segunda variable.
2. Variables referencia. Las variables referencia son referencias o nombres
de una información más compleja: arrays u objetos de una determinada
clase. Una referencia a un objeto es la dirección de un área en memoria
destinada a representar ese objeto. El área de memoria se solicita con
el operador new. Al asignar una variable de tipo referencia a objeto a
otra variable se asigna la dirección y no el objeto referenciado por esa
dirección. Esto significa que ambas variables quedan referenciando el
mismo objeto. En Java una variable no puede almacenar directamente
un objeto, como ocurre en C y C++. Por lo tanto cuando se dice en
Java que una variable es un string, lo que se quiere decir en realidad es
que la variable es una referencia a un string.
CAPÍTULO 3. EL LENGUAJE JAVA
43
Desde el punto de vista de su papel dentro del programa, las variables
pueden ser:
1. Variables miembro de una clase: Se definen en una clase, fuera de cualquier método; pueden ser tipos primitivos o referencias.
2. Variables locales: Se definen dentro de un método o más en general dentro
de cualquier bloque entre llaves {}. Se crean en el interior del bloque y se
destruyen al finalizar dicho bloque. Pueden ser también tipos primitivos
o referencias.
En la Tabla 3.1 de la pág. 43 se muestra una declaración, el nombre de la
variable introducida y el tipo de información que almacena la variable:
Declaración
int i;
String s;
int a [];
int[]b;
Identificador
i
s
a
b
Tipo
entero
referencia a string
referencia a arreglo de enteros
referencia a arreglo de enteros
Cuadro 3.1: Tipos de Variables.
En la Tabla 3.2 de la pág. 43 se muestran las dos grandes categorías de
tipos para las variables en Java:
Tipos Primitivos
int, short, byte, long
char, boolean
float, double
Referencias a Objetos
Strings
Arreglos
otros objetos
Cuadro 3.2: Categorías de Variables.
En la Tabla 3.3de la pág. 44 se indica para cada tipo primitivo el número
de bits que se emplea en su representación y el rango de valores que se puede
almacenar en las variables de estos tipos.
Se dice que un tipo A es de mayor rango que un tipo B si A es un superconjunto de B. Esto quiere decir que las variables de tipo B siempre se pueden
CAPÍTULO 3. EL LENGUAJE JAVA
Tipo
int
short
byte
long
boolean
char
float
double
Bits
32
16
8
64
1
16
32
64
Rango
−231 ..231 − 1
−215 .,215 − 1
−27 .,27 − 1
−263 .,263 − 1
n/a
n/a
IEEE
IEEE
44
Ejemplos
0,1,5,-120,...
0,1,5,-120,...
0,1,5,-120,...
0,1,5,-120,...
false, true
‘a’,‘A’,‘0’,‘*’,...
1.2
1.2
Cuadro 3.3: Tipos Primitivos de Variables.
asignar a variables de tipo A (eventualmente con pérdida de significancia).
Por ejemplo int es de mayor rango que short, que a su vez es de mayor
rango que byte. Float y double son de mayor rango que int. Double es de mayor
rango que float.
3.3.7.
Visibilidad y Vida de las Variables
Se entiende por visibilidad o ámbito de una variable a la parte de la aplicación donde dicha variable es accesible y por lo tanto puede ser utilizada en
cualquier expresión. En Java todos las variables deben estar incluidas en una
clase. En general las variables declaradas dentro de unas llaves {}, es decir
dentro de un bloque, son visibles y existen dentro de estas llaves. Por ejemplo
las variables declaradas al principio de una función existen mientras se ejecute
la función; las variables declaradas dentro de un bloque if no serán válidas
al finalizar las sentencias correspondientes a dicho if y las variables miembro
de una clase (es decir declaradas entre las llaves {} de la clase pero fuera de
cualquier método) son válidas mientras existe el objeto de la clase.
Las variables miembro de una clase declaradas como public son accesibles a través de una referencia a un objeto de dicha clase utilizando el
operador punto (.).
Las variables miembro declaradas como private no son accesibles directamente desde otras clases. Las funciones miembro de una clase tienen
CAPÍTULO 3. EL LENGUAJE JAVA
45
acceso directo a todas las variables miembro de la clase sin necesidad de
anteponer el nombre de un objeto de la clase. Sin embargo las funciones
miembro de una clase B derivada de otra A, tienen acceso a todas las
variables miembro de A declaradas como public o protected, pero no a las
declaradas como private. Una clase derivada sólo puede acceder directamente a las variables y funciones miembro de su clase base declaradas
como public o protected.
Otra característica del lenguaje es que es posible declarar una variable
dentro de un bloque con el mismo nombre que una variable miembro, pero no
con el nombre de otra variable local. La variable declarada dentro del bloque
oculta a la variable miembro en ese bloque. Para acceder a la variable miembro
oculta será preciso utilizar el operador this.
Uno de los aspectos más importantes en la programación orientada a objetos (OOP) es la forma en la cual son creados y eliminados los objetos. La
forma de crear nuevos objetos es utilizar el operador new. Cuando se utiliza
el operador new, la variable de tipo referencia guarda la posición de memoria
donde está almacenado este nuevo objeto. Para cada objeto se lleva cuenta
de por cuántas variables de tipo referencia es apuntado. La eliminación de los
objetos la realiza el denominado garbage collector, quien automáticamente
libera o borra la memoria ocupada por un objeto cuando no existe ninguna
referencia apuntando a ese objeto. Lo anterior significa que aunque una variable de tipo referencia deje de existir, el objeto al cual apunta no es eliminado
si hay otras referencias apuntando a ese mismo objeto.
3.4.
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.
3.4.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 ( % ).
CAPÍTULO 3. EL LENGUAJE JAVA
3.4.2.
46
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.4 de la pág. 46, 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
Cuadro 3.4: Operadores de Asignación.
3.4.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.4.4.
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:
CAPÍTULO 3. EL LENGUAJE JAVA
47
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.4.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.5 de la pág. 47 muestra los operadores relacionales de 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
Cuadro 3.5: Operadores Relacionales.
Estos operadores se utilizan con mucha frecuencia en las bifurcaciones y
en los bucles, que se verán luego.
CAPÍTULO 3. EL LENGUAJE JAVA
48
Ejemplo de Operadores Incrementales y Operadores Relacionales en un
método.
public void cambiarParesEntrenamiento(double[ ] paresEntrenamiento){
/* 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.4.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”);
editor.append(“Iteraciones:”+ String.valueOf(imprimoIteraciones) + “\n”);
editor.append(“Inicio: ” + horaInicial.toString() + “\n”);
CAPÍTULO 3. EL LENGUAJE JAVA
49
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.4.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.6 de
la pág. 49 muestra el orden en que se ejecutan los distintos operadores en una
sentencia, de mayor a menor precedencia:
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
== !=
&
^
|
&&
||
?:
= += -= *= /= %= &= ^= |= <<= >>= >>>=
Cuadro 3.6: Precedencia de Operadores.
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
CAPÍTULO 3. EL LENGUAJE JAVA
50
derecha a izquierda, lo que significa que el valor de la izquierda se copia sobre
la variable de la derecha.
3.5.
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.5.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.5.2.
Comentarios
Existen varias formas diferentes de introducir comentarios entre el código de Java. Son similares a la forma de realizar comentarios en el lenguaje
C/C++. Los comentarios son ú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.
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
CAPÍTULO 3. EL LENGUAJE JAVA
51
continuación de una instrucción que debe ser ejecutada. Otra 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
/* Otra 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 otra 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.
Comentarios Iniciales
Todos los ficheros fuente deben comenzar con un comentario al estilo C
que indique el programador, o programadores, la fecha, una nota de copyright
y una pequeña descripción del propósito del programa. Por ejemplo:
/*
* Nombre de la clase
* Versión
* Copyright
*/
CAPÍTULO 3. EL LENGUAJE JAVA
3.5.3.
52
Sentencia import
La palabra import indica que son declaraciones que le avisan al compilador
que el programa usará.
En el caso de java.applet.* todas las clases que pertenecen al paquete
(packages) applet (por eso el applet.* .
El que produce que se usen todas las clases es el “*”. En el caso de java.awt.
Graphics indica que se usará el objeto Graphics del paquete awt.
Por ejemplo:
import java.applet.*;
import java.awt.Graphics;
3.5.4.
Longitud de Líneas
Se deben evitar líneas de más de 80 caracteres, porque sino no son manejadas correctamente por muchos terminales y herramientas.
Los ejemplos de uso en la documentación deben ir en líneas más cortas,
generalmente de no más de 70 caracteres.
3.5.5.
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. Existen dos variantes del tipo if.
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:
CAPÍTULO 3. EL LENGUAJE JAVA
53
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.5.6.
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
CAPÍTULO 3. EL LENGUAJE JAVA
54
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];
}
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.
CAPÍTULO 3. EL LENGUAJE JAVA
55
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.A continuación se muestra como sale de un método:
public double devuelveErrorMinimo()
{return errorMinimo;
}
CAPÍTULO 3. EL LENGUAJE JAVA
56
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.
Exception
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
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
CAPÍTULO 3. EL LENGUAJE JAVA
57
pasando la Exception de un método a otro hasta llegar al último método del
programa, el método main().
3.6.
Clases en Java
Las clases son el centro de la Programación Orientada a Objetos (OOP
- Object Oriented Programming). Algunos conceptos importantes de la POO
son los siguientes:
1. Encapsulación: Las clases pueden ser declaradas como públicas (public)
y como package (accesibles sólo para otras clases del package). Las variables miembro y los métodos pueden ser public, private, protected y
package. De esta forma se puede controlar el acceso y evitar un uso
inadecuado.
2. Herencia: Una clase puede derivar de otra (extends), y en ese caso hereda
todas sus variables y métodos. Una clase derivada puede añadir nuevas
variables y métodos y/o redefinir las variables y métodos heredados.
3. Polimorfismo: Los objetos de distintas clases pertenecientes a una misma
jerarquía o que implementan una misma interface pueden tratarse de
una forma general e individualizada, al mismo tiempo. Esto facilita la
programación y el mantenimiento del código.
3.6.1.
Características Importantes de las Clases
A continuación se enumeran algunas características importantes de las
clases:
1. Todas las variables y funciones de Java deben pertenecer a una clase.
No hay variables y funciones globales.
2. Si una clase deriva de otra (extends), hereda todas sus variables y métodos.
3. Java tiene una jerarquía de clases estándar de la que pueden derivar las
clases que crean los usuarios.
CAPÍTULO 3. EL LENGUAJE JAVA
58
4. Una clase sólo puede heredar de una única clase (en Java no hay herencia
múltiple). Si al definir una clase no se especifica de qué clase deriva, por
defecto la clase deriva de Object. La clase Object es la base de toda la
jerarquía de clases de Java.
5. En un fichero se pueden definir varias clases, pero en un fichero no puede
haber más que una clase public. Este fichero se debe llamar como la clase
public que contiene con extensión *.java. Con algunas excepciones, lo
habitual es escribir una sola clase por fichero.
6. Si una clase contenida en un fichero no es public, no es necesario que el
fichero se llame como la clase.
7. Los métodos de una clase pueden referirse de modo global al objeto de
esa clase al que se aplican por medio de la referencia this.
8. Las clases se pueden agrupar en packages, introduciendo una línea al
comienzo del fichero (package packageName;). Esta agrupación en packages está relacionada con la jerarquía de directorios y ficheros en la que
se guardan las clases.
3.6.2.
Métodos o Funciones Miembros
Métodos de Objeto
Los métodos son funciones definidas dentro de una clase. Salvo los métodos static o de clase, se aplican siempre a un objeto de la clase por medio
del operador punto (.). Dicho objeto es su argumento implícito. Los métodos
pueden además tener otros argumentos explícitos que van entre paréntesis, a
continuación del nombre del método.
La primera línea de la definición de un método se llama declaración o
header; el código comprendido entre las llaves {} es el cuerpo o body del
método. Considérese el siguiente ejemplo:
imprimoError=algor.devuelveErrorMinimo();
public double devuelveErrorMinimo()
{return errorMinimo;
}
CAPÍTULO 3. EL LENGUAJE JAVA
59
La Clase Object
Como ya se ha dicho, la clase Object es la raíz de toda la jerarquía de clases
de Java. Todas las clases de Java derivan de Object.
La clase Object tiene métodos interesantes para cualquier objeto que son
heredados por cualquier clase. Entre ellos se pueden citar los siguientes:
1. Métodos que pueden ser redefinidos por el programador:
clone(): Crea un objeto a partir de otro objeto de la misma clase.
El método original heredado de Object lanza una CloneNotSupportedException. Si se desea poder clonar una clase hay que implementar la interface Cloneable y redefinir el método clone(). Este método
debe hacer una copia miembro a miembro del objeto original. No
debería llamar al operador new ni a los constructores.
equals(): Indica si dos objetos son o no iguales. Devuelve true si
son iguales, tanto si son referencias al mismo objeto como si son
objetos distintos con iguales valores de las variables miembro.
toString(): Devuelve un String que contiene una representación del
objeto como cadena de caracteres, por ejemplo para imprimirlo o
exportarlo.
finalize(): Este método ya se ha visto al hablar de los finalizadores.
2. Métodos que no pueden ser redefinidos (son métodos final):
getClass(): Devuelve un objeto de la clase Class, al cual se le pueden
aplicar métodos para determinar el nombre de la clase, su superclase, las interfaces implementadas, etc. Se puede crear un objeto
de la misma clase que otro sin saber de qué clase es.
notify(), notifyAll() y wait(): Son métodos relacionados con los
threads (hilos).
CAPÍTULO 3. EL LENGUAJE JAVA
3.7.
Clases de Mayor Utilidad
3.7.1.
Clase Arrays
60
Los arrays de Java (vectores, matrices, hiper-matrices de más de dos dimensiones) se tratan como objetos de una clase predefinida. Los arrays son
objetos, pero con algunas características propias.
Los arrays pueden ser asignados a objetos de la clase Object y los métodos
de Object pueden ser utilizados con arrays.
Algunas de las características más importantes de los arrays son las siguientes:
1. Los arrays se crean con el operador new seguido del tipo y número de
elementos.
2. Se puede acceder al número de elementos de un array con la variable
miembro implícita length (por ejemplo, vect.length).
3. Se accede a los elementos de un array con los corchetes [ ] y un índice
que varía de 0 a length-1.
4. Se pueden crear arrays de objetos de cualquier tipo. En principio un array
de objetos es un array de referencias que hay que completar llamando al
operador new.
5. Los elementos de un array se inicializan al valor por defecto del tipo correspondiente (cero para valores numéricos, la cadena vacía para Strings,
false para boolean, null para referencias).
6. Como todos los objetos, los arrays se pasan como argumentos a los métodos por referencia.
7. Se pueden crear arrays anónimos (por ejemplo, crear un nuevo array
como argumento actual en la llamada a un método).
Inicialización de Arrays
Los arrays se pueden inicializar con valores entre llaves {...} separados por
comas. También los arrays de objetos se pueden inicializar con varias llamadas
a new dentro de unas llaves {...}.
CAPÍTULO 3. EL LENGUAJE JAVA
61
Si se igualan dos referencias a un array no se copia el array, sino que se
tiene un array con dos nombres, apuntando al mismo y único objeto.
Ejemplo de creación de una referencia a un array:
/*vector de pesos */
public double[ ] pesos;
También existen arrays bidimensionales, que se crean de un modo muy
similar al de C++ (con reserva dinámica de memoria). En Java una matriz
es un vector de vectores fila, o más en concreto un vector de referencias a los
vectores fila. Con este esquema, cada fila podría tener un número de elementos
diferente.
Una matriz se puede crear directamente en la siguiente forma:
/*vector de las entradas de los pares de entrenamiento*/
protected double[ ][ ] entradaEntrenamiento;
3.7.2.
Clases String y StringBuffer
Las clases String y StringBuffer están orientadas a manejar cadenas de
caracteres. La clase String está orientada a manejar cadenas de caracteres
constantes, es decir, que no pueden cambiar. La clase StringBuffer permite
que el programador cambie la cadena insertando, borrando, etc. La primera
es más eficiente, mientras que la segunda permite más posibilidades.
Ambas clases pertenecen al package java.lang, y por lo tanto no hay que
importarlas. Hay que indicar que el operador de concatenación (+) entre objetos de tipo String utiliza internamente objetos de la clase StringBuffer y el
método append().
Los métodos de String se pueden utilizar directamente sobre literals (cadenas entre comillas), como por ejemplo: “Hola”.length().
CAPÍTULO 3. EL LENGUAJE JAVA
62
Métodos de la Clase String
Algunos métodos de String y la función que realizan:
String(...): Constructores para crear Strings a partir de arrays de bytes
o de caracteres.
String(String str) yString(StringBuffer sb): Costructores a partir de un
objeto String o StringBuffer.
charAt(int): Devuelve el carácter en la posición especificada.
getChars(int, int, char[ ], int): Copia los caracteres indicados en la posición indicada de un array de caracteres.
length(): Devuelve el número de caracteres de la cadena.
toLowerCase(): Convierte en minúsculas (puede tener en cuenta el locale).
toUpperCase(): Convierte en mayúsculas (puede tener en cuenta el locale).
valueOf(): Devuelve la representación como String de sus argumento.
Admite Object, arrays de caracteres y los tipos primitivos.
3.7.3.
Clase Double
La clase java.lang.Double deriva de Number, que a su vez deriva de Object.
Esta clase contiene un valor primitivo de tipo double.
Algunos Métodos de la Clase Double
Double(double) y Double(String): Los constructores de esta clase.
doubleValue(), floatValue(), longValue(), intValue(), shortValue(), byteValue(): Métodos para obtener el valor del tipo primitivo.
String toString(), Double valueOf(String): Conversores con la clase String.
isInfinite(), isNaN(): Métodos de chequear condiciones.
equals(Object): Compara con otro objeto.
CAPÍTULO 3. EL LENGUAJE JAVA
3.7.4.
63
Clase Integer
La clase java.lang.Integer tiene como variable miembro un valor de tipo
int.
Algunos Métodos de la Clase Integer
Integer(int) y Integer(String): Constructores de la clase.
doubleValue(), floatValue(), longValue(),intValue(), shortValue(), byteValue(): Conversores con otros tipos primitivos.
Integer decode(String), Integer parseInt(String), String toString(), Integer ValueOf(String): Conversores con String del sistema a partir del
nombre de dicha propiedad.
3.8.
El AWT (Abstract Windows Toolkit)
3.8.1.
Qué es el AWT
El AWT (Abstract Windows Toolkit) es la parte de Java que se ocupa de
construir interfaces gráficas de usuario. Aunque el AWT ha estado presente en
Java desde la versión 1.0, la versión 1.1 representó un cambio notable, sobre
todo en lo que respecta al modelo de eventos. La versión 1.2 ha incorporado un
modelo distinto de componentes llamado Swing, que también está disponible
en la versión 1.1 como package adicional.
3.8.2.
Creación de una Interface Gráfica de Usuario
Para construir una interface gráfica de usuario hace falta:
1. Un “contenedor” o container : Es la ventana o parte de la ventana donde
se situarán los componentes (botones, barras de desplazamiento, etc.) y
donde se realizarán los dibujos. Se correspondería con un formulario o
una picture box de Visual Basic.
CAPÍTULO 3. EL LENGUAJE JAVA
64
2. Los componentes: Son menúes, botones de comando, barras de desplazamiento, cajas y áreas de texto, botones de opción y selección, etc. Se
corresponderían con los controles de Visual Basic.
3. El modelo de eventos: El usuario controla la aplicación actuando sobre
los componentes, de ordinario con el ratón o con el teclado. Cada vez
que el usuario realiza una determinada acción, se produce el evento correspondiente, que el sistema operativo transmite al AWT.
El AWT crea un objeto de una determinada clase de evento, derivada de
AWT Event. Este evento es transmitido a un determinado método para que
lo gestione. En Visual Basic el entorno de desarrollo crea automáticamente el
procedimiento que va a gestionar el evento (uniendo el nombre del control con
el tipo del evento mediante el carácter) y el usuario no tiene más que introducir
el código. En Java es un poco más complicado, ya que el componente u objeto
que recibe el evento debe “registrar” o indicar previamente el objeto que se va
a hacer cargo de gestionar ese evento.
3.8.3.
Objetos “event source” y Objetos “event listener”
El modelo de eventos de Java está basado en que los objetos sobre los que
se producen los eventos (event sources) “registran” los objetos que habrán
de gestionarlos (event listeners), para lo cual los event listeners habrán de
disponer de los métodos adecuados. Estos métodos se llamarán automáticamente cuando se produzca el evento. La forma de garantizar que los event
listeners disponen de los métodos apropiados para gestionar los eventos es
obligarlos a implementar una determinada interface Listener. Las interfaces
Listener se corresponden con los tipos de eventos que se pueden producir.
Las capacidades gráficas del AWT resultan pobres y complicadas en comparación con lo que se puede conseguir con Visual Basic, pero tienen la ventaja
de poder ser ejecutadas casi en cualquier ordenador y con cualquier sistema
operativo.
CAPÍTULO 3. EL LENGUAJE JAVA
3.8.4.
65
Proceso a Seguir Para Crear Una Aplicación Interactiva
(Orientada a Eventos)
Pasos que se pueden seguir para construir una aplicación orientada a eventos sencilla, con interface gráfica de usuario:
1. Determinar los componentes que van a constituir la interface del usuario,
como botones, cajas de texto, menúes, etc.
2. Crear una clase para la aplicación que contenga la función main().
3. Crear una clase Ventana, sub-clase de Frame, que responda al evento
WindowClosing().
4. La función main() deberá crear un objeto de la clase Ventana (en el
que se van a introducir las componentes seleccionadas) y mostrarla por
pantalla con el tamaño y posición adecuados.
5. Añadir al objeto Ventana todos los componentes y menúes que deba
contener.
6. Definir los objetos Listener (objetos que se ocuparán de responder a los
eventos, cuyas clases implementan las distintas interfaces Listener) para
cada uno de los eventos que deban estar soportados. En aplicaciones
pequeñas, el propio objeto Ventana se puede ocupar de responder a los
eventos de sus componentes. En programas más grandes se puede crear
uno o más objetos de clases especiales para ocuparse de los eventos.
7. Finalmente, se deben implementar los métodos de las interfaces Listener
que se vayan a hacer cargo de la gestión de los eventos.
3.9.
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.
CAPÍTULO 3. EL LENGUAJE JAVA
66
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.9.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
{
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 );
CAPÍTULO 3. EL LENGUAJE JAVA
67
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.
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.9.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
CAPÍTULO 3. EL LENGUAJE JAVA
68
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.9.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.
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
CAPÍTULO 3. EL LENGUAJE JAVA
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 );
}
public static File desdeOrigen( String path[] ) {
return( dirInicial( null,path ) );
}
public static File desdeProp( String nombrePropiedad ) {
String pd = System.getProperty( nombrePropiedad );
69
CAPÍTULO 3. EL LENGUAJE JAVA
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” ) );
}
/* 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()];
70
CAPÍTULO 3. EL LENGUAJE JAVA
71
Figura 3.4: JDBC en Java.
for( int i=0; i < valor.length; i++ ) {
valor[i] = st.nextToken();
}
return( valor );
}
}
3.9.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().
CAPÍTULO 3. EL LENGUAJE JAVA
72
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:
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.9.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.9.6.
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.9.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
Los Servlets
4.1.
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
74
CAPÍTULO 4. LOS SERVLETS
75
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. [2, 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.
4.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{
CAPÍTULO 4. LOS SERVLETS
4.1.2.
76
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.
En la figura 5.1 de la página 89 se puede apreciar gráficamente el Ciclo de
Vida de un Servlet.
4.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
CAPÍTULO 4. LOS SERVLETS
Figura 4.1: Ciclo de Vida de un Servlet.
77
CAPÍTULO 4. LOS SERVLETS
78
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.
4.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.
4.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 instancia 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.
4.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 como se muestra en la figura
CAPÍTULO 4. LOS SERVLETS
79
Figura 4.2: Requerimiento de un Archivo JSP.
4.2 de la página 79.
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, como se muestra
en la figura 4.3 de la página 80.
Este modelo de acceso facilita la generación de contenido separado del
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.
4.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
CAPÍTULO 4. LOS SERVLETS
80
Figura 4.3: Requerimiento de un Servlet.
(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.
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
CAPÍTULO 4. LOS SERVLETS
81
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.
4.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.
4.1.9.
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
CAPÍTULO 4. LOS SERVLETS
82
variedad de sistemas. El software J2SE consiste en los Java SDK Standard
Edition y el Java Runtime Environment (JRE) Standard Edition.
4.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.
4.1.11.
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.
CAPÍTULO 4. LOS SERVLETS
83
Un contexto del servlet para la aplicación.
4.1.12.
Patrones y Guías de Servlets/JSP
A continuación se proporcionan las pautas específicas sobre cómo organizar
una aplicación que usa servlets y JSP’s.
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.
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.
CAPÍTULO 4. LOS SERVLETS
84
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.
• 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.
CAPÍTULO 4. LOS SERVLETS
85
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.
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 [2].
Capítulo 5
Introducción al DB2
Express-C 9
DB2 Express-C es un miembro de la familia IBM DB2 de poderosas aplicaciones de servidores de datos para manejar tanto datos relacionales como
XML. DB2 Express-C es una edición de DB2 libre, sin límites y fácil de usar.
La C en DB2 Express-C significa Comunidad. Una comunidad de usuarios
DB2 Express-C que se juntan para ayudarse unos a otros, tanto en línea como
fuera de ella. La comunidad DB2 Express-C consiste en una variedad de personas y compañías que diseñan, desarrollan, implementan o utilizan soluciones
de base de datos, como:
87
CAPÍTULO 5. INTRODUCCIÓN AL DB2 EXPRESS-C 9
88
Desarrolladores de aplicaciones que requieren un software de base de
datos de estándar abierto para construir aplicaciones standalone, clienteservidor, Web y empresariales.
ISVs, vendedores de hardware, vendedores de infraestructura de pila y
proveedores de otros tipos de solución que quieran incluir o empotrar un
completo servidor de datos como parte de sus soluciones.
Consultores, administradores de base de datos y arquitectos IT que necesiten un servidor de datos robusto para entrenamiento, desarrollo de
habilidades, evaluación y prototyping.
Startups, pequeñas y medianas compañías que necesitan un servidor de
datos confiable para sus aplicaciones y operaciones.
Estudiantes, profesores y otros usuarios académicos que quieran un servidor de datos altamente versátil para enseñanza, courseware, proyectos e
investigaciones [3].
DB2 Express-C comparte el mismo núcleo de funcionalidad y código base
como las ediciones pagadas de DB2 para Linux, UNIX y Windows. DB2
Express-C puede correr en sistemas de 32-bits y 64-bits con sistemas operativos
Windows o Linux. Puede correr en un sistema que tenga cualquier cantidad
de núcleos y de memoria. No tiene ningún requerimiento especial de almacenamiento o de configuración del sistema que sean especiales. DB2 Express-C
también incluye pureXML sin costo. pureXML es la tecnología única de DB2
para almacenar y procesar documentos XML nativamente. [4]
5.0.13.
Servidores DB2
Todas las ediciones de servidores DB2 contienen el mismo núcleo de componentes; están empaquetados de tal manera que los usuarios puedan escoger
las funciones que necesitan al precio correcto. Figura 5.1 de la página 89 ilustra
las diferentes ediciones de productos DB2.
Como se muestra en la figura 5.1, DB2 Express-C es igual que DB2 Express
solo que sin algunos componentes. DB2 Express-C es libre a la comunidad.
La figura 5.1 también explica porqué es tan fácil actualizar desde DB2
Express-C. Si se desea actualizar a cualquier otro servidor DB2 en el futuro,
CAPÍTULO 5. INTRODUCCIÓN AL DB2 EXPRESS-C 9
89
Figura 5.1: Servidores DB2.
todos los servidores DB2 tienen el mismo núcleo de componentes. Esto también significa que una aplicación desarrollada para una edición trabajará, sin
ninguna modificación, en otra edición. Y cualquier habilidad aprendida en una
edición aplicará a las otras ediciones.
5.0.14.
Clientes DB2 y Controladores
Un cliente DB2 incluye las funcionalidades necesarias para conectarse a
un servidor DB2, sin embargo, un cliente no siempre tiene que ser instalado.
Por ejemplo, una aplicación JDBC Type 4 puede conectarse directamente a
un servidor DB2, previsto del correcto controlador ya cargado. Los clientes
DB2 vienen en diferentes formas:
Cliente Servidor de Datos IBM (IBM Data Server Client): el más completo, incluye herramientas GUI, controladores.
Cliente de Tiempo de Ejecución de Servidor de Datos (IBM Data Server
Runtime Client): funcionalidad básica para conectarse e incluye controladores.
Módulos fusionados de Cliente de Tiempo de Ejecución DB2 para Windows (DB2 Runtime Client Merge Modules for Windows): principalmente usado para incluir un cliente de Tiempo de Ejecución DB2 como
CAPÍTULO 5. INTRODUCCIÓN AL DB2 EXPRESS-C 9
90
parte de la instalación de una aplicación Windows [5].
Aunque todos los clientes DB2 incluyen sus controladores requeridos, a
partir de DB2 9 se proveen controladores individuales también. Todos los
clientes DB2 y controladores son gratis y disponibles para descargar desde el
sitio Web de DB2 Express-C. Los clientes y controladores pueden ser usados
para conectarse a un servidor DB2 en Linux, UNIX o Windows. Para conecR
R
o DB2 para i5/OS
es necesario ir a
tarse a servidores DB2 para z/OS
través de un servidor DB2 Connect.
5.0.15.
Características y Productos Relacionados
Las características incluidas en la versión gratuita de DB2 Express-C son:
La funcionalidad base de DB2.
Control Center, Data Studio y otras herramientas de manejo pureXML.
Utilización de recursos hasta 2GB y 2 núcleos.
Disponible en Linux, Windows, y Solaris (x86).
Las capacidades disponibles con la licencia de 12 meses de DB2 Express-C
son:
Fix packs.
Alta disponibilidad y Recuperación Critica (HADR).
Data Replication (Homogenous SQL).
Utilización de recursos hasta 4GB y 4 núcleos (en 2 tomas).
5.0.16.
Características incluídas en otras ediciones de DB2:
Características pagadas en la edición DB2 Express:
pureXML.
CAPÍTULO 5. INTRODUCCIÓN AL DB2 EXPRESS-C 9
91
Alta disponibilidad.
Federación Homogénea.
Características incluidas sin costo en la edición DB2 Workgroup:
Alta disponibilidad.
R
Disponible en AIX
, Solaris, y HP-UX además de Linux y Windows.
Características pagadas en la edición DB2 Workgroup:
pureXML.
Optimización de Performance (MQT, MDC, Query Parallelism).
Federación Homogénea.
Características incluídas sin costo en la edición DB2 Enterprise:
Particionamiento de Tablas (Range).
Materialized Query Tables (MQT ).
Multi-dimensional Clustering (MDC ).
Alta disponibilidad y Recuperación Critica (HADR).
Conexión Concentrada.
Características pagadas en la edición DB2 Enterprise:
pureXML.
Optimización de almacenamiento (incluido compresión).
Control de acceso avanzado (seguridad avanzada).
Optimización del Performance (Performance Experto, Query Patroller ).
CAPÍTULO 5. INTRODUCCIÓN AL DB2 EXPRESS-C 9
92
Administración de datos Geodetic.
Federación Homogénea DB2.
Productos pagados relacionados a DB2 :
DB2 Connect.
DB2 Warehouse Editions.
R
Federation Server.
WebSphere
WebSphere Replication Server.
5.0.17.
Características Incluidas con la Licencia de Suscripción
de DB2 Express-C
Fix Packs
Un fix pack de DB2 es un paquete de código corregido aplicado en un
producto DB2 instalado, para corregir publicaciones diferentes después de
que el producto fue liberado. Con una licencia de suscripción, la corrección de
paquetes es gratis para descargar e instalar [6].
Alta disponibilidad de Recuperación Critica (HADR)
Alta disponibilidad de Recuperación Crítica (HADR) es una característica de fiabilidad de base de datos que proporciona una alta disponibilidad
y la solución de recuperación de datos ante desastres de sitio completos así
como parciales. Un ambiente HADR generalmente consiste en dos servidores
de datos, el primario y el secundario (que puede estar en posiciones geográficamente distantes). El servidor primario es donde la fuente de base de datos
es almacenada y accesada por aplicaciones de clientes.
Como las transacciones son procesadas sobre la base de datos primaria, los
registros de la base de datos automáticamente son transportados al servidor
secundario a través de la red. El servidor secundario tiene una copia clonada
de la base de datos primaria, por lo general creada por el back-up de la base
de datos primaria y restaurándolo sobre la base de datos secundaria. Cuando
CAPÍTULO 5. INTRODUCCIÓN AL DB2 EXPRESS-C 9
93
los registros de la base de datos primaria son recibidos ellos son reproducidos
de nuevo y aplicados a la base de datos secundaria.
Por la repetición continua de los registros, la base de datos secundaria
mantiene una réplica en sincronización de la base de datos primaria que puede
asumir si la base de datos primaria falla.
Una solución completa de DB2-supported HADR
Capacidad rápida de solución ante fallas, con transparencia completa
para clientes y aplicación de cliente.
Atomicidad completa en las transacciones para prevenir perdida de datos.
Habilidad de actualizar sistemas o aplicaciones sin interrupción de servicios visibles.
Sistema remoto de fallas, proporcionando recuperación completa de desastre local que puede dañar el centro de datos.
Administración fácil con herramientas graficas de DB2.
Todos esto con un impacto insignificante sobre funcionamiento total del
sistema.
Réplica de Datos
Esta característica permite la réplica de datos entre un servidor fuente
donde los cambios de datos con capturados, y un servidor objetivo donde el
cambio de datos son aplicados. La figura 5.2 de la página 94 proporciona una
descripción de cómo trabaja la réplica.
En la figura hay dos servidores, un servidor fuente y un servidor objetivo.
En el servidor fuente, el programa Capture captura el cambio hecho en la base
de datos. En el servidor objetivo, un programa Apply aplica los cambios de la
base de datos replica. La réplica es útil para una variedad de propósitos que
requieren replica de datos, incluyendo alivio de capacidad, sosteniendo el data
warehouse y el mercado de datos, revisando el historial de cambios. Usando las
características de la réplica SQL puedes replicar datos entre DB2 Express-C
y otros servidores DB2, incluyendo aquellos en otros sistemas Linux, UNIX,
z/OS, y i5/OS.
CAPÍTULO 5. INTRODUCCIÓN AL DB2 EXPRESS-C 9
94
Figura 5.2: Réplica de SQL.
5.0.18.
Características No Disponibles con DB2 Express-C
Esta sección describe alguna de las características disponibles en otras
ediciones de DB2 pero no en DB2 Express-C.
Particionamiento de la Base de Datos
La característica de particionamiento de la base de datos (DPF ) es solo
disponible con DB2 Enterprise Edition con la licencia de pago adicional. Esto
permite a la base de datos ser extendido a través de múltiples particiones los
cuales pueden estar alojados en varias computadoras. DPF está basado en una
arquitectura shared-nothing. Cada computadora, como es añadido al grupo de
partición, trae el poder adicional de procesamiento de datos con sus propias
CPUs y memoria. DPF es en particular útil en ambientes de servidor de datos
grandes como data warehouses donde las sentencias de los sistemas de apoyo
de decisión (DSS ) son controlados.
CAPÍTULO 5. INTRODUCCIÓN AL DB2 EXPRESS-C 9
95
Concentrador de Conexión
El concentrador de conexiones es una característica que permite el soporte
de un largo número de usuarios conectados simultáneamente. Previamente,
toda conexión a la base de datos requiere un agente de base de datos. El concentrador de conexiones introduce el concepto de un agente lógico, permitiendo
un agente para mantener muchas conexiones.
Geodetic Extender
DB2 Geodetic Extender esta disponible con pago adicional para DB2 Enterprise Edition. Este extender hace desarrollos para aplicaciones de inteligencia de negocios y egovernment que requieren un análisis de localización geográfica mucho más sencillo. DB2 Geodetic Extender puede construir un globo
mundial virtual a cualquier escala. La mayoría de información de localización
es tomada usando sistemas worldwide, por ejemplo el sistema de satélites de
posicionamiento global (GPS ), y puede ser representado en coordenadas de
latitud/longitud (geocódigo). Los datos de negocios, como direcciones, pueden
ser convertidos a geocódigo con DB2 Geodetic Extender y aplicaciones a nivel empresarial trabajan mejor cuando mantienen los datos en esta forma sin
proyección, saliendo las proyecciones del mapa (tierra a mapa plano) donde
ellos pertenecen, en la capa de presentación, para mostrar e imprimir mapas.
Workload Management (WLM)
Maneja cargas de trabajo en una base de datos en base a prioridades de
un usuario y de aplicaciones combinadas con la disponibilidad de recursos y
límites. Permite regular la carga de trabajo de tu base de datos y consultas,
de tal manera que consultas importantes y de alta prioridad pueden corer
inmediatamente, y , and previene consultas espontáneas que no tienen buen
rendimiento de monopolizar los recursos del sistema de manera que tu sistema
puede correr eficientemente. WLM is Nuevo en DB2 9.5 y prove mas poder
que las características de las herramientas Query Patroller y del DB2 Governor
que eran disponibles en versiones anteriores de DB2.
CAPÍTULO 5. INTRODUCCIÓN AL DB2 EXPRESS-C 9
96
Figura 5.3: DB2 Connect.
5.0.19.
Productos Pagados Relacionados con DB2
DB2 Connect
DB2 Connect es un software pagado que permite al cliente DB2 para
Linux, UNIX o Windows conectarse a un servidor DB2 para z/OS o para
i5/OS, como se muestra en la figura 5.3 de la página 96. DB2 Connect no es
requerido cuando la conexión ocurre en la dirección opuesta: cuando se conecta
desde DB2 para z/OS o i5/OS hacia DB2 para Linux, UNIX o Windows. DB2
Connect viene en dos ediciones principales dependiendo de las necesidades de
conexión: DB2 Connect Personal Edition y DB2 Connect Enterprise Edition.
WebSphere Federation Server
Antiguamente conocido como WebSphere Information Integrator (para soporte de federación), WebSphere Federation Server permite una federación de
CAPÍTULO 5. INTRODUCCIÓN AL DB2 EXPRESS-C 9
97
base de datos; significando que puedes correr consultas de base de datos que
puedan trabajar con objetos de diferentes sistemas de base de datos relacional.
Por ejemplo, con WebSphere Federation Server, se puede correr la siguiente
consulta:
SELECT *
FROM Oracle.Table1 A
DB2.Table2 B
SQLServer.Table3 C
WHERE
A.col1 < 100
and B.col5 = 1000
and C.col2 = “Test’
La figura 5.4 de la página 98 provee una ilustración donde WebSphere
Federation Server es usado.
WebSphere Replication Server
Antiguamente conocido como WebSphere Information Integrator (para soporte de replicación), WebSphere Replication Server permite replicación SQL
en registros de base de datos cuando servidores de datos que no son de IBM
están involucrados. Esto también incluye una característica conocida como
Q-Replication para replicar información usando cola de mensajes.
5.0.20.
Guía de Instalación de DB2 Express C
Este apartado explicará paso a paso una instalación básica de DB2 ExpressC en Windows. La misma installation wizard está
disponible en Linux ; por lo tanto los pasos son similares en ambas plataformas.
CAPÍTULO 5. INTRODUCCIÓN AL DB2 EXPRESS-C 9
Figura 5.4: WebSphere Federation Server.
98
CAPÍTULO 5. INTRODUCCIÓN AL DB2 EXPRESS-C 9
99
Procedimiento
1. Obtener la imágen de DB2 Express-C. Descargar la imágen apropiada de
DB2 Express-C, u ordenar el Discovery Kit DVD que incluye la imágen
del DB2 Express -C de la página Web www.ibm.com/db2/express.
2. Descomprimir los archivos en el directorio que se desee.
3. Localizar los archivos. Dirígirse hacia el directorio (o unidad) en donde
se encuentran los archivos de instalación que se han descomprimido.
4. Correr el Launchpad. Ejecutar el DB2 Launchpad haciendo doble clic
en el archivo setup.exe. En Linux, ejecutar el commando db2setup como
root. En el Launchpad, clic en la opción Install Product en el panel
izquierdo de la ventana.
5. Correr el DB2 setup wizard. El DB2 setup wizard revisa si cumple todos
los requerimientos del sistema y ve si existe otra instalación de DB2.
Hacer clic en el botón Next para seguir con la instalación.
6. Revisar los términos de licencia. Leer y aceptar los términos de licencia (seleccionar el radio button I Accept...) y clic al botón Next para
continuar.
7. Elegir el tipo de instalación. En este caso, seleccionar la opción Typical
(opción por defecto). La opción Compact realiza una instalación básica,
mientras la opción Custom permite personalizar la configuración específica que se quiere instalar. Clic en el botón Next para continuar.
8. Seleccionar la carpeta para la instalación. Esta pantalla permite elegir
la unidad y el directorio donde el código de DB2 es instalado en el
sistema. Asegurarse de que exista espacio suficiente para la instalación.
Usar la unidad y el directorio por defecto para este ejemplo (mostrado a
continuación): Unidad: C: Directorio: C:\Archivos de Programa\ IBM\
SQLLIB. Clic en el botón Next para continuar.
9. Configurar la información del usuario. Una vez que DB2 Express-C está instalado, asegurarse que los procesos de DB2 están corriendo como
Servicios del Sistema. Estos servicios requieren una cuenta del sistema
operativo para poder correrlo. En el ambiente de Windows, usar la cuenta por defecto db2admin es recomendada. Si esta cuenta aun no existe,
DB2 la creará en el Sistema Operativo. También se puede especificar
CAPÍTULO 5. INTRODUCCIÓN AL DB2 EXPRESS-C 9
100
una cuenta existente, pero esa cuenta debe tener los permisos de administrador local. Se recomienda usar las opciones sugeridas. Asegurarse
de especificar el password para la cuenta. En Linux se usa el UserID por
defecto db2inst1 (dueño de la instancia), db2fenc1 (usuario para rutinas
limitadas) y dasusr1 (usuario del DB2 Administrator Server, DAS ). Clic
en el botón Next para continuar.
10. Configurar la instancia DB2. Pensar en el concepto de instancia DB2
como un contenedor para bases de datos. Una instancia debe existir
antes de que una base de datos pueda ser creada dentro de ella. En una
instalación en Windows, la instancia llamada DB2 se creará automáticamente. En Linux, el nombre por defecto de la instancia es db2inst1.
Por defecto, la instancia DB2 esta configurada para escuchar conexiones
TCP/IP en el puerto 50000. El protocolo por defecto y el puerto pueden
ser cambiados dándole clic en Protocols y el botón Startup, respectivamente. Se recomienda usar las opciones por defecto para este ejemplo.
Clic en el botón Next para continuar.
11. Comenzar con la instalación. Revisar las opciones de instalación seleccionadas previamente. Hacer clic en el botón Install para comenzar a
copiar los archivos a la carpeta destino de instalación. DB2 también
realizará algunos procesos de configuración iniciales.
12. Primeros pasos. Luego que la instalación ha terminado, otra herramienta llamada First Steps arranca automaticamente. First Steps también
puede ser arrancada con el comando db2fs.
13. La base de datos SAMPLE es una base datos que se puede usar para
probar DB2. Esta es creada automáticamente luego de la instalación de
DB2. Verificar que la base de datos exista abriendo la herramienta DB2
Control Center. Para abrir esta herramienta, del botón Inicio de Windows elegir: Inicio → Programas → IBM DB2 →DB2COPY1 (Default)
→ General Administration Tools → Control Center. Ademas se puede
iniciar el Control Center con el comando db2cc.
14. Si la base de datos SAMPLE se muestra en el Control Center, se puede
saltar al paso 16. Si no se muestra, seleccionar el item Refresh del menu
Control Center View para asegurar que se puede ver toda la información
refrescada. Si la base de datos SAMPLE sigue sin aparecer, es porque no
ha sido creada. Habrá que crearla manualmente del First Steps. Elegir
donde dice Database Creation, y luego guiarse con el Wizard para crear
CAPÍTULO 5. INTRODUCCIÓN AL DB2 EXPRESS-C 9
101
Figura 5.5: Ventana de Progreso en DB2.
la base de datos SAMPLE. Asegurarse que los objetos XML y SQL y
las opciones de datos son seleccionados, y luego clic en OK. Esta última
opción creará una base de datos UNICODE el cual fue requerido en la
version 9 para soportar XML puro (pureXML), pero no es necesario en
DB2 9.5.
15. La siguiente ventana que se visualiza en la figura 5.5 de la página 101,
aparece cuando la base de datos esta siendo creada. (Este procedimiento
puede tomar algunos minutos). Cuando la base de datos es creada, clic
en el botón OK y cerrar la herramienta First Steps.
1. Regresar al Control Center y verificar que la base de datos SAMPLE
aparezca en el panel Object Tree. Se debe refrescar la vista del Control
Center para ver los nuevos cambios efectuados. Para hacer esto, seleccionar el item Refresh del menu Control Center View.
2. Reiniciar la computadora. A pesar que este paso no esta mencionado
en la documentación oficial de instalación DB2, se recomienda reiniciar
el sistema (si es posible, por lo menos en Windows) para asegurarse
que todos los procesos comiencen satisfactoriamente y limpien cualquier
recurso de memoria que no han sido eliminados correctamente. Esto es
OPCIONAL.
CAPÍTULO 5. INTRODUCCIÓN AL DB2 EXPRESS-C 9
102
Figura 5.6: Herramientas DB2.
5.0.21.
Herramientas de DB2
En este apartado, se describirán algunas de las herramientas que se pueden
usar con DB2.
La elipse roja en la figura 5.6 de la página 102 muestra el área en la que
se centra este apartado.
La figura 5.7 lista todas las herramientas disponibles en el menú de inicio
de DB2. La mayoría de esas herramientas son las mismas en Linux y Windows.
La tabla 5.1 de la página 103 provee una lista de comandos que pueden ser
usados para iniciar algunas de las herramientas más populares tanto en Linux
o Windows.
CAPÍTULO 5. INTRODUCCIÓN AL DB2 EXPRESS-C 9
Figura 5.7: Herramientas DB2: Menú Inicio.
Herramienta
Editor de Comandos
Command Line processor
Ventana de Comandos
Control Center
Task Center
Health Center
Configuration Assistant
First Steps
Comando
db2ce
db2
db2cmd
db2cc
db2tc
db2hc
db2ca
db2fs
Cuadro 5.1: Comandos Para Iniciar Algunas Herramientas DB2.
103
CAPÍTULO 5. INTRODUCCIÓN AL DB2 EXPRESS-C 9
104
Figura 5.8: Centro de Control de DB2.
Centro de Control (Control Center)
La herramienta primaria para la administración de DB2 es el Centro de
Control, ilustrado en la figura 5.8 de la página 104.
El Centro de Control es una herramienta de administración centralizada
que permite:
Ver el sistema, instancias, bases de datos y objetos de la base de datos;
Crear, modificar y manejar objetos de las bases de datos;
Lanzar otras herramientas gráficas de DB2.
El panel del lado izquierdo provee una visión jerárquica de los objetos de
la base de datos en el sistema, teniendo una carpeta para Tablas, Vistas, etc.
Al hacer doble clic sobre una carpeta, del lado derecho se listarán todos los
objetos relacionados, como por ejemplo, todas las tablas asociadas con la base
de datos SAMPLE. Si se selecciona una tabla en la parte alta del panel, en la
CAPÍTULO 5. INTRODUCCIÓN AL DB2 EXPRESS-C 9
105
parte baja del lado derecho del panel se proveerá información más específica
acerca de esa tabla.
Al hacer clic derecho sobre los diferentes objetos/carpetas en el árbol de
objetos es posible ver el menú con las opciones aplicables a los objetos/carpetas
[6].
La primera vez que se lanza el Centro de Control, preguntará qué vista se
prefiere usar. La elección de la vista determina qué tipo de opciones y objetos
de la base de datos son expuestos:
La vista básica provee la funcionalidad elemental.
La vista avanzada muestra más opciones y mejoras.
La vista personalizada permite ajustar las mejoras específicas, opciones
y objetos que se mostrarán.
Cómo Lanzar el Centro de Control Hay varias formas de lanzar el Centro de Control :
Navegando a través del menú de inicio de Windows.
Ejecutando db2cc en la línea de comandos.
Dando clic en el icono de el Centro de Control en la barra de herramientas
de cualquier otra herramienta gráfica de DB2.
Desde el icono DB2 en Windows como se muestra en la figura 5.9 de
la página 106 (Da clic sobre el icono verde DB2 y seleccionar la opción
Central de Control de DB2 ).
El Editor de Comandos DB2
Usando el Editor de Comandos DB2 (editor de comandos), se pueden ejecutar comandos DB2, sentencias SQL y XQuery, analizar el plan de ejecución
de una sentencia, y ver o actualizar resultados de consultas.
La figura 5.10 de la página 106 muestra el Editor de Comandos.
CAPÍTULO 5. INTRODUCCIÓN AL DB2 EXPRESS-C 9
Figura 5.9: Icono DB2 en Windows.
Figura 5.10: Editor de Comandos.
106
Figura 5.11: Botón Show SQL.
En el área de entrada, se pueden ingresar varias sentencias, tan largas hasta
que se presente el caracter de finalización. Si se presiona el botón ejecutar, las
sentencias serán ejecutadas una después de otra. Si se selecciona explícitamente
una sentencia, sólo esa sentencia será ejecutada. Debe existir una conexión
a la base de datos para devolver sentencias SQL, sin embargo, una de esas
sentencias puede ser una sentencia de conexión.
SQL Assist Wizard
Si no se está familiarizado con el lenguaje SQL se podría usar un asistente
para generar código SQL, el SQL Assist Wizard está disponible en el Editor de
Comandos para ayudarte. Como se muestra en la figura 5.11, invócalo desde
el Editor de Comandos dando clic sobre le último icono con el símbolo SQL.
Su uso es bastante claro. Primero indica el tipo de sentencia SQL para la
cual se necesita asistencia (SELECT, INSERT, UPDATE, DELETE). Dependiendo de que sentencia se haya elegido, diferentes opciones aparecerán. En
la parte baja de la ventana mostrará cómo la sentencia SQL es construida a
partir de diferentes elecciones en el asistente [4].
El Botón Show SQL
La mayoría de las herramientas gráficas y los asistentes en DB2 permiten
revisar el comando actual o la sentencia SQL que es creada como resultado de
usar la herramienta para realizar tal acción. Para ver esto, da clic en el botón
Show SQL en la herramienta en la que se está trabajando, como lo muestra la
figura 5.11 y figura 5.12 en las páginas 107 y 108 respectivamente.
La posibilidad de revisar las sentencias SQL y comandos es muy útil para
aprender sintaxis SQL, y para guardar comandos o sentencias para su posterior
uso. También se puede construir scripts re usando esos comandos y sentencias
generados [7].
CAPÍTULO 5. INTRODUCCIÓN AL DB2 EXPRESS-C 9
Figura 5.12: Salida de un Botón Show SQL.
108
Capítulo 6
Eclipse
6.1.
¿Que es Eclipse?
Eclipse es principalmente una plataforma de programación, usada para
crear entornos integrados de desarrollo (del Inglés IDE).
Eclipse fue desarrollado originalmente por IBM Canadá, desarrollado por
OTI (Object Technology International) como reemplazo ó el sucesor de su
109
CAPÍTULO 6. ECLIPSE
110
familia de herramientas para VisualAge. Eclipse es ahora desarrollado por la
Fundación Eclipse, una organización independiente sin ánimo de lucro que
fomenta una comunidad de código abierto y un conjunto de productos complementarios, capacidades y servicios.
Eclipse es también una comunidad de usuarios, extendiendo constantemente las áreas de aplicación cubiertas. Un ejemplo es el recientemente creado
Eclipse Modeling Project, cubriendo casi todas las áreas de Model Driven
Engineering.
La licencia de Eclipse fue liberada originalmente bajo la Common Public
License, pero después fue re-licenciada bajo la Eclipse Public License. La Free
Software Foundation ha dicho que ambas licencias son licencias de software
libre, pero son incompatibles con Licencia Pública General de GNU (GNU
GPL) [2].
6.2.
¿Como Utilizar Eclipse?
Eclipse es un entorno de desarrollo integrado de código abierto multiplataforma para desarrollar lo que el proyecto llama “Aplicaciones de Cliente
Enriquecido”, opuesto a las aplicaciones “Cliente-liviano” basadas en navegadores. Esta plataforma, típicamente ha sido usada para desarrollar entornos
de desarrollo integrados (del inglés IDE), como el IDE de Java llamado Java
Development Toolkit (JDT) y el compilador (ECJ) que se entrega como parte
de Eclipse y que son usados también para desarrollar el mismo Eclipse. Sin
embargo, también se puede usar para otros tipos de aplicaciones cliente, como
BitTorrent Azureus [8].
CAPÍTULO 6. ECLIPSE
111
Frame principal de desarrollo de Eclipse.
El entorno de desarrollo integrado (IDE) de Eclipse emplea módulos (en inglés plug-in) para proporcionar toda su funcionalidad al frente de la plataforma
de cliente rico, a diferencia de otros entornos monolíticos donde las funcionalidades están todas incluidas, las necesite el usuario o no. Este mecanismo de
módulos es una plataforma ligera para componentes de software. Adicionalmente a permitirle a Eclipse extenderse usando otros lenguajes de programación como son C/C++ y Python, permite a Eclipse trabajar con lenguajes
para procesado de texto como LaTeX, aplicaciones en red como Telnet y Sistema de gestión de base de datos. La arquitectura plugin permite escribir
cualquier extensión deseada en el ambiente, como sería Gestión de la configuración. Se provee soporte para Java y CVS en el SDK de Eclipse. Y no tiene
por qué ser usado únicamente para soportar otros lenguajes de programación.
La definición que da el proyecto Eclipse acerca de su software es una especie
de “herramienta universal” - un IDE abierto y extensible para todo y nada en
particular.
CAPÍTULO 6. ECLIPSE
112
En cuanto a las aplicaciones clientes, eclipse provee al programador con
frameworks muy ricos para el desarrollo de aplicaciones gráficas, definición y
manipulación de modelos de software, aplicaciones web, etc. Por ejemplo, GEF
(Graphic Editing Framework - Framework para la edición gráfica) es un plugin
de Eclipse para el desarrollo de editores visuales que pueden ir desde procesadores de texto hasta editores de diagramas UML, interfaces gráficas para el
usuario (GUI), etc. Dado que los editores realizados con GEF viven dentro de
Eclipse, además de poder ser usados conjuntamente con otros plugins, hacen
uso de su interfaz gráfica personalizable y profesional.
El SDK de Eclipse incluye las herramientas de desarrollo de Java, ofreciendo un IDE con un compilador de Java interno y un modelo completo de los
archivos fuente de Java. Esto permite técnicas avanzadas de refactorización
y análisis de código. El IDE también hace uso de un espacio de trabajo, en
este caso un grupo de metadata en un espacio para archivos plano, permitiendo modificaciones externas a los archivos en tanto se refresque el espacio de
trabajo correspondiente.
La instalación del Eclipse es muy sencilla, se puede descargar gratuitamente de www.eclipse.org en forma de archivo ZIP y se descomprime en la
carpeta donde se quiere instalar. Para ejecutar solo hay que arrancar el fichero
Eclipse.exe . Una vez arrancado lo único que se pide es que se le dé la ruta
por defecto donde se quiere que Eclipse vaya guardando los proyectos que se
vayan creando.
Eclipse puede utilizar varias perspectivas en su ventana principal dependiendo del tipo de desarrollo que se vaya a realizar. En el presente trabajo se
utilizó la perspectiva “Java”. Una vez que se termina el proyecto, el mismo se
puede probar mediante la ejecución del programa para ver si funciona, ya que
el mismo posee un área donde se puede hacer correr el servidor de prueba y
probar la aplicación realizada, de esta forma es un entorno versatil y sencillo
para poder realizar los programas en java [2].
Capítulo 7
Introducción al Servidor
Tomcat 5.0
7.1.
Descripción
Tomcat (también llamado Jakarta Tomcat o Apache Tomcat) funciona
como un contenedor de servlets desarrollado bajo el proyecto Jakarta en la
Apache Software Foundation. Tomcat implementa las especificaciones de los
servlets y de JavaServer Pages (JSP) de Sun Microsystems.
7.2.
Entorno
Tomcat es un servidor web con soporte de servlets y JSPs. Tomcat no
es un servidor de aplicaciones, como JBoss o JOnAS. Incluye el compilador
Jasper, que compila JSPs convirtiéndolas en servlets. El motor de servlets de
Tomcat a menudo se presenta en combinación con el servidor Web Apache [9].
Tomcat puede funcionar como servidor web por sí mismo. En sus inicios
existió la percepción de que el uso de Tomcat de forma autónoma era sólo
recomendable para entornos de desarrollo y entornos con requisitos mínimos
de velocidad y gestión de transacciones. Hoy en día ya no existe esa percepción
y Tomcat es usado como servidor Web autónomo en entornos con alto nivel
de tráfico y alta disponibilidad.
114
CAPÍTULO 7. TOMCAT
115
Dado que Tomcat fue escrito en Java, funciona en cualquier sistema operativo que disponga de la máquina virtual Java [2].
7.3.
Estado de su Desarrollo
Tomcat es mantenido y desarrollado por miembros de la Apache Software
Foundation y voluntarios independientes. Los usuarios disponen de libre acceso
a su código fuente y a su forma binaria en los términos establecidos en la
Apache Software Licence. Las primeras distribuciones de Tomcat fueron las
versiones 3.0.x. Las versiones más recientes son las 6.x, que implementan las
especificaciones de Servlet 2.5 y de JSP 2.1. A partir de la versión 4.0, Jakarta
Tomcat utiliza el contenedor de servlets Catalina [10].
7.4.
Estructura de Directorios
La jerarquía de directorios de instalación de Tomcat incluye:
bin - arranque, cierre, y otros scripts y ejecutables.
common - clases comunes que pueden utilizar Catalina y las aplicaciones
web.
conf - ficheros XML y los correspondientes DTD para la configuración
de Tomcat.
logs - logs de Catalina y de las aplicaciones.
server - clases utilizadas solamente por Catalina.
shared - clases compartidas por todas las aplicaciones web.
webapps - directorio que contiene las aplicaciones web.
work - almacenamiento temporal de ficheros y directorios.
7.5.
Características del Producto
Tomcat 3.x (distribución inicial):
• Implementado a partir de las especificaciones Servlet 2.2 y JSP 1.1.
• Recarga de servlets.
• Funciones básicas HTTP.
Tomcat 4.x:
• Implementado a partir de las especificaciones Servlet 2.3 y JSP 1.2.
• Contenedor de servlets rediseñado como Catalina.
• Motor JSP rediseñado con Jasper.
• Conector Coyote.
• Java Management Extensions (JMX), JSP Y administración basada
en Struts.
Tomcat 5.x:
• Implementado a partir de las especificaciones Servlet 2.4 y JSP 2.0.
• Recolección de basura reducida.
• Capa envolvente nativa para Windows y Unix para la integración
de las plataformas.
• Análisis rápido JSP.
Tomcat 6.x:
• Implementado de Servlet 2.5 y JSP 2.1.
• Soporte para Unified Expression Language 2.1.
• Diseñado para funcionar en Java SE 5.0 y posteriores.
• Soporte para Comet a través de la interfaz CometProcessor.
7.6.
Historia
Tomcat empezó siendo una implementación de la especificación de los
servlets comenzada por James Duncan Davidson, que trabajaba como arquitecto de software en Sun Microsystems y que posteriormente ayudó a hacer al
proyecto de código abierto y en su donación a la Apache Software Foundation.
Duncan Davidson inicialmente esperaba que el proyecto se convirtiese en
software de código abierto y dado que la mayoría de los proyectos de este tipo
CAPÍTULO 7. TOMCAT
117
tienen libros de O’Reilly asociados con un animal en la portada, quiso ponerle
al proyecto nombre de animal. Eligió Tomcat (gato), pretendiendo representar
la capacidad de cuidarse por sí mismo, de ser independiente [11].
Capítulo 8
Descripción de la Aplicación
8.1.
Descripción General
El presente trabajo se basa en el desarrollo de un software que permite la
gestión de una típica empresa agro-ganadera de una manera muy amigable al
usuario final mediante una aplicación Web multiplataforma con acceso a base
de datos.
El Objetivo fue realizar una aplicación Web multiplataforma desarrollada
en Java, en la cual el usuario final pueda contar con un medio para gestionar
el establecimiento e interaccionar con otras disciplinas, a través de la red,
brindando de esta manera mayor rapidez y eficiencia en la administración del
mismo.
La presente implementación de la aplicación llamada SAG (Sistema AgroGanadero) correrá en la plataforma Windows mediante el uso de software
multiplataforma.
8.2.
Análisis
Como primera etapa en el desarrollo de la aplicación se realizó un análisis
exhaustivo de la principal problemática de gestión que posee una empresa
agro-ganadera. En las cuales se utilizaron distintas metodologías de análisis
como Diagramas de contexto que se muestran en la figura 8.1 de la página 119
118
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
119
y casos de uso que son ejemplificados en la figura8.2 de la página119.
Figura 8.1: Diagrama de Contexto .
Figura 8.2: Caso de Uso.
8.3.
Desarrollo
De ésta forma el desarrollo de la aplicación se ajusta a las necesidades
propias del establecimiento, ya que permite registrar y organizar la información obtenida para cualquiera de las actividades del mismo, ya sean agrícolas o
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
120
ganaderas, transformándose en una base de operaciones para el usuario final,
ayudandolo a tomar las decisiones correctas en lo que se refiere a la administración del establecimiento, ya que podrán ver reflejados todos los movimientos, y así reducir los tiempos de respuesta para la toma de decisiones.
En la figura 8.3 de la página 120 se puede observar la página principal de
la Aplicación.
Figura 8.3: Página Principal de la Aplicación.
8.3.1.
Módulos
El sistema consiste básicamente en ocho módulos bien definidos:
1. Agricultura.
2. Ganadería.
3. Empleados.
4. Bancos.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
121
5. Clientes.
6. Proveedores.
7. Consultas.
8. Planillas.
Agricultura
Este módulo permite administrar los recursos productivos y las distintas
actividades realizadas como:
Cosechas.
Siembras.
Pulverizaciones.
Rollos.
Máquinas.
Campos.
Insumos .
Ventas.
Además permite gestionar las compras, ventas, rinde estimado y total. La
figura 8.4 de la página 122 visualiza la página principal de Agricultura con sus
diferentes secciones.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
122
Figura 8.4: Formulario de Agricultura.
Cosecha
Éste módulo permite manejar todas las operaciones de cosechas propias
y a terceros, como también los traslados de las mismas. La figura 8.5 de la
página 123 ilustra la pantalla con el formulario de carga de cosechas a terceros.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
123
Figura 8.5: Formulario de Carga Cosecha a Terceros.
Siembra
Éste módulo permite manejar todas las operaciones de siembra propia y a
terceros. La figura 8.6 de la página 124 ilustra la pantalla con el formulario de
carga de siembra propia.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
124
Figura 8.6: Formulario de Carga Siembra Propia.
Rollos
La sección de Rollos permite acentar los datos de las producciones de rollos
propios y realizados a terceros. Dicha sección se visualiza en la figura 8.7 de
la página 125.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
125
Figura 8.7: Formulario de Carga Rollos Propios.
Máquinas
Aquí es posible registrar el inventario de máquinas propias que posee la
empresa. La página principal de este módulo se puede observar mediante la
figura 8.8 de la página 126.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
126
Figura 8.8: Formulario de Modificar Máquinas.
Pulverización
En este apartado es posible registrar los trabajos de pulverizaciones realizadas por la empresa y, se puede visualizar su pantalla principal en la figura
8.9 de la página 127.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
127
Figura 8.9: Formulario de Carga Pulverizaciones a Terceros.
Campos
Aquí se registran los campos propios y alquilados que posee la empresa.
Su pantalla principal se muestra en la figura 8.10 de la página 128.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
128
Figura 8.10: Formulario de Carga Campos Propios.
Insumos
Los insumos son registrados en esta sección y su pantalla principal es la
que se muestra en la figura 8.11 de la página 129.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
129
Figura 8.11: Principal de Insumos.
Ventas
Este módulo permite registrar las ventas realizadas por la empresa. Se
visualiza mediante la figura 8.12 de la página 130.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
130
Figura 8.12: Principal de Ventas.
8.3.2.
Ganadería
Este módulo permite llevar el control y la planificación de todos los lotes
destinados a ganadería, observando su producción y su evolución a través del
tiempo, además de manejar todos los movimientos de animales que se registren
en el establecimiento, icluyendo:
Ganado.
Sanidad.
Inseminación.
Reproducción.
Balanza.
Campos.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
131
Isumos.
Además permite analizar detalladamente todos lon ingresos y egresos de
la actividad financiera de este sector. La figura 8.13 de la página 131
muestra la pantalla principal del módulo Ganadería, desde la cual se
puede acceder a sus diferentes secciones.
Figura 8.13: Pantalla Principal de Ganadería.
Ganado
Esta sección permite manejar las operaciones relacionadas con el ganado,
como ser, ingreso, egreso, muerte, parición, compra y venta. La figura 8.14 de
la página 132 muestra la pantalla de inicio correspondiente.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
132
Figura 8.14: Pantalla Principal de la Sección Ganado.
Sanidad
Este apartado se encarga del registro de vacunación y baño del ganado. La
figura 8.15 de la página 133 muestra los formularios de carga correspondientes.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
133
Figura 8.15: Formularios de Vacunación y Baño de Ganado.
Inseminación
Esta sección permite registrar todos los datos relacionados con las inseminaciones realizadas al ganado. La figura 8.16 de la página 134 visualiza el
formulario.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
134
Figura 8.16: Formulario de Carga de Inseminaciones de Ganado.
Reproducción y Balanza
Estos módulos manejan el registro de los datos relacionados con la preñéz,
tacto y peso del ganado. La figura 8.17 de la página 135 vizualiza los formularios correspondientes.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
135
Figura 8.17: Formularios de Reproducción y Balanza.
8.3.3.
Empleados
Este módulo maneja todas las operaciones de alta, baja y modificaciones
de la relación laboral existente entre los empleados y la empresa. La figura
8.18 de la página 136 visualiza la pantalla principal de éste módulo.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
136
Figura 8.18: Página Principal de Empleados.
8.3.4.
Bancos
El módulo de Bancos permite registrar los movimientos financieros de la
empresa, como ser, créditos bancarios, tarjetas de crédito, etc. En la figura
8.19 de la página 137 se puede observar la página inicial de éste módulo y la
figura 8.20 de la página 138 visualiza los diferentes formularios que componen
las seecciones disponibles.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
Figura 8.19: Página Principal del Módulo Bancos.
137
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
138
Figura 8.20: Operaciones Financieras.
8.3.5.
Clientes
Este módulo permite realizar las operaciones de altas, bajas y modificaciones de la cartera de clientes de la empresa. El formulario de carga con los
datos relacionados se puede visualizar en la figura 8.21 de la página 139.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
139
Figura 8.21: Principal de Clientes.
8.3.6.
Proveedores
Este módulo permite registrar todos los datos relacionados con los proveedores de la empresa, como se puede observar en la figura 8.22 de la página
140.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
140
Figura 8.22: Principal de Proveedores.
8.3.7.
Consultas
Este módulo ofrece al sistema la posibilidad de realizar consulta de toda
la información disponible en la base de datos, mediante el armado de informes
y una gran variedad de listados. En la fgura 8.23 de la página 141 se pueden
apreciar algunos de los listados disponibles en el sistema.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
141
Figura 8.23: Ejemplos de Listados Arrojados por el Sistema.
8.3.8.
Planillas
Este módulo le ofrece al usuario la posibilidad de imprimir planillas vacías
con los datos existentes en el sistema para su utilización en el campo. La figura
de la página muestra algunas de las planillas disponibles para impresión.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
142
Figura 8.24: Ejemplo de Planillas Disponibles en el Sistema.
8.4.
Estructura de Datos
A continuación se mostrará todo lo relacionado con la estructura de la base
de datos utilizada por la aplicación, la base de datos corre sobre el motor de
base de datos multiplataforma DB2 Express-C.
En el siguiente gráfico, se puede observar la base de datos utilizada por la
aplicación.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
143
Figura 8.25: Estructura de la Base de Datos.
La base de datos está compuesta por 28 tablas que se detallan a continuación:
AREA:
• NRO_AREA: INTEGER NOT NULL.
• DES_AREA: VARCHAR(50) NOT NULL.
BANCO:
• COD_BANCO: INTEGER NOT NULL.
• NOMBRE_BANCO: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• DIRECCION_BANCO: VARCHAR(100) NOT NULL WITH DEFAULT ‘No
tiene’.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
144
• TELEFONO_BANCO: VARCHAR(50) NOT NULL WITH DEFAULT ‘No
tiene’.
• TIPO_BANCO: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• OBSERVACIONES_BANCO: VARCHAR(500) NOT NULL WITH DEFAULT
‘No tiene’.
• LOCALIDAD_BANCO: VARCHAR(50) NOT NULL WITH DEFAULT ‘No
tiene’.
• PROVINCIA_BANCO: VARCHAR(50).
BANIO:
• COD_BANIO: INTEGER NOT NULL.
• FECHA_BANIO: DATE NOT NULL.
• EMPRESA: VARCHAR(30).
• PRODUCTO: VARCHAR(30).
• ENFERMEDAD: VARCHAR(30).
• CANT_CABEZAS: BIGINT.
• COSTO_CABEZA: BIGINT.
• OTRO: BIGINT.
• COSTO_TOTAL: BIGINT.
CAMPO:
• COD_CAMP: INTEGER NOT NULL.
• NOMBRE_CAMP: VARCHAR(100) NOT NULL WITH DEFAULT ‘No tiene’.
• UBICACION_CAMP: VARCHAR(100) NOT NULL WITH DEFAULT ‘No
tiene’.
• SUPERFICIE_CAMP: VARCHAR(100) NOT NULL WITH DEFAULT ‘No
tiene’.
• FUNCION_CAMP: VARCHAR(100) NOT NULL WITH DEFAULT ‘No tiene’.
• PORCENTAJE_KG_CAMP: VARCHAR(100) NOT NULL WITH DEFAULT
‘No tiene’.
• PRECIO_HA_CAMP: DOUBLE NOT NULL.
• TIPO_CAMP: VARCHAR(50) NOT NULL WITH DEFAULT ‘Propio’.
• EMPRESA_CAMP: VARCHAR(50).
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
145
• CANT_LOTES_CAMP: INTEGER.
• KG_FIJADO_CAMP: DOUBLE.
CLIENTE:
• COD_CLIENT: INTEGER NOT NULL.
• NOMBRE: VARCHAR(50) NOT NULL WITH DEFAULT ‘Sin Nombre’.
• CUIT: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• TELEFONO: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• EMAIL: VARCHAR(50) NOT NULL WITH DEFAULT ’No tiene’.
• DOMICILIO: VARCHAR(100) NOT NULL WITH DEFAULT ‘No tiene’.
• LOCALIDAD: VARCHAR(100) NOT NULL WITH DEFAULT ‘No tiene’.
• NOMBREC: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• APELLIDOC: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• TELEFONOC: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• EMAILC: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• PROVINCIA: VARCHAR(30).
COSECHA:
• COD_COSECHA: INTEGER NOT NULL.
• FECHA_COSECHA: DATE.
• EMPRESA_COSECHA: VARCHAR(50) WITH DEFAULT ‘No tiene’.
• MAQUINA_COSECHA: INTEGER.
• OPERADOR_MAQ_COSECHA: INTEGER.
• CAMPO_COSECHA: INTEGER.
• LOTE_CAMPO_COSECHA: VARCHAR(50) WITH DEFAULT ‘No tiene’.
• SUPERFICIE_COSECHA: VARCHAR(50) WITH DEFAULT ‘0’.
• KG_HA_COSECHA: DOUBLE WITH DEFAULT 0.
• KG_EQUIPO_COSECHA: DOUBLE WITH DEFAULT 0.
• PROPIETARIO_EQUIPO_COSECHA: VARCHAR(100) WITH DEFAULT
‘No tiene’.
• PATENTE_EQUIPO_COSECHA: VARCHAR(50) WITH DEFAULT ‘No tiene’.
• CANT_HA_COSECHA: DOUBLE WITH DEFAULT 0.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
146
• IMPORTE_HA_COSECHA: DOUBLE WITH DEFAULT 0.
• IMPORTE_TOTAL_COSECHA: DOUBLE WITH DEFAULT 0.
• CULTIVO_COSECHA: VARCHAR(50) WITH DEFAULT ‘No tiene’.
• TIPO_COSECHA: VARCHAR(50) WITH DEFAULT ‘Propia’.
• PORCENTAJE_PACTADO_COSECHA: DOUBLE WITH DEFAULT 0.
• TN_COSECHA: DOUBLE WITH DEFAULT 0.0.
• CLIENTE_COSECHA: INTEGER.
• FORMA_PAGO_COSECHA: VARCHAR(20).
• DESTINO_COSECHA: VARCHAR(50).
• OPERADOR2_MAQ_COSECHA: INTEGER NOT NULL WITH DEFAULT
0.
• CARTA_APORTE_COSECHA: BIGINT WITH DEFAULT 0.
• LOTE_NOM_COSECHA: VARCHAR(50) NOT NULL WITH DEFAULT ‘’.
CREDITO:
• COD_CRED: INTEGER NOT NULL.
• FECHAE_CRED: DATE.
• NRO_CRED: VARCHAR(20).
• DESTINO_CRED: VARCHAR(30).
• DURACION_CRED: INTEGER.
• EMPRESA_CRED: VARCHAR(30).
• BANCO_CRED: INTEGER.
• TASA_INTERES_CRED: INTEGER.
• TIPO_INTERES: VARCHAR(20).
• TIPO_INTERES1: VARCHAR(20).
• MONEDA_CRED: VARCHAR(30).
• TIPO_PAGO_CRED: VARCHAR(30).
• FECHAV_CRED: DATE.
• OBSERVACIONES_CRED: VARCHAR(50).
• TOTAL_CUOTAS_CRED: INTEGER.
• IMPORTE_CRED: DOUBLE.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
FUMIGACION:
• COD_FUM: INTEGER NOT NULL.
• FECHA_FUM: DATE.
• EMPRESA_FUM: VARCHAR(50).
• CAMPO_FUM: INTEGER.
• LOTE_FUM: VARCHAR(50) WITH DEFAULT ‘’.
• LOTE_NOM_FUM: VARCHAR(50) WITH DEFAULT ‘’.
• MAQUINA_FUM: INTEGER.
• OPERADOR_FUM: INTEGER WITH DEFAULT 0.
• OPERADOR2_FUM: INTEGER WITH DEFAULT 0.
• CULTIVO_FUM: VARCHAR(40).
• CLIENTE_FUM: INTEGER.
• PRODUCTO1_FUM: VARCHAR(50) WITH DEFAULT ‘’.
• PRODUCTO2_FUM: VARCHAR(50) WITH DEFAULT ‘’.
• PRODUCTO3_FUM: VARCHAR(50) WITH DEFAULT ‘’.
• PRODUCTO4_FUM: VARCHAR(50) WITH DEFAULT ‘’.
• DOSIS1_FUM: DOUBLE WITH DEFAULT 0.0.
• DOSIS2_FUM: DOUBLE WITH DEFAULT 0.0.
• DOSIS3_FUM: DOUBLE WITH DEFAULT 0.0.
• DOSIS4_FUM: DOUBLE WITH DEFAULT 0.0.
• MEDIDA1_FUM: VARCHAR(20) WITH DEFAULT ‘’.
• MEDIDA2_FUM: VARCHAR(20) WITH DEFAULT ‘’.
• MEDIDA3_FUM: VARCHAR(20) WITH DEFAULT ‘’.
• MEDIDA4_FUM: VARCHAR(50) WITH DEFAULT ‘’.
• CANTIDAD1_FUM: DOUBLE WITH DEFAULT 0.0.
• CANTIDAD2_FUM: DOUBLE WITH DEFAULT 0.0.
• CANTIDAD3_FUM: DOUBLE WITH DEFAULT 0.0.
• CANTIDAD4_FUM: DOUBLE WITH DEFAULT 0.0.
• HA_FUM: INTEGER.
• COSTO_HA_FUM: DOUBLE WITH DEFAULT 0.0.
• COSTO_TOTAL_FUM: DOUBLE WITH DEFAULT 0.0.
147
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
• TIPO_FUM: VARCHAR(50).
GANADO:
• COD_GANADO: INTEGER NOT NULL.
• EMPRESA_GANADO: VARCHAR(50).
• NRO_DTA_GANADO: INTEGER.
• NRO_RENSPA_GANADO: INTEGER.
• CANT_CON_CVNA_GANADO: INTEGER.
• CAN_SIN_CVNA_GANADO: INTEGER.
• CANT_TOTAL_GANADO: INTEGER.
• NRO_CVNA_DESDE_GANADO: INTEGER.
• NRO_CVNA_HASTA_GANADO: INTEGER.
• OBSERVACIONES_GANADO: VARCHAR(200).
• NRO_CVNA_GANADO: INTEGER.
• FECHA_GANADO: DATE.
• CATEGORIA_GANADO: VARCHAR(50).
• RAZA_GANADO: VARCHAR(50).
• NRO_COMPROBANTE_GANADO: VARCHAR(50).
• PESO_TOTAL_GANADO: DOUBLE.
• PESO_PROMEDIO_GANADO: DOUBLE.
• PRECIO_KG_GANADO: DOUBLE.
• IMPORTE_CABEZA_GANADO: DOUBLE.
• IMPORTE_TOTAL_GANADO: DOUBLE.
• TIPO_MOVIMIENTO_GANADO: VARCHAR(50).
INSEMINA:
• COD_INSEMINA: INTEGER NOT NULL.
• FECHA: DATE NOT NULL.
• EMPRESA: VARCHAR(30).
• RAZA: VARCHAR(20).
• RODEO: VARCHAR(20).
148
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
149
• CATEGORIA: VARCHAR(20).
• NRO_CARAVANA: BIGINT.
• PRODUCTO: VARCHAR(30).
• TORO: VARCHAR(20).
• OBSERVACIONES: VARCHAR(200) NOT NULL WITH DEFAULT ‘’.
INSUMOS:
• COD_INS: INTEGER NOT NULL.
• NOMBRE_INS: VARCHAR(100) NOT NULL WITH DEFAULT ‘No tiene’.
• MEDIDA_INS: VARCHAR(100) NOT NULL WITH DEFAULT ‘No tiene’.
• CANTIDAD_INS: INTEGER NOT NULL WITH DEFAULT 0.
• TIPO_INS: VARCHAR(100) NOT NULL WITH DEFAULT ‘No tiene’.
• PRECIO_INS: DOUBLE NOT NULL WITH DEFAULT 0.
• OBSERVACIONES_INS: VARCHAR(200) NOT NULL WITH DEFAULT ‘No
tiene’.
• FACT_INS: INTEGER NOT NULL WITH DEFAULT 0.
• NRO_FACT_INS: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• TIPO_ALIMENTO_INS: VARCHAR(100) NOT NULL WITH DEFAULT ‘No
tiene’.
• TIPO_VETERINARIO_INS: VARCHAR(100) NOT NULL WITH DEFAULT
‘No tiene’.
• TIPO_COMBUSTIBLE_INS: VARCHAR(100) NOT NULL WITH DEFAULT
‘No tiene’.
• TIPO_AGROQUIMICO_INS: VARCHAR(100) NOT NULL WITH DEFAULT
‘No tiene’.
• TIPO_SEMILLA_INS: VARCHAR(100) NOT NULL WITH DEFAULT ‘No
tiene’.
• TIPO_FERTILIZANTE_INS: VARCHAR(100) NOT NULL WITH DEFAULT
‘No tiene’ .
• MARCA_INS: VARCHAR(100) NOT NULL WITH DEFAULT ‘No tiene’.
• MAQUINA_INS: INTEGER NOT NULL WITH DEFAULT 0.
• PROVEEDOR_INS: INTEGER NOT NULL WITH DEFAULT 0.
• FECHA_INS: DATE.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
150
• LUGAR_COMPRA_INS: VARCHAR(50) WITH DEFAULT ‘No tiene’.
• TIPO_PAGO_INS: VARCHAR(20) NOT NULL WITH DEFAULT ”.
• GASTO_TOTAL_INSUMO: DOUBLE NOT NULL WITH DEFAULT 0.
LOTES:
• COD_LOTE: INTEGER NOT NULL.
• CAMPO_LOTE: INTEGER NOT NULL.
• NOMBRE_LOTE: VARCHAR(20) NOT NULL.
MAQUINA:
• COD_MAQ: INTEGER NOT NULL.
• MARCA_MAQ: VARCHAR(100) NOT NULL WITH DEFAULT ‘No tiene’.
• MODELO_MAQ: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• PATENTE_MAQ: VARCHAR(50) NOT NULL.
• ANIO_MAQ: VARCHAR(10) NOT NULL WITH DEFAULT ‘No tiene’.
• PROPIETARIO_MAQ: VARCHAR(50) NOT NULL WITH DEFAULT ‘No
tiene’.
• DESC_MAQ: VARCHAR(500) NOT NULL WITH DEFAULT ‘No tiene’.
PAGO:
• COD_PAGO: INTEGER NOT NULL.
• NRO_CREDITO_PAGO: VARCHAR(50).
• TASA_INTERES_PAGO: INTEGER WITH DEFAULT 0.
• NRO_CUOTA_PAGO: INTEGER WITH DEFAULT 1.
• MONTO_IVA_PAGO: DOUBLE WITH DEFAULT 0.
• INTERES_PAGO: DOUBLE WITH DEFAULT 0.
• CAPITAL_PAGO: DOUBLE WITH DEFAULT 0.
• OBSERVACIONES_PAGO: VARCHAR(500) WITH DEFAULT ‘No tiene’.
• FECHA_PAGO: DATE.
• CONCEPTO_PAGO: VARCHAR(10) WITH DEFAULT ‘Credito’.
• NRO_TARJETA_PAGO: VARCHAR(50) WITH DEFAULT ‘No tiene’.
• MONEDA_PAGO: VARCHAR(50) WITH DEFAULT ‘Pesos’.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
151
• FECHA_VENC_TARJETA_PAGO: DATE.
• IMPORTE_TOTAL_PAGO: DOUBLE WITH DEFAULT 0.
• IMPORTE_TARJETA_PAGADO: DOUBLE WITH DEFAULT 0.
• SALDO_PAGO: DOUBLE WITH DEFAULT 0.
• RESUMEN_TARJETA_PAGO: VARCHAR(50).
• TIPO_PAGO: VARCHAR(25).
PERSONAL:
• COD_EMP: INTEGER NOT NULL.
• NOMBRE_EMP: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• APELLIDO_EMP: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• DOMICILIO_EMP: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• TELEFONO_EMP: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• FECHA_NAC_EMP: DATE NOT NULL.
• ESTADO_CIVIL_EMP: VARCHAR(50) NOT NULL WITH DEFAULT ‘No
tiene’.
• FECHA_INGRESO_EMP: DATE NOT NULL.
• CATEGORIA_EMP: VARCHAR(50) NOT NULL WITH DEFAULT ‘Varios’.
• NRO_LEGAJO_EMP: VARCHAR(50) NOT NULL WITH DEFAULT ‘No
tiene’.
• CUIL_EMP: VARCHAR(15) NOT NULL WITH DEFAULT ‘No tiene’.
• BASICO_EMP: DOUBLE NOT NULL.
• NETO_EMP: DOUBLE NOT NULL.
• EMAIL_EMP: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• LOCALIDAD_EMP: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• DNI: INTEGER NOT NULL WITH DEFAULT 0 .
• ANTIGUEDAD_EMP: INTEGER NOT NULL WITH DEFAULT 0.
• EMPRESA_EMP: VARCHAR(50).
• EDAD_EMP: INTEGER.
• CELULAR_EMP: VARCHAR(30).
• PROVINCIA_EMP: VARCHAR(40).
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
152
PESAJE:
• COD_PESAJE: INTEGER NOT NULL.
• FECHA_PESAJE: DATE.
• RAZA_PESAJE: VARCHAR(50) WITH DEFAULT ‘No tiene’.
• RODEO_PESAJE: VARCHAR(50).
• EMPRESA_PESAJE: VARCHAR(50).
• CANT_HEMBRAS_PESAJE: INTEGER WITH DEFAULT 0.
• CANT_MACHOS_PESAJE: INTEGER WITH DEFAULT 0.
• CANT_TOTAL_PESAJE: INTEGER WITH DEFAULT 0.
• PESO_TOTAL_PESAJE: DOUBLE WITH DEFAULT 0.
• PESO_PROMEDIO_PESAJE: DOUBLE WITH DEFAULT 0.
• OBSERVACION: VARCHAR(30).
PRENIEZ:
• COD_PRENIEZ: INTEGER NOT NULL.
• FECHA_PRENIEZ: DATE.
• CATEGORIA_PRENIEZ: VARCHAR(20).
• EMPRESA_PRENIEZ: VARCHAR(20).
• OBSERVACION_PRENIEZ: VARCHAR(50).
• NRO_CARAVANA_PRENIEZ: BIGINT.
• EDAD_PRENIEZ: INTEGER.
• MES_PRENIEZ: INTEGER.
PROVEEDOR:
• COD_PROV: INTEGER NOT NULL.
• NOMBRE_PROV: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• CUIT_PROV: VARCHAR(20) NOT NULL WITH DEFAULT ‘No tiene’.
• TELEFONO_PROV: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• EMAIL_PROV: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• DOMICILIO_PROV: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• LOCALIDAD_PROV: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
153
• NOMBRE_RESP_PROV: VARCHAR(50) NOT NULL WITH DEFAULT ‘No
tiene’.
• APELLIDO_RESP_PROV: VARCHAR(50) NOT NULL WITH DEFAULT
‘No tiene’.
• TELEFONO_RESP_PROV: VARCHAR(50) NOT NULL WITH DEFAULT
‘No tiene’.
• EMAIL_RESP_PROV: VARCHAR(50) NOT NULL WITH DEFAULT ‘No
tiene’.
• RUBRO_PROV: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• DESC_PROV: VARCHAR(500) NOT NULL WITH DEFAULT ‘No tiene’.
• PROVINCIA_PROV: VARCHAR(30).
ROLLO:
• COD_ROLLO: INTEGER NOT NULL.
• FECHA_ROLLO: DATE.
• CAMPO_ROLLO: INTEGER.
• HA_ROLLO: VARCHAR(20) WITH DEFAULT ‘No tiene’.
• CANT_ROLLO: INTEGER WITH DEFAULT 0.
• OPERADOR_MAQ_ROLLO: INTEGER.
• MAQ_ROLLO: VARCHAR(50) WITH DEFAULT ‘No tiene’.
• ESPECIE_ROLLO: VARCHAR(50) WITH DEFAULT ‘No tiene’.
• TIPO_ROLLO: VARCHAR(50) WITH DEFAULT ‘No tiene’.
• CLIENTE_ROLLO: INTEGER WITH DEFAULT 0.
• PRECIO_ROLLO: DOUBLE WITH DEFAULT 0.
• PORCENTAJE_ROLLO: DOUBLE WITH DEFAULT 0.
• EMPRESA_ROLLO: VARCHAR(100) WITH DEFAULT ‘No tiene’.
• LOTE_ROLLO: VARCHAR(50) WITH DEFAULT ‘No tiene’.
• COSTO_HA_ROLLO: DOUBLE WITH DEFAULT 0.0.
• COSTO_OTRO_ROLLO: DOUBLE WITH DEFAULT 0.0.
• COSTO_TOTAL_ROLLO: DOUBLE WITH DEFAULT 0.0.
• IMPORTE_TOTAL: DOUBLE.
• OPERADOR2_MAQ_ROLLO: INTEGER WITH DEFAULT 0.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
154
• LOTE_NOM_ROLLO: VARCHAR(50) WITH DEFAULT ‘’.
SIEMBRA:
• COD_SIEMBRA: INTEGER NOT NULL.
• FECHA_SIEMBRA: DATE.
• EMPRESA_SIEMBRA: VARCHAR(50) WITH DEFAULT ‘No tiene’.
• CULTIVO_SIEMBRA: VARCHAR(50) WITH DEFAULT ‘No tiene’.
• MAQUINA_SIEMBRA: INTEGER.
• OPERADOR_MAQ_SIEMBRA: INTEGER.
• CAMPO_SIEMBRA: INTEGER.
• CAMPO_TERC_SIEMBRA: VARCHAR(50) WITH DEFAULT ‘No tiene’.
• LOTE_SIEMBRA: VARCHAR(50) WITH DEFAULT ‘No tiene’.
• SUPERFICIE_SIEMBRA: DOUBLE WITH DEFAULT 0.
• KG_HA_SIEMBRA: DOUBLE WITH DEFAULT 0.
• SEMILLA_METRO_SIEMBRA: INTEGER WITH DEFAULT 0.
• CANT_HA_SIEMBRA: INTEGER WITH DEFAULT 0.
• COSTO_HA_SIEMBRA: DOUBLE WITH DEFAULT 0.
• COSTO_TOTAL_SIEMBRA: DOUBLE WITH DEFAULT 0 .
• TIPO_SIEMBRA: VARCHAR(50) WITH DEFAULT ‘Propia’.
• PRECIO_HA_SIEMBRA: DOUBLE WITH DEFAULT 0.
• PRECIO_TOTAL_SIEMBRA: DOUBLE WITH DEFAULT 0.
• CLIENTE_SIEMBRA: INTEGER.
• VAR_HIBRIDO_SIEMBRA: VARCHAR(100).
• TIPO_FERTILIZANTE_SIEMBRA: VARCHAR(100).
• FERTILIZANTE_KG_HA_SIEMBRA: DOUBLE.
• OPERADOR2_MAQ_SIEMBRA: INTEGER NOT NULL WITH DEFAULT
0.
• LOTE_NOM_SIEMBRA: VARCHAR(50) WITH DEFAULT ‘’.
STOCK:
• COD_STOCK: INTEGER NOT NULL.
• EMPRESA_STOCK: VARCHAR(50).
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
155
• CULTIVO_STOCK: VARCHAR(50).
• FECHA_STOCK: DATE NOT NULL.
• CANT_TN_STOCK: DOUBLE NOT NULL.
TACTO:
• COD_TACTO: INTEGER NOT NULL.
• FECHA_TACTO: DATE.
• CATEGORIA_TACTO: VARCHAR(20).
• EMPRESA_TACTO: VARCHAR(20).
• OBSERVACION_TACTO: VARCHAR(50).
• CANT_PRENIADAS_TACTO: INTEGER.
• CANT_VACIAS_TACTO: INTEGER.
• CANT_TOTAL_TACTO: INTEGER.
• PORC_PRENIEZ_TACTO: DOUBLE.
• COSTO_CABEZA_TACTO: DOUBLE.
• COSTO_TOTAL_TACTO: DOUBLE.
TARJETA:
• COD_TARJETA: INTEGER NOT NULL.
• NRO_TARJETA: VARCHAR(20) NOT NULL WITH DEFAULT ‘0’.
• NOMBRE_TARJETA: VARCHAR(50) NOT NULL WITH DEFAULT ‘No
tiene’.
• BANCO_TARJETA: INTEGER NOT NULL WITH DEFAULT 0.
• TIPO_TARJETA: VARCHAR(50) NOT NULL WITH DEFAULT ‘No tiene’.
• FECHA_VENC_TARJETA: DATE NOT NULL.
• OBSERVACIONES_TARJETA: VARCHAR(500) NOT NULL WITH DEFAULT
‘No tiene’.
• TITULAR_TARJETA: VARCHAR(100) NOT NULL WITH DEFAULT ‘No
tiene’.
TRASLADOS:
• COD_TRASLADO: INTEGER NOT NULL.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
156
• COSECHA_TRASLADO: INTEGER.
• CARTA_TRASLADO: VARCHAR(100) WITH DEFAULT ‘’.
• KG_EQUIPO_TRASLADO: DOUBLE WITH DEFAULT 0.
• PROPIETARIO_EQUIPO_TRASLADO: VARCHAR(100) WITH DEFAULT
‘’.
• PATENTE_EQUIPO_TRASLADO: VARCHAR(50) WITH DEFAULT ‘’.
• DESTINO_TRASLADO: VARCHAR(50) WITH DEFAULT ‘’.
• EMPRESA_TRASLADO: VARCHAR(50).
• FECHA_TRASLADO: DATE.
• OTRO_DESTINO_TRASLADO: VARCHAR(50).
USUARIO:
• NRO_USUARIO: INTEGER NOT NULL.
• NOMBRE_USUARIO: VARCHAR(20) NOT NULL.
• CLAVE: VARCHAR(10) NOT NULL.
• AREA: INTEGER NOT NULL WITH DEFAULT 0.
VACUNA:
• COD_VACUNA: INTEGER NOT NULL.
• FECHA_VACUNA: DATE.
• EMPRESA: VARCHAR(30).
• PRODUCTO: VARCHAR(30).
• ENFERMEDAD: VARCHAR(30).
• GASTO_DOSIS: DOUBLE.
• OTRO: DOUBLE.
• GASTO_TOTAL: DOUBLE.
• TERNEROS: INTEGER.
• TERNERAS: INTEGER.
• VAQUILLONAS: INTEGER.
• NOVILLOS: INTEGER.
• TOROS: INTEGER.
• VACAS: INTEGER.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
157
• TOTAL_VACUNA: INTEGER.
VENTA:
• COD_VENTA: INTEGER NOT NULL.
• FECHA_VENTA: DATE.
• EMPRESA_VENTA: VARCHAR(50).
• PRODUCTO_VENTA: VARCHAR(50).
• DESTINATARIO_VENTA: VARCHAR(50).
• CANTIDAD_VENTA: INTEGER.
• PRECIO_VENTA: DOUBLE WITH DEFAULT 0.
• TOTAL_VENTA: DOUBLE WITH DEFAULT 0.
• TNTOTALES: DOUBLE.
• TNVENDIDAS: DOUBLE.
• TNSTOCK: DOUBLE.
• IVA_VENTA: DOUBLE.
• OBSERVACIONES_VENTA: VARCHAR(100).
• FACTURA_VENTA: INTEGER WITH DEFAULT 0.
• CULTIVO_VENTA: VARCHAR(30).
• ESPECIE_VENTA: VARCHAR(30).
• NRO_FACTURA_VENTA: VARCHAR(30).
• TIPO_VENTA: VARCHAR(50).
• OTRO_DESTINO_VENTA: VARCHAR(50).
• MONEDA_VENTA: VARCHAR(25).
La figura 8.26 de la página 158 visualiza la estructura de campos de algunas
de las tablas que componen la base de datos AGRO, utilizada por el sistema
aplicativo SAG.
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
158
Figura 8.26: Tablas de la Base de Datos SAG.
8.5.
Ejemplos de Código Fuente Utilizados
8.5.1.
Servlets y HTML embebido
A continuación se transcribe un ejemplo de Servlet con HTML embebido,
utilizado por la aplicación, el mismo realiza una operación de alta de cosecha
propia (AgregarCosechaPropia.java).
package cosecha;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
import java.sql.SQLException;
import java.sql.Statement;
import java.text.NumberFormat;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import utilitarios.SagHTML;
public class AgregarCosechaPropia extends
javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
private static final long serialVersionUID = 1L;
Connection conn;
public void init(ServletConfig cf) throws ServletException {
super.init(cf);
try {
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
}catch (ClassNotFoundException e) {
System.out.println(”Imposible encontrar el driver:” +
e.getMessage());
}
try {
conn = DriverManager.getConnection(“jdbc:odbc:agro”);
}catch (SQLException e) {
System.out.println(“Imposible crear conexion:” + e.getMessage());
159
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
}
public void destroy() {
super.destroy();
try {
conn.close();
}catch (SQLException e){
System.out.println(“Imposible cerrar conexion:” + e.getMessage());
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
String usuario=request.getParameter(“usuario”);
String fecha=request.getParameter(“fecha”);
String empresa=request.getParameter(“empresa”);
String cultivo=request.getParameter(“cultivo”);
String maquina=request.getParameter(“maquina”);
String operador=request.getParameter(“operador”);
String operador2=request.getParameter(“operador2”);
String campo=request.getParameter(“campo”);
String cantidadha=request.getParameter(“cantidadha”);
//Importes totales
String importeha=request.getParameter(“importeha”);
String importetotal=request.getParameter(“importetotal”);
String lote=request.getParameter(“lotesel”);
160
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
161
String lotenom=request.getParameter(“lotenom”);
String tncosechadas=request.getParameter(“tncosechadas”);
String kgha=request.getParameter(“kgha”);
PrintWriter out= response.getWriter();
NumberFormat NF = NumberFormat.getInstance();
NF.setMaximumFractionDigits(2); //2 decimales
try{
Statement stm = conn.createStatement();
Statement stm1 = conn.createStatement();
Statement stm2 = conn.createStatement();
Statement stm3 = conn.createStatement();
Statement stm4 = conn.createStatement();
Statement stm5 = conn.createStatement();
stm.executeUpdate(“insert into cosecha(fecha_cosecha,empresa_cosecha,
maquina_cosecha,operador_maq_cosecha,campo_cosecha,lote_campo_cosecha,
kg_ha_cosecha,cant_ha_cosecha,importe_ha_cosecha,importe_total_cosecha,
cultivo_cosecha,tipo_cosecha,tn_cosecha,operador2_maq_cosecha,
lote_nom_cosecha) values(“‘+fecha+“’,“‘+empresa+”’,“+maquina+”,
“+operador+”,“+campo+”,“‘+lote+”’,“+kgha+”, “+cantidadha+”,“+importeha+”,
“+importetotal+”,“‘+cultivo+”’,‘Propia’,“+tncosechadas+”,“+operador2+”,
“‘+lotenom+”’)”);
stm5.executeUpdate(“insert into stock(empresa_stock,cultivo_stock,fecha_stock,
cant_tn_stock) values(“‘+empresa+”’,“‘+cultivo+”’,“‘+fecha+”’,
“+tncosechadas+”)”);
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
162
ResultSet rs1 = stm1.executeQuery(“Select * from maquina where cod_maq=
“+maquina+””);
ResultSet rs2 = stm2.executeQuery(“Select * from personal where cod_emp=
“+operador+””);
ResultSet rs3 = stm3.executeQuery(“Select * from campo where cod_camp=
“+campo+”“);
ResultSet rs4 = stm4.executeQuery(“Select * from personal where cod_emp=
“+operador2+””);
SagHTML.cabeceraGeneralHTML(out,“Agricultura“);
SagHTML.barraMenuCabecera(out, “Opciones de”,“Agricultura”, “Cosecha Propia”);
SagHTML.menuIzquierdoAgricultura(out,usuario);
SagHTML.cuadroConsultar(out);
SagHTML.cuadroBuscar(out);
SagHTML.scriptGeneral(out);
out.println(“<td width=18 align=left valign=top> </td>”);
out.println(“<td align=left valign=top><table width=650 border=0 cellspacing=0
cellpadding=0>”);
out.println(“<tr>”);
out.println(“<td align=left valign=top><table width=650 border=0 cellspacing=0
cellpadding=0>”);
out.println(“<tr>”);
out.println(“<td align=left valign=top><table width=650 border=0 cellspacing=0
cellpadding=0>”);
out.println(“<tr>”);
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
163
out.println(“<td align=left valign=top><table width=300 border=0 cellspacing=0
cellpadding=0>”);
out.println(“<tr>”);
out.println(“<td class=menu_table style=border-bottom:1px dotted #bdbdbd;
align=left valign=top colspan=2 width=344 >”);
out.println(“<img src=images/home-icon.gif alt= width=11 height=10
class=home-icon /><span class=blue_title>”);
out.println(“<SPAN class=red-titulo>Cosecha Propia</SPAN></span>
<strong style=color:#000000;></strong>  </td>”);
out.println(“</TR>”);
out.println(“<tr>”);
out.println(”<td colspan=2 align=left valign=top ><SPAN class=blue_title>
Los datos se han agregado exitosamente.</SPAN><BR>”);
out.println(”</td>”);
out.println(”</tr>”);
out.println(”</TBODY>”);
out.println(“</TABLE>”);
out.println(“</TD>”);
out.println(“</TR>”);
out.println(“</TBODY>”);
out.println(“</TABLE>”);
out.println(“</TD>”);
out.println(“</TR>”);
out.println(“<TR>”);
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
out.println(“<TD align=center valign=top >”);
out.println(“<TABLE align=center border=0 >”);
out.println(“<TBODY>”);
out.println(“ <TR>”);
out.println(“ <TD align=center colspan=2><a href=Propios?
usuario=“+usuario+” ><IMG border=0 src=images/botones/propios.gif>
</a>  <a href=Terceros?usuario=“+usuario+” >
<IMG border=0 src=images/botones/terceros.gif”);
out.println(“ ></a>  <a href=AgregarTraslados?
usuario=“+usuario+” ><IMG border=0 src=images/botones/traslados.gif>
</a></TD>”);
out.println(“ </TR>”);
out.println(“ <TR>”);
out.println(“<TD align=center colspan=2>”);
out.println(“<TABLE border=0>”);
out.println(“<TBODY>”);
out.println(“ <TR>”);
out.println(“ <TD colspan=5><FIELDSET><LEGEND align=center>
<a href=Propios?usuario=“+usuario+” target=_self ><IMG border=0
src=images/botones/agregar.gif></a>
<a href=ModificarCosechaPropia target=_self ><IMG border=0
src=images/botones/modificar.gif></a>
<a href=EliminarCosechaPropia target=_self ><IMG border=0
src=images/botones/eliminar.gif></a></LEGEND>”);
164
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
out.println(“ <TABLE border=0 align=center>”);
out.println(“ <TBODY>”);
out.println(“ <TR>”);
out.println(“ <TD>”);
out.println(“ <TABLE border=0>”);
out.println(“ <TBODY><FORM name=formcosecha
ACTION= METHOD=POST>”);
out.println(“ <TR>”);
out.println(“ <TD align=left class=blue_title>Fecha:</TD>”);
out.println(“ <TD align=left class=red-titulo>“+fecha+”</TD>”);
out.println(“ <TD align=left rowspan=5 valign=top>”);
out.println(“ <FIELDSET><LEGEND class=red-titulo></LEGEND>”);
out.println(“ <TABLE border=0>”);
out.println(“ <TBODY>”);
out.println(“<TR>”);
out.println(“ <TD align=left class=blue_title>Tipo de Cultivo:</TD>”);
out.println(“ <TD align=left class=red-titulo>“+cultivo+”</TD>”);
out.println(“</TR>”);
out.println(“ </TR>”);
out.println(“ </TR>”);
out.println(“ <TR>”);
out.println(“ <TD align=left class=blue_title>Cantidad de Hectáreas:</TD>”);
out.println(“ <TD align=left>“+cantidadha+” ha.</TD>”);
out.println(“ </TR>”);
165
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
out.println(“ <TR>”);
out.println(“ <TD align=left class=blue_title>Toneladas Cosechadas:</TD>”);
out.println(“ <TD align=left>“+tncosechadas+” Tn.</TD>”);
out.println(“ </TR>”);
out.println(“ <TR>”);
out.println(“ <TD align=left class=blue_title>Rinde:</TD>”);
out.println(“ <TD align=left>“+kgha+” kg.</TD>”);
out.println(“ </TR>”);
out.println(“ </TBODY>”);
out.println(“ </TABLE></FIELDSET>”);
out.println(“ </TR>”);
out.println(“ <TR>”);
out.println(“ <TD align=left class=blue_title>Empresa:</TD>”);
out.println(“<TD align=left>“+empresa+”</TD>”);
out.println(“</TR>”);
out.println(“ <TR>”);
out.println(“ <TD align=left class=blue_title>Nombre del Campo:</TD>”);
while(rs3.next()){
out.println(“ <TD align=left>“+rs3.getString(“nombre_camp”)+”</TD>”);
}
out.println(“ </TR>”);
out.println(“ <TR>”);
out.println(“ <TD align=left class=blue_title>Nro. de Lote:</TD>”);
out.println(“ <TD align=left>“+lotenom+”</TD>”);
166
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
167
out.println(“ </TR>”);
out.println(“ <TR>”);
out.println(“ <TD colspan=2><HR></TD>”);
out.println(“ </TR>”);
out.println(“<TR>”);
out.println(“<TD align=left class=blue_title>Máquina (Modelo - Año):</TD>”);
out.println(“<TD align=left>”);
String numero=“”;
while(rs1.next()){
numero = rs1.getString(“cod_maq”);
out.println(“ “+rs1.getString(“modelo_maq”)+”, “+rs1.getString(“anio_maq”)+””);
}
rs1.close();
out.println(“ </TD>”);
out.println(“ <TD align=left rowspan=3 valign=top>”);
out.println(“ <FIELDSET><LEGEND class=red-titulo></LEGEND>”);
out.println(“ <TABLE border=0>”);
out.println(“ <TBODY>”);
out.println(“ <TR>”);
out.println(“ <TD align=left class=blue_title>Importe por Hectárea:</TD>”);
out.println(“ <TD align=left>      &nbsp
; $   “+importeha+”</TD>”);
out.println(“ </TR>”);
out.println(“ <TR>”);
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
168
out.println(“ <TD colspan=2><HR></TD>”);
out.println(“ </TR>”);
out.println(“ <TR>”);
out.println(“ <TD align=left class=red-titulo>Importe Total:</TD>”);
out.println(“ <TD align=left class=red-titulo>     &nbsp
; $  “+importetotal+”</TD>”);
out.println(“ </TR>”);
out.println(“ </TBODY>”);
out.println(“ </TABLE></FIELDSET>”);
out.println(“ </TD>”);
out.println(“ </TR>”);
out.println(“ </TR>”);
out.println(“</TR>”);
out.println(“<TR>”);
out.println(“ <TD align=left class=blue_title>Operador 1:</TD>”);
out.println(“ <TD align=left>”);
while(rs2.next()){
out.println(“ “+rs2.getString(“apellido_emp”)+”, “+rs2.getString(“nombre_emp”)+””);
out.println(“ </TD>”);
out.println(“ </TR>”);
out.println(“<TR>”);
out.println(“ <TD align=left class=blue_title>Operador 2:</TD>”);
out.println(“ <TD align=left>”);
if(operador2.equals(0)){
CAPÍTULO 8. DESCRIPCIÓN DE LA APLICACIÓN
169
out.println(“ ‘No Tiene”’);
}else{
while(rs4.next()){
out.println(“ “+rs4.getString(“apellido_emp”)+”, “+rs4.getString(“nombre_emp”)+””);
}
out.println(“ </TD>”);
out.println(“ </TR>”);
out.println(“ </TBODY>”);
out.println(“ </TABLE>”);
out.println(“<TABLE class=ingresar-bg width=252 height=64>”);
out.println(”<TBODY>”);
out.println(“</table></td>”);
out.println(“</tr>”);
out.println(“ <TR>”);
out.println(“ <TD colspan=2 align=right>”);
out.println(“ <IMG border=0 src=images/atras.gif onClick=history.back()></TD>”);
out.println(“ </TR>”);
out.println(“</table></td>”);
out.println(“</tr>”);
SagHTML.cuerpoPrincipalFinal(out);
SagHTML.finCuerpoPrincipal(out);
SagHTML.finHTML(out);
}catch(Exception e){
e.printStackTrace();
}
}
Capítulo 9
Conclusiones
9.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 Eclipse y DB2 Express-C 9, bajo Windows XP service pack 3, utilizando
Java 1.5, para implementarla en un entorno Windows, ha resultado sumamente
sencilla, rápida y eficiente.
El uso de Java se destaca en la Web y también sirve para crear todo tipo
de aplicaciones distribuidas en la Red (locales, Intranet o Internet).
En cuanto a las facilidades en el desarrollo de aplicaciones Java para entornos multiplataforma, se pudo apreciar que Eclipse 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
soporte menos complejo.
Con respecto al motor de bases de datos DB2 Express-C, 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,
171
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 usuarios a cargo de la aplicación, han manifestado su interés en el producto desarrollado, ya que se encuentra actualmente
en uso por el establecimiento, debido a que pudieron observar las facilidades
y buen desempeño de la aplicación y las sencillas interfaces gráficas; además
de poder ser operado completamente desde la Intranet y/o Internet.
9.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 por la utilización de Internet de la
aplicación.
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 links específicos a la meteorología, bolsa de cereales y otros
para facilitar a los usuarios la toma de decisiones de las actividades
rurales, como siembra, cosecha, ganadería, etc.
Desarrollar ampliamente los módulos existentes, ya que actualmente solo
se utiliza para la gestión de altas, bajas y modificación de información y
consultas en base a la información ingresada a la aplicación.
Incorporar la posibilidad que la aplicación pueda ser manipulada desde
una Palm por el usuario final.
Bibliografía
[1] K. Rutledge. The Business Case for e-business. IBM Corp., 2000.
[2] P. Gómez C. Solares. E. Castillo, A. Cobo. JAVA - Un Lenguaje de
Programación Multiplataforma para Internet Ű 1/E. IBM Corp.
[3] Daniela Momiroska Paul Read Nicholas Summers Virginia Totanes Calisto Zuzarte. Nagraj Alur, Peter Haas. DB2 UDB High Function Business
Intelligence in e-business 1/E. IBM Corp., 2002.
[4] Louisa Ford Paul Jud Kang Yong Ying. Whei-Jen Chen, Rav Ahuja. Up
and Running with DB2 for Linux 1/E. IBM Corp., 2003.
[5] G. Vasudeva G. Galambos. Patterns for e-business. J. Adams, S. Koushik.
A Strategy for Reuse. IBM Corp., 2001.
[6] David Kline Glen Johnson. Whei-Jen Chen, Angus Beaton. DB2 UDB
Evaluation Guide for Linux and Windows 1/E. IBM Corp., 2003.
[7] Alexandre H. Guerra Thomas Mitchell Francis Reddington. WheiJen Chen, Chris Fierros. DB2 UDB Exploitation of the Windows Environment 1/E. IBM Corp., 2003.
[8] International Business Machines Corporation. WebSphere Studio Application Developer Version 4 for use with the Windows 2000 and Windows
NT Operating System. IBM Press, 2002.
[9] A. S. Tanenbaum. Sistemas Operativos Distribuidos Ű 1/E. Prentice Hall
Hispanoamericana S.A.
[10] D. L. La Red Martínez. Sistemas Operativos. Moglia SRL.
[11] A. S. Tanenbaum. Sistemas Operativos Distribuidos Ű 1/E. Prentice Hall
Hispanoamericana S.A.
173
Índice alfabético
agricultura
modulo de, 121
agricultura y ganadería
argentina, 1
agro-ganadería
actualidad, 1
API
interface de programación de aplicaciones, 32
API (Application Programming Interface), 41
aplicación
descripción de la, 118
aplicación interactiva, 65
applet, 15
programa independiente, 21
seguridad, 24
applets, 21
concepto, 23
appletviewer
visualizador de applets, 21
arrays, 60
AWT
concepto, 63
interface gráfica de usuario, 63
bibliotecas
de clases, 35
bifurcaciones, 52
if, 52
if else, 53
bloque try, catch, finally, 56
browser
navegador, 23
bucles, 53
do while, 55
for, 54
while, 54
bytecodes
serie de códigos, 16
C++
lenguaje de programación
orientado a objetos, 11
C/C++, 50
código fuente, 158
Clase, 38
clase
características, 57
clase en Java, 57
clase object, 59
clases de utilidad, 60
clase Arrays, 60
clases string y StringBuffer, 61
Double, 62
integer, 63
comentarios, 50
conclusiones, 171
Content-Type, 75
DB2
Express-C 9, 87
destroy, 78
doGet, 75
174
ÍNDICE ALFABÉTICO
doGet (), 78
doPost (), 78
Double, 62
métodos de la clase, 62
175
uso de directorios definidos, 68
estructuras de datos, 142
estructuras de programación, 50
evento, 64
sources, 64
eventos
listeners, 64
expresión, 50
Eclipse
entorno de desarrollo, 109
ejemplo de
arrays, 61
garbage collection
bifurcación if, 52
manejo automático de memoria,
bifurcación if else, 53
17
bucle for, 54
bucle while, 54
herencia, 38, 41, 57
clase, 38
herencia múltiple, 39
comentario, 51
construcción de nombres de archivosHotJava, 28, 29
HTML, 20, 23
en Java, 69
lenguaje de marcación de hiperdo while, 55
texto, 23
interface, 39
HttpServletRequest,
75
línea compuesta por tres sentenHttpServletResponse, 75
cias, 50
método, 58
import, 52
matriz, 61
inialización de arrays, 60
operadores incrementales y relaINIT, 76
cionales, 48
instanciación e inicialización, 76
programa no portable, 66
integer, 63
sentencia return, 55
métodos de la clase, 63
encapsulación, 57
interface, 39
errores
Internet Explorer, 27
gestión de, 56
Java, 19
Java, 36
errores de programación
aplicaciones corporativas, 31
carga de drivers JDBC, 71
características, 12
entrada/salida por archivo, 73
conceptos básicos, 38
fuentes de caracteres, 73
Conceptos básicos de, 11
scheduling de los hilos de ejecuerrores de programación, 65
ción, 66
estructura general de un prograterminación de líneas, 72
ma, 36
uso de características de portabilintroducción a, 34
idad, 67
Jerarquía de clases en, 41
ÍNDICE ALFABÉTICO
lenguaje y código en, 34
limitaciones, 19
memoria, 17
orientado a objetos, 13
restricción de seguridad, 25
robustez de, 14
seguridad, 15
ventajas, 18
Java en browsers
definición, 23
Java Standalone, 21
Java VM
máquina virtual Java, 16
JavaSript, 20
javax.servlet.HttpServlet, 75
JDK, 51, 72
Java Development Kit, 15
JIT
just in time compiler, 28
JSP
compilación batch de, 81
modelos de, 78
procesadores, 79
JVM, 21
líneas
longitud, 52
listener, 64
176
multithreading
múltiples hilos de ejecución, 27
Nestcape Navigator, 26
Netscape, 11, 27
OO
programación orientada a objetos,
35
OOP, 57
operadores, 45
aritméticos, 45
de asignación, 46
de concatenación de cadenas de
caracteres, 48
incrementales, 46
precedencia de, 49
racionales, 47
unarios, 46
package, 40, 41
packages, 37
plugins, 19
polimorfismo, 57
POO
programación orientada a objetos,
36
portabilidad, 16
return
máquinas virtuales
do while, 55
concepto, 26
RTTI
métodos, 58
runtime type identification, 13
de la clase object, 59
de objeto, 58
sentencia, 50
módulos, 120
server-side, 76
malloc/free
servicio
soporte de memoria dinámica, 20
de demanda, 78
Microsoft, 27
servlet, 74
Microsoft Explorer, 26
ciclo de vida del, 76
multiplataforma, 16, 18
codificación de, 75
ÍNDICE ALFABÉTICO
desarrollo, 74
motor del, 76
servlets
código fuente de, 158
Set-Cookie, 75
software, 40
String, 61
métodos de la clase, 62
string, 42
StringBuffer, 61
Sun, 11, 24
thread, 17
Tomcat
Tomcat 5.0, 114
variable
clasificación, 42
local, 43
miembro de una clase, 43
referencia, 42
variables
miembro, 44
tipo primitivo, 42
visibilidad y vida de las, 44
Web
aplicaciones, 81
WWW, 22
177
Descargar