30
AJAX Desarrollo de Aplicaciones Distribuidas

AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

  • Upload
    others

  • View
    17

  • Download
    0

Embed Size (px)

Citation preview

Page 1: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAXDesarrollo de Aplicaciones Distribuidas

Page 2: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

Contenido

• Introducción

• Desarrollo

• XMLHttpRequest

• Envío de datos

• Procesamiento de datos

• JSON

• Algunas técnicas en AJAX

• Referencias

2

Page 3: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAX - Introducción

• AJAX es un acrónimo de Asynchronous JavaScript + XML (JavaScript asíncrono + XML)• “Ajax no es una tecnología en sí mismo. En realidad, se

trata de varias tecnologías independientes que se unen de formas nuevas y sorprendentes.”

• Las tecnologías que forman AJAX son:• XHTML y CSS, para crear una presentación basada en

estándares.• DOM, para la interacción y manipulación dinámica de la

presentación.• XML y JSON, para el intercambio de información.• XMLHttpRequest, para el intercambio asíncrono de

información.• JavaScript, para unir todas las demás tecnologías.

3

Page 4: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAX

4

Page 5: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAX

• En las aplicaciones web tradicionales, las acciones del usuario en la página desencadenan peticiones al servidor.• El servidor procesa la petición y devuelve una nueva

página HTML al navegador del usuario.

• Peticiones continuas al servidor requieren esperar a que se recargue la página con los cambios solicitados.

• AJAX mejora la interacción del usuario evitando las recargas constantes de la página• El intercambio de información con el servidor se produce en

un segundo plano.

5

Page 6: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAX

6

Page 7: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAX

• AJAX eliminan la recarga constante de páginas mediante creación de un elemento intermedio entre el usuario y el servidor• El usuario ya no se encuentra con una ventana del

navegador vacía esperando la respuesta del servidor.

• Las peticiones HTTP al servidor se sustituyen por peticiones JavaScript que se realizan de forma asíncrona al elemento encargado de AJAX.• Se evitan recargas de página o largas esperas por la

respuesta del servidor.

7

Page 8: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

8

Page 9: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAX - Desarrollo

• Contexto• Introducido en nuevo desarrollo de Exchange 2000

(pobre cliente web OWA ‘Outlook Web Access’)• Desarrollo de XMLHTTP.• Inclusión en la versión de Internet Explorer 5

(librería MSXML)

9

Page 10: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAX

• Ejemplo

‘Hola Mundo’:

La petición HTTP y

la descarga de los

contenidos del archivo

(mensaje hola mundo)

se realizan sin

necesidad de recargar

la página.

10

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html><head><title>Hola Mundo con AJAX</title>

<script type="text/javascript">function descargaArchivo() {

// Obtener la instancia del objeto XMLHttpRequestif(window.XMLHttpRequest) {

peticion_http = new XMLHttpRequest();}else if(window.ActiveXObject) {

peticion_http = new ActiveXObject("Microsoft.XMLHTTP");}// Preparar la funcion de respuestapeticion_http.onreadystatechange = muestraContenido;// Realizar peticion HTTPpeticion_http.open('GET', 'http://localhost/holamundo.txt', true);peticion_http.send(null);function muestraContenido() {

if(peticion_http.readyState == 4) {if(peticion_http.status == 200) {

alert(peticion_http.responseText);}

}}

}window.onload = descargaArchivo;</script></head><body></body></html>

Page 11: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAX• Cuatro bloques: • instanciar el objeto XMLHttpRequest

peticion_http = new XMLHttpRequest();

• preparar la función de respuestapeticion_http.onreadystatechange = muestraContenido;

• onreadystatechange = cuando reciba la respuesta del servidor, se ejecuta manejador del evento.

• realizar la petición al servidorpeticion_http.open('GET', 'http://localhost/prueba.txt', true);peticion_http.send(null);

• ejecutar la función de respuesta• muestraContenido() comprueba que se ha recibido

respuesta válida del servidor (propiedad readyState)

11

Page 12: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAX - XMLHttpRequest

• Propiedades de XMLHttpRequest

12

Page 13: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAX

• Propiedad readyState

13

Page 14: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAX

• Métodos de XMLHttpRequest

14

Page 15: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAX

• open (string metodo, string URL [,boolean asincrono, string usuario, string password]);• Por defecto, las peticiones realizadas son asíncronas

• send (contenido)• contenido indica la información que se va a enviar al

servidor junto con la petición HTTP (una cadena de texto, un array de bytes o un objeto XML DOM)

