Download Web
Document related concepts
no text concepts found
Transcript
Comunicaciones basadas en la web Cc52n 2005/1 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¶m2=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