Ajax y XHTML
Ajax y XHTML
dos.
Etapas de Desarrollo
Objetivos Logrados
Se han alcanzado plenamente la totalidad de los objetivos planteados para
el presente trabajo.
• Aplicación desarrollada.
1 Introducción 1
1.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.1 Las Tecnologías Web . . . . . . . . . . . . . . . . . . . . 1
1.1.2 Visión en Conjunto . . . . . . . . . . . . . . . . . . . . . 4
1.1.3 Forman Parte de las RIA . . . . . . . . . . . . . . . . . 5
1.2 Algunos Ejemplos Reales de AJAX . . . . . . . . . . . . . . . 8
1.2.1 Notas Finales . . . . . . . . . . . . . . . . . . . . . . . . 9
2 Las RIA 11
2.1 HTML y XHTML . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.1 Conceptos Básicos de HTML . . . . . . . . . . . . . . . 11
2.1.2 Estructura del Documento HTML, Ejemplo Básico . . . 11
2.1.3 Tags de Imagen y Tabla . . . . . . . . . . . . . . . . . . 13
2.1.4 Hiperenlaces . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2 XHTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.1 Diferencias Más Importantes Entre XHTML y HTML . 19
2.2.2 ¿Cómo Validar una Página Web? . . . . . . . . . . . . . 22
2.3 XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.4 JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.4.1 Crear un Nuevo Objeto . . . . . . . . . . . . . . . . . . 23
2.4.2 Crear un Nuevo Constructor . . . . . . . . . . . . . . . 24
2.4.3 Asignar un Método a un Objeto . . . . . . . . . . . . . 24
2.5 Applet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.6 Adobe Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.7 Java WebStart . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.7.1 Obtención del Software de Java Web Start . . . . . . . . 29
2.7.2 Ejecución de una Aplicación con el Software de Java
Web Start . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.8 DHTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
vii
ÍNDICE GENERAL viii
2.8.1 Usos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3 El Objeto XMLHttpRequest 32
3.1 Descripción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.1.1 Implementación y Uso de la Interfaz . . . . . . . . . . . 33
3.2 Características Generales del Objeto . . . . . . . . . . . . . . . 33
3.2.1 Razones Para Utilizar una Librería en el Lado Cliente . 33
3.2.2 La Dependencia de los Navegadores . . . . . . . . . . . 35
3.3 Navegadores Compatibles . . . . . . . . . . . . . . . . . . . . . 39
3.4 Métodos y Propiedades del Objeto . . . . . . . . . . . . . . . . 40
3.4.1 Métodos . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.4.2 Propiedades . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.5 Peticiones Síncronas y Asíncronas . . . . . . . . . . . . . . . . 42
3.6 Escribir Clases en JavaScript . . . . . . . . . . . . . . . . . . . 48
3.6.1 Clases VS Prototipos . . . . . . . . . . . . . . . . . . . . 48
3.6.2 Prototype vs Encerrar las Funciones . . . . . . . . . . . 51
3.6.3 Variables Públicas vs Variables Privadas . . . . . . . . 51
4 Herramientas de Depuración 52
4.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.2 Instalación de las Herramientas . . . . . . . . . . . . . . . . . 52
4.3 La Consola JavaScript . . . . . . . . . . . . . . . . . . . . . . . 54
4.4 Document Object Model Inspector (Inspector del DOM) . . . 56
4.4.1 ¿Cómo Funciona? . . . . . . . . . . . . . . . . . . . . . 59
4.5 Venkman(Depurador de Javascript) . . . . . . . . . . . . . . . 60
4.6 Firebug (Todo lo Anterior en Uno) . . . . . . . . . . . . . . . . 66
4.6.1 Funcionalidades de Firebug . . . . . . . . . . . . . . . . 69
5 Petición de Información 75
5.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
5.2 Insertar Código HTML . . . . . . . . . . . . . . . . . . . . . . 75
5.3 Insertar Imágenes Usando el DOM . . . . . . . . . . . . . . . 79
5.4 Insertar Código JavaScript . . . . . . . . . . . . . . . . . . . . 83
5.5 DOM API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
5.6 DOM API e innerHTML . . . . . . . . . . . . . . . . . . . . . 90
5.7 Encapsulación del Objeto XMLHttpRequest . . . . . . . . . . 95
5.8 Petición de Código Javascript y Lanzarlo . . . . . . . . . . . . 102
5.9 Manejo de Errores . . . . . . . . . . . . . . . . . . . . . . . . . 104
5.10 Dar Soporte al Usuario . . . . . . . . . . . . . . . . . . . . . . 107
ÍNDICE GENERAL ix
11 Conclusiones 265
11.1 Respecto del Futuro de AJAX . . . . . . . . . . . . . . . . . . 265
11.2 Respecto del Motor de Base de Datos Utilizado . . . . . . . . . 266
11.3 Respecto del Entorno de Desarrollo Utilizado . . . . . . . . . . 266
11.4 Líneas Futuras de Acción . . . . . . . . . . . . . . . . . . . . . 266
Bibliografía 268
xii
ÍNDICE DE FIGURAS xiii
Introducción
1.1 Introducción
Antes de emprender la lectura de este texto hay ciertas cosas que sería bueno
conocer para entender perfectamente qué es AJAX y en qué lugar se ubi-
ca dentro del desarrollo de aplicaciones Web. Por ello se aprovechará esta
introducción para hablar del entorno que rodea a AJAX [4, AJAX].
1
CAPÍTULO 1. INTRODUCCIÓN 2
HTML es el lenguaje básico con el que se pueden crear páginas Web, con el
paso del tiempo se han ido añadiendo etiquetas a las que ya tenía además de
dar soporte a otros lenguajes como CSS (Cascade Style Sheets).
Las versiones anteriores a la 3.2 del lenguaje están ya caducadas y no son
útiles hoy día; hoy en día un nuevo proyecto se debería emprender intentando
seguir el estándar XHTML que es la última versión, aprobada en enero 2000.
Este lenguaje es el que ha supuesto el mayor cambio desde 1997 (HTML 3.2),
ya que busca proporcionar páginas Web ricas en contenido a un amplio abanico
de dispositivos PC, móviles y dispositivos con conexión inalámbrica.
Ahora que se tiene las CSS [5], se asigna a las etiquetas una clase dentro del
documento “.html”, y a esa clase contenida en otro documento se le especifica
el formato, de esta forma se tienen dos documentos: uno con los datos y
otro que dice cómo deben representarse. Si se quisiera hacer un cambio en la
representación de una Web compuesta por 100 páginas y las 100 leen el mismo
CSS, con un solo cambio en el “.css” se habría cambiado toda la representación
automáticamente.
• Se tiene una página Web con código de alguno de estos lenguajes guar-
dada en el servidor; cuando un usuario (cliente) accede a ésta, el servidor
la ejecuta y le devuelve el resultado al cliente, que será solo HTML, no
contendrá lenguajes del lado del servidor ya que el navegador no los
comprende.
Para que se entienda la necesidad del uso de AJAX, se va a ver una serie
de términos, problemas y posibles soluciones y ver cuál es el papel de AJAX
dentro de todo esto [4, AJAX].
• Respuesta lenta.
Por estas razones nacieron las (RIA), Rich Internet Application Technolo-
gies.
• Applet.
• Adobe Flash.
• Java WebStart.
• DHTML.
• APPLET.
CAPÍTULO 1. INTRODUCCIÓN 6
— Ventajas:
∗ Puede hacer uso de todas las APIS Java.
∗ Su desarrollo tiene un patrón de trabajo bien definido.
∗ Puede manipular gráficos y crear Interfaces de Usuario avan-
zadas.
— Desventajas:
∗ El navegador necesita un Plug-in.
∗ El tiempo de bajada del APPLET puede ser muy grande.
• ADOBE FLASH
Fue diseñado para ver Películas Interactivas, aunque ahora se utiliza mucho
para hacer juegos monousuario para Web ya que es programable con ActionS-
cript.
— Ventajas:
∗ Es capaz de dar un aspecto visual inigualable actualmente con
otras tecnologías para una página Web.
∗ Muy bueno para mostrar gráficos vectoriales 3D.
— Desventajas:
∗ El navegador necesita un plug-in.
∗ ActionScript es una tecnología propietaria.
∗ El tiempo de bajada del vídeo o programa suele ser muy grande
(lo bonito se paga).
• JAVA WEBSTART
— Ventajas:
∗ Una vez cargado, da una experiencia similar a una aplicación
de escritorio.
∗ Utiliza Tecnología muy extendida como Java.
∗ Las aplicaciones se pueden firmar digitalmente.
∗ Se pueden seguir utilizando una vez desconectado.
CAPÍTULO 1. INTRODUCCIÓN 7
— Desventajas:
∗ El navegador necesita un plug-in.
∗ Problema de compatibilidad con las aplicaciones viejas ya que
se han cambiado algunas cosas.
∗ El tiempo que puede tardar en descargar una aplicación de
escritorio es demasiado grande.
— Ventajas:
∗ Se utiliza para crear aplicaciones interactivas y más rápidas.
— Desventajas:
∗ La comunicación es síncrona.
∗ Requiere el refresco completo de la página, perdiendo parte del
contexto.
— Ventajas:
∗ La mejor tecnología RIA hasta el momento.
∗ Está en su mejor momento para la industria.
∗ No se necesita descargar plug-in.
— Desventaja:
∗ Todavía existen incompatibilidades entre navegadores (cada
vez menos).
∗ Desarrollo con Javascript, hoy día no suficientemente explora-
do.
Como muestra la evolución de las tecnologías Web y los ejemplos reales del uso
de AJAX llega el momento en que las compañías que se dedican al desarrollo
Web hagan los cursillos de reciclaje a sus empleados, la documentación que
sigue ha sido desarrollada basándose en muchas fuentes, se ha hecho intentan-
do que la curva de aprendizaje sea lo menos pronunciada posible por si hay
personas que se quieren iniciar en el desarrollo Web con AJAX.
CAPÍTULO 1. INTRODUCCIÓN 10
Las RIA
<HTML>
<HEAD>
11
CAPÍTULO 2. LAS RIA 12
</HEAD>
<BODY>
</BODY>
</HTML>
Hay tres tags que describen las partes del documento y que son imprescin-
dibles:
todo lo que se hace es encerrar texto entre tags para formatearlo, centrarlo,
etc., casi todo lo que permitiría hacer un procesador de textos actual.
Leer imágenes o crear tablas puede resultar un tanto más complejo debido a
la anidación de los campos.
Imágenes:
<HTML>
<HEAD>
</HEAD>
<BODY>
<B>Imagen de Prueba</B>
</BODY>
</HTML>
<HEAD>
CAPÍTULO 2. LAS RIA 15
</HEAD>
<BODY>
<CENTER>
<B>Imágen de Prueba</B>
<BR>
</CENTER>
<CENTER>
</CENTER>
</BODY>
</HTML>
CAPÍTULO 2. LAS RIA 16
Tablas
Una tabla HTML puede ser considerada de manera simple como un grupo
de filas donde cada una de ellas contiene un grupo de celdas. Las tablas, así
como toda estructura en documentos HTML, son definidas usando tags. A
continuación se agrega una tabla en el ejemplo anterior.
<HTML>
<HEAD>
</HEAD>
<BODY>
<CENTER>
<B>Imágen de Prueba</B>
<BR>
</CENTER>
<CENTER>
</CENTER>
<CENTER>
<TABLE border=“4”>
<TR>
<TH>Nombre Empresa</TH>
<TH>Dirección</TH>
<TH>Provincia</TH>
</TR>
<TR>
CAPÍTULO 2. LAS RIA 17
<TD>“Baterías Rac”</TD>
<TD>Rivadavia 60</TD>
<TD>Formosa</TD>
</TR>
</TABLE>
</CENTER>
</BODY>
</HTML>
2.1.4 Hiperenlaces
Los vínculos son una parte vital de HTML y del concepto mismo de la Web.
Internet es considerada una red debido a cómo los vínculos conectan partes o
documentos separados, basados en la idea de una simple referencia sumada a
la interactividad.
Un vínculo HTML puede ser básicamente considerado como una referen-
cia a otro recurso. Esta referencia establece una relación implícita entre el
documento y el recurso vinculado. Los vínculos pueden ser clasificados como
visuales (ubicados dentro del contenido del documento) u ocultos (definiendo
información relacional generalizada).
CAPÍTULO 2. LAS RIA 18
• <A href=“http://www.google.com/”>Buscador</A>
2.2 XHTML
su uso ya que no todos forman parte de la real academia, XHTML es una forma
estricta de escribir HTML ya que esta definido en XML y tiene un documento
DTD de validación. Esta forma de escribir es totalmente compatible con
HTML 4.01 ya que se definió a partir de éste, con lo cual, cualquier navegador
puede leerlo [5].
— Ejemplo:
∗ Forma incorrecta:
— Ejemplo:
<html>
</html>
• Los tags que eran únicos y no tenían tag de cierre, ahora llevan el símbolo
de finalización, <br> ahora se escribiría como <br /> dejando un espacio
entre br y / para que sea compatible con los navegadores actuales.
CAPÍTULO 2. LAS RIA 20
— Ejemplo:
∗ En HTML:
<!DOCTYPE ...>
<html>
<head>
<title>... </title>
</head>
</html>
CAPÍTULO 2. LAS RIA 21
HTML XHTML
compact compact=“compact”
checked checked=“checked”
declare declare=“declare”
readonly readonly=“readonly”
disabled disabled=“disabled”
selected selected=“selected”
defer defer=“defer”
nohref nohref=“nohref”
noshade noshade=“noshade”
nowrap nowrap=“nowrap”
multiple multiple=“multiple”
noresize noresize=“noresize”
ismap ismap=“ismap”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd”>
El Consorcio Word Wide Web posee una página Web que contiene una aplica-
ción para validar páginas XHTML, CSS, etc., el mismo verifica que las páginas
esten correctamente construidas, su dirección es http://validator.w3.org/.
2.3 XML
• Código:
<Biblioteca>
<Libro>
<ISBN>84-688-4704-6</ISBN>
</Libro>
<Libro>
<ISBN>84-689-1037-6</ISBN>
CAPÍTULO 2. LAS RIA 23
</Libro>
</Biblioteca>
2.4 JavaScript
Para crear una clase en JavaScript se debe escribir una función especial, que se
encargará de construir el objeto en memoria e inicializarlo. Esta función se le
llama constructor en la terminología de la programación orientada a objetos.
function constructorObjeto (param01,...,paramN)
var privada01 = “Soy privada”; //Las variables creadas con var son privadas.
...
this.variableN = paramN;
this.funcion01 = funcion01;
...
this.funcionN = funcionN;
Utiliza la palabra this para declarar las propiedades y métodos del objeto
que se está construyendo. A ese objeto que se está construyendo se le asignan
valores en sus propiedades y también nombres de funciones definidas para
sus métodos. Al construir un objeto técnicamente es lo mismo declarar una
propiedad o un método, solo difiere en que a una propiedad se le asigna un
valor y a un método se le asigna una función.
Al crear una función que esté ligada a un objeto desde su creación sin necesi-
dad de especificarlo durante su creación, lo mejor es emplear prototipos, pero
también es posible asignar una función en cualquier momento a una variable
como se observa a continuación, esto se usa a lo largo de todo el libro para
reasignar los manejadores de la clase AJAX.
CAPÍTULO 2. LAS RIA 25
function funcionX(argumento01,...,argumentoM)
Código de la función.
• Ejemplo:
<html>
<body>
function constructorPastel(chocolate,nata,galletas)
this.chocolate = chocolate;
this.galletas = galletas;
this.nata = nata;
this.ingredienteSecreto;
this.montarPastel = montar;
function montar()
pastelSoloChocolate.ingredienteSecreto = 20;
CAPÍTULO 2. LAS RIA 26
pastelSoloChocolate.montarPastel();
</script>
</body>
</html>
2.5 Applet
2.8 DHTML
En una página DHTML, una vez que ha sido cargada completamente por
el cliente, se ejecuta un código (como por ejemplo JavaScript) que tiene efectos
en los valores del lenguaje de definición de la presentación (por ejemplo CSS ),
logrando así una modificación en la información presentada o el aspecto visual
de la página mientras el usuario la está viendo.
2.8.1 Usos
Entre los usos más habituales del DHTML se pueden destacar los siguientes:
• Menús desplegables.
• Imágenes que cambian al pasar el cursor sobre ellas.
• Objetos en movimiento.
• Cronómetros, etc.
El Objeto XMLHttpRequest
3.1 Descripción
32
CAPÍTULO 3. EL OBJETO XMLHTTPREQUEST 33
Características básicas que debe cubrir una librería en el lado del cliente:
CAPÍTULO 3. EL OBJETO XMLHTTPREQUEST 34
• Debe dar cierto manejo ante errores, primero para que el programa no
colapse y segundo para proporcionar cierta información al desarrollador.
• Son mejores que las librerías propias, ya que están creadas normalmente
por multitud de desarrolladores, y por lo tanto pretesteadas.
function objetoAjax(){
var xmlhttp=false;
try {
}catch (e) {
try {
}catch (E) {
xmlhttp = false;
//para Mozilla
return xmlhttp;
function VerImagen(){
CAPÍTULO 3. EL OBJETO XMLHTTPREQUEST 37
divResultado = document.getElementById(‘resu’);
ajax=objetoAjax()
ajax.open(‘GET’, url);
ajax.onreadystatechange=function() {
if (ajax.readyState==4) {
divResultado.innerHTML = ajax.responseText
ajax.send(null)
• Código HTML (lado del cliente): se crea una página que contiene un
botón que realizará el evento y llamará a la función JavaScript.
<HTML>
<HEAD>
</HEAD>
<BODY>
<CENTER>
onclick=VerImagen() ><BR>
CAPÍTULO 3. EL OBJETO XMLHTTPREQUEST 38
<BR>
</CENTER>
<CENTER>
</CENTER>
</BODY>
</HTML>
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
out.println(“<CENTER>” );
out.println(“</CENTER>” );
3.4.1 Métodos
— Parámetros:
∗ metodo: depende del tipo de petición, puede ser GET o POST.
∗ URL: contiene la dirección url del programa que reside en el
servidor.
∗ banderaAsync: si su valor es true realiza una petición asíncrona
y si es false realiza una petición síncrona.
∗ Nombreuser y password: solo se usan para acceder a recursos
protegidos.
— Parámetro:
∗ contenido: variable que contiene datos que se envían al servi-
dor.
3.4.2 Propiedades
document.getElementById(‘estado’).innerHTML = peticion01.status;
CAPÍTULO 3. EL OBJETO XMLHTTPREQUEST 42
document.getElementById(‘txtestado’).innerHTML = peticion01.statusText;
document.getElementById(‘txtresultado’).innerHTML = peticion01.responseText;
document.getElementById(‘xmlresultado’).innerHTML = peticion01.responseXML;
document.getElementById(‘estconex’).innerHTML = peticion01.readyState;
document.getElementById(‘estcamb’).innerHTML=peticion01.onreadystatechange
Propiedad Descripción
status Código devuelto por el servidor.
statusText Texto que acompaña al código.
responseText Datos devueltos formato string.
responseXML Datos devueltos formato Objeto XML
readyState Estado actual de la petición:
0: Sin iniciar.
1: Cargando.
2: Cargado.
3: Interactivo (algunos datos devueltos).
4: Completado
onreadystatechange Puntero a la función del manejador
que se llama cuando cambia readyState.
• Código JavaScript:
function MostrarUrl(){
divResultado = document.getElementById(‘resu’);
CAPÍTULO 3. EL OBJETO XMLHTTPREQUEST 44
est = document.getElementById(‘estado’);
ajax=objetoAjax()
ajax.open(‘GET’, url,false);
ajax.onreadystatechange=function() {
if (ajax.readyState==0) {
if (ajax.readyState==1) {
est.innerHTML = “cargando....”
if (ajax.readyState==4) {
est.innerHTML = “Completado”
divResultado.innerHTML = ajax.responseText
ajax.send(null)
• Código HTML:
<HTML>
<HEAD>
</HEAD>
CAPÍTULO 3. EL OBJETO XMLHTTPREQUEST 45
<BODY>
<CENTER>
onclick=MostrarUrl() ><BR>
<BR>
</CENTER>
<CENTER>
</CENTER>
</BODY>
</HTML>
• Código JSP:
<HTML>
<HEAD>
pageEncoding=“ISO-8859-1”%>
<TITLE>esperar.jsp</TITLE>
</HEAD>
<BODY>
<% try{
CAPÍTULO 3. EL OBJETO XMLHTTPREQUEST 46
Thread.sleep(1000);
}catch(InterruptedException e){}
%>
<CENTER>
alt=logo />
</CENTER>
</BODY>
</HTML>
divResultado = document.getElementById(‘resu’);
divEstado=document.getElementById(‘estado’);
ajax=objetoAjax()
ajax.onreadystatechange=function() {
if(ajax.readyState==){
if(ajax.readyState==0){
if(ajax.readyState==1){
divResultado.innerHTML = “Cargando”
if(ajax.readyState==2){
divResultado.innerHTML = “Cargado”
if(ajax.readyState==3){
divResultado.innerHTML = “Interactivo”
CAPÍTULO 3. EL OBJETO XMLHTTPREQUEST 48
if (ajax.readyState==4) {
divResultado.innerHTML = “Completado”
divResultado.innerHTML = ajax.responseText
ajax.send(null)
Para comprender mejor los ejemplos anteriores es necesario hacer una compa-
ración entre Javascript y Java de tal forma que se puedan adoptar mediadas
para escribir correctamente el código.
Java es un lenguaje basado en clases, pero JavaScript es un lenguaje ba-
sado en prototipos. La tabla 3.2 de la página 49 resume dicha comparación.
Empleado
function Empleado () {
Juan = new Empleado;
this.nombre = "";
this.departamento = "general";
Juan.especialidad es "ninguna"
}
Empleado.prototype.especialidad = " ninguna";
Trabajador
funct ion Trabajador () { Lucas = new Trabajador;
this.proyectos = [] ;
} Lucas.especialidad es "ninguna"
Trabajador.prototype = new Empleado;
Ingeniero
function Ingeniero () {
this.departamento = "ingenieria"; David = new Ingeniero;
this.ordenador = "";
} David.especialidad es "codigo"
Ingeniero.prototype = new Trabajador;
Ingeniero.prototype.especialidad = "codigo";
Es posible encerrar todo el código dentro del constructor, de forma que sólo se
haría referencia a una función declarada fuera que construye el objeto XML-
HttpRequest y que podría estar también dentro, de manera que el objeto se
auto-contendría.
Esta técnica parecería, desde el punto de vista de la proligidad en la cons-
trucción del código, ya que encerrar las funciones en el constructor es una
buena técnica para limpiar código, tiene un problema técnico. Encerrar las
funciones puede ser ineficiente desde el punto de vista del rendimiento y me-
moria, cada vez que haya una función encerrada en el constructor ésta se crea
para cada objeto, lo que no es un problema si se crean pocos objetos a la vez
en un computador.
El problema surgiría cuando terminales mas desfavorecidas como por ejem-
plo los diferentes terminales móviles que en un futuro podrían soportar el ob-
jeto XMLHttpRequest, por lo tanto conviene dejar la función contrutora como
está en el ejemplo antes mostrado.
Herramientas de Depuración
4.1 Introducción
52
CAPÍTULO 4. HERRAMIENTAS DE DEPURACIÓN 53
Pasos de la Instalación:
Las utilidades que deben aparecer como se puede observar en la figura 4.1
de la página 53 son las siguientes:
CAPÍTULO 4. HERRAMIENTAS DE DEPURACIÓN 54
• Consola Javascript.
• DOM Inspector.
• FireBug.
• Archivo: depuracion1.html.
<html>
<head><title>depuración</title></head>
function hagoAlgo()
</script>
<body>
<br>
</body>
CAPÍTULO 4. HERRAMIENTAS DE DEPURACIÓN 55
</html>
Esta herramienta permite ver el árbol de objetos del documento con todos los
campos de cada etiqueta.
Cuando se realiza una inserción de código HTML en una página mediante el
objeto XMLHttpRequest, ese cambio no es apreciable y la consola no devuelve
ningún error. Esto se debe a que el código insertado puede ser correcto pero
no hace lo que debería, la solución es ver lo que realmente se ha insertado
mediante el Inspector del DOM . Esta utilidad busca el error dentro del código
insertado, esto se puede observar mediante el siguiente ejemplo:.
• Archivo: depuracion2.html
<html>
<head><title>depuración</title></head>
function insertoalgo()
CAPÍTULO 4. HERRAMIENTAS DE DEPURACIÓN 57
zona = document.getElementById(‘zonaInsercion’) ;
</script>
<body>
<br>
<span id=“zonaInsercion”>
</span>
</body>
</html>
• Archivo depurar.html
<html>
<head><title>depuracion</title></head>
function hagoAlgo()
hagoalgo2() ;
function hagoalgo2()
hagoalgoreal();
function hagoalgoreal()
longitud = nombre.length;
</script>
<body>
<br>
</body>
</html>
¿Cómo funciona?
2. Una vez hallado el archivo, hacer doble clic para visualizar su código en
el editor a la derecha.
Este es tal vez el depurador más nuevo y potente que hay, proporciona toda
la información que ofrecen los otros programas pero de forma más rápida.
Firebug es una extensión de Firefox creada y diseñada especialmente para
desarrolladores y programadores Web. Es un paquete de utilidades con el
que se puede analizar (revisar velocidad de carga, estructura DOM ), editar,
monitorizar y depurar el código fuente, CSS, HTML y JavaScript de una
página Web de manera instantánea y on-line.
Para demostrar su funcionamiento básico se utilizará el archivo depu-
rar.html. Es necesario realizar los siguientes pasos:
• Depurador de Javascript.
Consola de Firebug
• Console.
• HTML.
• CSS.
• Script.
• DOM.
• NET.
CAPÍTULO 4. HERRAMIENTAS DE DEPURACIÓN 70
HTML
CSS
Script
CAPÍTULO 4. HERRAMIENTAS DE DEPURACIÓN 72
DOM
CAPÍTULO 4. HERRAMIENTAS DE DEPURACIÓN 73
Firebug también ayuda a encontrar los objetos DOM de una manera rela-
tivamente sencilla y los edita al vuelo. El DOM es el “Modelo en Objetos para
la representación de Documentos” y por lo tanto se trata de la interfaz a través
de la cual los programas y scripts pueden acceder y modificar dinámicamente
el contenido, estructura y estilo de los documentos HTML.
Entre sus características y funciones se pueden nombrar:
• Resumen de objetos.
NET o Red
• Línea de tiempo.
• Monitorizar el XMLHttpRequest.
Capítulo 5
5.1 Introducción
• Archivo: insertarHTML.html
<HTML>
75
CAPÍTULO 5. PETICIÓN DE INFORMACIÓN 76
<HEAD>
<TITLE>insertarHTML.html</TITLE>
</HEAD>
<BODY>
<CENTER>
onclick=tomarHTML() >
<BR>
</SPAN>
</CENTER>
</BODY>
</HTML>
width=“700” height=“125”></P>
...
function tomarHTML(){
resultado = document.getElementById(‘parteHTML’);
ajax=objetoAjax()
ajax.open(‘GET’, url);
ajax.onreadystatechange=function() {
if (ajax.readyState==4) {
resultado.innerHTML = ajax.responseText
ajax.send(null)
...
AJAX es una técnica que permite cargar en una misma página diferentes
elementos, bajo demanda. [4]
• insertarImag.html
<HTML>
<HEAD>
<TITLE>insertarImag.html</TITLE>
</HEAD>
<BODY>
<CENTER>
onclick=“tomarIMG(‘direccionImag.txt’)” >
<br>
</SPAN>
</CENTER>
</BODY>
CAPÍTULO 5. PETICIÓN DE INFORMACIÓN 82
</HTML>
• Archivo direccionImag.txt
../imagenes/encabezado.png
• Función JavaScript
function tomarIMG(ubicacion){
resultado = document.getElementById(‘Imagen01’);
ajax=objetoAjax()
ajax.open(‘GET’, ubicacion);
ajax.onreadystatechange=function() {
if (ajax.readyState==4) {
resultado.src = ajax.responseText
ajax.send(null)
1. La tag img del código html posee un id, es decir que no se ha utilizado
una etiqueta <spam> para sustituir un campo del código, y además se
le ha puesto a la imagen el tamaño que tendrá, pero no el campo src
donde se encuentra, de forma que en el cuadro que aparecerá vacío para
una imagen se puede insertar la imagen que se desee.
resultado.src
Una cosa interesante, ya que puede ser necesaria a la hora de realizar ciertos
programas, es la posibilidad de evaluar código Javascript con la función eval();
lo bueno ahora, es que gracias a la técnica de programación AJAX, es posible
tomar ese código de un archivo preparado anteriormente o generado por el
servidor dinámicamente y devuelto.
Un ejemplo sencillo de llamar ejecutar código Javascript con AJAX sería:
• Archivo insertarJavascript.html
<HTML>
CAPÍTULO 5. PETICIÓN DE INFORMACIÓN 84
<HEAD>
<TITLE>insertarJavaScript.html</TITLE>
</HEAD>
<BODY>
<CENTER>
onclick=“tomarJavaScript(‘direccionJavaScript.txt’)” >
</CENTER>
</BODY>
</HTML>
• Archivo direccionJavaScript.txt
• Función tomarJavaScript()
...
function tomarJavaScript(ubicacion){
ajax=objetoAjax()
ajax.open(‘GET’, ubicacion);
ajax.onreadystatechange=function() {
if (ajax.readyState==4) {
eval(ajax.responseText)
CAPÍTULO 5. PETICIÓN DE INFORMACIÓN 85
ajax.send(null)
...
• Archivo insercionesIndirectas.html
<HTML>
CAPÍTULO 5. PETICIÓN DE INFORMACIÓN 86
<HEAD>
<TITLE>inserciones Indirectas</TITLE>
</HEAD>
<BODY>
<CENTER>
<SPAN id=parteHTML>
onclick=“tomarJavaScript(‘direccionJavaScript.txt’)” >
<br>
</SPAN>
</CENTER>
</BODY>
</HTML>
• Archivo CodigoJavascriptCargaInd01.txt
resultado = document.getElementById(‘parteHTML’);
ajax=objetoAjax()
ajax.open(‘GET’, url);
ajax.onreadystatechange=function() {
if (ajax.readyState==4) {
resultado.innerHTML = ajax.responseText
CAPÍTULO 5. PETICIÓN DE INFORMACIÓN 87
ajax.send(null)
• Archivo pag01.html
width=“700” height=“125”></P>
El DOM esta íntimamente relacionado con JavaScript que aun por su nom-
bre, no es un lenguaje Orientado a Objetos como Java. Además carece de
características importantes como la herencia y se basa en prototipos.
Ya que el lenguaje interactúa con los objetos del navegador, cuando se
descarga una página HTML que contiene JavaScript, este código sigue estando
dentro de la página ya que el lenguaje actúa en la parte del cliente, en cambio
lenguajes como ASP, PHP o JSP generan lenguaje HTML desde el servidor
y el usuario no puede ver su código en la página que descargue.
En el DOM el objeto principal es el objeto window como se puede observar
en la figura 5.6 de la página 89:
CAPÍTULO 5. PETICIÓN DE INFORMACIÓN 88
<html>
<body>
<script type=“text/javascript”>
document.write(document.domain)
</script>
</body>
</html>
Se han remarcado las etiquetas HTML que nos dejan insertar código Ja-
vaScript dentro de una página HTML convencional, el código JavaScript debe
estar delimitado por estos tags de principio y fin, el resultado es el que se
muestra en la figura 5.7 de la página 89.
CAPÍTULO 5. PETICIÓN DE INFORMACIÓN 89
Es normal que los diferentes toolkits que hay para programar aplicaciones
Web orientadas a AJAX resuelvan estas incompatibilidades por el programa-
dor cuando no queda mas remedio en cambio en la mayoría de las ocasiones
es posible encontrar un camino estándar que exista en todos los navegadores.
El árbol de objetos del navegador es un árbol general que contiene tanto
métodos y propiedades del navegador como las creadas por el usuario, como
se puede observar con Firebug visualizado en la figura 5.8 de la página 91.
Dentro del DOM cada etiqueta tiene una propiedad llamada innerHTML,
en los ejemplos anteriores se ha visto cómo al cambiar el texto HTML cambia
la página, en cambio también se puede modificar el documento cambiando las
diferentes propiedades de cada nodo, esto es más complejo y laborioso pero
permite crear entornos realmente atractivos,es posible crear etiquetas, insertar
texto y modificar propiedades mediante JavaScript.
<head>
CAPÍTULO 5. PETICIÓN DE INFORMACIÓN 91
</script>
</script>
PeticionAjax01.completado = objetoRequestCompletado01;
normalmente./*
respuesta.*/
viejaParte.replaceChild(nuevaParte, viejaParte.childNodes[0]);
else
{
CAPÍTULO 5. PETICIÓN DE INFORMACIÓN 93
</script>
</head>
<body>
</button>
<span id=“ParteHTML”>
</span>
</body>
</html>
<head>
</script>
CAPÍTULO 5. PETICIÓN DE INFORMACIÓN 94
PeticionAjax01.completado = objetoRequestCompletado01;
document.getElementById(‘ParteHTML’).innerHTML = respuestaTexto;
</script>
</head>
<body>
</button>
<span id=“ParteHTML”>
</span>
</body>
</html>
texto.txt
<html>
<head>
<title>Insertar HTML</title>
</script>
</script>
</head>
<body>
CAPÍTULO 5. PETICIÓN DE INFORMACIÓN 96
<span id=“ParteHTML”>
<center>
</button>
</center>
</span>
</body>
</html>
function objetoAjaxHtml(ruta,idDondeInsertar)
this.ruta = ruta; //Ruta que llega asta el archivo con su nombre y extensión
function tomarHtml()
var idActual = this.id ; /*Dentro de las funciones el this. no funcionara, así que
se crea una variable con su contenido, como anteriormente.*/
document.getElementById(idActual).innerHTML = respuestaTexto;
CAPÍTULO 5. PETICIÓN DE INFORMACIÓN 97
Con todo esto se tomaria la misma página del ejemplo del ratón y el re-
sultado sería el mismo que anteriormente, cabe destacar el uso de prototipos,
ésta clase es un objetoAjax especializado para el manejo de HTML.
Petición de la dirección de una imagen:
<head>
<title>Insertar Imagen</title>
</script>
“391”,“350”,“0”,“guerrero”);
</script>
</head>
<body>
<span id=“ParteHTML”>
<center>
</center>
</span>
</body>
</html>
<head>
<title>Insertar Imagen</title>
</script>
</script>
</head>
<body>
<span id=“ParteHTML”>
<center>
</center>
<center>
<center>
</span>
</body>
</html>
CAPÍTULO 5. PETICIÓN DE INFORMACIÓN 100
direccion.txt
guerrero.jpg
ClasePeticionAjaxImagen.js
function objetoAjaxImagen(ruta,idDondeInsertar,tipoInsercion,alto,ancho,
borde,alter){
this.ruta = ruta; //Ruta que llega asta el archivo que contiene la dirección del a
imagen.
//Propiedades de la imagen
this.alto = alto;
this.ancho = ancho;
this.borde = borde;
this.alternativa = alter;
function tomarImagen()
/*Dentro de las funciones el this. no funcionara, así que se crea una variable
nueva con su contenido, como anteriormente.*/
this.completado =
break;
document.getElementById(idActual).src = rutaImagen;
break;
Esta es con diferencia la clase más sencilla, se ha dejado para el final para las
mentes cansadas.
LanzarJavascript.html
<html>
<head>
<title>Insertar Javascript</title>
</script>
</script>
</script>
</head>
<body>
<center>
CAPÍTULO 5. PETICIÓN DE INFORMACIÓN 103
<button onclick=“PeticionAjaxjavascriptl01.tomarJavascript()”>
</center>
</body>
</html>
ClasePeticionAjaxJavascript.js
function tomarJavascript()
alertaejemplo.js
...
this.objetoRequest.onreadystatechange =
function()
switch(objetoActual.objetoRequest.readyState)
objetoActual.cargando();
break;
objetoActual.cargado();
break;
objetoActual.interactivo();
CAPÍTULO 5. PETICIÓN DE INFORMACIÓN 106
break;
case 4:
if(objetoActual.objetoRequest.status != 200)
+ objetoActual.objetoRequest.statusText);
manejadorError(objetoActual.objetoRequest.status);
parámetros.*/
objetoActual.completado(objetoActual.objetoRequest.status,
objetoActual.objetoRequest.statusText,
objetoActual.objetoRequest.responseText,
objetoActual.objetoRequest.responseXML);
break;
}
CAPÍTULO 5. PETICIÓN DE INFORMACIÓN 107
function objetoRequestCargando() {}
...
Una de las cosas que se debe tener claro es que el usuario final, navegante,
cliente, etc. que se encuentre con la página Web o programa que use tecnología
AJAX pulsará sus botones y esperara que ocurra “algo”, y desesperará, por
ello estaría bien que viera algo mientras espera, un barra de carga, un mono
saltando, etc. depende de la naturaleza de la aplicación.
Se va a añadir a la librería, exactamente al objeto de pedir código HTML
una función que se llamará cuadroEstadoCarga, que no será obligatorio usarla
y que se podrá redefinir en el código de la página, por si no gusta el que se
hace por defecto, pero que si se quisiéra usar, funcionará sin que se tenga que
hacer nada más que decírselo, con los siguientes resultados: figura5.10de la
página108.
Se ha utilizado un texto un poco raro del que hay que dar crédito al creador
de la librería isiAJAX en unos foros, usó este texto para uno de sus ejemplos
de carga largos y se puede encontrar su trabajo en sourceforge, es un archivo
de texto de unos 20 Megas, si se está haciendo las pruebas en un servidor
instalado en una PC de casa es mejor que sea un archivo grande, si además es
un archivo de texto y el navegador se ve obligado a procesarlo puede ayudar a
que se vea el cuadrito de carga, si no, pasará como un flash y no se apreciará.
La página principal del ejemplo anterior es la misma que en los ejemplos
CAPÍTULO 5. PETICIÓN DE INFORMACIÓN 108
<head>
<title>Insertar HTML</title>
</script>
“PeticionAjaxHtml01”);
</script>
</head>
<body>
<span id=“ParteHTML”>
<center>
</button>
</center>
</span>
</body>
</html>
CAPÍTULO 5. PETICIÓN DE INFORMACIÓN 110
this.ruta = ruta; //Ruta que llega hasta el archivo con su nombre y extensión.
function tomarHtml()
document.getElementById(idActual).innerHTML = respuestaTexto;
}
CAPÍTULO 5. PETICIÓN DE INFORMACIÓN 111
function cuadroEstadoCarga()
“</a>” +
“</center>”
objetoAjaxHtml.prototype.cuadroEstadoCarga = cuadroEstadoCarga; /*
El cuadro que indica el estado de la carga. */
Se ha señalado el código nuevo referente al cuadro de carga, el cuadro
aparece por defecto centrado para dar un mejor aspecto como se ve en el
código HTML generado, no es más que un par de imágenes y un link con
muchas barras invertidas para quitarle a las comillas su sentido de carácter
especial.
Igualmente que se haya hecho esto aquí se podría añadir a la petición de
las imágenes de Tipo 1 pero, como no añade nada nuevo, no se explicará ya
que se hará exactamente lo mismo; se lo añadiría antes de que apareciera la
imagen y luego ésta lo sustituiría.
Capítulo 6
6.1 Introducción
113
CAPÍTULO 6. EJEMPLOS REALES DE USO PARA AJAX 114
6.1 se han delimitado ciertas zonas, esta página tiene todas las zonas típicas
que se pueden encontrar en un portal Web; aunque puede variar su posición
y su aspecto gráfico, el funcionamiento es igual, generalmente poseen un títu-
lo(zona 5 de la figura 6.1) y un menú(zona 4 de la figura 6.1), estos rara vez
desaparecerán de la página, en cambio el cuerpo de la página(zona 1 del a
figura 6.1), cambiará dependiendo de la sección. Lo ideal sería que cuando
cambie de sección solo varíe la zona 1, esto se puede lograr usando AJAX, an-
teriormente se utilizaban Frames, ahora la solución con AJAX es más elegante
y más dinámico.
CAPÍTULO 6. EJEMPLOS REALES DE USO PARA AJAX 115
Método GET
Método POST
• Cadena de petición:
http://localhost:8080/RAC/VerBateria
codigo=15&usuario=lino&clave=lino
CAPÍTULO 6. EJEMPLOS REALES DE USO PARA AJAX 116
Todo queda mucho más separado y limpio, además se evita que quede en
los historiales.
Este problema surge debido a las diferentes codificaciones que hay para los
caracteres en texto plano, si la página corre de forma local no hay problema
pero si es un servidor quien está generando información y utiliza otra co-
dificación es casi seguro que los acentos se van a estropear por el camino y
cuando se muestren al final serán unos signos de interrogación algo pintorescos
y extraños.
Para resolver este problema se deben hacer dos cosas, la primera es guardar
las páginas Web que se escriban en formato de texto UTF-8 que contiene todos
los símbolos, una vez terminada la página Web se debe guardar en formato
UTF-8 de la siguiente manera:
• request.setCharacterEncoding(“UTF-8”);
function objetoAjax(metodo)
this.metodo = metodo;
/*Se copia el objeto actual, si se usa this dentro de la función que se asígna
a onreadystatechange, no funcionara.*/
if (this.metodo == ”GET”)
this.objetoRequest.setRequestHeader(‘Content-Type’,
‘application/x-www-form-urlencoded’);
this.objetoRequest.send(valores);
GET y POST.
<%
CAPÍTULO 6. EJEMPLOS REALES DE USO PARA AJAX 120
String TimeStamp;
String Nombre;
Nombre=request.getParameter( “Nombre” );
String Apellidos;
Apellidos=request.getParameter( “Apellidos” );
String Cumple;
Cumple=request.getParameter( “Cumple” );
%>
//Se toman los datos de cada campo y se los introduce en una variable cada uno
//Se construye una cadena con ellos con el formato estándar de enviar información
function peticionUsandoGET()
/*Cuando se usa el método GET la página a la que se envían los datos y los datos
van unidos en
la misma cadena */
darInfo01.completado = objetoRequestCompletado01;
function peticionUsandoPOST()
//Cuando se utiliza el método POST la página a la que se envían los datos y los
datos van en cadenas diferentes.
darInfo01.completado = objetoRequestCompletado01;
<body onload=“desconectaBoton(1)”>
<br />
Se tiene una hipotética base de datos (simulada) solo con dos usuarios, JuanMa
y Sergio.
<br />
<br />
<br />
<table border=“0”>
<tr>
<td>
onkeyup=“validarUsuario()” />
</td>
<td>
<span id=“mensajeValidacion”>
</span>
</td>
</tr>
</table>
</form>
</body>
function validarUsuario()
if (!posibleUsuario) //Crea una variable con el nombre del Posible nuevo usuario
if (escape(posibleUsuario.value.length) > 3)
PeticionAjax01.tomar(url);
else
}
CAPÍTULO 6. EJEMPLOS REALES DE USO PARA AJAX 126
//La pagina jsp devolverá true si el nombre se puede usar y false si ya está usando
por otro usuario.
if(respuestaTexto == “true”)
document.getElementById(‘mensajeValidacion’).innerHTML
else
document.getElementById(‘mensajeValidacion’).innerHTML
function desconectaBoton(opcion)
boton.disabled = opcion;
</script>
• Código 3: validarUsuario.jsp
usuario=request.getParameter(“id”);
CAPÍTULO 6. EJEMPLOS REALES DE USO PARA AJAX 128
//Se tiene una hipotetica base de datos solo con JuanMa y Sergio, se la simula
de esta manera.
if ( (usuario.equals(“JuanMa”)) || (usuario.equals(“Sergio”)))
out.print(“false”);
else
out.print(“true”);
%>
insertar.jsp
<html>
<head><title></title></head>
<body>
<!—Se simula la inserción del usuario en la base datos, pero no es real, no se inserta
nada. —>
</body>
</html>
Este ejemplo mostrará una función de Javascript que puede tener una impor-
tancia crítica en el desarrollo de ciertos programas con necesidades de tiempo
y muchas veces concurrentes.
CAPÍTULO 6. EJEMPLOS REALES DE USO PARA AJAX 129
no dispara la acción.
El segundo es que los mensajes son enviados por el servidor en el ejemplo,
son algo que genera el servidor y que podría crearse de forma dinámica si
hiciera falta cualquier tipo de información que necesita refresco.
• Código 1: autoRefrescar.html
<html>
<head>
src=“lib/ConstructorXMLHttpRequest.js”></script>
src=“lib/ClasePeticionAjax.js”></script>
var tiempo = 0;
function refrescarAuto()
tiempo++;
peticionFrase();
}
CAPÍTULO 6. EJEMPLOS REALES DE USO PARA AJAX 131
function peticionFrase()
document.getElementById(“respuesta”).innerHTML = respuestaTexto;
peticion01.tomar(url);
</script>
</head>
<body>
<table border=“1”>
<tr>
<td><span id=“tiempo”></span></td>
<td><span id=“respuesta”></span></td>
</tr>
</table>
refrescarAuto();
</script>
</body>
</html>
• Código 2: cuentameAlgo.jsp
<%
request.setCharacterEncoding(“UTF-8”);
int tiempo = 0;
switch(tiempo)
break;
break;
case 6: out.print(“.”);
break;
case 8: out.print(“...”);
break;
break;
cuenta.”);
%>
El siguiente ejemplo muestra como generar dinámicamente una tabla con in-
formación dada por el usuario con la siguiente interfaz, vista en la figura 6.7
de la página 134.
Esto no tiene nada que ver con AJAX, es solo una muestra de que se
puede ir generando los elementos necesarios dinámicamente, esto es un gran
avance ya que gracias a ello se pueden realizar programas con un aspecto
visual agradable rápidamente si se programan en una Web. Pero es necesario
guardar la información que se genera para que tenga sentido. Llegado este
momento se puede elegir archivo o base de datos, en este caso se elige archivo,
se envían los datos a una página jsp que creará el archivo, de forma que la
cosa gráficamente quedaría como se ve en la figura 6.8 de la página 135.
El ejemplo muestra cómo generar la tabla haciendo uso del DOM por lo
cual se complica un poco, pero en cambio al guardar en un archivo y rescatar
la información haciendo uso de la propiedad “innerHTML” lo que simplifica el
problema. En otras palabras, el archivo almacena la información directamente
en HTML.
CAPÍTULO 6. EJEMPLOS REALES DE USO PARA AJAX 134
var identificadorUnico = 0;
return;
else
document.getElementById(“autor”).value = “”;
document.getElementById(“titulo”).value = “”;
document.getElementById(“estilo”).value = “”;
//4.Se crea una nueva fila para la tabla, usando el DOM y se le añade las celdas
celda1.appendChild(document.createTextNode(identificadorUnico));
fila.appendChild(celda1);
celda2.appendChild(document.createTextNode(autor));
fila.appendChild(celda2);
celda3.appendChild(document.createTextNode(titulo));
fila.appendChild(celda3);
celda4.appendChild(document.createTextNode(estilo));
fila.appendChild(celda4);
botonborrar.setAttribute(“type”, “button”);
celda5.appendChild(botonborrar);
fila.appendChild(celda5);
identificadorUnico++;
document.getElementById(“tablaDiscos”).appendChild(fila);
baseDatosB.html(Parte 2 Javascript)
tablaDiscos.removeChild(borrarFila);
baseDatosB.html(Parte 3 HTML)
<body>
<h2>Añadir datos:</h2>
<form action=“#”>
<tr>
</td>
</tr>
</table>
</form>
<h2>Tabla de Discos:</h2>
<tbody id=“tablaDiscos”>
CAPÍTULO 6. EJEMPLOS REALES DE USO PARA AJAX 139
<tr>
<th>Id</th>
<th>Autor</th>
<th>Título</th>
<th>Estilo</th>
<th>Operaciones</th>
</tr>
</tbody>
</table>
</body>
• El código Javascript y,
• El código HTML.
Mientras que a la página jsp simplemente le llega la cadena de texto que hay
en el cuadro y devuelve un documento XML con las referencias encontradas.
• Código 1: autoCompletar.html
<html >
<head>
<title>Auto Completar</title>
<style type=“text/css”>
.ratonFuera
background: #A9A9A9;
color: #000000;
.ratonEncima
background: #5F9EA0;
color: #000000;
</style>
src=“lib/ConstructorXMLHttpRequest.js”></script>
src=“lib/ClasePeticionAjax.js”></script>
CAPÍTULO 6. EJEMPLOS REALES DE USO PARA AJAX 143
function buscarNombres(elemento)
borrarInfo();
return;
//Cuando se usa el método GET la página a la que se envía los datos y los datos
van unidos en la misma cadena.
/*Se asigna la función de completado, que llevara la carga de generar las nuevas
celdas con la información recibida, en esta ocasión, aunque lo mas correcto sería que
se tuviéra una función propia que lo haga, esto es solo un ejemplo sencillo */
pedirInfo01.completado =
{
CAPÍTULO 6. EJEMPLOS REALES DE USO PARA AJAX 144
posicionVentanaInformacion(elementoActual);
.innerHTML = documentoCompleto[i].childNodes[0].nodeValue;
//2.Se le aplica el estilo para que sea interactivo dependiendo de los eventos.
celda.setAttribute(“bgcolor”, ”#A9A9A9”);
//3.Si se pulsa sobre uno de los sugeridos se sustituirá el valor de búsqueda por
este.
fila.appendChild(celda);
document.getElementById(“cuerpoTablaSugerancias”).appendChild(fila);
}
CAPÍTULO 6. EJEMPLOS REALES DE USO PARA AJAX 145
function borrarInfo()
ventanaborrar.removeChild(ventanaborrar.childNodes[i]);
document.getElementById(“tablaSugerancias”).style.border = “none”;
function posicionVentanaInformacion(elemento)
var desplazamiento = 0;
elemento = elemento.offsetParent;
return desplazamiento;
function ponerNombre(celda)
document.getElementById(“nombres”).value = celda.firstChild.nodeValue;
borrarInfo();
</script>
CAPÍTULO 6. EJEMPLOS REALES DE USO PARA AJAX 147
</head>
<body>
<h1>Auto Completar</h1>
<h3>Los nombres que hay en el fichero jsp del servidor empiezan por A y por
N.</h3>
<form action=“null”>
onkeyup=“buscarNombres(this);” style=“height:20;”/>
</form>
<tbody id=“cuerpoTablaSugerancias”></tbody>
</table>
</body>
</html>
• Código 2: pedirInfo.jsp
<%response.setHeader(“Cache-Control”, “no-cache”);
request.setCharacterEncoding(“UTF-8”);
listanombres.add(“Ana”);
listanombres.add(“Anamaria”);
listanombres.add(“Anastasia”);
listanombres.add(“Adolfo”);
listanombres.add(“Alex”);
listanombres.add(“Naomi”);
listanombres.add(“Noelia”);
listanombres.add(“Nora”);
listanombres.add(“Nox”);
Iterator i = listanombres.iterator();
out.println(“<listaNombres>”);
while( i.hasNext() ) {
String nombre=(String)i.next();
int j=0;
j++;
valido = (j == prefijo.length());
else {
valido = false;
if(valido) {
valido = false;
out.println(“</listaNombres>”);
out.close();
%>
Capítulo 7
Problemas de Seguridad y
Desarrollo
7.1 Introducción
150
CAPÍTULO 7. PROBLEMAS DE SEGURIDAD Y DESARROLLO 151
En principio todas las aplicaciones Web están sujetas a los mismos problemas
de seguridad ya que todas se suelen correr sobre el mismo software del servidor
al que le llegan las peticiones de los usuarios “no identificados” ya que nunca se
puede asegurar realmente de quien hay al otro lado de la línea, si la aplicación
necesita de seguridad deberá ser el servidor el que la proporcione. A nadie se
CAPÍTULO 7. PROBLEMAS DE SEGURIDAD Y DESARROLLO 153
• Solución correcta: No existe, el código debe ser visible para que se eje-
cute.
• Solo dejar utilizar la aplicación a los clientes que puedan validarse real-
mente con su firma digital.
CAPÍTULO 7. PROBLEMAS DE SEGURIDAD Y DESARROLLO 154
PARTE SERVIDOR
PARTE CLIENTE (Accesibles directamente ó por una dirección)
Necesitan validación
PARTE 2
CLIENTE VALIDADOR
PARTE 1
SERVICIO 1 CONTROLADOR
B.D
Cliente BASE DE DATOS
VISTA
VALIDADOR SERVICIO 2
La política de mismo origen data de Netscape Navigator 2.0, fue una impor-
tante medida de seguridad introducida para proporcionar seguridad en el lado
cliente cuando se esta ejecutando código sobre el navegador (en mayor parte
de los casos Javascript).
Esta política evita que un documento o script cargado desde un determina-
do sitio Web pueda realizar peticiones a otro sitio Web diferente; es interesante
que a la hora de desarrollar las aplicaciones utilizando AJAX se sepa esto ya
que es un límite impuesto para garantizar la seguridad, esto se puede observar
mediante el siguiente ejemplo.
• CargarOtroDominio.html
<html>
<head>
<title>Insertar HTML</title>
</script>
}
CAPÍTULO 7. PROBLEMAS DE SEGURIDAD Y DESARROLLO 157
</script>
</head>
<body>
<center>
<button onclick=“PeticionAjax01.tomar(‘http://www.google.es/’)”>
Toma http://www.google.es/</button>
</center>
</body>
</html>
• Conexión cifrada
La conexión debería estar cifrada desde la página principal para que cuando
el usuario mande sus datos personales éstos estén codificados, aunque esto haga
gastar más recursos. Hay que configurarlo en el servidor, por ejemplo Tomcat.
• Sin cookies
Solamente debe de poder trabajar con ella la parte del servidor Web y
debe tener un usuario que solo debe poder acceder a su base de datos para
evitar que se cambien los precios aquí, si es que se tiene una tienda. Además,
en una aplicación Web el usuario no necesita acceder directamente al servidor
por SQL a no ser que sea precisamente para esto como el ISQLPlus de Oracle,
en cuyo caso está diseñado expresamente para esto.
El cliente solo debe poder acceder a una página que luego delegará depen-
diendo la petición realizada por el usuario el trabajo en otras contenidas en el
servidor no accesibles desde fuera.
Capítulo 8
Un Mundo de Toolkits y
Frameworks
8.1 Introducción
160
CAPÍTULO 8. UN MUNDO DE TOOLKITS Y FRAMEWORKS 161
no saber cuál escoger y porqué. Para arrojar un poco de luz en este asunto,
primero se va a realizar una pequeña clasificación que, en cualquier caso, se
quedará pequeña en cuanto pase algo de tiempo ya que siempre están apa-
reciendo nuevas ideas para utilizar AJAX partiendo de diferentes tecnologías
de alto nivel. En este apartado se hará incapie en las bibliotecas que generan
Javascript y que incorporan tecnología Java por lo que los siguientes puntos
intentan abarcar gran parte de las soluciones java actuales para trabajar con
AJAX.
Éstas son tal vez las que menos abstracción dan ya que se esta trabajando
directamente sobre Javascript y HTML, como ocurre por ejemplo en la biblio-
teca construida durante los primeros capítulos del presente volumen (aunque
ésta es muy simple y no cubre todas las necesidades, se la usa para aprender).
Características principales:
• Proveen una buena navegación dando soporte para los botones de “Ir
a la página anterior” e “Ir a la página siguiente” que muchas veces al
hacer una aplicación dinámica pierden su utilidad.
CAPÍTULO 8. UN MUNDO DE TOOLKITS Y FRAMEWORKS 162
• Han sido probadas en el mercado por lo que suelen ser mejores que las
de uno mismo.
• Son fáciles de usar aunque primero hay que aprender a usarlas, lo que
no es directo ni mucho menos.
• Los entornos IDE como Netbeans y Eclipse tienen plugins que dan so-
porte a muchas de estas bibliotecas facilitando el desarrollo.
• Dojo Toolkit:
• http://dojotoolkit.com/
• Prototype:
• http://prototype.conio.net/
CAPÍTULO 8. UN MUNDO DE TOOLKITS Y FRAMEWORKS 163
• Script.aculo.us:
• http://script.aculo.us/
• Rico:
• Construida sobre Prototype.
Como conclusión puede decirse que son buenas y se pueden tomar “wid-
gets” de diferentes fuentes. Lo malo es que el desarrollador tiene que aprender
Javascript y cada biblioteca suele tener su propia sintaxis.
jMaki proporciona una capa Java de abstracción sobre Javascript, de esta ma-
nera se puede utilizar Widgets de las diferentes bibliotecas del lado cliente (las
soportadas, como Dojo, Scriptaculus, Yahoo UI Widgets, DHTML Goodies)
bajo una sintaxis Java común. De esta manera se facilita el trabajo a los
programadores Java para los que Javascript suele ser algo muy extraño, su
Web es https:/ajax.dev.java.net/.
Como conclusión puede decirse que aún a las diferentes bibliotecas bajo un
modelo de programación común y tiene plugin para Netbeans 5.5. Su único
problema (que también puede verse como una ventaja) es que está en constante
evolución ya que sus desarrolladores se encargan de que soporte las bibliotecas
Javascript de última generación.
NOTA: jMaki también permite trabajar con PHP, no solo con Java.
Como conclusión puede decirse que es muy sencillo de utilizar ya que los
componentes se usan arrastrándolos sobre el espacio de trabajo. No obstante,
crear nuevos componentes personalizados no es una tarea sencilla.
Con este toolkit todo el desarrollo se hace bajo Java, (más bien un subcon-
junto de sus bibliotecas bastante pequeño) junto con una serie de bibliotecas
desarrolladas por Google para el desarrollo Web que son las que integran real-
mente el toolkit y que, realmente, son las que se utilizarán. Es posible emplear
constantemente el lenguaje Java a que se esta acostumbrado (asumiendo que
se sabe Java) en el seno del toolkit para el desarrollo y la depuración. Una
vez que todo funcione correctamente se utilizará el preprocesador del toolkit
que traducirá la aplicación escrita en Java a HTML y Javascript. La Web es
http://code.google.com/webtoolkit/.
Como conclusión puede decirse que Java es la mejor capa de abstracción
que nos aleja del HTML/Javascript todo lo que se puede. Además tiene un
CAPÍTULO 8. UN MUNDO DE TOOLKITS Y FRAMEWORKS 165
Como puede suponer el lector, hay suficientes toolkits y frameworks, como para
hablar de todos ellos, si bien se va a mencionar algunas de las plataformas de
programación y lenguajes más usuales.
Hay una gran cantidad de compañías que utilizan tecnología Microsoft por lo
que se puede encontrar también una gran cantidad de frameworks basados en
.NET , ya que el número de usuarios potenciales es muy grande. Uno de los
más interesantes es:
Existen más frameworks entre los que se podría mencionar: Ajax Engine,
Bitkraft, MagicAjax, Monorraíl y zumiPage.
• Flex Framework FABride: es una pequeña biblioteca que puede ser in-
sertada en una aplicación o componente Flex o incluso en un archivo swf
vacío y exponerlo al código dinámico en el navegador; ahora es código
abierto.
CAPÍTULO 8. UN MUNDO DE TOOLKITS Y FRAMEWORKS 166
Ya que existen tantas aproximaciones diferentes sobre una misma idea como
es AJAX y se debe elegir una manera de trabajar que use una o varias de
éstas (si es que son compatibles), de las opciones anteriores se debe hacer la
elección con detenimiento ya que esto condicionará de manera importante el
esquema de nuestra aplicación.
No se sabría decir cual es la mejor forma de trabajar, ya que ello depende de
muchos factores. Por ello, la más idónea sea seguramente la más cercana a cada
programador particular: un programador Web se puede ver cómodo con las
bibliotecas del lado cliente si no conoce Java, mientras que a un programador
Java le puede resultar complicado aprender Javascript en un principio por las
carencias de programación orientada a objetos de éste.
9.1 Introducción
• Apache Tomcat.
168
CAPÍTULO 9. HERRAMIENTAS UTILIZADAS PARA LA APLICACIÓN169
Como se muestra en la figura 9.1, DB2 Express-C es igual que DB2 Express
solo que sin algunos componentes. DB2 Express-C es libre a la comunidad.
La figura 9.1 también explica porqué es tan fácil actualizar desde DB2
Express-C. Si se desea actualizar a cualquier otro servidor DB2 en el futu-
ro, todos los servidores DB2 tienen el mismo núcleo de componentes. Esto
también significa que una aplicación desarrollada para una edición trabajará,
sin ninguna modificación, en otra edición. Y cualquier habilidad aprendida en
una edición aplicará a las otras ediciones.
• Cliente Servidor de Datos IBM (IBM Data Server Client): el más com-
pleto, incluye herramientas GUI, controladores.
CAPÍTULO 9. HERRAMIENTAS UTILIZADAS PARA LA APLICACIÓN171
La figura 9.2 de la página 9.2 muestra los diferentes clientes DB2 y con-
troladores disponibles.
Al lado izquierdo de la figura 9.2, todos los clientes DB2 y controladores
son mostrados. Aunque todos los clientes DB2 incluyen sus controladores
requeridos, a partir de DB2 9 se proveen controladores individuales también.
Todos los clientes DB2 y controladores son gratis y disponibles para descargar
desde el sitio Web de DB2 Express-C. Los clientes y controladores pueden ser
usados para conectarse a un servidor DB2 en Linux, UNIX o Windows. Para
CAPÍTULO 9. HERRAMIENTAS UTILIZADAS PARA LA APLICACIÓN172
• Fix packs.
• pureXML
• Alta disponibilidad
• Federación Homogénea
• Alta disponibilidad
• Disponible en AIX
R
, Solaris, y HP-UX además de Linux y Windows
• pureXML
• Optimización de Performance (MQT, MDC, Query Parallelism)
• Federación Homogénea
• pureXML
• Optimización de almacenamiento. (incluido compresión)
• Control de acceso avanzado (seguridad avanzada)
• Optimización del Performance (Performance Experto, Query Patroller )
• DB2 Connect.
CAPÍTULO 9. HERRAMIENTAS UTILIZADAS PARA LA APLICACIÓN174
• WebSphere
R
Federation Server.
Fix Packs
Réplica de Datos
Concentrador de Conexión
Geodetic Extender
DB2 Geodetic Extender esta disponible con pago adicional para DB2 Enter-
prise Edition. Este extender hace desarrollos para aplicaciones de inteligencia
de negocios y egovernment que requieren un análisis de localización geográfica
mucho más sencillo. DB2 Geodetic Extender puede construir un globo mun-
dial virtual a cualquier escala. La mayoría de información de localización
es tomada usando sistemas worldwide, por ejemplo el sistema de satélites de
posicionamiento global (GPS ), y puede ser representado en coordenadas de
latitud/longitud (geocódigo). Los datos de negocios, como direcciones, pue-
den ser convertidos a geocódigo con DB2 Geodetic Extender y aplicaciones a
nivel empresarial trabajan mejor cuando mantienen los datos en esta forma sin
proyección, saliendo las proyecciones del mapa (tierra a mapa plano) donde
ellos pertenecen, en la capa de presentación, para mostrar e imprimir mapas.
CAPÍTULO 9. HERRAMIENTAS UTILIZADAS PARA LA APLICACIÓN178
DB2 Connect
DB2 Connect es un software pagado que permite al cliente DB2 para Linux,
UNIX o Windows conectarse a un servidor DB2 para z/OS o para i5/OS,
como se muestra en la figura 9.4 de la página 9.4. DB2 Connect no es requerido
cuando la conexión ocurre en la dirección opuesta: cuando se conecta desde
DB2 para z/OS o i5/OS hacia DB2 para Linux, UNIX o Windows. DB2
Connect viene en dos ediciones principales dependiendo de las necesidades de
conexión: DB2 Connect Personal Edition y DB2 Connect Enterprise Edition.
FROM Oracle.Table1 A
DB2.Table2 B
CAPÍTULO 9. HERRAMIENTAS UTILIZADAS PARA LA APLICACIÓN179
SQLServer.Table3 C
WHERE
Este apartado explicará paso a paso una instalación básica de DB2 Express-C
en Windows. La misma installation wizard está
disponible en Linux ; por lo tanto los pasos son similares en ambas plata-
formas.
Procedimiento
5. Correr el DB2 setup wizard. El DB2 setup wizard revisa si cumple todos
los requerimientos del sistema y ve si existe otra instalación de DB2.
Hacer clic en el botón Next para seguir con la instalación.
9. Configurar la información del usuario. Una vez que DB2 Express-C es-
tá instalado, asegurarse que los procesos de DB2 están corriendo como
Servicios del Sistema. Estos servicios requieren una cuenta del sistema
operativo para poder correrlo. En el ambiente de Windows, usar la cuen-
ta por defecto db2admin es recomendada. Si esta cuenta aun no existe,
DB2 la creará en el Sistema Operativo. También se puede especificar
una cuenta existente, pero esa cuenta debe tener los permisos de admi-
nistrador local. Se recomienda usar las opciones sugeridas. Asegurarse
de especificar el password para la cuenta. En Linux se usa el UserID por
defecto db2inst1 (dueño de la instancia), db2fenc1 (usuario para rutinas
limitadas) y dasusr1 (usuario del DB2 Administrator Server, DAS ). Clic
en el botón Next para continuar.
Herramienta Comando
Editor de Comandos db2ce
Command Line processor db2
Ventana de Comandos db2cmd
Control Center db2cc
Task Center db2tc
Health Center db2hc
Configuration Assistant db2ca
First Steps db2fs
El panel del lado izquierdo provee una visión jerárquica de los objetos de
la base de datos en el sistema, teniendo una carpeta para Tablas, Vistas, etc.
Al hacer doble clic sobre una carpeta, del lado derecho se listarán todos los
objetos relacionados, como por ejemplo, todas las tablas asociadas con la base
de datos SAMPLE. Si se selecciona una tabla en la parte alta del panel, en la
parte baja del lado derecho del panel se proveerá información más específica
acerca de esa tabla.
CAPÍTULO 9. HERRAMIENTAS UTILIZADAS PARA LA APLICACIÓN187
Aumentando el Desempeño
Distribuye carga de trabajo entre los servidores sin interrupción del servicio a
los visitantes del sitio de la Web.
Provee servicios a cliente de calidad superior y mejor desempeño del sitio
CAPÍTULO 9. HERRAMIENTAS UTILIZADAS PARA LA APLICACIÓN193
Web.
El extraordinario crecimiento de la Web ha hecho que una infraestructura
fiable, disponible y escalable sea más necesaria que nunca. Una interrupción,
aunque sea breve, o reducción de servicio puede causar que los clientes Web,
cada vez más sofisticados y exigentes, se dirijan inmediatamente a la compe-
tencia.
El e-business es parte integral del éxito del negocio principal de hoy. Actual-
mente las empresas necesitan respuesta de base de alta calidad para rápida-
mente construir e implementar aplicaciones para e-business on demand de alto
desempeño.
El ambiente de TI del e-business debe ser construido sobre una sólida Base
y con Herramientas que sean integradas y que tengan desempeño confiable.
Los tiempos de detención del sistema y los problemas de desempeño crean un
riesgo real para el negocio. Este riesgo se multiplica debido a la diversidad de
los ambientes de TI.
Corporaciones de mayor porte pueden tener amplia diversidad dentro de
su propia empresa. Corporaciones de menor porte encontrarán diversidad al
dividirse más allá de las fronteras de su empresa hacia el resto de su cadena
de valor. El software IBM WebSphere ayuda a reducir este riesgo del negocio.
CAPÍTULO 9. HERRAMIENTAS UTILIZADAS PARA LA APLICACIÓN194
Plataforma de Software
Todo esto permite que las personas trabajen en conjunto de forma más
productiva mientras actúan sobre la información que necesitan. La capacidad
del portal de negocios es proporcionada por la familia WebSphere Portal y la
familia WebSphere Commerce es un conjunto de soluciones eficaces del lado de
ventas para tratar los desafíos encontrados en ambientes de clientes y socios
comerciales [1].
— Application server.
— WebSphere studio:
∗ IBM WebSphere Studio Site Developer.
∗ IBM WebSphere Studio Application Developer.
∗ IBM WebSphere Studio Application Developer Integration Edi-
tion.
∗ IBM WebSphere Studio Enterprise Developer.
∗ IBM WebSphere Studio Homepage Builder.
— Host Access.
— WebSphere Portal.
— WebSphere Everyplace.
— WebSphere Commerce.
Application Server
Servidor de Aplicaciones
Contenedor de EJB
Contenedor Web
Los servlets y los archivos JSP (Java Server Pages) son componentes del
servidor que se utilizan para procesar peticiones de clientes HTTP como, por
ejemplo, navegadores Web. Se encargan de la presentación y el control de
la interacción del usuario con los datos de aplicación subyacentes y la lógica
empresarial. También pueden generar datos formateados, como XML, para
que los utilicen otros componentes de aplicación.
El contenedor Web procesa servlets, archivos JSP y otros tipos de inclu-
siones de servidor. Los servlets anteriores a J2EE se ejecutarán en un motor
de servlets. Cada contenedor Web contiene automáticamente un único gestor
de sesiones.
Cuando se manejan los servlets, el contenedor Web crea un objeto de
petición y un objeto de respuesta, e invoca el método de servicio de servlets.
El contenedor Web invoca el método destroy() del servlet cuando corresponda
y descarga el servlet, y después la JVM ejecuta la recolección de basura.
Contenedor de Applets
Un sistema principal virtual es una configuración que permite que una única
máquina de sistema principal parezca varias máquinas de sistema principal.
Los recursos asociados con un sistema principal virtual no pueden compartir
datos con recursos asociados con otro sistema principal virtual, incluso si los
sistemas principales virtuales comparten la misma máquina física.
Primer nivel:
Tercer nivel:
— Los servicios del tercer nivel están protegidos del acceso directo de
los componentes de cliente al residir en una red segura.
— La interacción debe producirse a través de los procesos del segundo
nivel.
Los tres niveles deben poder comunicarse entre ellos. Los protocolos abier-
tos estándar y las API expuestas simplifican esta comunicación. Los com-
ponentes de cliente se pueden escribir en cualquier lenguaje de programación
como, por ejemplo, Java o C++, y se puedan ejecutar en cualquier sistema
operativo, siempre que pueden comunicarse con la capa de la lógica de aplica-
ción.
De la misma forma, las bases de datos del tercer nivel pueden tener cual-
quier diseño, siempre que la capa de la lógica de aplicación pueda consultarlas
y manipularlas. La clave de esta arquitectura es la capa de la lógica de apli-
cación.
CAPÍTULO 9. HERRAMIENTAS UTILIZADAS PARA LA APLICACIÓN205
El ambiente operativo principal debe ser una base confiable que permita de
forma segura, transacciones e implementaciones de servicios en la Web de for-
ma abierta. En otras palabras, debe ser una infraestructura abierta, basada
en servicios, como la proporcionada por la familia del WebSphere Application
Server, un mecanismo de alto desempeño, extremadamente escalable para apli-
caciones de e-business dinámicos.
En el caso en que nuevas aplicaciones tengan que ser desarrolladas, estas
necesitan ser creadas de forma que capturen el conocimiento de negocio de
forma eficaz, y construidas para integrarse, de manera que se ajusten rápida-
mente al ambiente existente, y a impulsarlo. Esta capacidad de desarrollo de
aplicaciones es proporcionada por la familia WebSphere Studio [1].
Tanto para los usuarios que estén construyendo páginas Web como para
los grandes equipos que construyan aplicaciones Web avanzadas, la familia
CAPÍTULO 9. HERRAMIENTAS UTILIZADAS PARA LA APLICACIÓN208
9.4.1 Descripción
9.4.2 Entorno
Tomcat puede funcionar como servidor web por sí mismo. En sus inicios
existió la percepción de que el uso de Tomcat de forma autónoma era sólo
recomendable para entornos de desarrollo y entornos con requisitos mínimos
de velocidad y gestión de transacciones. Hoy en día ya no existe esa percepción
y Tomcat es usado como servidor Web autónomo en entornos con alto nivel
de tráfico y alta disponibilidad.
Dado que Tomcat fue escrito en Java, funciona en cualquier sistema ope-
rativo que disponga de la máquina virtual Java.
Capítulo 10
Aplicación Web
210
CAPÍTULO 10. APLICACIÓN WEB 211
Sección Productos
Sección Historia
216.
Sección Contacto
Sección Ubicación
En esta sección se utilizan las facilidades ofrecidas por una de las aplicaciones
más famosas del mundo Web que se caracteriza por el uso de tecnologías
basadas en Ajax. Esta aplicación es la del Google Maps. Se puede visualizar
mediante la figura 10.8 de la página 218.
CAPÍTULO 10. APLICACIÓN WEB 215
Agregar Videos
Esta sección permite dar de alta los videos que luego visualizará el usuario en
la sección videos.
CAPÍTULO 10. APLICACIÓN WEB 216
Consultar/Elimnar
Las tablas que integran la base de datos RAC son las siguientes:
• ADMIN: contiene los datos que manejan el control de acceso del admi-
nistrador del sistema. Se puede apreciar su estructura en la figura 10.11
de la página 221 y posee los siguientes campos de datos:
campos es la siguiente:
10.3.1 HTML
<html>
<head>
CAPÍTULO 10. APLICACIÓN WEB 227
<title>:. R A C :.</title>
</head>
x.src=x.oSrc;
i<a.length; i++)
&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
x=d.forms[i][n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=
MM_findObj(n,d.layers[i].document);
if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc)
x.oSrc=x.src; x.src=a[i+2];}
</script>
onLoad=“MM_preloadImages(‘imagenes/bo_index.png’,
‘imagenes/bo_historia.png’,
‘imagenes/bo_productos.png’,
‘imagenes/bo_ubicacion.png’)”>
height=“100%”>
<tr>
cellspacing=“0”>
<tr>
</tr>
<tr><td bgcolor=“#ACC880”>
CAPÍTULO 10. APLICACIÓN WEB 231
<tr>
<td><a href=“JavaScript:RACHtml(‘principal’)”
onMouseOut=“MM_swapImgRestore()”
onMouseOver=“MM_swapImage(‘Image1’,”,‘imagenes/bo_index.png’,1)”>
alt=“Principal”>
onMouseOut=“MM_swapImgRestore()”
onMouseOver=“MM_swapImage(‘Image2’,”,
‘imagenes/bo_historia.png’,1)”>
src=“imagenes/b_historia.png” alt=“Historia”></a></td>
<td><a href=“JavaScript:RACHtml(‘producto’)”
onMouseOut=“MM_swapImgRestore()”
onMouseOver=“MM_swapImage(‘Image3’,”,
‘imagenes/bo_productos.png’,1)”>
src=“imagenes/b_productos.png” alt=“Productos”></a></td>
<td><a href=“JavaScript:RACHtml(‘ubicacion’)”
onMouseOut=“MM_swapImgRestore()”
onMouseOver=“MM_swapImage(‘Image4’,”,
‘imagenes/bo_ubicacion.png’,1)”>
src=“imagenes/b_ubicacion.png” alt=“Ubicación”>
</a></td>
</tr>
</table></td></tr>
<tr>
<TBODY>
<TR>
<TBODY><TR>
<TD class=nav-t3-normal>
<A href=JavaScript:RACHtml(‘producto’)>Productos</A></TD>
<TD class=nav-t3-normal>
<A href=JavaScript:RACHtml(‘historia’)>Historia</A></TD>
<TD class=nav-t3-normal>
<A href=JavaScript:RACHtml(‘ubicacion’)>Ubicación</A></TD>
<TD class=nav-t3-normal>
<A href=JavaScript:RACHtml(‘contacto’)>Contacto</A></TD>
<TD class=nav-t3-normal>
<A href=JavaScript:RACHtml(‘admin’)>Admin</A></TD>
</TR></TBODY>
</TABLE><br></TD>
</TR>
CAPÍTULO 10. APLICACIÓN WEB 233
</TBODY>
</TABLE>
cellpadding=“0” >
<TBODY>
<TR>
<TBODY>
<TR>
</TR>
<TR>
width=“218” height=“11”></TD>
</TR>
</TBODY>
</TABLE>
<BR><TABLE width=“197”>
<TR>
<BR>
<BR>
voltaje.<BR>
<BR>
<BR>
<BR>
</MARQUEE></TD>
</TR>
CAPÍTULO 10. APLICACIÓN WEB 235
</TABLE>
</TD>
rowspan=“3”><font id=baterias><script>Principal(‘bateria’);
</script></font></TD>
</A><BR>
<BR>
<A href=“JavaScript:RACHtml(‘contacto’)”>
height=“63”></A><BR>
<BR>
<A href=“JavaScript:RACHtml(‘ubicacion’)”>
height=“63”></A></TD>
</TR>
<TR>
<IMG
src=“http://www.dolarsi.com/cotizador/cotizador_verde_full.asp”>
rowspan=“2” valign=“top”>
<script type=“text/javascript”>
function greeting()
function montharr(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11)
this[0] = m0;
this[1] = m1;
this[2] = m2;
this[3] = m3;
this[4] = m4;
this[5] = m5;
this[6] = m6;
this[7] = m7;
this[8] = m8;
this[9] = m9;
this[10] = m10;
this[11] = m11;
function calendar()
{
CAPÍTULO 10. APLICACIÓN WEB 237
var thisDay;
var monthDays = new montharr(31, 28, 31, 30, 31, 30, 31, 31, 30,
year = today.getYear() ;
thisDay = today.getDate();
monthDays[1] = 29;
nDays = monthDays[today.getMonth()];
firstDay = today;
firstDay.setDate(1);
testMe = firstDay.getDate();
if (testMe == 2)
firstDay.setDate(0);
startDay = firstDay.getDay();
document.writeln(”);
class=tabla-td><B>’);
document.write(monthNames.substring(today.getMonth() * 3,
(today.getMonth() + 1) * 3));
document.write(‘. ’);
CAPÍTULO 10. APLICACIÓN WEB 238
document.write(year);
document.write(‘<TR class=texto-calend>
<TD><B>Dom</B><TD><B>Lun</B><TD><B>Mar</B><TD>
<B>Mie</B><TD><B>Jue</B><TD><B>Vie</B><TD>
<B>Sab</B>’);
document.write(‘<TR>’);
column = 0;
document.write(‘<TD>’);
column++;
document.write(‘<TD valign=middle>’);
if (i == thisDay)
document.write(‘<FONT class=borde-amarillo
color=black><b>’)
document.write(i);
if (i == thisDay)
document.write(‘</b></FONT>’)
column++;
if (column == 7)
{
CAPÍTULO 10. APLICACIÓN WEB 239
document.write(‘<TR>’);
column = 0;
document.write(‘</TABLE>’);
document.writeln(”);
greeting();
document.write(‘</br>’);
calendar();
document.write(“”);
</SCRIPT>
</TD>
</TR>
<TR></TR>
</TBODY>
</TABLE></CENTER></DIV>
<BR>
<BR>
<BR>
<BR>
</FORM>
<DIV id=catalogo></DIV>
<DIV id=video></DIV>
</td>
</tr>
<tr>
</tr>
</table></td>
</tr>
</table>
</body>
</html>
Servlet
A continuación se transcribe el código del servlet de Java que maneja el
armado de la página mediante la interacción con el motor Ajax.
package utilitarios;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
CAPÍTULO 10. APLICACIÓN WEB 241
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
Connection conn;
super.init(cf);
conn=RACHtml.conexion();
public RACHtml() {
super();
String link=request.getParameter(“link”);
response.setHeader(“Content-Type”, “text/html;charset=windows-1252”);
response.setHeader(“Cache-Control”, “must-revalidate”);
response.setHeader(“Cache-Control”, “no-cache”);
CAPÍTULO 10. APLICACIÓN WEB 242
if(link.equals(“historia”)){
tabla(out);
historia(out);
fintabla(out);
}else if(link.equals(“producto”)){
tabla(out);
productos(out);
fintabla(out);
}else if(link.equals(“ubicacion”)){
tabla(out);
ubicacion(out);
fintabla(out);
}else if(link.equals(“principal”)){
tabla(out);
principal(out);
fintabla(out);
}else if(link.equals(“contacto”)){
tabla(out);
contacto(out);
fintabla(out);
}else if(link.equals(“admin”)||link.equals(“validar”)){
if(link.equals(“validar”)){
try{
Statement stm=conn.createStatement();
and clave=“‘+clave+””’);
String existe=””;
while(rs.next()){
existe=rs.getString(1);
rs.close();
if(existe.equals(“”)){
tabla(out);
out.println(“<CENTER><BR><BR>”);
out.println(“<form name=formu>”);
out.println(“ <TBODY>”);
out.println(“<TR>”);
out.println(“ </TR>”);
out.println(“ <TR>”);
out.println(“ </TR>”);
out.println(“ <TR>”);
out.println(“ </TR>”);
out.println(“ <TR>”);
out.println(“src=‘imagenes/entrar.gif’ alt=‘Entrar’></a></TD>”);
out.println(“</TR>”);
out.println(“ </TBODY>”);
out.println(“ </TABLE></form>”);
out.println(“ </CENTER></body>”);
fintabla(out);
}else{
tabla(out);
admin(out);
fintabla(out);
}catch(Exception e){
e.printStackTrace();
}else{
tabla(out);
CAPÍTULO 10. APLICACIÓN WEB 245
validarAdmin(out);
fintabla(out);
out.println(“ <TBODY>”);
out.println(“ <TR>”);
out.println(“ height=175><br></TD>”);
out.println(“</p>”);
out.println(“ don Capra se dio cuenta de que era necesario estudiar mucho y
que”);
out.println(“ </TR>”);
out.println(“ <TR>”);
out.println(“align=center height=170>”);
out.println(“ <br>”);
out.println(” <br>”);
out.println(“ <br>”);
out.println(“ <br>”);
out.println(“ <br>”);
out.println(“ </marquee></TD>”);
CAPÍTULO 10. APLICACIÓN WEB 249
out.println(“ </TR>”);
out.println(“ <TR>”);
out.println(“ </TR>”);
out.println(“ </TBODY>”);
out.println(“ </TABLE></DIV>”);
out.println(“<TBODY>”);
out.println(“ <TR>”);
out.println(“(document.form.catalogo.value);’>”);
out.println(“(document.form.video.value);’>”);
out.println(“(document.form.cual.value);’>”);
out.println(“ </TR>”);
out.println(“ </TBODY>”);
out.println(“ </TABLE><br>”);
out.println(“<p class=texto> </p>” );
out.println(“<br>”);
out.println(“<br>” );
out.println(“<p class=texto> </p>” );
out.println(“ cellspacing=1>”);
out.println(“ <TBODY>”);
out.println(“ <TR>”);
out.println(“ height=175><br></TD>”);
out.println(“ </p>”);
out.println(“ width=100%>”);
out.println(“ <TBODY>”);
out.println(“ <tr>”);
out.println(“un área especial de nuestro sitio, creada para que usted pueda”);
out.println(“es muy importante para que podamos, a cada dia, ofrecer una mejor
tecnología y ”);
out.println(“</FONT></td>”);
CAPÍTULO 10. APLICACIÓN WEB 252
out.println(“ </TR>”);
out.println(“ <TR>”);
out.println(“Nombre*<BR>”);
out.println(“style=‘width:250px;’></TD>”);
out.println(“ </TR>”);
out.println(“ <tr>”);
out.println(“ <tr>”);
out.println(“Teléfono<br />”);
out.println(“ <tr>”);
out.println(“Tema<br />”);
out.println(“<tr>”);
out.println(“width=’315’></td>”);
out.println(“ <tr>”);
CAPÍTULO 10. APLICACIÓN WEB 253
out.println(“width=‘315’>Mensaje*”);
out.println(“<br />”);
out.println(“style=‘width:30px;text-align:center;”’);
out.println(“src=‘imagenes/enviar.gif’/></td>”);
out.println(“ </tbody></table>”);
out.println(“</FORM>”);
out.println(“ </TR>”);
out.println(“ <TR>”);
out.println(“align=center height=170>”);
)<br>”);
out.println(“ <br>”);
out.println(“ <br>”);
out.println(“ <br>”);
out.println(“ <br>”);
out.println(“ <br>”);
out.println(“ </marquee></TD>”);
out.println(“ </TR>”);
out.println(“ <TR>”);
out.println(“ </TR>”);
out.println(“ </TBODY>”);
CAPÍTULO 10. APLICACIÓN WEB 255
out.println(“ </TABLE></DIV>”);
//ADMIN
out.println(“<CENTER><BR><BR>”);
out.println(“<form name=formu>”);
out.println(“ <TBODY>”);
out.println(“ <TR>”);
out.println(“class=select-modelo></TD>”);
out.println(“ </TR>”);
out.println(“ <TR>”);
out.println(“class=select-modelo></TD>”);
out.println(“ </TR>”);
out.println(“ <TR>”);
out.println(“onclick=RACHtml(‘validar’); name=‘entrar”’);
out.println(“ </TR>”);
out.println(“ </TBODY>”);
out.println(“ </TABLE></form>”);
out.println(“ </CENTER></body>”);
out.println(“ cellspacing=1>”);
out.println(“<TBODY>”);
out.println(“ <TR>”);
out.println(“ <TBODY>”);
out.println(“ <TR>”);
out.println(“ <BR>”);
out.println(“ </TD></TR>”);
out.println(“ <TR>”);
out.println(“rowspan=2><A”);
out.println(“ href=‘JavaScript:AgregarMarca()’>”);
out.println(“ <BR>”);
out.println(“ </A><A”);
out.println(“Agregar Videos</A><BR>”);
out.println(“<BR>”);
out.println(“ <BR>”);
out.println(“<BR>”);
out.println(“ src=‘http://www.dolarsi.com/cotizador/”);
out.println(“cotizador_verde_full.asp’>”);
out.println(“ </A>”);
out.println(“ </TD>”);
out.println(“ <CENTER>”);
out.println(“ </CENTER>”);
out.println(“ </TD>”);
out.println(“ </TR>”);
out.println(“ </TBODY>”);
out.println(“ </TABLE>”);
out.println(“ </TD>”);
CAPÍTULO 10. APLICACIÓN WEB 258
out.println(“ </TR>”);
out.println(“ </TBODY>”);
out.println(“</TABLE>”);
out.println(“ <tr>”);
out.println(“ <TBODY>”);
out.println(“ <TR>”);
out.println(“<A href=JavaScript:RACHtml(’producto’)>”);
out.println(“ Productos</A></TD>”);
out.println(“<A href=JavaScript:RACHtml(’historia’)>Historia</A></TD>”);
out.println(“<A href=JavaScript:RACHtml(‘ubicacion’)>Ubicación</A></TD>”);
out.println(“<TD class=nav-t3-normal>”);
out.println(“<A href=JavaScript:RACHtml(‘contacto’)>Contacto</A></TD>”);
out.println(“<A href=JavaScript:RACHtml(‘admin’)>Admin</A></TD>”);
CAPÍTULO 10. APLICACIÓN WEB 259
out.println(“</TR></TBODY>”);
out.println(“ </TABLE><br></TD>”);
out.println(“ </TR>”);
out.println(“ <TR>”);
out.println(“ </TD>”);
out.println(“ </TR>”);
out.println(“ </TBODY>”);
out.println(“</TABLE></DIV>”);
out.flush();
out.close();
Connection conn=null;
try {
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
}catch (ClassNotFoundException e) {
e.getMessage());
try {
conn = DriverManager.getConnection(“jdbc:odbc:rac”);
CAPÍTULO 10. APLICACIÓN WEB 260
}catch (SQLException e) {
return conn;
var xmlhttp=false;
try {
}catch (e) {
try {
}catch (E) {
xmlhttp = false;
}
CAPÍTULO 10. APLICACIÓN WEB 261
return xmlhttp;
function RACHtml(link){
if(link==‘principal’){
window.location.href=“Index.html”;
}else{
var usuario=“”;
var clave=“”;
if(link==‘validar’){
usuario = document.getElementById(“usuario”).value;
clave = document.getElementById(“clave”).value;
divResultado = document.getElementById(‘resu’);
ajax=objetoAjax()
+escape(link);
ajax.open(‘GET’, url);
ajax.onreadystatechange=function() {
if (ajax.readyState==1) {
if (ajax.readyState==4) {
CAPÍTULO 10. APLICACIÓN WEB 262
divResultado.innerHTML = ajax.responseText
ajax.send(null);
// delete(ajax);
.texto{
font-size: 12px;
color: #333333;
padding-left:5px;
padding-right:5px;
.textoj{
font-size: 12px;
color: #333333;
padding-left:5px;
padding-right:5px;;
text-align: justify;
CAPÍTULO 10. APLICACIÓN WEB 263
text-indent: 6px;
vertical-align: middle
.titulo{
font-size: 16px;
color: #ACC880;
font-weight: bold;
text-transform: uppercase;
padding-left:5px;
.nombres{
font-size: 16px;
color: #ff8000;
font-weight: bold;
text-transform: uppercase;
padding-left:5px;
.borde-amarillo{
border-style: solid;
border-width: 1px;
border-color: green
}
.fondo-tabla{
background-image: url(“../imagenes/fondo-tabla.gif”);
background-repeat: no-repeat;
background-position: center;
font-size: 10pt;;
}
Capítulo 11
Conclusiones
265
CAPÍTULO 11. CONCLUSIONES 266
[1] Bart Jacob Carla Sadtler, John Ganci. WebSphere Product Family Over-
view and Architecture. IBM Press, USA, 2004.
[2] IBM Corporation. IBM DB2 Universal Database para Windows Guía
Rápida de Iniciación Versión 7. IBM Press, USA, 2000.
[3] IBM. WebSphere Comerse V5.5 Architecture. IBM Press, USA, 2003.
[4] Dion Almaer Justin Gehtland, Ben Galbraith. Pragmatic Ajax: A Web
2.0 Primer. ISBNŮ13: 978-0976694083. O’Reilly, USA, 2007.
[7] Javier Eguíluz Pérez. Introducción a AJAX. IBM Press, USA, 2008.
268
Índice de Materias
269
ÍNDICE DE MATERIAS 270
XHTML, 2
XML, 2, 206
XMLHttpRequest, 7, 113