15

Page 16: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAX – Envío de datos

• Ejemplo de interacción con el servidor

16

<form><label for="fecha_nacimiento">Fecha de nacimiento:</label><input type="text" id="fecha_nacimiento" name="fecha_nacimiento" /><br/><label for="codigo_postal">Codigo postal:</label><input type="text" id="codigo_postal" name="codigo_postal" /><br/><label for="telefono">Telefono:</label><input type="text" id="telefono" name="telefono" /><br/><input type="button" value="Validar datos" />

</form><div id="respuesta"></div>

Page 17: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

Desarrollo de Aplicaciones Distribuidas

17

var READY_STATE_COMPLETE=4;var peticion_http = null;function inicializa_xhr() {

return new XMLHttpRequest();}function crea_query_string() {

var fecha = document.getElementById("fecha_nacimiento");var cp = document.getElementById("codigo_postal");var telefono = document.getElementById("telefono");return "fecha_nacimiento=" + encodeURIComponent(fecha.value) +"&codigo_postal=" + encodeURIComponent(cp.value) +"&telefono=" + encodeURIComponent(telefono.value) +"&nocache=" + Math.random();

}

function valida() {peticion_http = inicializa_xhr(); if(peticion_http) {

peticion_http.onreadystatechange = procesaRespuesta;peticion_http.open("POST", "http://localhost/validaDatos.jsp", true);peticion_http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");var query_string = crea_query_string();peticion_http.send(query_string);

}}function procesaRespuesta() {

if(peticion_http.readyState == READY_STATE_COMPLETE) { if(peticion_http.status == 200) {

document.getElementById("respuesta").innerHTML = peticion_http.responseText; }}

}

Page 18: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAX

• peticion_http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

• si no se establece la cabecera Content-Type correcta, el servidor descarta todos los datos enviados mediante el método POST.

• para enviar parámetros mediante el método POST, es obligatorio incluir la cabecera Content-Type

• peticion_http.send(query_string);

• se encarga de enviar los parámetros al servidor (cadena de texto, documento XML,…)

• parámetros se envían en forma de cadena de texto con las variables y sus valores concatenados mediante el símbolo &

• encodeURIComponent() en query_string es imprescindible para evitar problemas con algunos caracteres especiales.

18

Page 19: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAX – Procesamiento de datos

• XMLHttpRequest también permite la recepción de respuestas de servidor en formato XML.• petición_http.responseXML• Procesamiento mediante métodos DOM de manejo

de documentos XML/HTML

19

<respuesta><mensaje>...</mensaje><parametros> <telefono>...</telefono> <codigo_postal>...</codigo_postal> <fecha_nacimiento>...</fecha_nacimiento></parametros>

</respuesta>

Page 20: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAX

• Procesamiento de la respuesta

20

function procesaRespuesta() { if(peticion_http.readyState == READY_STATE_COMPLETE) { if(peticion_http.status == 200) {

var documento_xml = peticion_http.responseXML;var root = documento_xml.getElementsByTagName("respuesta")[0];var mensajes = root.getElementsByTagName("mensaje")[0];var mensaje = mensajes.firstChild.nodeValue;var parametros = root.getElementsByTagName("parametros")[0];var telefono = parametros.getElementsByTagName("telefono")[0].firstChild.nodeValue;var fecha_nacimiento = parametros.getElementsByTagName("fecha_nacimiento")[0]

.firstChild.nodeValue;var codigo_postal = parametros.getElementsByTagName("codigo_postal")

[0].firstChild.nodeValue;

document.getElementById("respuesta").innerHTML = mensaje + "<br/>" + "Fecha nacimiento = " + fecha_nacimiento + "<br/>" + "Codigo postal = " + codigo_postal

+"<br/>" + "Telefono = " + telefono;

} }}

Page 21: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAX - JSON

• JSON (JavaScript Object Notation)• Formato mucho más compacto y ligero que XML, usado

para el intercambio de información

• Fácil de procesar por el navegador

• Tipo MIME oficial es application/json

• Representa estructuras de datos (arrays) y objetos (arrays asociativos) en forma de texto

21

Page 22: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

JSON

22

var modulos = new Array();modulos[0] = "Lector RSS";modulos[1] = "Gestor email";modulos[2] = "Agenda";modulos[3] = "Buscador";modulos[4] = "Enlaces";

var modulos = ["Lector RSS", "Gestor email", "Agenda", "Buscador", "Enlaces"];

