UNIVERSIDAD SALESIANA
DE BOLIVIA
INGENIERIA DE SISTEMAS
DOSSIER
MATERIA: PROYECTO DE SOFTWARE
PARALELO: ”A1”
DOCENTES: Lic. ADRIAN QUISBERT VILELA
Proyecto de Software pagina->2
INDICE
INDICE................................................................................................................................ 2
PRESENTACIÓN................................................................................................................ 3
BIBLIOGRAFIA ………………………………………………………………………………..176
GLOSARIO…………………………………………………………………………………….176
LECTURAS COMPLEMENTARIAS................................................................................179
Proyecto de Software pagina->3
PRESENTACIÓN
El presente documento es un esfuerzo de los docentes de la materia de Proyecto
de Software que se plasma en un texto cuyo fin es el de poner al alcance de los
estudiantes, un instrumento complementario a los conceptos y saberes impartidos
en aula.
Su objetivo es el de proporcionar a los estudiantes y comunidad salesiana en
general, una herramienta complementaria y de apoyo a los conocimientos
impartidos en aula y laboratorio de la materia Proyecto de Software.
Los docentes
Proyecto de Software pagina->4
OBJETIVOS DE LA MATERIA
GENERAL
ESPECÍFICOS
- Dar a conocer los conceptos fundamentales sobre análisis diseño y
programación orientada a objetos para el desarrollo de software.
COMPETENCIAS
mediante ODBC
Aplica consultas SQL.
servlets.
Proyecto de Software pagina->8
Proyecto de Software pagina->9
UNIDAD I
Los dos elementos básicos que incluye esta definición son: las actividades y los
recursos.
Ahora piense por un instante en cada uno de los proyectos que se desarrollan en
las organizaciones, y verá que todos ellos tienen cometidos que deben cumplirse
en un cierto plazo de tiempo y que además requieren de la concurrencia de otras
personas.
Los administradores eficaces de proyectos, son los que logran que el trabajo se
ejecute a tiempo, dentro del presupuesto, y conforme a las normas de calidad
especificadas.
Es por todo esto que, los conceptos de Proyecto y de Metodología de diseño que,
hasta hace poco tiempo, eran solamente aplicados a grandes emprendimientos;
hoy también deben ser aplicados a medianos y pequeños emprendimientos.
El modelamiento visual es la clave para realizar el análisis OO. Desde los inicios
del desarrollo de software OO han existido diferentes metodologías para hacer
esto del modelamiento, pero sin lugar a duda, el Lenguaje de Modelamiento
Unificado (UML) puso fin a la guerra de metodologías.
Según los mismos diseñadores del lenguaje UML, éste tiene como fin modelar
cualquier tipo de sistemas (no solamente de software) usando los conceptos de la
orientación a objetos. Y además, este lenguaje debe ser entendible para los
humanos y máquinas.
El UML consta de todos los elementos y diagramas que permiten modelar los
sistemas en base al paradigma orientado a objetos. Los modelos orientados a
objetos cuando se construyen en forma correcta, son fáciles de comunicar,
Proyecto de Software pagina->15
Encapsulación
Polimorfismo
Herencia
Enlace Dinámico
Las conductas de los objetos están definidos en los métodos. Los métodos se
encargan de modificar las variables para cambiar los estados o crear nuevos
objetos.
new Rectangle(x,y,width,height);
new Rectangle(0,0,60,100);
Los constructores son métodos especiales provistos en cada clase Java que
permiten a los programadores crear e inicializar objetos de este tipo. En este caso
(new) muestra como inicializar el nuevo objeto Rectangle para ser localizado en el
origen (0,0), con un ancho de 60 y un alto de 100.
Rectangle()
Rectangle(int x,int y,int width,int height)
Rectangle(int width,int height)
Rectangle(Point p,Dimension d)
Rectangle(Point p)
Rectangle(Dimension d)
Referencia_del_objeto.variable
Esto permite ver o modificar las variables de los objetos, por ejemplo en el caso de
la clase Rectangle, si cuadro es la referencia al objeto y (x,y) las variables
entonces con:
cuadro.x
cuadro.y
pueden ser usadas para hacer referencia a las variables del objeto, en la
sentencias y expresiones en Java.
cuadro.width
cuadro.Height
Referencia_al_objeto.nombre_del_método(argumentos);
Referencia_al_objeto.nombre_del_método();
Por ejemplo, para mover el rectángulo, necesitamos hacer uso del método move(),
que ya menciónamos unas líneas atrás. Lo hacemos de la siguiente manera:
cuadro.move(10,20);
RECOLECTOR DE BASURA
Otros lenguajes de programación orientada a objetos, requieren que se guarde la
pista de los objetos que se han venido creando para más adelante si no se usan
sean destruidos, esto trae como consecuencia realizar un trabajo tedioso y con
posibilidad de cometer muchos errores.
En conclusión una clase es una colección de datos y métodos. Los datos y los
métodos juntos usualmente sirven para definir el contenido y las capacidades de
algunos tipos de objetos.
class Nombre_de_clase {
...
Declaración de variables
...
Declaración de métodos
...
}
Más adelante se explicara acerca del ámbito de las clases y los tipos de datos por
ahora este ejemplo tiene la intención de mostrarle como esta organizada una
clase.
Circulo c;
Circulo c;
c = new Circulo();
Ahora hemos creado una instancia de nuestra clase Circulo (un objeto circulo) y
tenemos asignado este a la variable c, la cual es de tipo Circulo.
Para declarar que una clase es subclase de otra, se deberá indicar lo siguiente:
SOBREESCRIBIENDO MÉTODOS
Cuando una clase define un método usando el mismo nombre, retorna tipos y
argumentos como un método en la superclase, el método en la clase sobreescribe
el método en la superclase. Cuando el método es invocado en la clase la nueva
definición del método es llamada, no la antigua definición que está en la
superclase.
Cuando todas las variables de la clase están ocultas y los métodos son la única
posibilidad para cambiar los valores de las variables ocultas en objetos de la clase,
todo funciona bien. Por que si mediante un método tratamos de cambiar un valor
para una variable y el valor no es correcto el método tiene la facultad para
rechazarlo.
Proyecto de Software pagina->21
private
private protected
protected
public, y ademas "friendly"
La tercera columna indica que la clase como las clases del mismo paquete pueden
llamar al método. Y la cuarta columna indica que cualquier clase puede llamar al
método.
Private:
En este nivel de acceso, sólo la clase que contiene al método puede llamarlo para
declarar un método privado utilizamos la palabra reservada private ejemplo:
class prueba {
Proyecto de Software pagina->22
Los objetos de tipo prueba, pueden llamar al método texto1, pero los objetos de
otro tipo no pueden hacerlo.
Private Protected:
Este nivel de acceso incluye el acceso private, además permite que cualquier
subclase de la clase pueda llamar al método.
class prueba2 {
private protected void texto2() {
System.out.println("y ahora como se ve..");
}
}
Los objetos del tipo prueba2, pueden llamar al método texto2(), ademas las
subclases de prueba2, también tienen acceso a texto2().
Veamos un ejemplo:
package curso;
class lección3 {
protected void contenido() {
System.out.println("Imprimiendo..baaa");
}
}
Ahora supongamos que otra clase, llamada lección4, será declarada miembro del
paquete curso la clase lección4, puede llamar al método contenido() declarado
dentro de la clase lección3, porque está dentro del mismo paquete.
Proyecto de Software pagina->23
package curso;
class lección4 {
void Métododeacceso() {
lección3 a = new lección3();
a.contenido();
}
}
Public:
Cuando los métodos son públicos todas las clases tienen acceso a ellos.
package curso;
class lección3 {
public void contenidopub() {
System.out.println("todos pueden ver los
contenidos");
}
}
package html;
class lección4 {
void métododeacceso() {
lección3 a = new lección3();
a.contenidopub();
}
}
Como se ve podemos llamar al método contenidopub() en la clase lección3.
Friendly:
Veamos un ejemplo:
package curso;
class A {
void invitado() {
System.out.println("Como estan amigos");
}
}
La clase A, puede llamar al método invitado(), pero además todas las clases
declaradas dentro del mismo paquete curso, pueden llamar al método invitado().
EL MÉTODO main()
Escriba este código en cualquier editor de textos, guárdelo como fecha.Java.
import Java.util.Date;
class fecha {
Proyecto de Software pagina->24
public:
Indica que el método main(), puede ser llamado por cualquier objeto, ya lo
explicamos arriba.
static:
Indica que el método main() es una clase método.
void:
Indica que el método main(), no retorna valores. En Java cuando se ejecuta una
aplicación el interprete de Java (Java.exe) inicia con el método main(), el método
main(), llama entonces todos los otros métodos requeridos por la aplicación.
Utilice el compilador Javac, con su archivo fecha.Java, luego si todo está correcto,
con el interprete de Java escriba: Java classname (sin extensión) para visualizar el
resultado.
UNIDAD II
1.1 INTRODUCCIÓN
Internet, la red de redes mas grande del planeta ha venido evolucionando a ritmos
muy acelerados, en sus inicios el correo electrónico fue la sensación. En la
actualidad sigue siendo una herramienta fundamental en las comunicaciones, pero
se han venido desarrollando otras herramientas y tecnologías como el hipertexto,
los cuales vienen a ser objetos de información los cuales pueden contener textos,
gráficos, audio, vídeo además de vínculos a otros hipertextos. La World Wide Web
se encarga de la transferencia de los hipertextos utilizando el protocolo HTTP,
hasta aquí Internet había crecido y madurado un poco, cada vez eran mas los
sites donde se podían encontrar paginas web mostrando información de todo tipo,
pero había un detalle: las paginas eran estáticas, y de pronto Sun Microsystems
anuncia un nuevo producto asegurando que JAVA, así se llamaba, iba
revolucionar Internet, las paginas Web se convertirían en dinámicas e interactivas.
calculadoras para uso de los visitantes. O uno que muestre figuras 3D, tales como
moléculas o dinosaurios que pueden ser rotados con un click del ratón.
que puede ser incrustado en una página Web. Puedes incluir un applet en un
documento HTML para proporcionar interactividad y dar vida a una página Web.
HotJava demostró el poder del lenguaje Java y lo puso de moda entre los
programadores y el resto de la gente. Y lo demás es historia.
Los programadores comenzaron con la versión Alpha de Java que Sun puso a
disposición de toda la gente, creando las clasificaciones de applets más
maravillosas. La experiencia de Sun y la retroalimentación por parte de los
usuarios ayudaron a refinar el lenguaje y la interfaz de programación de
aplicaciones (API). Al mismo tiempo que Sun sacó la versión Beta de el lenguaje,
Netscape anunció que la version 2.0 del Web browser, Netscape Navigator
soportaría applets de Java. Esto sirvió para incrementar el fuerte interés en la
tecnología Java, en el mundo de la computación y en Internet.
Con compañías como IBM, SGI y Oracle licenciando la tecnología Java de Sun se
puede estar seguro de que más productos de software y hardware incorporarán la
tecnología Java.
Las características principales que nos ofrece Java respecto a cualquier otro
lenguaje de programación, son:
2.1 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
adolece de 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 como el garbage collector (reciclador de memoria dinámica). 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.
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, entre las que
destacan:
Aritmética de punteros
No existen referencias
Registros (struct)
Definición de tipos (typedef)
Macros (#define)
Necesidad de liberar memoria (free)
Proyecto de Software pagina->28
2.3 Distribuido
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.
2.4 Robusto
Java realiza verificaciones en busca de problemas tanto en tiempo de compilación
como en tiempo de ejecución. La comprobación de tipos en Java ayuda a detectar
errores, lo antes posible, en el ciclo de desarrollo. Java obliga a la declaración
explícita de métodos, reduciendo así las posibilidades de error. Maneja la memoria
para eliminar las preocupaciones por parte del programador de la liberación o
corrupción de memoria.
Comprobación de punteros
Comprobación de límites de arrays
Excepciones
Verificación de byte-codes
En una representación en que tuviésemos que indicar todos los elementos que
forman parte de la arquitectura de Java sobre una plataforma genérica,
obtendríamos una figura como la siguiente:
Proyecto de Software pagina->31
2.6 Seguro
La seguridad en Java tiene dos facetas. En el lenguaje, características como los
punteros o el casting implícito que hacen los compiladores de C y C++ se eliminan
para prevenir el acceso ilegal a la memoria. Cuando se usa Java para crear un
navegador, se combinan las características del lenguaje con protecciones de
sentido común aplicadas al propio navegador.
El lenguaje C, por ejemplo, tiene lagunas de seguridad importantes, como son los
errores de alineación. Los programadores de C utilizan punteros en conjunción
con operaciones aritméticas. Esto le permite al programador que un puntero
referencie a un lugar conocido de la memoria y pueda sumar (o restar) algún valor,
para referirse a otro lugar de la memoria. Si otros programadores conocen
nuestras estructuras de datos pueden extraer información confidencial de nuestro
Proyecto de Software pagina->32
El código Java pasa muchos tests antes de ejecutarse en una máquina. El código
se pasa a través de un verificador de byte-codes que comprueba el formato de los
fragmentos de código y aplica un probador de teoremas para detectar fragmentos
de código ilegal -código que falsea punteros, viola derechos de acceso sobre
objetos o intenta cambiar el tipo o clase de un objeto-.
2.7 Portable
Más allá de la portabilidad básica por ser de arquitectura independiente, Java
implementa otros estándares de portabilidad para facilitar el desarrollo. Los
enteros son siempre enteros y además, enteros de 32 bits en complemento a 2.
Además, Java construye sus interfaces de usuario a través de un sistema
abstracto de ventanas de forma que las ventanas puedan ser implantadas en
entornos Unix, Pc o Mac.
Proyecto de Software pagina->34
2.8 Interpretado
El intérprete Java (sistema run-time) puede ejecutar directamente el código objeto.
Enlazar (linkar) un programa, normalmente, consume menos recursos que
compilarlo, por lo que los desarrolladores con Java pasarán más tiempo
desarrollando y menos esperando por el ordenador. No obstante, el compilador
actual del JDK es bastante lento. Por ahora, que todavía no hay compiladores
específicos de Java para las diversas plataformas, Java es más lento que otros
lenguajes de programación, como C++, ya que debe ser interpretado y no
ejecutado como sucede en cualquier programa tradicional.
Se dice que Java es de 10 a 30 veces más lento que C, y que tampoco existen en
Java proyectos de gran envergadura como en otros lenguajes. La verdad es que
ya hay comparaciones ventajosas entre Java y el resto de los lenguajes de
programación, y una ingente cantidad de folletos electrónicos que supuran
fanatismo en favor y en contra de los distintos lenguajes contendientes con Java.
Lo que se suele dejar de lado en todo esto, es que primero habría que decidir
hasta que punto Java, un lenguaje en pleno desarrollo y todavía sin definición
definitiva, está maduro como lenguaje de programación para ser comparado con
otros; como por ejemplo con Smalltalk, que lleva más de 20 años en cancha.
La verdad es que Java para conseguir ser un lenguaje independiente del sistema
operativo y del procesador que incorpore la máquina utilizada, es tanto
interpretado como compilado. Y esto no es ningún contrasentido, me explico, el
código fuente escrito con cualquier editor se compila generando el byte-code. Este
código intermedio es de muy bajo nivel, pero sin alcanzar las instrucciones
máquina propias de cada plataforma y no tiene nada que ver con el p-code de
Visual Basic. El byte-code corresponde al 80% de las instrucciones de la
aplicación. Ese mismo código es el que se puede ejecutar sobre cualquier
plataforma. Para ello hace falta el run-time, que sí es completamente dependiente
de la máquina y del sistema operativo, que interpreta dinámicamente el byte-code
y añade el 20% de instrucciones que faltaban para su ejecución. Con este sistema
es fácil crear aplicaciones multiplataforma, pero para ejecutarlas es necesario que
exista el run-time correspondiente al sistema operativo utilizado.
2.9 Multithreaded
Al ser multithreaded (multihilvanado, en mala traducción), Java permite muchas
actividades simultáneas en un programa. Los threads (a veces llamados, procesos
ligeros), son básicamente pequeños procesos o piezas independientes de un gran
proceso. Al estar los threads contruidos en el lenguaje, son más fáciles de usar y
más robustos que sus homólogos en C o C++.
2.10 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 (siempre que mantengan el API anterior).
Java, para evitar que los módulos de byte-codes o los objetos o nuevas clases,
haya que estar trayéndolos de la red cada vez que se necesiten, implementa las
opciones de persistencia, para que no se eliminen cuando de limpie la caché de la
máquina.
A. Introducción
La sintaxis de Java resulta muy familiar a los programadores de C++, debido
mayoritariamente a que Java proviene de C++. Sin embargo Java pretende
mejorar a C++ en muchos aspectos (sobre todo en los aspectos orientados a
objeto del lenguaje), aunque prohíbe muchas de las tareas por las que C++ fue tan
extendido.
Proyecto de Software pagina->36
Se observa que las diferencias han sido diseñadas como mejoras del lenguaje, ya
que uno de los aspectos más criticado (y defendido) de C++ es su capacidad para
hacer cosas "no orientadas a objetos", así como acceder a los recursos de las
máquinas (lo que le permitía atacar sistemas, siendo uno de los lenguajes más
difundidos entre los programadores de virus).
B. Diferencias sintáticas
a) Elementos similares
Uso de bibliotecas (paquetes): Como no existen macros como #include, se
utiliza import.
b) Elementos equivalentes
Métodos inline: En Java no existen (hay que incluir el cuerpo de los métodos
junto a su definición), aunque los compiladores Java suelen intentar expandir en
línea (a modo de los métodos inline) los métodos declarados como final.
c) Elementos añadidos
Comentarios: Java soporta los dos tipos de comentarios de C++, e incorpora un
tercero, con la sintaxis /** comentario */, para la documentación automática.
Proyecto de Software pagina->37
Operador >>> : Java añade este operador para desplazamientos a la derecha sin
signo.
Iniciación: Todos las variables de tipo simple y las referencias a objeto se inician a
un valor 0 (o equivalente), y null para las referencias a objeto.
C. Diferencias de diseño
a) Tipos de datos
Tipos simples: Soporta los mismos que C++, añadiendo boolean (true/false), y
ampliando el tipo char, para soportar caracteres Unicode de 16 bits.
Vectores: Son objetos de sólo lectura, con un método length() para averiguar su
longitud, y que lanzan una excepción si se intenta acceder a un elemento fuera del
vector.
Cuerpo de los métodos: Todos los cuerpos de las clases han de estar
codificados en las definiciones de las clases. No se pueden separa como se hace
en C++ mediante ficheros de cabecera (".h").
c) Nuevos diseños
Interfaces (interface): Que son unas especies de clases abstractas con métodos
abstractos, y que permiten herencia múltiple, utilizando la palabra reservada
implements.
D. Diferencias de ejecución
a) Aspectos modificados:
Intérprete: Los intérpretes Java son unas 20 veces más lentos que los de C,
aunque esta diferencia se está reduciendo con lo compiladores JIT(Just In Time)
para Java que están apareciendo en el mercado.
Proyecto de Software pagina->39
Bibliotecas estándar: En C++ existía casi una biblioteca por plataforma (si
existía) para hacer cosas como: Trabajo en red, conexión a bases de datos, uso
de múltiples hilos de control, uso de objetos distribuídos o compresión. Java
incorpora bibliotecas estándar multiplataforma para todas estas tareas en su API.
b) Aspectos eliminados:
Acceso directo al hardware: En Java está restringido, aunque para eso permite
la utilización de métodos nativos, escritos para la plataforma (normalmente C/C+
+). En cualquier caso las applets no pueden utilizar estos métodos nativos, sólo
las aplicaciones Java pueden hacerlo.
c) Aspectos introducidos
Applets Java: Este tipo de aplicaciones son seguras, distribuíbles por Internet y
ejecutables por los navegadores, aunque tienen restricciones (como la escritura en
disco).
a) Introducción
En este apartado se va a comparar Java con los lenguajes C++ y Smalltalk (primer
lenguaje que presentaba un modelo de objeto).
Proyecto de Software pagina->40
Como cualquier otro lenguaje, Java se usa para crear aplicaciones. Pero, además
Java tiene la particularidad especial de poder crear aplicaciones muy especiales,
son los applets, que es una mini (let) aplicación (app) diseñada para ejecutarse en
un navegador. A continuación se verá en detalle lo mínimo que se puede hacer en
ambos casos, lo que permitirá presentar la secuencia de edición, compilación,
ejecución en Java, que será imprescindible a la hora de estudiar detalles más
concretos de Java, porque los ejemplos que se muestren serán mejor
comprendidos.
HolaMundo!
Hay que ver en detalle la aplicación anterior, línea a línea. Esas líneas de código
contienen los componentes mínimos para imprimir Hola Mundo! en la pantalla. Es
un ejemplo muy simple, que no instancia objetos de ninguna otra clase; sin
embargo, accede a otra clase incluida en el JDK.
Estas dos primeras líneas son comentarios. Hay tres tipos de comentarios en
Java, // es un comentario orientado a línea .
class HolaMundoApp {
Esta línea especifica un método que el intérprete Java busca para ejecutar en
primer lugar. Igual que en otros lenguajes, Java utiliza una palabra clave main para
especificar la primera función a ejecutar. En este ejemplo tan simple no se pasan
argumentos.
public significa que el método main() puede ser llamado por cualquiera, incluyendo
el intérprete Java.
static es una palabra clave que le dice al compilador que main se refiere a la
propia clase HolaMundoApp y no a ninguna instancia de la clase. De esta forma,
si alguien intenta hacer otra instancia de la clase, el método main() no se
instanciaría.
void indica que main() no devuelve nada. Esto es importante ya que Java realiza
una estricta comprobación de tipos, incluyendo los tipos que se ha declarado que
devuelven los métodos.
A una variable de tipo class se puede acceder sin necesidad de instanciar ningún
objeto de esa clase. Por ello ha de ser un tipo básico o primitivo, o bien puede ser
una referencia que apunta a otro objeto. En este caso, la variable out es una
referencia que apunta a un objeto de otro tipo, aquí una instancia de la clase
PrintStream (un objeto PrintStream), que es automáticamente instanciado cuando
la clase System es cargada en la aplicación. Esto es algo semejante al hecho de
que los objetos stream de entrada/salida, cin y cout son automáticamente
instanciados y enlazados a los dispositivos estándar de entrada y salida cuando
un programa C++ comienza su ejecución.
tipo_retorno main()
tipo_retorno main( int argc,char argv[] )
El tipo_retorno puede ser cualquier tipo válido, o void, para indicar que la función
no tiene que devolver valor alguno. La lista de argumentos puede estar vacía, o
contener los argumentos de soporte para pasar parámetros en la línea de
comandos. Esta forma de implementación la función difiere de la que acaba de
presentar para Java, que siempre habrá de ser la misma, independientemente de
los valores de retorno o la lista de parámetros que se pasen en la lista de
argumentos a la aplicación.
salida a fichero de texto plano o ascii, sino que es suficiente con cualquier otro
editor.
Compilación
El compilador javac se encuentra en el directorio bin por debajo del directorio java,
donde se haya instalado el JDK. Este directorio bin, si se han seguido las
instrucciones de instalación, debería formar parte de la variable de entorno PATH
del sistema. Si no es así, tendría que revisar la Instalación del JDK. El compilador
de Java traslada el código fuente Java a byte-codes, que son los componentes
que entiende la Máquina Virtual Java que está incluida en los navegadores con
soporte Java y en appletviewer.
%javac HolaMundoApp.java
Ejecución
%java HolaMundoApp
%Hola Mundo!
Problemas de compilación
A continuación se encuentra una lista de los errores más frecuentes que se
presentan a la hora de compilar un fichero con código fuente Java, tomando como
base los errores provocados sobre la mínima aplicación Java que se está
utilizando como ejemplo, pero también podría generalizarse sin demasiados
problemas.
System.out.printl( "HolaMundo! );
^
Error tipográfico, el método es println no printl.
%In class HolaMundoApp: main must be public and static
class HolaMundoapp {
Esto es originado por otra de las cosas que ha introducido el JDK 1.1 como son
los elementos obsoletos (deprecated), es decir, aquellas clases o métodos que no
se recomienda utilizar, aunque sigan siendo válidos, porque están destinados a
Proyecto de Software pagina->45
ftp://ftp.rcp.net.pe/pub/networks/win95/webedit
Ahora si tienen alguna plataforma como AIX, OS2, Windows 3.x, pueden revisar la
documentación de la URL:
http://ncc.hursley.ibm.com/Javainfo
¿QUÉ ES EL JDK?
El JDK, es un conjunto de herramientas de desarrollo el cual consta de:
El compilador de Java
Se trata de una de las herramientas de desarrollo incluidas en el JDK. Realiza un
análisis de sintaxis del código escrito en los ficheros fuente de Java (con
extensión *.java). Si no encuentra errores en el código genera los ficheros
compilados (con extensión *.class). En otro caso muestra la línea o líneas
erróneas. En el JDK de Sun dicho compilador se llama javac.exe. Tiene
numerosas opciones, algunas de las cuales varían de una versión a otra. Se
aconseja consultar la documentación de la versión del JDK utilizada para obtener
una información detallada de las distintas posibilidades.
Cada vez que se abra una ventana de MS-DOS será necesario ejecutar este
fichero *.bat para asignar adecuadamente estos valores. Un posible fichero
llamado jdk117.bat, podría ser como sigue:
set JAVAPATH=C:\jdk1.3
set PATH=.;%JAVAPATH%\bin;%PATH%
set CLASSPATH=.\;%JAVAPATH%\lib\classes.zip;%CLASSPATH%
Si no se desea tener que ejecutar este fichero cada vez que se abre una consola
de MS-DOS es necesario indicar estos cambios de forma “permanente”. La forma
de hacerlo difiere entre Windows 95/98 y Windows NT. En Windows 95/98 es
necesario modificar el fichero Autoexec.bat situado en C:\, añadiendo las líneas
antes mencionadas. Una vez rearrancado el ordenador estarán presentes en
cualquier consola de MS-DOS que se cree. La modificación al fichero
Autoexec.bat en Windows 95/98 será la siguiente:
Proyecto de Software pagina->48
set JAVAPATH=C:\jdk1.3
set PATH=.;%JAVAPATH%\bin;%PATH%
set CLASSPATH=
appletviewer.exe
Opciónes:
-debug Inicia el Java debugger jdb, permitiéndote depurar el applet en el
documento.
Java.exe
Sintaxis:
Java [opciónes] nombre_de_clase <argumentos>
Proyecto de Software pagina->49
Opciónes:
-debug Permite que el jdb (Java debugger) se conecte a si mismo a la sesión de
Java. Cuando
-classpath Especifica el camino que Java usa para buscar las clases.
Los Directorios en la variable CLASSPATH son separados con punto y coma (;).
Por ejemplo:
C:\users\avh\classes\;C:\jdk\classes
-ss x Cada tárea en Java tiene dos pilas: una para el código de Java y otra para el
código de C.
Proyecto de Software pagina->50
-ss establece el tamaño máximo de la pila mediante el valor x que puede ser
usada por el código de C en una tárea. Todas las táreas que resultan de la
ejecución del programa pasado a Java tienen a x como tamaño de pila para C. La
unida por defecto para x son bytes. x debe ser mayor que 1000 bytes. Puedes
modificar el significado de x adiciónando la letra k para kilobytes o la letra m para
megabytes. El tamaño por defecto de la pila es 128 kilobytes (-ss 128k).
-oss x Cada tárea en Java tiene dos pilas: una para el código de Java y otra para
el código de C.
-oss establece el tamaño máximo de la pila mediante el valor x que puede ser
usada por el código de Java en una tárea. Todas las táreas que resultan de la
ejecución del programa pasado a Java tienen a x como tamaño de pila para Java.
La unidad por defecto para x son bytes. x debe ser mayor que 1000 bytes.
-v, -verbose Hace que Java imprima un mensaje en la salida estándar cada vez
que un archivo de clase es cargado.
-verbosegc Hace que el colector de basura imprima mensajes cada que este libera
memoria.
Entorno:
CLASSPATH Esta variable de entorno es usada para indicar al sistema la ruta de
las clases definidas por el usuario.
Por ejemplo:
C:\users\avh\classes;C:\jdk\classes
Proyecto de Software pagina->51
Javac.exe
Cuando un archivo fuente de Java hace referencia a una clase que no esta
definida en alguno de los archivos fuente del comando de línea, entonces Javac
hace uso del Classpath, por defecto el Classpath, solo contiene las clases del
sistema.
Sintaxis:
Javac [opciónes] archivos
Opciónes:
-classpath ruta Aquí ruta, le dice a classpath a donde tiene que ir a buscar las
clases especificadas en el código fuente. Esta opción elimina el path por defecto y
cualquier otra ruta especificada en classpath la ruta especificada puede ser una
lista de directorios separados por (;) para sistemas Windows y (.) para sistemas
Unís -d directorio Directorio, especifica el lugar donde usted desea se guarden sus
clases, por defecto las clases se guardan en el mismo directorio que las fuentes
(*.Java)
Javadoc.exe
Descripción: Javadoc genera documentación API en formato HTML para el
paquete especificado o para los archivos fuentes individuales en Java en la línea
de comandos.
Sintaxis:
Javadoc [opciónes] nombre_de_paquete
Javadoc [opciónes] nombre_de_archivo
Proyecto de Software pagina->52
Opciónes:
-classpath path El path que Javap usa para encontrar las clases nombradas en la
línea de comandos.
Javah.exe
Descripción: Javah genera archivos fuentes y de cabecera en C (archivos .h
y .c) que describen las clases especificadas. Estos archivos de C proveen la
información necesaria para implementar métodos nativos para las clases
especificadas en C.
Sintaxis:
Javah [opciónes] nombre_de_clase
Opciónes:
-classpath path El path que Javah usa para encontrar las clases nombradas en la
línea de
comandos.
-td directory El directorio donde Javah almacena los archivos temporales. Por
defecto es /tmp.
-v Hace que Javah imprima mensajes acerca del trabajo que está realizando.
Javap.exe
Descripción: Javah desensambla el archivo de clases especificado por los
nombres de clases en la línea de comandos e imprime una versión humanamente
comprensible de esas clases.
Sintaxis:
Javap [opciónes] nombre de_clase
Opciónes:
Proyecto de Software pagina->53
-c Imprime las instrucciónes de la maquína virtual de Java para cada uno de los
métodos en cada una de las clases especificadas. Esta opción desensambla todos
los métodos incluyendo los privados y protegidos.
-classpath path El path que Javap usa para encontrar las clases
nombradas en la línea de comandos.
jdb.exe
Descripción: jdb es un depurador para clases de Java. Este esta basado en una
línea de comandos de texto y tiene una sintaxis de comandos como la del dbx en
UNIX o depuradores gdb.
Sintaxis:
jdb [opciónes de Java] class
jdb [-host hostname] -password password
Opciónes:
-host hostname
-password password
Comandos:
memory
methods class
print id(s)
resume [thread(s)]
run [class] [args]
step
stop [at class:line]
stop [in class.method]
suspend [threads(s)]
thread thread
threadgroup name
threadgroups
threads [threadgroups]
up [n]
use [ruta_archivo_fuente]
where [thread] [all]
Proyecto de Software pagina->55
UNIDAD III
PROGRAMACIÓN EN JAVA
1.1 Introducción
1.2 Tokens
Los códigos de byte se ajustan al sistema de máquina virtual Java, que abstrae las
diferencias entre procesadores a un procesador virtual único.
a) Identificadores
int alturaMedia;
b) Palabras clave
Las palabras claves son aquellos identificadores reservados por Java para un
objetivo determinado y se usan sólo de la forma limitada y específica. Java tiene
un conjunto de palabras clave más rico que C o que C++.
c) Literales y constantes
Los literales son sintaxis para asignar valores a las variables. Cada variable es de
un tipo de datos concreto, y dichos tipos de datos tienen sus propios literales.
d) Operadores
+ ^ <= ++ %=
>>>= - ~ >= -
== <<= [ / ||
>> += ^= ] %
! >>> = != (
Proyecto de Software pagina->58
& < *= ) |
int miNumero=0;
miNumero = miNumero + 2;
e) Separadores
Se usan para informar al compilador de Java de cómo están agrupadas las cosas
en el código.
Formato Uso
1.3 Expresiones
Entre otras cosas, las expresiones son utilizadas para realizar cálculos, para
asignar valores a variables, y para ayudar a controlar la ejecución del flujo del
programa. La tarea de una expresión se compone de dos partes: realiza el cálculo
indicado por los elementos de la expresión y devuelve el valor obtenido como
resultado del cálculo.
int contador=1;
contador++;
En Java el código fuente está dividido en partes separadas por llaves, denominas
bloques. Cada bloque existe independiente de lo que está fuera de él, agrupando
en su interior sentencias (expresiones) relacionadas.
Desde un bloque externo parece que todo lo que está dentro de llaves se ejecuta
como una sentencia. Pero, ¿qué es un bloque externo?. Esto tiene explicación si
entendemos que existe una jerarquía de bloques, y que un bloque puede contener
uno o más subbloques anidados.
Toda variable tiene un ámbito, en el que es usada, que viene determinado por los
bloques. Una variable definida en un bloque interno no es visible por el bloque
externo.
Las llaves de separación son importantes no sólo en un sentido lógico, ya que son
la forma de que el compilador diferencie dónde acaba una sección de código y
Proyecto de Software pagina->61
dónde comienza otra, sino que tienen una connotación estética que facilita la
lectura de los programas al ser humano.
Así mismo, para identificar los diferentes bloques se utilizan sangrías. Las
sangrías se utilizan para el programador, no para el compilador.
// Bloque externo
int x = 1;
int y = 2;
2. TIPOS DE DATOS
Para crear una variable (de un tipo simple) en memoria debe declararse indicando
su tipo de variable y su identificador que la identificará de forma única. La sintaxis
de declaración de variables es la siguiente:
Esta sentencia indica al compilador que reserve memoria para dos variables del
tipo simple TipoSimple con nombres Identificador1 e Identificador2.
Cada tipo de datos simple soporta un conjunto de literales que le pueden ser
asignados, para darles valor. En este apartado se explican los tipos de datos
simples (o primitivos) que presenta Java, así como los literales que soporta
(sintaxis de los valores que se les puede asignar).
Se usan para representar números enteros con signo. Hay cuatro tipos: byte, short,
int y long.
Tipo Tamaño
byte 1Byte (8 bits)
short 2 Bytes (16 bits)
int 4 Bytes (32 bits)
long 8 Bytes (64 bits)
Literales enteros
Los literales enteros se almacenan por defecto en el tipo int, (4 bytes con signo), o
si se trabaja con números muy grandes, con el tipo long, (8 bytes con signo),
añadiendo una L ó l al final del número.
Se usan para representar números con partes fraccionarias. Hay dos tipos de
coma flotante: float y double. El primero reserva almacenamiento para un número
de precisión simple de 4 bytes y el segundo lo hace para un numero de precisión
doble de 8 bytes.
Tipo Tamaño
float 4 Byte (32 bits)
double 8 Bytes (64 bits)
De forma predeterminada son del tipo double (8 bytes). Existe la opción de usar un
tipo más corto (el tipo float de 4 bytes), especificándolo con una F ó f al final del
número.
Se usa para almacenar variables que presenten dos estados, que serán
representados por los valores true y false. Representan valores bi-estado,
provenientes del denominado álgebra de Boole.
Literales Booleanos
Java utiliza dos palabras clave para los estados: true (para verdadero) y false
(para falso). Este tipo de literales es nuevo respecto a C/C++, lenguajes en los que
Proyecto de Software pagina->64
Para declarar un dato del tipo booleano se utiliza la palabra reservada boolean:
Literales carácter
char c = (char)System.in.read();
El tamaño de los tipos que queremos convertir es muy importante. No todos los
tipos se convertirán de forma segura. Por ejemplo, al convertir un long en un int, el
compilador corta los 32 bits superiores del long (de 64 bits), de forma que encajen
en los 32 bits del int, con lo que si contienen información útil, esta se perderá.
Por ello se establece la norma de que "en las conversiones el tipo destino siempre
debe ser igual o mayor que el tipo fuente":
2. Vectores y Matrices
Se puede observar que los corchetes son opcionales en este tipo de declaración
de vector, tanto después del tipo de variable como después del identificador.
3. Cadenas
Proyecto de Software pagina->67
En Java se tratan como una clase especial llamada String. Las cadenas se
gestionan internamente por medio de una instancia de la clase String. Una
instancia de la clase String es un objeto que ha sido creado siguiendo la
descripción de la clase.
Cadenas constantes
Cuando Java encuentra una constante de cadena, crea un caso de la clase String
y define su estado, con los caracteres que aparecen dentro de las comillas dobles.
3. OPERADORES
3.1 Introducción
Los operadores son un tipo de tokens que indican una evaluación o computación
para ser realizada en objetos o datos, y en definitiva sobre identificadores o
constantes.
El valor y tipo que devuelve depende del operador y del tipo de sus operandos.
Por ejemplo, los operadores aritméticos devuelven un número como resultado de
su operación.
Los operadores realizan alguna función sobre uno, dos o tres operandos.
Los operadores que requieren un operando son llamados operadores unarios. Por
ejemplo, el operador "++" es un operador unario que incrementa el valor de su
operando en una unidad.
Los operadores unarios en Java pueden utilizar tanto la notación prefija como la
postfija.
Proyecto de Software pagina->68
Los operadores que requieren dos operandos se llaman operadores binarios. Por
ejemplo el operador "=" es un operador binario que asigna el valor del operando
del lado derecho al operando del lado izquierdo.
Todas los operadores binarios en Java utilizan notación infija, lo cual indica que el
operador aparece entre sus operandos.
Por último, los operadores ternarios son aquellos que requieren tres operandos. El
lenguaje Java tiene el operador ternario, "?":, que es una sentencia similar a la if-
else.
Este operador ternario usa notación infija; y cada parte del operador aparece entre
operandos:
Aritméticos.
De comparación y condicionales.
A nivel de bits y lógicos.
De asignación.
El lenguaje Java soporta varios operadores aritméticos para los números enteros y
en coma flotante. Se incluye + (suma), - (resta), * (multiplicación), / (división), y %
(módulo, es decir, resto de una división entera). Por ejemplo:
El tipo de los datos devueltos por una operación aritmética depende del tipo de
sus operandos; si se suman dos enteros, se obtiene un entero como tipo devuelto
con el valor de la suma de los dos enteros.
Estos operadores se deben utilizar con operandos del mismo tipo, o si no realizar
una conversión de tipos de uno de los dos operandos al tipo del otro.
42 -> 00101010
Además Java soporta un operador ternario, el ?:, que se comporta como una
versión reducida de la sentencia if-else:
Un operador de bit permite realizar operaciones de bit sobre los datos. Existen dos
tipos: los que desplazan (mueven) bits, y operadores lógicos de bit.
13 >> 1;
Si se desplaza con signo el número -1 (1111), seguirá valiendo -1, dado que
la extensión de signo sigue introduciendo unos en los bits más
significativos.
Con el desplazamiento sin signo se consigue introducir ceros por la
izquierda, obteniendo el número 7 (0111).
Proyecto de Software pagina->73
El operador & realiza la operación AND de bit. Aplica la función AND sobre cada
par de bits de igual peso de cada operando. La función AND es evaluada a cierto
si ambos operandos son ciertos.
12 & 13
1101
& 1100
------
1100
Entre otras cosas, la manipulación bit es útil para gestionar indicadores booleanos
(banderas). Supongamos, por ejemplo, que se tiene varios indicadores booleanos
en nuestro programa, los cuales muestran el estado de varios componentes del
programa: esVisible, esArrastrable, etc... En lugar de definir una variable booleana
para cada indicador, se puede definir una única variable para todos ellos. Cada bit
de dicha variable representará el estado vigente de uno de los indicadores. Se
deberán utilizar entonces manipulaciones de bit para establecer y leer cada
indicador.
int flags = 0;
int contador = 0;
i = i + 2;
i += 2;
Los operadores con mayor precedencia son evaluados antes que los operadores
con una precedencia relativa menor.
x + y / 100
Así:
x + y / 100
Es equivalente a:
x + (y / 100)
ARRAYS
Mucho de lo que se ha aprendido en lo que se refiere a tipos de datos y objetos es
aplicable a los arreglos en Java.
Cuando se crea un aray de esta forma no se crean los objetos que son
almacenados en el array, no hay un constructor para llamar, y la lista de
argumentos es omitida con la palabra new. Los elementos de un array creados de
esta manera con el valor por defecto del tipo. Los elementos de un array de int son
inicializados a 0, por ejemplo, y los de un array de objetos a null (no apuntan a
nada). La otra manera de crear un array es mediante un inicializador estatico que
tiene la misma apariencia que en C:
Esta sintaxis crea un array dinámicamente e inicializa sus elementos a los valores
especificados. Los elementos especificados en la inicialización de un array deben
Proyecto de Software pagina->78
Arrays multidimensionales:
Java también soporta arrays multidimensionales. Estos son implementados como
arrays de arrays, similar a C. Se especifica una variable como un tipo de array
multidimensional simplemente agregando un segundo par de corchetes al final del
par anterior. La dimensión de los arrays se especifica entre los corchetes con un
valor para cada dimensión.
Ejemplo:
Este array contiene 10 elementos, cada uno de tipo int[][]. Esto quiere decir que es
un array de una sola dimensión, cuando los elementos del array sean inicializados
pasará a ser multidimensional. La regla para este tipo de arrays es que las
primeras n dimensiones (donde n es al menos una) debe tener el numero de
elementos especificado, y esas dimensiones deben ser seguidas por m
dimensiones adiciónales que no tengan un tamaño de dimensión especificado.
Proyecto de Software pagina->79
STRINGS
Los strings en Java no son arrays de caracteres terminados en null como en C. En
vez de ello son instancias de la clase Java.lang.String. Un string es creado cuando
el compilador de Java encuentra una cadena entre comillas(“”). Toda la teoria
especificada para la creación de tipos de objetos dicha anteriormente es aplicada
aquí mismo.
Ecuacion ()
{
System.out.println ("programa que reseulve un sistema de ecuaciones");
System.out.println ("introdusca el numero de ecuanciones");
n = Leer.datoShort ();
llenaMatriz (n);
mostrarMatriz (n);
resuelve (n);
}
// metodo para mostrar la matriz
public void mostrarMatriz (int n)
{
int i, j;
for (i = 0 ; i < n ; i++)
{
for (j = 0 ; j < n ; j++)
{
System.out.print (" " + A [i] [j] + "X" + i + " ");
}
System.out.println (" = " + B [i]);
}
System.out.println ("");
}
// programa que llena dos matrices
public void llenaMatriz (int n)
{
int i, j;
float nn;
A = new float [n] [n];
B = new float [n];
for (i = 0 ; i < n ; i++)
{
for (j = 0 ; j < n ; j++)
{
System.out.print ("A[" + i + "," + j + "]=");
nn = Leer.datoFloat ();
A [i] [j] = nn;
}
System.out.print ("B[" + i + "]=");
nn = Leer.datoFloat ();
B [i] = nn;
}
}
// resuelve el sistema de ecuaciones de Ax = B
public void resuelve (int n)
{
int i, j, k;
Proyecto de Software pagina->81
Para utilizar los objetos contenidos en un paquete, bien sea creado por ustedes o
incluido con el entorno de programación de Java, es necesario importar dichos
paquetes.
Por ejemplo para importar un objeto similar a “Applet” del paquete de clases
“Java.applet” se deberá utilizar la siguiente instrucción:
import Java.applet.Applet;
import Java.applet.*;
Al importar todos los objetos o solamente uno del paquete de clases, estamos
creando la definición e implementación disponible para el paquete actual,
supongamos:
Java.applet.Applet
INSTRUCCIONES DE BLOQUE
Un bloque es un conjunto de sentencias encerradas por ({}) por ejemplo:
void bloque() {
int a = 20;
{ // Aquí empieza el bloque, Ah esto es un comentario.
int b = 30;
System.out.println(“Aquí estamos dentro del bloque:”);
System.out.println(“a:” + a);
System.out.println(“b:” + b);
} // Fin del bloque.
}
CONDICIONALES: IF
La sentencia condicional (if) permite ejecutar código Java de manera muy
similar a la sentencia (if) en el lenguaje C, (if) es la palabra reservada de esta
condicional seguido por una expresión_booleana y una sentencia o bloque de
sentencias, las cuales serán ejecutadas si la expresión_booleana es verdadera.
Proyecto de Software pagina->83
Además existe la palabra reservada else, que permite ejecutar una sentencia o un
bloque de sentencias si la expresión_booleana es falsa.
OPERADOR CONDICIONAL
Otro modo de utilizar la condiciónal (if)..(else) es usar el operador conciónal (?) el
cual tiene la siguiente sintaxis:
CONDICIONALES SWITCH
Para evitar el uso repetido de la sentencia (if), al evaluar el valor de algunas
variables por ejemplo:
if (evento == MouseClick)
Sentencia o bloque;
else if (evento == Drop)
Sentencias o bloque;
else if (evento == Fail)
Sentencias o bloque;
else if (evento == Complete)
Sentencias o bloque;
Este tipo de sentencias (if), es conocida como los (if) anidados. En Java existe un
forma mas abreviada de de manejar los (if) anidados, usando la sentencia
(switch), cuya sintaxis es:
switch (Evaluar) {
case valor1:
Sentencia o bloque;
break;
case valor2:
Sentencia o bloque;
Proyecto de Software pagina->84
break;
case valor3:
Sentencia o bloque;
break;
...
default: Sentencia o bloque por defecto;
}
switch (evento) {
case MouseClick:
Sentencia o bloque;
break;
case Drop:
Sentencia o bloque;
break;
case Fail:
Sentencia o bloque;
break;
case Complete:
Sentencia o bloque;
break;
default: Sentencia o bloque por defecto;
}
switch (Num) {
case 2:
case 4:
case 6:
case 8:
System.out.println("Num, es un numero par");
break;
default: System.out.println("Num, es un numero impar");
}
BUCLES FOR
Proyecto de Software pagina->85
El bucle (for) en Java, funciona de manera similar que en C, repite una sentencia o
bloque de sentencias un numero de veces hasta que alguna condición se cumpla.
Valor_de_inicio:
Aquí deberá indicar cual es el valor con el que comenzara el bucle por ejemplo:
int cont = 0
Las variables que se declaren en esta sección del bucle seran locales para el
bucle estas dejan de existir cuando el bucle a terminado.
Expresion_booleana:
Aquí se chequea la expresión_booleana después de cada paso por el bucle por
ejemplo: cont < 50 ,si el resultado es verdadero entonces se ejcuta el bucle. si es
falso para la ejecución.
Incremento:
El incremento permite cambiar el valor del índice del bucle.
Revise, ¿qué es lo que hace este código e intente explicarlo?
BUCLE DO WHILE:
do {
cuerpo
} while (condición)
Ejemplo:
int a = 1;
Proyecto de Software pagina->86
do {
System.out.println("Iteración: " + a);
a++;
} while (a <= 10);
Iteración: 1
Iteración: 2
Iteración: 3
Iteración: 4
Iteración: 5
Iteración: 6
Iteración: 7
Iteración: 8
Iteración: 9
Iteración: 10
Si se esta usando break como parte de una sentencia switch; este para la
ejecución del switch y el programa continua. Cuando se usa la sentencia break en
un loop, para la ejecución del loop actual y ejecuta la siguiente sentencia luego del
loop.
Por ejemplo :
int contador = 0;
while (contador < array1.length) {
Proyecto de Software pagina->87
if (array1[contador] == 0) {
break;
}
array2[contador] = (float) array1[contador++];
}
En este ejemplo se copian elementos del array1 (array de enteros) al array2 (array
de floats) hasta que todos los elementos del array1 sean copiados o que el valor al
que se hace referencia para copiar del array1 sea 0.
Ejemplo:
int contador1 = 0;
int contador2 = 0;
while (countador1 < array1.length) {
if (array1[contador1] == 0) {
contador1++;
continue;
}
array2[contador2++] = (float)array1[contador1++];
}
En este ejemplo se copian solo los elementos del array1 (array de enteros) que no
sean 0 al array2, la sentencia continue en este caso nos sirve para que la
ejecución del programa se traslade nuevamente a la evaluación de la condición y
el elemento del array1 no se copie al array2
Para usar un bucle etiquetado, adicionar la etiqueta seguida de dos puntos (:)
antes del comienzo del bucle. Luego cuando uses break o continue con el nombre
de esta etiqueta, la ejecución se trasladara a la instrucción que esta luego de la
etiqueta.
Por ejemplo:
Proyecto de Software pagina->88
fuera:
For (int i = 0; i < 10; i++) {
While (x < 50) {
if (i * x == 400)
break fuera;
...
}
...
}
i es 1, j es 1
i es 1, j es 2
i es 1, j es 3
i es 2, j es 1
i es 2, j es 2
i es 2, j es 3
Final de bucles.
Proyecto de Software pagina->89
UNIDAD IV
ACCESO A BASE DE DATOS MEDIANTE JDBC-ODBC
Para trabajar con JDBC es necesario tener controladores (drivers) que permitan
acceder a las distintas Bases de Datos: cada vez hay más controladores nativos
JDBC. Sin embargo, ODBC es hoy en día la API más popular para acceso a
Bases de Datos: Sun admite este hecho, por lo que, en colaboración con Intersolv
(uno de principales proveedores de drivers ODBC) ha diseñado un puente que
permite utilizar la API de JDBC en combinación con controladores ODBC.
Algunos fabricantes, como Microsoft, ofrecen sus propias APIs, en lugar de JDBC,
como RDO, etc. Aunque estas APIs pueden ser muy eficientes, y perfectamente
utilizables con Java, su uso requiere tener muy claras las consecuencias, sobre
todo la pérdida de portabilidad, factor decisivo en la mayor parte de los casos para
escoger Java en lugar de otro lenguaje.
JDBC es un API de Java que permite que programas en Java ejecuten comandos
SQL, permitiendo esto que los programas puedan usar bases de datos en ese
esquema. Dado que casi todos los sistemas de administración de bases de datos
relacionales (DBMS) soportan SQL(Structured Query Language), y que Java corre
en la mayoría de las plataformas, JDBC hace posible escribir una sóla aplicación
de base de datos que pueda correr en diferentes plataformas e interactuar con
distintos DBMS.
Los puentes de JDBC-ODBC se han creado para permitir que los programas de
Java conecten con el software compatible ODBC de la base de datos.
JDBC no sólo provee un interfaz para acceso a motores de bases de datos, sino
que también define una arquitectura estándar, para que los fabricantes puedan
crear los drivers que permitan a las aplicaciones java el acceso a los datos.
Sun define JDBC como: “The JDBC API is the industry standard for database-
independent connectivity between the Java programming language and a wide
range of databases.”
2. CONTROLADORES JDBC
Los controladores (conectores o drivers) JDBC proveen clases que implementan la
interfaz JDBC. JDBC define cuatro tipos de controladores, y cada una tiene una
mezcla variada de ejecutables sistema operativo dependientes y código de Java
como se indica a continuación:
Ventajas: Buena forma de aprender JDBC. También puede ser buena idea
usarlo, en sistemas donde cada máquina cliente tenga ya instalado los drivers
ODBC. También es posible que sea la única forma de acceder a ciertos
motores de Bases de Datos.
Inconvenientes: No es buena idea usar esta solución para aplicaciones que
exijan un gran rendimiento, ya que la transformación JDBC-ODBC es costosa.
Tampoco es buena solución para aplicaciones con alto nivel de escalabilidad.
Para los tipo 1 y 2, además de las librerías del driver, necesitaremos ciertas
librerías propias del cliente del motor de base de datos que estemos usando y
quizá ficheros de configuración.
1. Aplicaciones standalone
2. Applets comunicando con un servidor Web
3. Aplicaciones y applets comunicando con una base de datos a través de un
puente JDBC/ODBC.
4. Aplicaciones accediendo a recursos remotos usando mecanismos como
Java RMI
4. LA API DE JDBC
Pasamos en este punto a dar una breve descripción de cada una de las interfaces
y clases que componen el paquete java.sql.
4.1 Interfaces
Proyecto de Software pagina->97
Driver
Es la interfaz que deben implementar todos los controladores JDBC en alguna de
sus clases. Cuando se cargue una clase Driver, ésta creará una instancia de sí
misma que se registrará posteriormente mediante el administrador de
controladores.
Connection
Representa una sesión de trabajo con una base de datos. Sus métodos, aparte de
permitir modificarla y consultar sus tablas, también permiten obtener información
sobre su estructura.
Statement
Mediante esta interfaz, se envían las órdenes SQL individuales a la base de datos
a través del controlador JDBC y se recogen los resultados de las mismas.
ResultSet
Mediante esta interfaz, se organizan en tablas los resultados de las órdenes SQL.
Las filas deben leerse una detrás de otra, pero las columnas pueden leerse en
cualquier orden.
ResultSetMetaData
Contiene información sobre las columnas de los objetos ResultSet.
PreparedStatement
Los objetos PreparedStatement contienen órdenes SQL precompiladas que
pueden por tanto ejecutarse muchas veces.
CallableStatement
Los objetos CallableStatement se emplean para ejecutar procedimientos
almacenados.
DatabaseMetaData
Contiene diversa, y abundantísima, información sobre la base de datos. Algunos
de sus métodos devuelven los resultados como tablas ResultSet, y pueden
tratarse como éstos.
4.2 Clases
DriverManager
Contiene métodos para trabajar con un conjunto de controladores JDBC.
Types
Define una serie de constantes usadas para identificar los tipos de datos SQL.
Time
Esta clase añade a la clase Date del paquete java.util los métodos y
características para trabajar con cláusulas de escape JDBC identificándolo como
un tipo TIME de SQL.
Proyecto de Software pagina->98
Date
Esta clase añade a la clase Date del paquete java.util los métodos y
características para trabajar con cláusulas de escape JDBC como un tipo DATE de
SQL.
Timestamp
Esta clase añade a la clase Date del paquete java.util los métodos y
características para trabajar con cláusulas de escape JDBC identificándolo como
un tipo TIMESTAMP de SQL.
DriverPropertyInfo
Contiene métodos para averiguar y trabajar con las propiedades de los
controladores JDBC.
SQLException
Proporciona diversa inmformación acerca de los errores producidos durante el
acceso a una base de datos.
SQLWarning
Contiene información sobre los avisos que se producen durante el trabajo con una
base de datos. Los avisos se encadenan al objeto que los provocó.
5.1. Statement
Fue la primera manera de enviar sentencias SQL usando java, este método está
cada vez más en desuso, ya que no protege ante la inyección de código SQL.
5.2 PreparedStatement
Proyecto de Software pagina->99
El puente es por si mismo un driver basado en tecnología JDBC que está definida
en la clase sun.jdbc.odbc.JdbcOdbcDriver.
El puente JDBC-ODBC debe ser considerado como una solución transitoria. Sun
Microsystems y las tecnologías DataDirect estan trabajando para hacerlo más
confiable y robusto, pero ellos no lo consideran un producto recomendado. Con el
desarrollo de drivers puros en Java, el puente se volverá innecesario.
Hasta aquí con la pequeña introducción acerca del puente JDBC-ODBC. La última
parte de esta introducción nos habla de adaptar nuestras aplicaciones basadas en
puentes JDBC-ODBC a drivers puros JDBC. Esto es verdadero, sin casi nada de
cambio en el código. Personalmente he creado proyectos que trabajan
inicialmente con Access y el puente JDBC-ODBC, posteriormente he migrado
estas aplicaciones a servidores como MySQL y SQLServer, para los cuales solo
debe implementarse el driver JDBC correspondiente.
6.3 Conectando una aplicación Java con Access mediante puente JDBC-
ODBC
Supongamos ahora que necesita conectar una aplicación en Java con Access, sea
porque es su primer pinino o porque realmente los requerimientos de su sistema
se adaptan a esta base de datos. Para este ejemplo, supongamos que la base de
datos de Access se crea en el siguiente directorio:
C:\proyecto\bd1.mdb
Oprima el botón Aceptar. Oprima a su vez los botones aceptar de las pantallas
subsecuentes. Con esto el driver ya ha sido creado y puede ser accedido desde
nuestra aplicación.
import java.sql.*;
public class cConnection {
/*Atributos*/
private String url = "jdbc:odbc:";
private String driver = "PDRV";
private String usr = "cvazquez";
private String pswd = "vazquez";
private Connection con;
/*Constructor, carga puente JDBC-ODBC*/
public cConnection() {
loadDriver();
}
/**
* Carga el driver de la conexión a la base de datos
Proyecto de Software pagina->102
*/
private void loadDriver()
{
try
{
//Instancía de una nueva clase para el puente
//sun.jdbc.odbc.JdbcOdbcDriver
//El puente sirve entre la aplicación y el driver.
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
}
catch(ClassNotFoundException e)
{
System.out.println("Error al crear el puente JDBC-ODBC");
}
}
/**
* Obtiene una conexión con el nombre del driver especificado
* @param driverName Nombre del driver de la base de datos
* @return
*/
public Connection mkConection()
{
url = url + driver;
System.out.println("Estableciendo conexión con " + url);
try
{
//Obtiene la conexión
con = DriverManager.getConnection( url,usr,pswd);
}
catch(SQLException sqle)
{
System.out.println("No se pudo establecer la conexión");
return null;
}
System.out.println("Conexión establecida con:\t " + url);
//Regresa la conexión
return con;
}
/* Cerrar la conexión.
*/
public boolean closeConecction()
{
try
{
con.close();
}
catch(SQLException sqle)
Proyecto de Software pagina->103
{
System.out.println("No se cerro la conexión");
return false;
}
System.out.println("Conexión cerrada con éxito ");
return true;
}
}
El siguiente fragmento de código muestra la manera de establecer la conexión con
la base de datos.
…
//Crear un objeto de la clase de conexión
cConnection conect = new cConnection();
//Obtener la conexión
Connection con = conect.mkConection();
if(con == null){
//Error al establecer la conexión
}
Si la conexión fue realizada con éxito, podemos ejecutar sentencias SQL. El
siguiente fragmento de código muestra la ejecución de la sentencia SQL select
(suponiendo que tablas de la base de datos fueron creadas con anterioridad).
…
ResultSet rs = null;
Statement stm = con.createStatement();
String strSQL = "SELECT * FROM mitabla";
//Ejecuta la consulta SQL
rs = stm.executeQuery(strSQL);
//Trabajar con el result set…
//Cerrar todo
rs.close();
stm.close();
boolean isClosed = conect.closeConecction()
if(!isClosed){
//Error al cerrar la conexión
}
7. EJEMPLO DE APLICACIÓN
acceso en lugar de utilizar un driver JDBC nativo para Interbase porque ello nos
permitirá mostrar el uso de drivers ODBC: de este modo, aquél que no disponga
de Interbase, podrá crear una Base de Datos Access, BTrieve o de cualquier otro
tipo para el que sí tenga un driver ODBC instalado en su sistema, y utilizar el
código fuente incluido con el diskette que acompaña a la revista.
El Listado A muestra el SQL utilizado para crear nuestra pequeña Base de Datos
de ejemplo, incluida en el diskette. Nótese que el campo ID de la tabla
CONTACTOS es del tipo contador o autoincremento, y requiere de la definición de
un trigger y un contador en Interbase: otros sistemas de Base de Datos pueden
tener soporte directo para este tipo de campo, lo que hará innecesario parte del
código SQL del Listado A.
CONNECT "h:\work\artículos\jdbc\1\fuente\agenda.gdb"
USER "SYSDBA" PASSWORD "masterkey";
/* Se hace COMMIT */
EXIT;
Listado A: SQL utilizado para crear la Base de Datos de ejemplo, AGENDA.GDB,
con Interbase.
El primer paso, evidentemente, será crear la Base de Datos, que en nuestro caso
se llama AGENDA.GDB. Una vez hecho esto, debemos crear una fuente de datos
ODBC: para ello, se debe escoger en el Panel de Control el icono "32bit ODBC",
correspondiente al gestor de fuentes de datos ODBC, y hacer click sobre el botón
"Add..." de la página "User DSN", con lo que aparecerá la ventana de la Figura A.
Figura A: Ventana del gestor de fuentes de datos ODBC utilizada para añadir
nuevas fuentes de datos.
El hecho de que para acceder una Base de Datos mediante ODBC se utilice el
nombre de la fuente de datos, en lugar del nombre de la Base de Datos, nos
permite cambiar la ubicación e incluso el nombre de la misma sin tener que
modificar el código fuente de nuestros programas, ya que estos utilizarán el
nombre de la fuente de datos para identificarla.
Clase/Interf Descripción
ace
Driver Permite conectarse a una Base de Datos: cada gestor
de Base de Datos requiere un Driver distinto.
DriverManag Permite gestionar todos los Drivers instalados en el
er sistema.
DriverProper Proporciona diversa información acerca de un Driver.
tyInfo
Connection Representa una conexión con una Base de Datos.
Una aplicación puede tener más de una conexión a
más de una Base de Datos.
DatabaseMe Proporciona información acerca de una Base de
tadata Datos, como las tablas que contiene, etc.
Statement Permite ejecutar sentencias SQL sin parámetros.
PreparedStat Permite ejecutar sentencias SQL con parámetros de
ement entrada.
CallableStat Permite ejecutar sentencias SQL con parámetros de
ement entrada y salida, típicamente procedimientos
almacenados.
Proyecto de Software pagina->107
class jdbc1 {
public static void main( String[] args ) {
try {
// Accederemos a la fuente de datos
// ODBC llamada JDBC_AGENDA
String urlBD = "jdbc:odbc:JDBC_AGENDA";
String usuarioBD = "SYSDBA";
String passwordBD = "masterkey";
Establecer una conexión con una Base de Datos mediante JDBC es sencillo: en
primer lugar, registramos el Driver a utilizar (que en nuestro caso es el puente
JDBC/ODBC), mediante el código:
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
La cadena utilizada para indicar la Base de Datos siempre tiene tres partes,
separadas por el carácter ":". La primera parte es siempre "jdbc". La segunda
parte indica el subprotocolo, y depende del Sistema de Gestión de Base de Datos
utilizado: en nuestro caso, es "odbc", pero para SQLAnyware, por ejemplo, es
"dbaw". La tercera parte identifica la Base de Datos concreta a la que nos
deseamos conectar, en nuestro caso la especificada por la fuente de datos ODBC
llamada "JDBC_AGENDA". Aquí también se pueden incluir diversos parámetros
necesarios para establecer la conexión, o cualquier otra información que el
fabricante del SGBD indique.
conexión.close();
Es conveniente cerrar las conexiones a Bases de Datos tan pronto como dejen de
utilizarse, para liberar recursos rápidamente. Sin embargo, ha de tenerse en
cuenta que establecer una conexión es una operación lenta, por lo que tampoco
se debe estar abriendo y cerrando conexiones con frecuencia.
Proyecto de Software pagina->109
import java.sql.*;
import java.io.*;
class jdbc2 {
public static void main( String[] args ) {
try {
// Accederemos al alias ODBC llamado JDBC_DEMO
String urlBD = "jdbc:odbc:JDBC_AGENDA";
String usuarioBD = "SYSDBA";
String passwordBD = "masterkey";
Excepción Descripción
SQLExcepti Error SQL.
on
SQLWarnin Advertencia SQL.
g
DataTrunca Producida cuando se truncan datos inesperadamente,
tion por ejemplo al intentar almacenar un texto demasiado
largo en un campo.
Tabla B: Excepciones que puede generar la API de JDBC
Proyecto de Software pagina->112
Por último, las excepciones del tipo DataTruncation se producen cuando se trunca
información inesperadamente, ya sea al leerla o al escribirla.
Proyecto de Software pagina->113
UNIDAD V
JAVA EN EL LADO CLIENTE
El mensaje que aparece en la parte inferior del browser cuando carga una página
que contiene un Applet, es similar al siguiente: "initializing... starting...", esto indica
que el applet, se esta cargando. Entonces, ¿qué está pasando?
Cuando el usuario se encuentra en una página web, que contiene un applet y salta
a otra página entonces el applet se detiene (stopping) a si mismo, y si el usuario
retorna a la pagina el applet, vuelve a ejecutarse (start) nuevamente. Cuando el
usuario sale del browser el applet, tiene un tiempo para detenerse y hacer una
limpieza final antes de salir del browser.
Estructura de un Applet.
public class Miapplet extends Applet {
........
........
public void init() {
.......}
public void start() {
.......}
public void stop() {
.......}
public void destroy() {
.......}
.........
}
init() permite inicializar el applet cada vez que este es cargado o recargado.
start() inicia la ejecución del applet una vez cargado o cuando el usuario regresa a
la pagina.
stop() detiene la ejecución del applet como cuando se sale del browser.
destroy() antes de salir del browser hace la limpieza final.
............
public void paint(Graphics g) {
........}
...........
}
El método paint() es el método básico para imprimir información, y el método
update() puede ser usado con paint() para un mejor rendimiento en el pintado.
import Java.awt.Graphics;
import Java.applet.Applet;
public class HelloWorld extends Applet{
public void paint(Graphics g){
g.drawString("Helloworld",50,25);
}
}
Explicando:
drawString(String str, int x, int y) permite dibujar una cadena de caracteres usando
los siguientes parametros:
Usamos este tag especial el cual es una extensión HTML, de la siguiente forma:
<HTML>
<HEAD>
<TITLE>A ver como nos va..</TITLE>
</HEAD>
<BODY>
<BR>
Proyecto de Software pagina->115
Explicando:
CODE
El atributo code indica el nombre de la clase, es decir el archivo que contiene el
applet, incluyendo la extensión (class) en este caso el archivo class debe estar en
el mismo directorio que el archivo HTML.
import Java.awt.Graphics;
import Java.applet.Applet;
public class Applet2 extends Applet{
String texto;
public void init(){
texto=getParameter(“text”);
}
public void paint(Graphics g){
g.drawString(texto,50,25);
}
}
Como es de esperar este archivo deberá guardarse como Applet2.Java luego de
ser compilado les devolverá el applet, Applet2.class
Explicando:
getParameter(String str)
por ejemplo:
Código HTML:
<HTML>
<HEAD>
<TITLE>A ver como nos va..</TITLE>
</HEAD>
<BODY>
<BR>
<HTML>
<HEAD>
<TITLE>y Ahora que sigue...</TITLE>
</HEAD>
<BODY>
<BR>
<applet code=Applet2.class WIDTH=100 Height=40>
<PARAM NAME=”text” VALUE=”Estan viendo mi 2do. Applet!!”>
</applet>
</BODY>
</HTML>
Cuando un proceso en Java es creado, esta hereda la prioridad del proceso que lo
creo (hereda la prioridad de su padre). Se puede modificar la prioridad de los
procesos en cualquier momento luego de su creación usando el método
setpriority().
Este código fuente de Java implementa un applet que anima una carrera entre dos
procesos runner con diferentes prioridades. Cuando se clickea el Mouse sobre el
applet comienza la carrera. El primer proceso tiene una prioridad de 2 y el
segundo proceso 3.
Ejemplo de un applets.
/* button actions */
import java.awt.*;
public class ButtonActionsTest extends java.applet.Applet {
public void init() {
setBackground(Color.white);
add(new Button("Red"));
add(new Button("Blue"));
add(new Button("Green"));
add(new Button("White"));
add(new Button("Black"));
}
Proyecto de Software pagina->118
4. LAS EXCEPCIONES
4.1 ¿QUé es una excepción?
El termino excepción es conocido de manera corta como un “evento excepcional”
y puede ser definido de la siguiente manera: Una excepción es un evento que
ocurre durante la ejecución de un programa que desbarata o desorganiza el
normal funcionamiento del flujo de las instrucciones de un programa. Visto desde
el lenguaje Java una excepción es cualquier objeto que es una instancia de la
clase Throwable (o cualquiera de sus subclases).
try {
// Declaraciones Java
}
El siguiente programa usa una declaración try para el método entero por que el
código es fácil de leer.
Proyecto de Software pagina->119
PrintStream pstr;
try {
int i;
La declaración try gobierna las sentencias encerradas con este y define el campo
de acción de esta. Una declaración try debe ser acompañada por al menos un
bloque catch o un bloque finally.
El bloque CATCH:
Como se explicó anteriormente, la sentencia try define el alcance del manejador
de excepción. Se asocia el manejador con una declaración try poniendo uno o
mas bloques catch directamente después que el bloque try :
try {
...
} catch ( . . . ) {
...
} catch ( . . . ) {
...
}...
Cabe resaltar que no puede haber código entre el final de la declaración try y el
comienzo de la declaración catch. La forma general de la declaración catch de
Java es:
El bloque catch contiene una serie de declaraciones Java. Esas declaraciones son
ejecutadas cuando el manejador de excepción es invocado.
Aqui un ejemplo:
try {
int a[10];
int c;
c = a[11];
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Tratamiento de
ArrayIndexOutOfBoundsException: " + e.getMessage());
} catch (IOException e) {
System.err.println("Tratamiento de IOException: " +
e.getMessage());
}
El bloque FINALLY:
El paso final en el establecimiento de un manejador de excepción es proveer un
mecanismo para borrar el estado del método después (posiblemente) permitiendo
que el control sea pasado a una parte diferente del programa. Hacemos esto
encerrando el código a limpiar con un bloque finally.
try {
....
} finally {
if (pStr != null) {
System.out.println("Cerrando PrintStream");
pStr.close();
} else {
System.out.println("PrintStream no abierto");
}
}
System.out.print("y divertido?\n");
}
System.out.print("Yo quiero reunirme con ese sujeto");
}
System.out.print("Por favor llamame!\n");
}
}
Proyecto de Software pagina->122
5. CONTROL DE EVENTOS
Se llaman eventos a aquellas acciones que realizan los usuarios cuando
presionan una tecla, arrastran el ratón o presionan el botón izquierdo del ratón,
etc.
action() (Event.ACTION_EVENT)
mouseEnter() (Event.MOUSE_ENTER)
mouseExit() (Event.MOUSE_EXIT)
mouseMove() (Event.MOUSE_MOVE)
mouseDown() (Event.MOUSE_DOWN)
mouseDrag() (Event.MOUSE_DRAG)
mouseUp() (Event.MOUSE_UP)
keyDown() (Event.KEY_PRESS o Event.KEY_ACTION)
keyUp() (Event.KEY_RELEASE o
Event.KEY_ACTION_RELEASE)
gotFocus() (Event.GOT_FOCUS)
lostFocus() (Event.LOST_FOCUS)
handleEvent() (todos los tipos de eventos)
texto TextField, todos ellos producen el evento action, todos los metodos
manejadores de eventos tienen al menos un argumento (Event) y retornan un
valor booleano, al retornar un valor FALSE, el manejador del evento indica que el
evento debe continuar hasta alcanzar una jerarquía mas alta.
Un valor TRUE indica que el evento no debe ser enviado mas alla. El método
handleEvent() casi siempre retorna el método super.handleEvent(), para
asegurarse que todos los eventos son enviados al método manejador de eventos
apropiado.
El evento mismo
Las coordenadas x,y donde el evento ocurrio
Los argumentos x,y le indican dónde ocurrió el click del mouse, veamos por
ejemplo este método que imprime la coordenada x,y.
import java.awt.Graphics;
import java.applet.Applet;
import java.awt.Event;
public class Textmove extends Applet implements Runnable{
String text_in;
int xpos=0;
Thread killme=null;
boolean suspended = false;
public void init(){
text_in=getParameter("text");
}
public void paint(Graphics g){
g.drawString(text_in,xpos,100);
}
public void start(){
if(killme==null){
killme=new Thread(this);
killme.start();
}
}
public void set_x(){
xpos =xpos-5;
if(xpos<-120){
xpos=size().width;
}
}
public void run(){
while(killme != null){
try {Thread.sleep(100);}catch(InterruptedException e){}
set_x();
repaint();
}
}
public boolean handleEvent(Event evt) {
if (evt.id == Event.MOUSE_DOWN) {
if (suspended) {
killme.resume();
} else {
killme.suspend();
Proyecto de Software pagina->125
}
suspended = !suspended;
}
return true;
}
public void stop(){
if(killme != null)
killme.stop();
killme=null;
}
}
<HTML>
<TITLE> Eventos del Mouse </TITLE>
<BODY>
<H1> Abajo el Applet</H1><HR>
<APPLET CODE="Textmove.class" WIDTH=150 HEIGHT=100>
</APPLET>
</BODY>
</HTML>
UNIDAD VI
Esto es parte de todo lo que sucede en la industria, que está llevando a Java a ser
la plataforma de desarrollo e implementación preferida para la computación
basada en Internet.
2. HTML BÁSICO
Una directiva será un texto incluido entre los símbolos menor que < y mayor que >.
Este texto será una orden que explique la utilidad de la etiqueta, y es indistinto que
se escriba en mayúsculas o minúsculas. Las directivas de HTML pueden ser de
dos tipos, cerradas o abiertas. Las directivas cerradas son aquellas que tienen una
etiqueta que indica el principio de la directiva y otra que indica el final. La del final
contendrá el mismo texto, añadiéndole al principio el carácter /. El efecto que
define la directiva se aplicará sobre todo lo que esté incluido entre estas dos
etiquetas. Entre ambas etiquetas se pueden encontrar otras directivas. Las
directivas abiertas constan de una sola etiqueta.
Ejemplos:
Directiva cerrada
<CENTER> Mi página Web </CENTER>
Directiva abierta
<HR>
Directiva con parámetros
<BODY bgcolor="#FFFFFF"> </BODY>
Los ficheros que contienen documentos HTML suelen tener la extensión .html o
.htm. En este manual se han fijado los siguientes criterios a la hora de escribir la
sintaxis de las directivas de HTML:
http://ares.six.udc.es/cine/corunha2.html
Donde ....
Ejemplo:
Ejemplos:
Proyecto de Software pagina->129
Ejemplo :
Ejemplo:
El primer par de cifras indican la proporción de color Rojo, el segundo par de cifras
la proporción de color Verde y, las dos últimas, la proporción de color Azul. Estos
números están en numeración hexadecimal. Esta numeración se caracteriza por
tener 16 dígitos (en lugar de los 10 habituales). Estos dígitos son:
0123456789ABCDEF
Ejemplos:
Cuando la gente no usa color verdadero, sino 256 colores hay que tener en cuenta
que los navegadores sólo permiten ver con exactitud 216. Estos se conseguirán
con ternas de parejas expresadas como: 00, 33, 66, 99, CC y FF. Cualquier otra
combinación se visualizará como el color más parecido.
La paleta de colores de 216 que asegura una visión real de los colores en la web será:
De cualquier forma la mayoría de los editores de HTML nos permiten obtener el código de
color correspondiente escogiendo directamente el color de una paleta. Así mismo la mayor
parte de los navegadores actuales tienen algunos colores predefinidos por lo que pueden ser
referenciados por su nombre. La paleta de colores que se pueden poner con nombre es más
limitada, sólo 140:
Todos los visores de páginas Web actuales soportan todos los caracteres gráficos
de la especificación ISO 8859-1, que permite escribir textos en la mayoría de los
países occidentales.
caracteres que se utilizan para las directivas de HTML, por ejemplo < y >. Estos
caracteres pueden ser representados por un código numérico o una entidad
cuando deseemos que aparezcan en el documento "tal cual". Las entidades
comienzan por el símbolo & (ampersand) y terminan con el símbolo ; (punto y
coma).
página
página
página
Si deseamos que cualquier visor de páginas Web pueda visualizar las letras
acentuadas de nuestro documento debemos utilizar sus correspondientes
entidades o códigos para representarlas.
En HTML sólo se reconoce un espacio entre palabra y palabra, el resto de los espacios
serán ignorados por el visor.
Asimismo tampoco se respetan las tabulaciones, retornos de carro etc... Para ello
existen una serie de directivas que indican estos códigos. La directiva
<PRE></PRE> obliga al visor a visualizar el texto tal y como ha sido escrito, respetando
tabulaciones, espacios, retornos de carro, etc.. pero se verá con una fuente tipo máquina
(courier).
preformateado .
preformateado .
Proyecto de Software pagina->136
</PRE>
align = posición
Alinea el párrafo a la izquierda (left), a la derecha (right), lo centra (center) o
lo justifica (justify). Este último parámetro sólo funciona en navegadores
versiones 4 o superiores.
La directiva <HR> muestra una línea horizontal de tamaño determinable. Tiene los
siguientes parámetros opcionales:
align = posición
Alinea la línea a la izquierda (left), a la derecha (right) o la centra (center).
noshade
No muestra sombra, evitando el efecto en tres dimensiones.
size = número
Indica el grosor de la línea en pixels.
width = % ó número
Indica el ancho de la línea en tanto por ciento en función del ancho de la
ventana del visor, o en pixels si indicamos un número sin porcentaje.
Ejemplo:
La directiva <HR> sin ningún parámetro mostrará una línea horizontal que ocupará
todo el ancho de la página. Estas líneas sencillas son las que ves en este manual
para separar las diferentes secciones.
2.6 Cabeceras
Proyecto de Software pagina->137
<H1>Texto de Texto de
Prueba</H1>
prueba
<H2>Texto de Prueba</H2>
Texto de
Prueba
<H3>Texto de Prueba</H3> Texto de Prueba
<H4>Texto de Prueba</H4> Texto de Prueba
<H5>Texto de Prueba</H5> Texto de Prueba
Para indicar atributos de texto (negrilla, subrayado, etc...) tenemos varias directivas.
Algunas de ellas no son reconocidas por determinados visores de Internet, es por ello que
según el visor que estés utilizando, verás el resultado correctamente o no.
prueba
Teletype <TT></TT> <TT>Texto de prueba</TT> Texto de prueba
Texto de
Subrayado <U></U> <U>Texto de prueba</U>
prueba
Texto de
Tachado <S></S> <S>Texto de prueba</S>
prueba
<BLINK>Texto de Texto de
Parpadeo <BLINK></BLINK>
prueba</BLINK> prueba
<SUP>Texto de Texto de prueba
Superíndice <SUP></SUP>
prueba</SUP>
<SUB>Texto de
Subíndice <SUB></SUB> Texto de prueba
prueba</SUB>
<CENTER>Texto de Texto de
Centrado <CENTER></CENTER>
prueba</CENTER> prueba
Por otro lado, la directiva <FONT></FONT> nos permite variar el aspecto del
texto, con los siguientes parámetros:
size = valor
Da al texto un tamaño en puntos determinado.
size = +/- valor
Da al texto un tamaño tantas veces superior (+) o inferior (-) como indique
el valor.
color = "código de color"
Escribe el texto en el color cuyo código se especifica.
face = "fuente_de_letra"
Permite cambiar la fuente de la letra, por ejemplo: Arial. Se pueden poner varias
separadas por comas. De esa manera si el navegador no tiene la primara, probará
con la segunda, etc. Por ejemplo: Helvetica, Arial, Sans Serif.
Ejemplo Se vería como
Existen otras directivas que realizan las mismas operaciones que las antes vistas en los
atributos del texto.
Ejemplo:
start = num
Indica que número será el primero de la lista. Si no se indica se entiende
que empezará por el número 1. Se indica numéricamente,
independientemente del tipo que se elija.
type = tipo
Indica el tipo de numeración utilizada. Si no se indica se entiende que será
una lista ordenada numéricamente.
Los tipos posibles son:
Ejemplo Resultado
<OL>
1. España
<LI>España
2. Francia
<LI>Francia
3. Italia
<LI>Italia
<LI>Portugal
4. Portugal
</OL>
<OL type = A >
A. España
<LI>España
B. Francia
<LI>Francia
C. Italia
<LI>Italia
<LI>Portugal
D. Portugal
</OL>
Las listas sin numerar representan los elementos de la lista con un "topo" o
marca que antecede a cada uno de ellos. Se utiliza la directiva <UL></UL> para
delimitar la lista, y <LI> para indicar cada uno de los elementos. La directiva <UL>
puede contener el parámetro type que indica la forma del "topo" o marca que
antecede a cada elemento de la lista. Los valores de type pueden ser disc, circle
o square, con lo que el topo o marca puede ser un disco, un circulo o un cuadrado.
Ejemplo Resultado
<UL type = disc >
España
<LI>España
Francia
<LI>Francia
Italia
<LI>Italia
<LI>Portugal
Portugal
</UL>
<UL type = square>
España
<LI>España
Francia
<LI>Francia
Italia
<LI>Italia
<LI>Portugal
Portugal
</UL>
Las listas de definición muestran los elementos tipo Diccionario, o sea, término y
definición. Se utiliza para ellas la directiva <DL></DL>. El elemento marcado como
término se antecede de la directiva <DT>, el marcado como definición se antecede
de la directiva <DD>.
Proyecto de Software pagina->141
Ejemplo Resultado
<DL>
<DT>WWW WWW
<DD>Abreviatura de World Wide Web Abreviatura de World Wide Web
<DT>FTP FTP
<DD>Abreviatura de File Transfer Abreviatura de File Transfer
Protocol Protocol
<DT>IRC IRC
<DD>Abreviatura de Internet Relay Chat Abreviatura de Internet Relay Chat
</DL>
Existen otros dos tipos de listas menos comunes. Las listas de Menú o Directorio
se comportan igual que las listas sin numerar. La lista de Menú utiliza la directiva
<MENU></MENU> y los elementos se anteceden de <LI> El resultado es una lista
sin numerar más "compacta" es decir, con menos espacio interlineal entre los
elementos. La lista de Directorio utiliza la directiva <DIR></DIR> y los elementos
se anteceden de <LI>. Los elementos tienen un limite de 20 caracteres.
Todas las listas se pueden "anidar", es decir incluir una lista dentro de otra, con lo que se
consigue una estructura tipo "índice de materias".
Ejemplo Resultado
<UL type= disc>
<LI>Buscadores
<UL>
Buscadores
<LI>Google
Google
<LI>Yahoo
Yahoo
<LI>Ole
Ole
<LI>El índice
El índice
</UL>
Links
<LI>Links
Pangea
<UL>
<LI>Pangea
PIE
<LI>PIE
</UL>
</UL>
2.9 Imágenes
Hasta el momento hemos visto como se puede escribir texto en una página Web,
así como sus posibles formatos. Para incluir una imagen en nuestra página Web
utilizaremos la directiva <IMG>. Hay dos formatos de imágenes que todos los
navegadores modernos reconocen. Son las imágenes GIF y JPG. Cualquier otro
Proyecto de Software pagina->142
tipo de fichero gráfico o de imagen (BMP, PCX, CDR, etc...) no será mostrado por
el visor, a no ser que disponga de un programa externo que permita su
visualización.
src = "imagen"
Indica el nombre del fichero gráfico a mostrar.
alt = "Texto"
Mostrará el texto indicado en el caso de que el navegador utilizado para ver
la página no sea capaz de visualizar la imagen.
align = TOP / MIDDLE / BOTTOM
Las imágenes, por defecto, se comportan como si fueran un carácter,
alineándose en la misma línea que el texto que las precede o que las sigue.
Éste parámetro indica como se alineará el texto que siga a la imagen con
respecto a ésta. TOP alinea el texto con la parte superior de la imagen,
MIDDLE con la parte central, y BOTTOM con la parte inferior. Otras
opciones más avanzadas serían: TEXTTOP se alinea justo al comienzo del
texto más alto de la línea, ABSMIDDLE, se alinea en el centro real de la
imagen y ABSBOTTOM, coloca el texto justo al final de la imagen. Estos
tres parámetros son más precisos, pero no todos los navegadores los
aceptan.
align = LEFT / RIGHT
Si en el parámetro align tiene los valores left o right, la imagen dejará de
comportarse como un carácter colocándose a la izquierda o a la dercha y
permitiendo escribir texto a su otro lado (si no, sólo se podrá escribir una
línea).
border = tamaño
Indica el tamaño del "borde" de la imagen. A toda imagen se le asigna un
borde que será visible cuando la imagen forme parte de un Hyperenlace.
height = tamaño
Indica el alto de la imagen en puntos o en porcentaje. Se puede usar para
variar el tamaño de la imagen original, aunque es mejor redimensionarla en
un programa de retoque fotográfico ya que será de mejor calidad y el
archivo tendrá el tamaño apropiado.
width = tamaño
Indica el ancho de la imagen en puntos o en porcentaje. Se puede usar
para variar el tamaño de la imagen original, aunque es mejor
redimensionarla en un programa de retoque fotográfico ya que será de
mejor calidad y el archivo tendrá el tamaño apropiado.
hspace = margen
Indica el número de espacios horizontales, en puntos, que separarán la
imagen del texto que la siga y la anteceda.
vspace = margen
Indica el número de puntos verticales que separaran la imagen del texto que le siga
y la anteceda.
Proyecto de Software pagina->143
Ejemplo:
Veamos varios ejemplos "jugando" con los tamaños de la imagen, así como comprobando
la alineación de los textos. (Recuerda que en función del visor que utilices pueden verse o
no los efectos de cada parámetro).
<IMG src="caution.gif"
width=100 >
<IMG src="caution.gif"
height=20 >
<IMG src="caution.gif"
align=TOP>Atención !!! Atención !!!
<IMG src="caution.gif"
align=MIDDLE>Atención !!! Atención !!!
<IMG src="caution.gif"
align=BOTTOM>Atención !!! Atención !!!
2.10 HyperEnlaces
Cuando queremos ir a una página fuera de nuestro sitio web, siempre hay que
usar una referencia absoluta, es decir, hay que poner la url completa, incluido el
protocolo, etc. Por ejemplo: http://www.pangea.org/pacoc/manuales.
Cuando queremos ir a una página de nuestro sitio web se debe poner siempre una
referencia relativa, es decir, sólo el nombre de la página ala que queremos ir si
está en la misma carpeta, o el camino para ir desde donde estamos a donde
queremos ir. Por ejemplo, para ir a la página "principal.htm" que estuviera en la
subcarpeta "paginas" de la que estamos, habría que poner: <A
HREF="paginas/principal.htm>.
Un Hyperenlace también puede llevarnos a una zona de nuestra página. Para ello
debemos marcar en nuestra página las diferentes secciones en las que se divide.
Lo haremos con el parámetro name.
Ejemplo:
<A name = "seccion1"></A>
Un Hyperenlace puede hacerse a cualquier tipo de fichero. Con las directivas anteriores
hemos visto como hacer enlaces a páginas Web o secciones dentro de una página web, pero
podríamos hacer un Hyperenlace a un grupo de noticias, o a otro servicio de Internet.
Ejemplo:
<A href = "news://news.actualidad.es/">Noticias de actualidad</A>
Ejemplo:
<A href = "mailto: luisfd@jet.es">Envíame tus sugerencias</A>
grabarlo en nuestro ordenador. Esta es una forma sencilla de permitir a los visitantes de
nuestra página copiar ficheros a su ordenador.
Ejemplo:
<A href = "manual.zip">Pulsa aquí para llevarte una copia del manual.</A>
2.11 Tablas
Las tablas nos permiten representar cualquier elemento de nuestra página (texto,
listas, imágenes, etc...) en diferentes filas y columnas separadas entre sí. Es una
herramienta muy útil para "ordenar" contenidos de distintas partes de nuestra
página. La tabla se define mediante la directiva <TABLE></TABLE>. Los
parámetros opcionales de esta directiva son:
border = num
Indica el ancho del borde de la tabla en puntos.
cellspacing = num
Indica el espacio en puntos que separa las celdas que están dentro de la
tabla. Por defecto 2.
cellpadding = num
Indica el espacio en puntos que separa el borde de cada celda y el
contenido de esta. Por defecto 1.
width = num ó %
Indica la anchura de la tabla en puntos o en porcentaje en función del
ancho de la ventana del visor. Si no se indica este parámetro, el ancho se
adecuará al tamaño de los contenidos de las celdas.
height = num ó %
Indica la altura de la tabla en puntos o en porcentaje en función del alto de
la ventana del visor. Si no se indica este parámetro, la altura se adecuará a
la altura de los contenidos de las celdas.
bgcolor = "código de color"
Indica el color del fondo de la tabla.
background = "código de color"
Indica una imagen de fondo para la tabla.
Para definir las celdas que componen la tabla se utilizan las directivas <TD> y
<TH>. <TD> indica una celda normal, y <TH> indica una celda de "cabecera", es
decir, el contenido será resaltado en negrita y en un tamaño ligeramente superior
al normal. Los parámetros opcionales de ambas directivas son:
Se vería como
Las directivas <TD> y <TH> son cerradas según el estándar de HTML, es decir,
que un elemento de tabla <TD> debería cerrarse con un </TD>, sin embargo los
visores asumen que un elemento de la tabla, queda automáticamente "cerrado"
cuando se "abre" el siguiente.
Proyecto de Software pagina->148
2.12 Mapas
La directiva <AREA> define las áreas sensibles de la imagen y tiene los siguientes
parámetros obligatorios:
shape = "tipo"
Indica el tipo de área a definir.
coords = "coordenadas"
Indica las coordenadas de la figura indicada con shape.
href = "URL"
Indica la dirección a la que se accede si se pulsa en la zona delimitada por
el área indicada.
rect
Área rectangular. Se deben especificar las coordenadas de la esquina
superior izquierda y las de la esquina inferior derecha.
poly
Polígono. Se deben especificar las coordenadas de todos los vértices del
polígono. El visor se encarga de "cerrar" la figura.
circle
Círculo. Se debe especificar en primer lugar las coordenadas del centro del
círculo y a continuación el valor del radio (en puntos).
Proyecto de Software pagina->149
Para activar el mapa debemos indicar la imagen a mostrar, indicando que dicha imagen es
tratada por un mapa. Para ello escribiríamos la siguiente directiva:
Si tu visor tiene la capacidad de gestionar este tipo de mapas (Netscape 2.x o Ms-
Explorer 2.x), prueba a pulsar sobre alguna parte del mapa que hemos definido y
que te aparecerá a continuación:
Estas directivas pueden no funcionar en algún visor de HTML, pero el uso de ellas
por parte de los dos "grandes" del software para Internet hace prever que serán
inmediatamente incluidas en las nuevas versiones del resto de los visores.
2.14 Marquee
Nuestra página Web puede tener un sonido que se active al entrar en la página.
Esta característica de Ms Explorer utiliza la directiva <BGSOUND> y tiene los
siguientes parámetros:
Proyecto de Software pagina->151
src = "fichero"
Indica el nombre del fichero que contiene el sonido (.wav, .mid).
loop = num / infinite
Indica el número de veces que se reproducirá el sonido. Si se indica infinite,
el sonido se reproducirá de forma continua hasta que abandonemos la
página.
src = "fichero"
Indica el nombre del fichero (sonido .wav o .mid, o cualquier otro).
loop = num / infinite
Indica el número de veces que se reproducirá el sonido. Si se indica infinite,
el sonido se reproducirá de forma continua hasta que abandonemos la
página.
width = "número"
Ancho del objeto insertado. Si se quiere que no se vea se puede poner en 0
o utilizar el parámetro <HIDDEN>
height = "número"
Altura del objeto insertado. Si se quiere que no se vea se puede poner en 0
o utilizar el parámetro <HIDDEN>
HIDDEN = true
Ocultar el gestor de sonidos.
AUTOSTART = true
Se activará el sonido al cargarse la página.
Estos dos últimos parámetros los utilizaremos cuando queramos poner sonidos de
fondo para Netscape. Habrá que utilizar tanto esta directiva como la
<BGSOUND>. De esta manera el sonido de fondo funcionará tanto en Netscape
como en Explorer.
Los marcos son una técnica para dividir la ventana del visor en diferentes zonas.
Cada una de estos marcos se podrá manipular por separado, permitiéndonos
mostrar en cada una de ellos una página Web diferente. Esto es muy útil para, por
Proyecto de Software pagina->152
Para definir los diferentes marcos o frames se utilizan las directivas <FRAMESET>
</FRAMESET> y <FRAME>. La directiva <FRAMESET> indica como se va a
dividir la ventana principal. Pueden incluirse varias directivas <FRAMESET>
anidadas con el objeto de subdividir una división. Los parámetros de
<FRAMESET> son rows y cols en función de si la división de la pantalla se
realiza por filas (rows) o columnas (cols). Los parámetros rows y cols se
acompañan de un grupo de números que indican en puntos o en porcentaje el
tamaño de cada uno de los marcos. En caso de utilizar rows los tamaños de los
marcos se entienden indicados de arriba a abajo, es decir, el primer valor será el
asignado al marco superior, el segundo al marco inmediatamente inferior, etc... En
el caso de cols los tamaños se aplican de izquierda a derecha.
Ejemplos Resultado
Crea tres marcos horizontales, la
primera ocupará un 20% de la
<FRAMESET rows = "25%,50%,25%">
ventana principal, la segunda un
50% y la tercera un 25%.
Crea tres marcos verticales, la
primera y la tercera tendrán un
"ancho" fijo de 120 y 100 puntos
<FRAMESET cols = "120,*,100">
respectivamente. La segunda
ocupará el resto de la ventana
principal (*).
En este caso "anidamos" dos
directivas. La primera divide la
ventana principal en dos marcos
verticales, la primera ocupa un
15% de la ventana principal y la
<FRAMESET cols = "15%,*"> segunda el resto. La segunda
<FRAMESET rows = 20%,*"> directiva vuelve a subdividir el
primer marco creado
anteriormente, pero esta vez en
dos marcos horizontales, el
superior ocupará un 20% de la
ventana, y el inferior el resto.
border = "número"
Proyecto de Software pagina->153
Permite cambiar o quitar (0) el borde entre los marcos. Por defecto,
aparece. Para que también funcione en Explorer habrá que usar
frameborder = 0
framespacing = "número"
Permite cambiar el espacio entre el borde del marco y la página.
name = "nombre"
Indica el nombre por el que nos referiremos a ese marco.
src = "URL"
El marco mostrará en principio el contenido del documento HTML que se
indique.
marginwidth = num.
Indica, en puntos, el margen izquierdo y derecho del marco.
marginheight = num
Indica, en puntos, el margen superior e inferior del marco.
scrolling = "yes / no / auto"
Indica si se aplica una barra de desplazamiento al marco en el caso de que
la página que se cargue en ella no quepa en los límites del marco. El valor
"yes" muestra siempre la barra de desplazamiento, "no" no la muestra
nunca (la zona de la página que no quepa en el marco no la veremos), y
"auto" la muestra sólo en caso de que sea necesario para poder ver la
página.
noresize
Si se indica este parámetro, el usuario no podrá "redimensionar" los marcos
con el visor. Un usuario que esté viendo una página con marcos puede
redimensionarlos seleccionando un borde del marco con el ratón y
desplazándolo.
En vista del aprendizaje que tenemos diariamente en el aula de clases, nos vemos
desafiados por un mundo lleno de conocimientos que invoca a la investigación.
Proyecto de Software pagina->154
Este trabajo fue realizado precisamente para llenar las expectativas y ansias de
intelectualidad que nos brinda la carrera, desde bases de datos, vemos la
importancia de la arquitectura cliente servidor.
Conocer una arquitectura que en este momento es una de las más importantes y
utilizadas en el ámbito de enviar y recibir información, también es una herramienta
potente para guardar los datos en una base de datos como servidor.
Elementos principales
Por otro lado el cliente también puede ser una computadora personal o una
televisión inteligente que posea la capacidad de entender datos digitales. Dentro
de este caso el elemento servidor es el depositario del vídeo digital, audio,
fotografías digitales y texto y los distribuye bajo demanda de ser una maquina que
Proyecto de Software pagina->155
cuenta con la capacidad de almacenar los datos y ejecutar todo el software que
brinda éstos al cliente.
En Resumen
Pedido de servicio.
Respuesta
"En esta arquitectura la computadora de cada uno de los usuarios, llamada cliente,
produce una demanda de información a cualquiera de las computadoras que
proporcionan información, conocidas como servidores"estos últimos responden a
la demanda del cliente que la produjo.
Los clientes y los servidores pueden estar conectados a una red local o una red
amplia, como la que se puede implementar en una empresa o a una red mundial
como lo es la Internet.
Bajo este modelo cada usuario tiene la libertad de obtener la información que
requiera en un momento dado proveniente de una o varias fuentes locales o
Proyecto de Software pagina->157
Debemos señalar que para seleccionar el modelo de una arquitectura, hay que
partir del contexto tecnológico y organizativo del momento y, que la arquitectura
Cliente/Servidor requiere una determinada especialización de cada uno de los
diferentes componentes que la integran.
QUE ES UN CLIENTE
QUE ES UN SERVIDOR
Para ver el gráfico seleccione la opción ¨Descargar trabajo¨ del menú superior
Presentación/Captación de Información
Procesos
Almacenamiento de la Información
Proyecto de Software pagina->158
Aplicaciones Cliente/Servidor
Para ver el gráfico seleccione la opción ¨Descargar trabajo¨ del menú superior
Puestos de Trabajo
Comunicaciones
Servidores
Una máquina que suministra una serie de servicios como Bases de Datos,
Archivos, Comunicaciones,...).
Los Servidores, según la especialización y los requerimientos de los servicios que
debe suministrar pueden ser:
Mainframes
Miniordenadores
Especializados (Dispositivos de Red, Imagen, etc.)
Las Comunicaciones
Infraestructura de redes
Infraestructura de comunicaciones
Infraestructura de redes
Infraestructura de comunicaciones
1. El Cliente y el Servidor pueden actuar como una sola entidad y también pueden
actuar como entidades separadas, realizando actividades o tareas independientes.
Para ver el gráfico seleccione la opción ¨Descargar trabajo¨ del menú superior
También es importante hacer notar que las funciones Cliente/Servidor pueden ser
dinámicas. Ejemplo, un servidor puede convertirse en cliente cuando realiza la
solicitud de servicios a otras plataformas dentro de la red.
7. Además se constituye como el nexo de unión mas adecuado para reconciliar los
sistemas de información basados en mainframes o minicomputadores, con
aquellos otros sustentados en entornos informáticos pequeños y estaciones de
trabajo.
TIPOS DE CLIENTES
1. "cliente flaco":
1. "cliente gordo":
TIPOS DE SERVIDOR
Servidores de archivos
Servidor donde se almacenan las bases de datos, tablas, índices. Es uno de los
servidores que más carga tiene.
Servidores de transacciones
Servidor que cumple o procesa todas las transacciones. Valida primero y recién
genera un pedido al servidor de bases de datos.
Servidores de Groupware
Contienen objetos que deben estar fuera del servidor de base de datos. Estos
objetos pueden ser videos, imágenes, objetos multimedia en general.
Servidores Web
Se usan como una forma inteligente para comunicación entre empresas a través
de Internet.
Proyecto de Software pagina->162
PRESENTACIÓN DISTRIBUIDA
Ventajas
Desventajas
PRESENTACIÓN REMOTA
Ventajas
Desventajas
LÓGICA DISTRIBUIDA
Proyecto de Software pagina->163
Ventajas
Desventajas
Es difícil de diseñar.
Difícil prueba y mantenimiento si los programas del cliente y el servidor están
hechos en distintos lenguajes de programación.
No son manejados por la GUI 4GL.
Ventajas
Desventajas
Ventajas
Desventajas
Definición de middleware
"Es un termino que abarca a todo el software distribuido necesario para el soporte
de interacciones entre Clientes y Servidores".
Este se inicia en el modulo de API de la parte del cliente que se emplea para
invocar un servicio real; esto pertenece a los dominios del servidor. Tampoco a la
interfaz del usuario ni la a la lógica de la aplicación en los dominios del cliente.
Tipos de Middleware
1. Middleware general
4. MANEJO DE SOCKETS
"¿De dónde saco yo este descriptor de fichero para comunicar a través de la red,
señor sabelotodo?" Esta es probablemente la última pregunta en la que piensas
ahora, pero voy a contestarla de todas maneras: usas la llamada al sistema
socket(). Te devuelve un descriptor de fichero y tú te comunicas con él usando las
llamadas al sistema especializadas send() y recv() ( man send , man recv ).
"¡Pero, oye!" puede que exclames ahora. "Si es un descriptor de fichero, por qué,
en el nombre de Neptuno, no puedo usar las llamadas normales read() y write()
para comunicarme a través de un socket ." La respuesta corta es, "¡Sí que
puedes!" La respuesta larga es, "Puedes usarlas, pero send() y recv() te ofrecen
mucho más control sobre la transmisión de datos."
¿Y ahora qué? Qué tal esto: hay muchos tipos de sockets. Existen las direcciones
de Internet DARPA (sockets de internet), rutas sobre nodos locales (sockets de
Unix), direcciones X.25 del CCITT ( sockets éstos de X.25 que puedes ignorar
perfectamente) y probablemente muchos más en función de la modalidad de Unix
que estés ejecutando. Este documento se ocupa únicamente de los primeros: los
sockets de Internet.
¿Qué es esto? ¿Hay dos tipos de sockets de internet? Sí. Bueno no, estoy
mintiendo. En realidad hay más pero no quería asustarte. Aquí sólo voy a hablar
de dos tipos. A excepción de esta frase, en la que voy a mencionar que los sockets
puros [Raw Sockets] son también muy potentes y quizás quieras buscarlos más
adelante.
Proyecto de Software pagina->166
Muy bien. ¿Cuáles son estos dos tipos? El primer tipo de sockets lo definen los
sockets de flujo [Stream sockets]; El otro, los sockets de datagramas [Datagram
sockets], a los que en adelante me referiré, respectivamente como
"SOCK_STREAM" y "SOCK_DGRAM ". En ocasiones, a los sockets de
datagramas se les llama también "sockets sin conexión". (Aunque se puede usar
connect() con ellos, si se quiere. Consulta connect() , más abajo.)
¿Qué aplicación tienen los sockets de flujo? Bueno, quizás has oído hablar del
programa telnet. ¿Sí? telnet usa sockets de flujo. Todos los carácteres que tecleas
tienen que llegar en el mismo orden en que tú los tecleas, ¿no? También los
navegadores, que usan el protocolo HTTP , usan sockets de flujo para obtener las
páginas. De hecho, si haces telnet a un sitio de la web sobre el puerto 80, y
escribes " GET / ", recibirás como respuesta el código HTML.
¿Cómo consiguen los sockets de flujo este alto nivel de calidad en la transmisión
de datos? Usan un protocolo llamado "Protocolo de Control de Transmisión", más
conocido como "TCP" (consulta el RFC-793 para información extremadamente
detallada acerca de TCP). TCP asegura que tu información llega secuencialmente
y sin errores. Puede que hayas oído antes "TCP" como parte del acrónimo "
TCP/IP ", donde "IP" significa "Protocolo de Internet" (consulta el RFC-791 .) IP se
encarga básicamente del encaminamiento a través de Internet y en general no es
responsable de la integridad de los datos.
Estupendo. ¿Qué hay de los sockets de datagramas? ¿Por qué se les llama
sockets sin conexión? ¿De qué va esto, en definitiva, y por qué no son fiables?
Bueno, estos son los hechos: si envías un datagrama, puede que llegue. Puede
que llegue fuera de secuencia. Si llega, los datos que contiene el paquete no
tendrán errores.
¿Por qué son sin conexión? Bueno, básicamente porque no tienes que mantener
una conexión abierta como harías con los sockets de flujo. Simplemente montas
un paquete, le metes una cabecera IP con la información de destino y lo envías.
No se necesita conexión. Generalmente se usan para transferencias de
información por paquetes. Aplicaciones que usan este tipo de sockets son, por
ejemplo, tftp y bootp.
"¡Basta!" puede que grites. "¿Cómo pueden siquiera funcionar estos programas si
los datagramas podrían llegar a perderse?". Bien, mi amigo humano, cada uno
Proyecto de Software pagina->167
tiene su propio protocolo encima de UDP. Por ejemplo, el protocolo tftp establece
que, para cada paquete enviado, el receptor tiene que devolver un paquete que
diga, "¡Lo tengo!" (un paquete "ACK"). Si el emisor del paquete original no obtiene
ninguna respuesta en, vamos a decir, cinco segundos, retransmitirá el paquete
hasta que finalmente reciba un ACK . Este procedimiento de confirmaciones es
muy importante si se implementan aplicaciones basadas en SOCK_DGRAM.
¡Eh tíos, es hora de aprender algo sobre Encapsulación de datos ! Esto es muy,
muy importante. Tan importante que podrías aprenderlo si te matricularas en el
curso de redes aquí, en el estado de Chico ;-). Básicamente consiste en esto: un
paquete de datos nace, el paquete se envuelve (se "encapsula") con una cabecera
(y raramente con un pie) por el primer protocolo (por ejemplo el protocolo TFTP),
entonces todo ello (cabecera de TFTP incluida) se encapsula otra vez por el
siguiente protocolo (por ejemplo UDP), y otra vez por el siguiente (IP) y otra vez
por el protocolo final o nivel (físico) del hardware (por ejemplo, Ethernet)
Ahora puedo finalmente hablar del conocido Modelo de redes en niveles [Layered
Network Model]. Este modelo de red describe un sistema de funcionalidades de
red que tiene muchas ventajas sobre otros modelos. Por ejemplo, puedes escribir
programas de sockets sin preocuparte de cómo los datos se transmiten
físicamente (serie, thin ethernet, AUI, lo que sea) porque los programas en los
niveles más bajos se ocupan de eso por ti. El hardware y la topología real de la
red son transparentes para el programador de sockets.
Sin más preámbulos, te presento los niveles del modelo completo. Recuerda esto
para tus exámenes de redes:
Aplicación
Presentación
Proyecto de Software pagina->168
Sesión
Transporte
Red
Enlace de datos
Físico
El nivel físico es el hardware (serie, Ethernet, etc.) El nivel de aplicación está tan
lejos del nivel físico como puedas imaginar--es el lugar donde los usarios
interactúan con la red.
Sin embargo, este modelo es tan general que si quisieras podrías usarlo como una
guía para reparar coches. Un modelo de niveles más consistente con Unix podría
ser:
¿Ves cuánto trabajo se necesita para construir un solo paquete? ¡Dios! ¡Y tienes
que teclear la cabecera de los paquetes tú mismo, usando "cat"! Sólo bromeaba.
Todo lo que tienes que hacer con los sockets de flujo es usar send() para enviar
tus datos. Para los sockets de datagramas tienes que encapsular el paquete
según el método de tu elección y enviarlo usando sendto(). El núcleo implementa
los niveles de Internet y de Transporte por ti, y el hardware el nivel de acceso a la
red. Ah, tecnología moderna.
Así finaliza nuestra breve incursión en la teoría de redes. Ah, olvidaba contarte
todo lo que quería decir acerca del encaminamiento: ¡nada! Exacto, no voy a
hablar de él en absoluto. el encaminador retira la información de la cabecera IP,
consulta su tabla de encaminamiento, bla, bla, bla. Consulta el RFC sobre IP si de
verdad te importa. Si nunca aprendes nada de eso probablemente sobrevivirás.
5. DEFINICIÓN DE SERVLETS
Proyecto de Software pagina->169
5.1 Introducción
Los Servlets son módulos que extienden los servidores orientados a petición-
respuesta, como los servidores web compatibles con Java. Por ejemplo, un servlet
podría ser responsable de tomar los datos de un formulario de entrada de pedidos
en HTML y aplicarle la lógica de negocios utilizada para actualizar la base de
datos de pedidos de la compañia.
Los Servlets son para los servidores lo que los applets son para los navegadores.
Sin embargo, al contrario que los applets, los servlets no tienen interface gráfico
de usuario.
Los servelts pueden ser incluidos en muchos servidores diferentes porque el API
Servlet, el que se utiliza para escribir Servlets, no asume nada sobre el entorno o
protocolo del servidor. Los servlets se están utilizando ampliamente dentro de
servidores HTTP; muchos servidores Web soportan el API Servlet.
Los Servlets son un reemplazo efectivo para los scripts CGI. Proporcionan una
forma de generar documentos dinámicos que son fáciles de escribir y rápidos en
ejecutarse. Los Servlets también solucionan el problema de hacer la programación
del lado del servidor con APIs específicos de la plataforma: están desarrollados
con el API Java Servlet, una extensión estándard de Java.
Por eso se utilizan los servlets para manejar peticiones de cliente HTTP. Por
ejemplo, tener un servlet procesando datos POSTeados sobre HTTP utilizando un
formulario HTML, incluyendo datos del pedido o de la tarjeta de crédito. Un servlet
como este podría ser parte de un sistema de procesamiento de pedidos,
trabajando con bases de datos de productos e inventarios, y quizas un sistema de
pago on-line.
out.println("<HTML><HEAD><TITLE>");
out.println(title);
out.println("</TITLE></HEAD><BODY>");
out.println("<H1>" + title + "</H1>");
out.println("<P>This is output from SimpleServlet.");
out.println("</BODY></HTML>");
out.close();
}
}
Tomcat
JAVA_HOME=/usr/local/jdk1.2.2
CLASS_PATH=$JAVA_HOME/jre/lib/ext
./bootstrap.sh
El resultado será un fichero denominado ant.jar dentro del directorio /lib, que será
utilizado durante la compilación de Tomcat.
Esto tendrá como resultado el archivo servlet.jar en el subdirectorio lib/, que será
necesario para la compilación de WatchDog.
Sin embargo, como vamos a utilizar Apache como servidor Web, tendremos que
deshabilitar esta última característica de Tomcat. Para ello, editamos el archivo
/usr/local/jakarta/dist/tomcat/conf/server.xml y comentamos, mediante comentarios
de HTML (<!-- -->) las líneas siguientes:
Apache
Podemos instalar Apache a partir de las fuentes que podemos descargar desde la
web de Apache . Tras descomprimir el archivo descargado en cualquier directorio
que usemos para compilar (por ejemplo, /var/instalacion/), mediante tar -xvzf
apache_1.3.20.tar.gz, modificamos el archivo /var/instalacion/apache_1.3.20/src/
Configuration.tmpl , descomentando la línea AddModule
modules/standard/mod_so.o . Tras hacer esto nos situamos en la raiz del
directorio de fuentes de Apache, y ejecutamos:
./configure --prefix=/usr/local/apache
make
make install
Para probar que el servidor está correctamente instalado tan solo deberemos
ejecutar /usr/local/apache/bin/apachectl start y entrar mediante el navegador en la
dirección http://localhost.
Integración Apache-Tomcat
include /usr/local/jakarta/dist/tomcat/conf/mod_jk.conf-auto
Hay que tener en cuenta que todos lo incluido dentro del directorio
/usr/local/jakarta/dist/tomcat/webapps será servido por el servidor, aunque dicho
directorio no haya sido incluido en los archivos de configuración. Es por ello que
deberemos borrar este directorio si no deseamos que esto sea así.
BIBLIOGRAFIA
“Como programar en Java”, Deitel & Deitel, Pearson Education – primera edición
“Aprendiendo Java en 21 dias”, Lemay – Perkins, Sams.net Publishing – primera
edición
Proyecto de Software pagina->176
GLOSARIO
abstract: Abstracto.Aplicable a clases o métodos.
clase: Estructura que define como son los objetos, indicando sus
atributos y sus acciones.
LECTURAS COMPLEMENTARIAS