Download Comunicaciones basadas en la web

Document related concepts
no text concepts found
Transcript
Comunicaciones basadas en la
web
Cc50h 2004/2
Web-based communication
• Se basan en el esque ma cliente servidor que
implementa la web
• usa protocolos web http (port 80, GET, PUT, ...)
• Trabajan bien tras frirewalls
• Clientes normalmente flacos
• Ejemplos en Java:
–
–
–
–
Servlets
Applets
J2EE
Java Web Services (via SOAP)
Desarrollo y ejecución de Applets
1. Escribir el código fuente en un archivo con
extensión Java con un editor de texto
2. Compilarlo con el Compilador (javac) para
generar el archivo clase con extensión class
3. Ponerlo en el servidor web junto con una
página que contengauna referencia al applet (tag)
4. Invocar con un browser la página web
Desarrollo y ejecución de Applets
MyApplet.java
MyApplet.class
Java
class
file
Java
source
code
Pagina.html
Applet
tag
Pagina.html
<applet code=MyApplet.class >
<parameters>
</applet>
MyApplet.class
GET Pagina.html
MyApplet.class
Pagina.htm
l
Desarrollo y ejecución de Servlets
1. Escribir el código fuente en un archivo con
extensión Java con un editor de texto
2. Compilarlo con el Compilador (javac) para
generar el archivo clase con extensión class
3. Ponerlo en el servidor web en el lugar apropiado
4. Invocar con un browser el servlet (directamente
o a través de un botón action de un form de
HTML)
Desarrollo y ejecución de Servlets
MyServlet.java
MyServlet.class
Java
class
file
Java
source
code
Código HTML
GET MyServlet
MyServlet
.class
Java Script
El código de un programa es escrito directamente dentro
de la página HTML
NO SE PARECE MUCHO A JAVA !!!!!
Html & Script
<script language = “JavaScript”>
the code
</script>
Java program
running on the client
Java Server Pages (y ...)
• Como Java Script para applets, JSP es un
lenguaje script para la programación de
servlets
• El código es escrito directamente dentro de
la página HTML pero es ejecutada en el
servidor
• El server generará entonces código HTML
el cual será “escrito”en el browser cliente
Esquema J2EE
Servidor de Aplicaciones
DBMS
J2EE Bean
Servlet
JSP
respuesta
Contacta un Servlet o un JSP
Servidor web
Servlets
• Servlets son módulos que extienden a servidores orientados
a request/response, como por ejemplo Servidores Web
“java-enabled”.
• Un servlet puede ser el responsable de tomar datos de una
“forma” HTML y aplicar un método para actualizar las
bases de datos de la una compañía de acuerdo a ellos.
• Servlets reemplazan a los CGI scripts. They provide a way
to generate dynamic documents that is both easier to write
and faster to run.
• Servlets also address the problem of doing server-side
programming with platform-specific APIs: they are
developed with the Java Servlet API, a standard Java
extension.
La Anatomía de un Servlet
• Un nuevo tipo (clase) de servlet es especificado
extendiendo la clase HttpServlet
• Existen métodos predefinidos:
– init() es llamado por el servidor web cuando el servlet
se “sube” la primera vez (uploaded)
– doGet(HttpServletRequest req,
HttpServletResponse res) throws
ServletException, IOException
se llama cuando el servlet es invocado con una peticion
Http GET, que es la normal cuando se contacta un serv.
– doPost(HttpServletRequest req,
HttpServletResponse res) throws
ServletException, IOException
se ejecuta cuando el servlet fue invocado con una petición
Http POST
Anatomía de un servlet
• Una petición GET se genera siempre que una
petición http es ingresada en el browser
(http://www.yahoo.com/ implica GET
index.html Httpx.x )
• Cuando el servlet se llama por primera vez, se
inicializa y 4-6 threads son levantados para
atender a cleintes en paralelo cuando vayan
apareciendo, Para ahorrar tiempo
• En la mayoría de los casos los servlets son
contactados a través de forms en páginas html.
En este caso es posible especificar parámetros y
generar una petición POST
Pasando parametros
• Es posible pasar parámetros en la línea de
invocación URL
– http://host:port/servlet?param1=value1&param2=value2
..
• El servlet puede preguntar por los valores
de los parámetros si conoce el nombre de
ellos de la siguente manera:
– String value = req.getParametervalues(param1)
• Parámetros pueden ser solamente strings
Session Tracking
• Session tracking es el mecanismo que usan
los servlets para mantener información
acerca del estado de los requests de un
usuario (esto es, requests originados de un
mismo browser) en un período de tiempo.
Using Cookies
• Cookies are a way for a servlet to send some information
to a client to store, and for the server to later retrieve its
data from that client.
• Servlets send cookies to clients by adding fields to
HTTP response headers.
• Clients automatically return cookies by adding fields to
HTTP request headers.
• Cookies have a name and a value (additionally they can
have some comments).
• In addition to a name and a value, you can also provide
optional attributes such as comments.
• A server can provide one or more cookies to a client.
Using Cookies
• To send a cookie
1.Instantiate a Cookie object
2.Set any attributes
3.Send the cookie
• To get information from a cookie,
1.Retrieve all the cookies from the user's request
2.Find the cookie by its name
3.Get the values of the cookies that you found
Los Enterprise Java Beans son
como los Servlets
• Son trozos de código que extienden un
servidor
• “Viven” en un contenedor apropiado
• El contenedor decide cuándo se crean y se
destruyen
• No son contactados directamente por el
cliente
Existen 3 Clases principales
• Session Beans:
– Implementan procesos, orientados a acciones
(cálculo de un valor)
• Entity Beans:
– Están asociados a datos persistentes. Representan
una instancia de un dato almacenado
• Message Driven Beans:
– Parecidos a Session beans pero son “despertados”
o contactados por mensajes que pueden incluso ser
asínctonos
Refinando la clasificación
• Session Beans:
– Sin estado: son contactados una vez por los clientes, ejecutan una
acción y no queda traza de lo que se hizo
– Con estado: en una “sesión” pueden ser contactados varias veces
por el mismo cliente para desarrollar una “conversación”. Será
necesario mantener algún tipo de información para recordar lo que
va haciendo el cliente
• Entity Beans:
– Persistencia controlada por el Bean: el programador debe incluir
código de modo de asegurarse que el enttity bean represente a un
dato en una tabla
– Persistencia controlada por el container: el container se preocupa
de asociar el bean a un dato de una tabla
Cómo administra el container el
cliclo de vida de los beans
• Los beans son creados y destruidos por el container.
Cuando un bean se levanta con el container (el bean debe
estar ahí cuando se echa a andar el server) se crean
instancias del bean (bean pool) las cuales son “asignadas”
a los clientes. Qué bean es entregado a qué cliente lo
decide el container
• Si se necesitan más beans estos son creados por el
container (create)
• Si hay demasiados estos son destruidos (Remove)
• El container puede decidir además hacer “dormir” o
“despertar” a los beans según las necesidades (activate,
passivate) para
El papel de cada uno de las 3
clases de objetos
• Cuando un cliente desea contactar a un bean localiza un
un ejbHome Object que correspoda al de un bean deseado.
• Este proceso es bien dependiente de las “condiciones locales” pero
normalmente requiere hacer un lookup a un servidor de nombres
(normalmente provisto por el servidor de aplicaciones también) por
medio de la API JNDI
• Una vez que tiene una referencia a este lo usa para
fabricar un objeto EJB, al cual le aplica los métodos
• El EJBObjet se contactará con un bean adecuado para que
dé el servicio (esto lo hace el contenedor)
El papel de cada uno de las 3
clases de objetos
Bean Pool
3 contacta home
ejbHome
cliente
5- retorna referencia
4 crea ejbObject
6 invoca método
1-ubicar
2 retorna referencia
Naming
ejbObject
7 contacta bean
Estados de un Bean
Cliente
invoca
create
en un
home
Interface
Cliente llama a remove()
en el ejbObject o se le
da un timeout al cliente
No existe
El container llega a un límite
de su capacidad: swapping
1- Class.newInstance()
2- setSessionContext()
3- ejbCreate(...)
ejbRemove()
Timeout del cleinte
ejbPasivate()
Activo
Pasivo
ejbActiivate()
Liente llama a un método del
Bean pasivado
Los Entity beans
• Un bean representa a un dato (fila) en una base de datos
• Hay que pensar en ellos como si fueran uno solo con el dato en
memoria secundaria
• Debe existir un mecanismo para automáticamente transferir los datos
de la memoria secundaria al EJB y vice-versa
• Esto se hace a través de llamadas a los métodos ejbLoad() y ejbStore()
• Estos métodos son llamados por el container cuando estima que es
necesario
• distintos beans pueden representar al mismo dato en disco
• ejbActivate() y ejbPassivate() se llaman cuando un entity bean es
puesto/sacado de un pool de beans, por lo que hay que programas la
adquisición y liberación de reucursos
• Como además se debe guardar el estado del bean en memoria
secundaria, por lo cual se llama siempre a ejbStore abtes de pasivar y
a ejbLoad antes de activar
Las 2 maneras de lograr
persistencia de los beans
• En un bean-manajed persistence entity bean el programador debe
escribir las instrucciones para que las variables del entity bean sean
las correspondientes a un dato en una base de datos (saving, loading,
and finding)
• Estas instrucciones van en los métodos de creación (ejbCreate(...)),
destrucción (ejbRemove()), localización (ejbFind(...)), carga
(ejbload()) y almacenamiento (ejbStore())
• Esto generalmente se hace via instrucciones JDBC
• En los container-managed persistence beans de esto se encarga el
container, sólo basta dar algunas directrices para la localización de los
datos en un archivo especial (según yo, esto sería una de las gracias
más grandes de j2ee)
Creación y destrucción de Entity
Beans
• Cuando un entity bean es creado por una llamada al método ejbCreate
se debe crear también este dato en la base de datos, si se trata de un
bean-managed persistence bean, aquí se deben programar las
instruccónes SQL para insertar una fila en una tabla
• De la misma manera, cuando un entity bean es removido, se llama a
ejbRemove y aquí se debe programas la instrucción SQL que borre la
fila correspondiente
• A cada clase de entity bean que se crea hay que asociarle un objeto
que represente la clave primaria de ese tipo de objeto (por ejemplo un
string. Por convención se usa el nombre del bean terminado en PK
(por ejemplo CuentaPK)
• El método ejbCreate de un entity bean debe devolver un siempre un
objeto de este tipo luego de haber creado el dato
Esquema de creación de un entity bean
1- create()
2- ejbCreate()
cliente
Home
4- retorna una
referencia al EJB object
5- creación del
objeto EJB
4- retorna un objeto
que representa la clave
primaria del ejb creado
EJB Object
CONTAINER
Bean
3- se crea el
dato en la base
de datos
Base
de
Datos
Los CMP Entity Beans
• La idea principal es no tener que escribir
ningun código de persistencia con la base de
datos
• Mucho del código migra del Bean al
Deployment descriptor (pero muy
simplificado)
• Juega un papel importante el EJB-QL, que es
un lenguaje estilo SQL orientado a objetos
con el cual se especifican muchas cosas.
SOAP
• Simple Object Access Protocol
• XML-based communication protocol and encoding
format for inter-application communication
• SOAP is widely viewed as the backbone to a new
generation of cross-platform cross-language
distributed computing applications, termed Web
Services.
• En java está implementado con el servidor AXIS
Architecture
Tomcat
Axis
XML
Cliente
XML
Servicio
Web
Ejemplo (client)
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
public class CalcClient{
public static void main(String [] args) throws Exception {
String endpoint = "http://host:port/axis/Calculator.jws";
if (args == null || args.length != 3) {
System.err.println("Usage: CalcClient <add|subtract> arg1 arg2");
return;
}
String method = args[0];
Integer i1 = new Integer(args[1]);
Integer i2 = new Integer(args[2]);
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
call.setOperationName( method );
call.addParameter( "op1", XMLType.XSD_INT, ParameterMode.IN );
call.addParameter( "op2", XMLType.XSD_INT, ParameterMode.IN );
call.setReturnType( XMLType.XSD_INT );
Integer ret = (Integer) call.invoke( new Object [] { i1, i2 });
System.out.println("Got result : " + ret);
}
}
Ejemplo (server)
public class Calculator {
public int add(int i1, int i2) {
return i1 + i2;
}
public int subtract(int i1, int i2)
return i1 - i2;
}
}
{
• En AXIS basta con escribir este archivo en java,
cambiarle la extensión a jws y el resto (deplyment) lo
hace el sistema
• Se pueden usar WS Deployment Descriptors para
“customizar” el servicio