Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tabla de contenidos
l Precedentes
l Características
l Tecnología
l Caso de estudio: Ajax en JSF
Precedentes
l Aplicaciones web
l Ejecutadas en el lado del cliente con fácil
despliegue
- Debido a una interacción limitada (HTML)
l Resuelta parcialmente con JavaScript
- Carga y descarga de páginas continua
l Envío al servidor, procesado y vuelta para renderizar
- Soluciones:
l Aplicaciones interactivas alojadas en el lado del servidor
y descargadas bajo demanda por el cliente
Precendentes
l Ejecutada en contextos especiales:
l Plug-ins
- Ej: Flash
l Máquinas virtuales
- Ej: applets
l Intepretadas por motores
- Ej: JavaScript
Precedentes
l Applets
l Aplicaciones “pequeñas” a las que se accede en un
servidor web mediante un navegador.
- Se transmiten a través de HTTP, y se instalan y ejecutan
automáticamente como parte de un documento HTML
- Acceso limitados a los recursos por problemas de seguridad.
l La seguridad implementada por defecto es:
- No accesos (R y/o W) a disco del cliente.
- No acceso a otro IP que no sea el del proveedor del applet desde el cliente.
Precedentes
Documento
HTML
Código Applet en el
JAVA Navegador
l Clases Java.
l Heredan de la clase java.applet.Applet o javax.swing.JApplet
l AWT (abstract windows toolkit) o Swing (clases correspondientes a GUI)
l soporte adicional a las funciones gráficas de los Applets
Precendentes
<html>
<head>
<title>Applets Java</title>
</head>
<body>
<applet
code=“AlgunApplet.class" width="200" height="300">
Su browser no entiende Java.
</applet>
...
</body>
</html>
Precedentes
l Ejemplo: Holamundo HolaMundo.html
<html>
<head>
<title>Applets Java</title>
</head>
<body>
<applet
code= "AppletHolaMundo.class" width="200" height="300">
Su browser no entiende Java.
</applet>
</body>
</html>
AppletHolaMundo.java
import java.applet.*;
import java.awt.*;
Precedentes
l Ciclo de vida
l El navegador toma el control (contexto)
Precendentes
l Flash
l Gráficos vectoriales
l Concepto de escenarios, línea de tiempo, capas y paneles
l Animaciones 2D
- Fotograma a fotograma
- Animación por interpolación: de movimiento o forma
l Incrustación en páginas web
l Ficheros de pequeño tamaño
l Lenguaje de programación ActionScript (basado en
ECMAScript)
- Interacción utilizando LPOO
l Herramientas de edición propietarias y plugins necesarios
Precedentes
l Embebido en página HTML Plugin a
utilizar
<html>
<body>
Fichero
swf a
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" cargar
codebase="http://download.macromedia.com/pub/shockwave/
cabs/flash/swflash.cab#version=6,0,40,0" width="468" height="60"
id="mymoviename">
<param name="movie" value="example.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<embed src="example.swf" quality="high" bgcolor="#ffffff"
width="468" height="60" name="mymoviename" align="" type="application/x-
shockwave-flash"
pluginspage="http://www.macromedia.com/go/getflashplayer">
</embed>
</object>
</body>
</html>
Precedentes
l JavaScript
l Contemporáneo a los applets
- Como respuesta a Java
- Con diferente soporte por parte de Microsoft: VBScript
l Lenguaje OO dinámicamente tipado ligado a DOM (modelo de
objetos del documento) - Interpretado
- Con unos "inicios difíciles": distinto comportamiento en cada navegador,
errores en ejecución, se puede deshabilitar en el navegador, etc.
l W3C estandariza DOM
- Ej: http://www.dynamicdrive.com/
Precendente
l JavaScript
l Basado en manejadores de eventos
Evento Descripción
onload Después de la carga
onunload Despúes de descargar
onfocus Al seleccionar
onblur Al abandonar la selección
onmouseover Al pasar el ratón por encima
onmouseout Al abandonar el ratón
onclick Al hacer click con el ratón
onmousedown Al pulsar el botón
onmouseup Al liberar el botón
onmousemove Al desplazar el ratón
onkeydown Al pulsar una tecla
onkeyup Al soltar una tecla
onkeypress Al pulsar y soltar repetidamente
Precedente
l Ejemplo:
<!DOCTYPE html>
<html>
<head>
<script>
function displayDate()
{
document.getElementById("demo").innerHTML=Date();
}
</script>
</head>
<body>
<h1>Ejemplo JavaScript</h1>
<p id="demo">Texto a reemplazar</p>
</body>
</html>
Universidad de Burgos - Francisco J. Rodríguez <fjrdiaz@ubu.es> 14/39
Arquitectura y Servicios de Internet – Aplicaciones de Internet Enriquecidas
Características
l RIA = Rich Internet Application
l Eliminación de la frontera entre aplicación web y
aplicación de escritorio
- Aplicaciones interactivas
- Con refresco de datos en tiempo real
- No sólo ligado al envío de formularios o clicks sobre
enlaces
Tecnología
l AJAX - Asynchronous JavaScript + XML
l No es un estándar, es una técnica
l No es una "nueva tecnología"
- Apoyada en un objeto XMLHttpRequest (desde 1999 :0)
l Apoyada (ahora sí) por todos los navegadores
l Puede interactuar con cualquier tecnología de servidor
- PHP, ASP.NET, servlets, CGI, etc.
l Cambio en el paradigma típico de petición/respuesta
- Interacción asíncrona con el servidor
- Sin refrescar la página --> alterando el código de la
página directamente en el cliente (DOM)
Tecnología
l Anteriormente resuelto con "trampas":
l iframes, frames, frames ocultos, etc.
l Cambio en el modelo
Tecnología
l Sincrono vs.
asíncrono
Tecnología
l Creación de un objeto XMLHttpRequest:
var xmlHttp;
function createXMLHttpRequest() {
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
}
Tecnología
l Petición y recogida
…
function startRequest() { Asíncrono
createXMLHttpRequest();
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.open("GET", "simpleResponse.xml", true);
xmlHttp.send(null);
}
Query string
function handleStateChange() {
if (xmlHttp.readyState == 4) {
if( xmlHttp.status == 200) {
Alert("The server replied with: " +
xmlHttp.responseText);
}
}
}
</script>
</head>
<body>
<form action="#">
<input type="button" value="Start Basic Asynchronous
Request"
onclick="startRequest();"/>
</form>
</body>
Universidad de Burgos - Francisco J. Rodríguez <fjrdiaz@ubu.es>
</html> 20/39
Arquitectura y Servicios de Internet – Aplicaciones de Internet Enriquecidas
Tecnología
l Métodos estándar en XMLHttpRequest
Método Descripción
getAllResponseHeaders() Retorna todas las parejas clave/valor de las cabeceras de la respuesta HTTP
open("method", "url") Establece la llamada al servidor. Puede ser GET, POST, o PUT. La url puede
ser absoluta o relativa (con tres argumentos opcionales: boolean asynch,
string username, string password).
Tecnología
l Propiedades estándar
Método Descripción
onreadystatechange Manejador de evento que se dispara a cada cambio de estado, tipicamente una llamada a
función
responseXML Respuesta del servidor como XML. Parseable como objeto DOM
statusText Versión en texto del estado HTTP (OK, Not Found, etc.)
Tecnología
l DOM
l Modo común de representar y manipular un documento HTML o XML
l Modelo de Objetos del Documento
- Representación en forma de árbol de los datos y la estructura de una
página
l Utilizando JavaScript y la propiedad id de del elemento HTML
- Navegación en el árbol con propiedades (elementos DOM):
Propiedad/Elemento DOM Descripción
childNodes Devuelve el array de hijos
firstChild Devuelve el primer hijo
lastChild Devuelve el último hijo
nextSibling Devuelve el siguiente hermano
nodeValue Devuelve el nodo actual
parentNode Devuelve el nodo padre
previousSibling Devuelve el hermano previo
Tecnología
l DOM
l Navegación con métodos
Propiedad Descripción
getElementById(id) Devuelve el elemento en el documento con id
getElementsByTagName(name) Devuelve el array de elementos hijos que tienen ese
nombre
hasChildNodes() Devuelve true si tiene hijos
getAttribute(name) Devuelve el atributo
Tecnología
l DOM
l Edición y modificación del contenido con atributos/métodos
Atributos/Métodos Descripción
document.createElement(tagName) Crea un elemento (HTML)
document.createTextNode(text) Crea un nodo de texto
<element>.appendChild(childNode) Añade un hijo.
<element>.getAttribute(name) Lee o establece el atributo con dicho nombre
<element>.setAttribute(name, value)
<element>.insertBefore(newNode, Inserta el nuevo nodo antes del nodo indicado
targetNode)
<element>.removeAttribute(name) Elimina un atributo
<element>.removeChild(childNode) Elimina un hijo
<element>.replaceChild(newNode, oldNode)Reemplaza un hijo
Tecnología
l Procesar la respuesta como texto plano
l Método responseText
- Conectado a la propiedad innerHTML
l Ej: ...
Texto devuelto se conecta en el
function handleStateChange() { componenteHTML
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
Consulta en DOM document.getElementById("results").innerHTML =
xmlHttp.responseText;
}
}
}
</script>
</head>
<body>
<form action="#">
<input type="button" value="Busqueda"
onclick="startRequest();"/>
</form>
l Con algunas limitaciones dependientes del tipo de navegador
<div id="results"></div>
</body>
</html>
Tecnología
l Procesa la respuesta como XML
l Método responseXML
- Navegación en el documento XML con DOM
l Ej: function listAllStates() {
var xmlDoc = xmlHttp.responseXML;
<?xml version="1.0" encoding="UTF-8"?> var allStates =
<states> xmlDoc.getElementsByTagName("state");
<north> var out = "Todos los Estados";
<state>Minnesota</state>
var currentState = null;
<state>Iowa</state>
<state>North Dakota</state> for(var i = 0; i < allStates.length; i++) {
</north> currentState = allStates[i];
<south> out = out + "\n- " +
<state>Texas</state> currentState.childNodes[0].nodeValue;
<state>Oklahoma</state> }
<state>Louisiana</state>
</south> alert(out);
<east> }
<state>New York</state>
<state>North Carolina</state>
<state>Massachusetts</state>
</east>
<west>
<state>California</state>
<state>Oregon</state>
<state>Nevada</state>
</west>
</states>
Universidad de Burgos - Francisco J. Rodríguez <fjrdiaz@ubu.es> 27/39
Arquitectura y Servicios de Internet – Aplicaciones de Internet Enriquecidas
Tecnología
l Envío de datos en la
petición AJAX var url = "get_data.php";
var params = "lorem=ipsum&name=binny";
l GET http.open("GET", url+"?"+params, true);
http.onreadystatechange = function() {
if(http.readyState == 4 && http.status == 200) {
- Con pares clave/valor alert(http.responseText);
- Enviada en el método open }
}
l POST: http.send(null);
http.onreadystatechange = function() {
if(http.readyState == 4 && http.status == 200) {
alert(http.responseText);
}
}
http.send(params);
Tecnología
l JSON - JavaScript Object Notation como alternativa a XML
- Formato de intercambio de datos ligero (basado en { } [ ] y clave:valor)
- Sintaxis muy reducida (ver http://www.json.org/)
l Ej: JSON vs. XML (extraído de http://www.json.org)
<widget>
{"widget": { <debug>on</debug>
"debug": "on", <window title="Sample Konfabulator Widget">
"window": { <name>main_window</name>
"title": "Sample Konfabulator Widget", <width>500</width>
"name": "main_window", <height>500</height>
"width": 500, </window>
"height": 500 <image src="Images/Sun.png" name="sun1">
}, <hOffset>250</hOffset>
"image": { <vOffset>250</vOffset>
"src": "Images/Sun.png", <alignment>center</alignment>
"name": "sun1", </image>
"hOffset": 250, <text data="Click Here" size="36" style="bold">
"vOffset": 250, <name>text1</name>
"alignment": "center" <hOffset>250</hOffset>
}, <vOffset>100</vOffset>
"text": { <alignment>center</alignment>
"data": "Click Here", <onMouseUp>
"size": 36, sun1.opacity = (sun1.opacity / 100) * 90;
"style": "bold", </onMouseUp>
"name": "text1", </text>
"hOffset": 250, </widget>
"vOffset": 100,
"alignment": "center",
"onMouseUp": "sun1.opacity = (sun1.opacity / 100) *
90;"
}
Universidad de Burgos - Francisco J. Rodríguez <fjrdiaz@ubu.es>
}} 29/39
Arquitectura y Servicios de Internet – Aplicaciones de Internet Enriquecidas
Tecnología
l JSON
l Soportada en navegadores, creando objetos
JSON
- Ej:
<div id="placeholder"></div>
<script>
var data={
"firstName":"Ray",
"lastName":"Villalobos",
"joined":2012
};
document.getElementById("placeholder").innerHTML=data.firstName+" "+data.lastName+"
"+data.joined;
</script>
Caso de estudio
l AJAX en JSF
l Integrando el código JavaScript a la página
generada dinámicamente
l Utilizando las bibliotecas de recursos
- Componentes gráficos JSF con AJAX habilitado
- Usando etiqueta <f:ajax />
l Sin parametrizar, valor por defecto valueChange
- Usando el método JavaScript:
jsf.ajax.request() directamente en el Facelet
l Documentación de la JSF JavaScript API
- https://javaserverfaces.java.net/nonav/docs/2.2/jsdocs/symbols/jsf.ajax.html
Caso de estudio
l Atributos en la etiqueta <f:ajax />
Nombre Tipo Descripción
disabled javax.el.ValueExpression evalúa a Boolean Indica si se deber renderizar o no. Por defecto a a false
event javax.el.ValueExpression evalúa a String Identifica el tipo de evento al que se aplica la acción Ajax. Por defecto action para
ActionSource y valueChange para EditableValueHolder. (Nota: cierta
correspondencia con eventos JavaScript pero eliminado on delante)
execute javax.el.ValueExpression evalúa a Object Colección que identifica una lista de componentes (separados por espacio en blanco) a ser
ejecutado en el servidor. Por defecto @this (otros valores @all, @none, @form, ids
separados por espacios o uso de EL como colección de Strings)
immediate javax.el.ValueExpression evalúa a Boolean Indica si la entrada se debe procesar tempranamente en el ciclo de vida.
onevent javax.el.ValueExpression evalúa a String Nombre de la función JavaScript que maneja el evento de UI
onerror javax.el.ValueExpression evalúa a String Nombre de la función JavaScript que maneja errores.
render javax.el.ValueExpression evalúa a un Object Collection con la lista de componentes a rederizarse en el cliente. Por defecto @none (otros
valores @this, @all, @form, ids separados por espacios o uso de EL como coleccion
de Strings).
Caso de estudio
l Atributo/valor
Atributo Valores posibles
event click*, keyup, mouseover, focus, blur.
execute Identificador del componente UI de JSF o bien
@all, @none, @this* o @form
Caso de estudio
l Procesado de la respuesta
l Atributo render: especifica secciones a ser
alteradas
- Valores: uno o varios identificadores, o @this,
@all, @none, @form, o una expresión EL
l Agrupación de elementos en la misma acción
<f:ajax event="click" render="@all">
...
<h:commandButton id="Submit">
<f:ajax event="mouseover"/>
</h:commandButton>
...
</f:ajax>
Caso de estudio
l Carga directa del código JavaScript en un Facelet
Código JavaScript a incluir (en este caso
biblioteca habitual)
<h:form>
<h:outputScript name="jsf.js" library="javax.faces"
target="head"/>
</h:form>
Caso de estudio
l Ej: HolaMundo en JSF con AJAX
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:body>
<h3>Ejemplo de HolaMundo con JSF y AJAX</h3>
<h:form>
<h:inputText id="name" value="#{helloBean.name}"></h:inputText>
<h:commandButton value="Bienvenido">
<f:ajax execute="name" render="output" />
</h:commandButton>
<h2>
<h:outputText id="output" value="#{helloBean.sayWelcome}"
/>
</h2>
</h:form>
</h:body>
</html>
name, es el componente a ejecutar render, es el componente a
asíncronamente en el lado del renderizar en respuesta
servidor
Universidad de Burgos - Francisco J. Rodríguez <fjrdiaz@ubu.es> 36/39
Arquitectura y Servicios de Internet – Aplicaciones de Internet Enriquecidas
Caso de estudio
l Otros casos:
l JavaFX de Oracle
- Aplicaciones RIA con lenguaje JavaFXScript
l Competencia de Flash (Apache Flex) y Silverlight
l Silverlight de Microsoft
- Aplicaciones RIA
l Basado en WPF (Windows Presentation Foundation)
con XAML
l Competencia de JavaFX y Flash (Apache Flex)
l HTML 5 con JavaScript como presente y futuro
Bibliografía
l Rodriguez de la Fuente, S. Et al. (2003) Programación de
Aplicaciones Web. Editorial Thomson. ISBN: 84-9732-181-2
l M.L.Liu. (2004) Computación Distribuida. Fundamentos y
Aplicaciones. Ed. Pearson Addison-Wesley, 1ª edición. ISBN: 84-
7829-066-4
l Odell, D. (2009) Pro JavaScript RIA Techniques. Apress
l Aslesson, R. & Schutta,N.T. (2006) Foundations of Ajax. Apress.
Licencia
•Autor: Raúl Marticorena Sánchez
•Área de Lenguajes y Sistemas Informáticos
•Departamento de Ingeniería Civil
•Escuela Politécnica Superior
•UNIVERSIDAD DE BURGOS
•2013
Este obra está bajo una licencia Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported.
No se permite un uso comercial de esta obra ni de las posibles obras derivadas, la distribución de las cuales se
debe
hacer con una licencia igual a la que regula esta obra original