var modulos = new Array();modulos.titulos = new Array();modulos.titulos['rss'] = "Lector RSS";modulos.titulos['email'] ="Gestor de email";modulos.titulos['agenda'] = "Agenda";

var modulos = new Array();modulos.titulos = new Array();modulos.titulos.rss = "Lector RSS";modulos.titulos.email ="Gestor de email";modulos.titulos.agenda = "Agenda";

var modulos = new Array();modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"};

Page 23: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

JSON

• La notación JSON para los arrays asociativos se compone de tres partes:

• 1. Los contenidos del array asociativo se encierran entre llaves ({ y })

• 2. Los elementos del array se separan mediante una coma (,)

• 3. La clave y el valor de cada elemento se separan mediante dos puntos (:)

• Si la clave no contiene espacios en blanco, es posible prescindir de las comillas

23

Page 24: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

JSON

24

var modulo = new Object();modulo.titulo = "Lector RSS";modulo.objetoInicial = new Object();modulo.objetoInicial.estado = 1;modulo.objetoInicial.publico = 0;modulo.objetoInicial.nombre = "Modulo_RSS";modulo.objetoInicial.datos = new Object();

var modulo = {titulo : "Lector RSS",objetoInicial : { estado : 1, publico : 0, nombre : "Modulo RSS", datos : {} }};

Page 25: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

25

<respuesta><mensaje>...</mensaje><parametros> <telefono>...</telefono> <codigo_postal>...</codigo_postal> <fecha_nacimiento>...</fecha_nacimiento></parametros>

</respuesta>

{mensaje: "...",parametros: {telefono: "...", codigo_postal: "...", fecha_nacimiento: "..." }}

function procesaRespuesta() { if(http_request.readyState == READY_STATE_COMPLETE) { if(http_request.status == 200) {

var respuesta_json = http_request.responseText;var objeto_json = eval("("+respuesta_json+")");var mensaje = objeto_json.mensaje;var telefono = objeto_json.parametros.telefono;var fecha_nacimiento = objeto_json.parametros.fecha_nacimiento;var codigo_postal = objeto_json.parametros.codigo_postal;document.getElementById("respuesta").innerHTML = mensaje +

"<br>" + "Fecha nacimiento = " + fecha_nacimiento + "<br>" + "Codigo postal = " + codigo_postal +"<br>" + "Telefono = " + telefono;

} }}

Page 26: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAX

• Se debe transformar la cadena de texto en un objeto JSON. • Función eval(), se añaden paréntesis al principio y al final para

realizar la evaluación de forma correcta

var objeto_json = eval("("+respuesta_json+")");

• Permite acceder a sus métodos y propiedades mediante la notación de puntos tradicional

var fecha_nacimiento = objeto_json.parametros.fecha_nacimiento;

• Es posible el envío de los parámetros en formato JSON• No es tarea sencilla (librerías JSON)

26

Page 27: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

Algunas técnicas en AJAX

• Listas desplegables encadenadas• Cuando se selecciona un elemento de la primera lista

desplegable, se cargan en la segunda lista unos valores que dependen del valor seleccionado en la primera lista

• Autocompletar• Al usuario se le presenta un cuadro de texto simple en el

que puede introducir la información. A medida que el usuario escribe, la aplicación muestra en un desplegable los valores que coinciden con la entrada actual.

27

Page 28: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAX

• Listas desplegables encadenadas

• Los valores de la primera

lista se incluyen en la página

y cuando se selecciona un

valor, se realiza una consulta

al servidor para obtener los

valores de la otra lista.

28

Page 29: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

AJAX

• Autocompletar• Combinar un cuadro

de texto y una lista desplegable en AJAX.Cuando el usuario escribe en el cuadro de texto, la aplicación solicita al servidor los términos relacionados con lo escrito. Cuando la aplicación recibe la respuesta, la muestra a modo de ayuda para autocompletar.

29

Page 30: AJAX - UM€¦ · modulos.titulos = {rss: "Lector RSS", email: "Gestor de email", agenda: "Agenda"}; JSON • La notación JSON para los arrays asociativos se compone de tres partes:

Referencias

• Documentos de referencia:• Introducción a AJAX, Javier Eguíluz Pérez (

www.librosweb.es) <fuente transparencias>• AJAX, Manual imprescindible, 2008, Javier Mellado

Domínguez, ANAYA• Profesional AJAX, Nicholas C. Zakas, Jeremy McPeak

y Joe Fawcett, 2006, ANAYA• Ajax in Action, Dave Crane, Eric Pascarello, Darren

James, 2005, Manning

30