Professional Documents
Culture Documents
Agenda
Distribucin de Aplicaciones Empresariales Tecnologa J2EE Servlets y Pginas JSP Enterprise Java Bean (EJB)
Ejemplo y Conclusiones
Tecnologa J2EE 2
Ral Monge
Tecnologa J2EE
Ral Monge
EX UMBRA
IN
SOLEM
Alta disponibilidad
xito de una organizacin muchas veces depende del buen funcionamiento de sus sistemas Sistemas con informacin sensible Carga del sistema es impredecible Gran variedad de sistemas, plataformas, lenguajes y APIs a integrar
Tecnologa J2EE 4
Seguridad
Escalabilidad
Heterogeneidad
Ral Monge
Tecnologa J2EE
Ral Monge
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Caractersticas
Mainframe
Modelo centralizado (monoltico) Terminales tontos Presentacin, lgica de negocios y acceso a datos estn entrelazados en el mainframe No se requiere administrar clientes Es fcil lograr consistencia de datos Difcil de actualizar, mantener y reusar cdigo
Tecnologa J2EE 6
Ventajas:
BD
Desventajas:
Ral Monge
Tecnologa J2EE
Ral Monge
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Dos Capas
Caractersticas
Clientes (gordos) envan consultas SQL Presentacin, lgica de negocios y procesamiento del modelo de datos en el cliente Independencia de productos de BD Difcil de actualizar, mantener y escalar Modelo de datos fuertemente acoplado al cliente Fuerte trfico de datos sin mayor procesamiento
Tecnologa J2EE 8
Ventajas:
BD
Desventajas:
Ral Monge
Tecnologa J2EE
Ral Monge
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Caractersticas
Clientes son ms delgados (slo presentacin) Capa media maneja servicios del sistema Lgica de negocios puede cambiar ms fcilmente Se introduce complejidad en capa media Clientes y capa media mantienen fuerte acoplamiento
Ventajas:
BD
Desventajas:
Ral Monge
Tecnologa J2EE
Ral Monge
Tecnologa J2EE
10
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Caractersticas
Caractersticas
Lgica de negocios y modelo de datos en objetos Usan tpicamente: Corba, RMI o DCOM Acoplamiento ms dbil Mayor reusabilidad de cdigo Esfuerzo de administracin aun significativo Complejidad de la capa media (un problema que hay que atacar)
Tecnologa J2EE 11
Ventajas:
Browser maneja lgica de presentacin Browser se comunica va HTTP Lgica de negocios y modelo de datos manejados por generacin dinmica de contenidos Ubicuidad y cero administracin de clientes Soporta diferentes tipos de clientes Complejidad de la capa media
Tecnologa J2EE 12
Ventajas:
Desventajas:
Desventajas:
Ral Monge
Ral Monge
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Contenedor y Componentes
Componentes
Arquitecturas de Componentes
Contenedor
Contenedores permiten desplegar componentes en el servidor Ideal es que exista un estndar para no depender del proveedor de la solucin
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Complejidad de Integracin
Cliente Gordo (SWING)
Tendencias Actuales
Base de Datos
Browser
Aplicacin Empresarial
SOAP
Sistema CRM
15
Moverse a arquitecturas de 2 o ms capas Moverse a modelos de aplicaciones basadas en objetos Usar tecnologa de componentes para facilitar despliegue y mantencin de aplicaciones Usar clientes basados en HTML Usar tecnologas que faciliten la integracin de diversas aplicaciones
Tecnologa J2EE 16
Ral Monge
Objeto Cliente
Invocacin del Stub
Objeto Stub
Envo de Peticin Serializada
Receptor
Objeto Servidor
Ral Monge
Tecnologa J2EE
17
Ral Monge
Tecnologa J2EE
18
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
JDBC
Cliente JDBC
Protocolo Base de Datos
BD
olookup()
Objeto Cliente Objeto Stub
n bind() o rebind()
Objeto Servidor
Cliente
HTTP,RMI, etc.
Lgica de Negocios
JDBC
BD
Protocolo Base de Datos
20
Ral Monge
Tecnologa J2EE
19
Ral Monge
Tecnologa J2EE
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Browser
Applet JVM
Ral Monge
Tecnologa J2EE
22
Definir una plataforma estndar para soportar aplicaciones distribuidas Simplificar el desarrollo mediante un modelo de aplicacin basada en componentes Facilitar la integracin de la aplicacin con diferentes tipos de clientes y con otros sistemas o aplicaciones
Ral Monge
Tecnologa J2EE
23
Ral Monge
Tecnologa J2EE
24
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
cliente
Capa Cliente
Ral Monge
Capa Media
Tecnologa J2EE
Capa SIE
25 Ral Monge Tecnologa J2EE 26
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Tecnologa J2EE
Contenedores J2EE
Ral Monge
Tecnologa J2EE
27
Ral Monge
Tecnologa J2EE
28
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Servicios de Plataforma
Tecnologa de Servicios
Servicio de Nombres
Servicios de Despliegue
Soporte para transacciones distribuidas Conectar plataforma J2EE con SIE (e.g. ERP, procesamiento transacional en mainframes, etc.) Parsing y transformacin de documentos XML
Tecnologa J2EE 30
Servicios Transaccionales
Servicios de Seguridad
Ral Monge
Ral Monge
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Tecnologas de Comunicacin
Tecnologas de Mensajera
Protocolos de Internet
TCP/IP, HTTP, SSL Interfaces para objetos remotos y serializacin Java IDL y RMI-IIOP
RMI
Permite seguir el progreso de tareas Soporta mensajera punto a punto (PTP) y de publicacin-suscripcin (Pub/Sub) API para sistema de correo electrnico Soporta diferentes formas de almacenamiento, formatos y transporte (e.g. IMAP4, POP3 y SMTP)
Tecnologa J2EE 32
JavaMail API
Web Services
Tecnologa J2EE 31
Ral Monge
Ral Monge
EX UMBRA
IN
SOLEM
Aplicacin Multicapas
EX UMBRA
IN
SOLEM
Recursos SIE
Contenedor EJB
Browser
Recursos SIE
Contenedor Web Pginas JSP, Servlets, XML, JavaMail
Tecnologa J2EE
Contenedor Web
RMI-IIOP (3-Tier)
Ral Monge Tecnologa J2EE
JDBC (2-Tier)
34
Ral Monge
SOLEM
EX UMBRA
IN
SOLEM
Browser
Recursos SIE
Contenedor Web
JavaMail HTTP(S) Servlet Objeto Acceso Datos Objeto Acceso Datos JDBC
Browser
Pginas JSP, Servlets, XML JDBC HTML/ XML Pgina JSP
JDBC JavaMail
Contenedor Web
Tecnologa J2EE 36
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Escenario: B2B
Contenedor Web HTTP(S) XML Contenedor Web Contenedor EJB RMI-IIOP JMS Contenedor EJB
Recursos SIE
construir aplicacin
desplegar sistema
construir beans
Proveedor de Beans
Ral Monge Tecnologa J2EE 37 Ral Monge
Proveedor de Contenedores/Servidores
Tecnologa J2EE 38
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Patrones J2EE
Blueprints
http://developer.java.sun.com/developer/restricted/patterns/ J2EEPatternsAtAGlance.html
http://java.sun.com/blueprints/enterprise/
Ral Monge Tecnologa J2EE 39 Ral Monge Tecnologa J2EE 40
Applets grandes requieren mayor tiempo de carga y usan ms ancho de banda Problemas de compatibilidad con los browsers
Ral Monge
Tecnologa J2EE
41
Ral Monge
Tecnologa J2EE
42
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
CGI
Una aplicacin CGI recibe peticin desde el Servidor Web y responde con cdigo HTML Se crea un nuevo proceso por cada peticin Tpicamente se procesa la peticin con PERL, lo que obliga a hacer partir el interpretador Si programa CGI termina antes de responder al Servidor Web, el cliente sufre de retardos
Desventajas:
La pgina usa informacin de base de datos u otras fuentes al lado del servidor
Ral Monge
Tecnologa J2EE
43
Ral Monge
Tecnologa J2EE
44
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Contenedor de Servlets
Peticin HTTP
Request
Servlet service()
Browser
Respuesta HTTP
Contenedor de Servlets
Contenido Esttico
Response
Ral Monge
Tecnologa J2EE
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Clase HttpServlet
Clientes Servidor Web
Request
service()
Ejemplo de HttpServlet
HttpServlet
doDelete() doGet() doOptions() doPost() doTrace() doPut()
public class bienvenidoServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println("<HTML>"); out.println("<HEAD>"); out.println("<TITLE>Bienvenido</TITLE>"); out.println("</HEAD>"); out.println("<BODY>"); out.println("<H1>Bienvenido al Sistema</H1>"); out.println("<P>Ha tenido exito en pasar control de acceso!!</P>"); out.println("</BODY>"); out.println("</HTML>"); } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
47 Ral Monge Tecnologa J2EE 48
Response
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Necesidad de Sesin
Protocolo HTTP considera que servidor cierra conexin despus de cada peticin
Reescritura de URL
Agregando a URL parmetros (nombre/valor) Informacin aparece visible en el Browser Se pasa parmetro en un campo oculto de un data form Aun se puede ver en el cdigo fuente de la pgina HTML Pequea pieza de informacin que se pasa de ida y vuelta entre el servidor y el cliente Se usan objetos almacenados en el servidor que a travs de una clave se relacionan en forma nica con un cliente
HTTP es considerado protocolo sin estado Qu pasa cuando un cliente interacta varias veces con el servidor, conducido por un estado anterior?
Campos Ocultos
Problema:
Cookies
Objetos de sesin
Ral Monge
Tecnologa J2EE
49
Ral Monge
Tecnologa J2EE
50
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Ejemplo de Cookies
Agregando una cookie en la respuesta
Cookie c1 = new Cookie("usuario", usuario); Cookie c2 = new Cookie("password", password); respuesta.addCookie(c1); respuesta.addCookie(c2);
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Reduce esfuerzo de programacin de escribir en stream de respuesta cdigo HTML Evita intervenir cdigo de servlets por cada cambio
Ral Monge
Tecnologa J2EE
53
Ral Monge
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
<CENTER><H2>Listando Todos los Usuarios</H2> <TABLE> <TR><TH>Nombre</TH><TH>Apellido</TH><TH>Usuario</TH><TH>Password</TH></TR> <% String sql = "SELECT Nombre, Apellido, Usuario, Password FROM Usuarios"; try { Connection con = DriverManager.getConnection( "jdbc:db2j:/BASE_DATOS/BD_PRUEBA;create=true", "", ""); Statement s = con.createStatement(); ResultSet rs = s.executeQuery(sql); // sigue en la prxima pgina
Ral Monge
Tecnologa J2EE
55
Ral Monge
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Cuerpo
Ral Monge
Tecnologa J2EE
57
Ral Monge
Tecnologa J2EE
58
EX UMBRA
IN
SOLEM
5. Beans Empresariales
Otros Servicios
Ral Monge
Tecnologa J2EE
59
Ral Monge
Tecnologa J2EE
60
10
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Objetos Remotos
Cliente Objeto Distribuido
Interfaz Remota
Middleware Explcito
API Transaccin
Cliente
Objeto Distribuido
Interfaz Remota
API de BD
Interfaz Remota
Interfaz Remota
Stub
Skeleton
Stub Red
Skeleton
API Seguridad
Red
Ral Monge Tecnologa J2EE 61 Ral Monge
Tecnologa J2EE
62
EX UMBRA
IN
SOLEM
Middleware Implcito
Cliente Objeto Distribuido
Interfaz Remota
API Transaccin
EX UMBRA
IN
SOLEM
Ms fcil de escribir
No se requiere codificar a APIs del middleware (slo se declara lo requerido) Separacin de lgica de negocios de la lgica del middleware Si se cambia middleware slo se modifica un archivo descriptor
Tecnologa J2EE 64
Interceptor de Peticiones
Interfaz Remota Interfaz Remota
Ms fcil de mantener
API de BD
Stub Red
Ral Monge
Skeleton
API Seguridad
Ms fcil de soportar
Ral Monge
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Qu es un Contenedor EJB?
Es un componente (de software) del lado del servidor que encapsula lgica del negocio
Se deben disear de acuerdo con las especificaciones tcnicas definidas para EJBs Slo pueden ser desplegados y ejecutados en un contenedor EJB (servidor de aplicacin)
Tecnologa J2EE 65
Ral Monge
Ral Monge
11
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Modelan procesos de negocio Ejemplo: Motor de precios, autorizador de tarjeta de crdito Modelan datos de negocio Ejemplo: producto, orden de compra, empleado Similar a bean de sesin, pero permite el procesamiento asncrono de mensajes tipo JMS Ejemplo: ordenar una compra
Tecnologa J2EE 67 Ral Monge Tecnologa J2EE 68
Ral Monge
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Archivos de Despliegue
Home Interfaces
Contenedor EJB
Home Object
Servicios
Local Interfaces
EJB Object
Enterprise Bean
Remote Interfaces
Servicio de Nombres
Ral Monge
Implementa procesos de negocios que requieren de una sola interaccin No mantiene estado conversacional Ejemplo: Motor de clculo y verificador de tarjeta de crdito
SB con Estado (Stateful. SFSB) Implementa procesos de negocios que requieren de varias peticiones o transacciones Mantiene estado conversacional Ejemplo: Carro de compras
Tecnologa J2EE 72
Ral Monge
Tecnologa J2EE
71
Ral Monge
12
Instancia de EB
1: ejbPassivate() 2: escribir estado
Memoria Secundaria
Ral Monge
Tecnologa J2EE
73
Ral Monge
Tecnologa J2EE
74
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Tabla de Cuentas
1: ejbLoad() 4: ejbStore()
API JDBC
2: Leer desde BD
Tabla
5: Escribir a BD se puede repetir muchas veces el ciclo: ejbLoad - mtodo negocio - ejbStore
Tecnologa J2EE 76
Ral Monge
Tecnologa J2EE
75
Ral Monge
EX UMBRA
IN
SOLEM
Pooling de EB
Remote Interface
EX UMBRA
IN
SOLEM
Cliente 1
Remote Interface
Cliente 2
Remote Interface
Cliente 2
El contenedor EJB puede dinmicamente asignar una instancia de EB para representar diferentes datos
Ral Monge Tecnologa J2EE 77 Ral Monge
Contenedor realiza persistencia Herramienta del contenedor genera cdigo de acceso al repositorio de datos Permite ahorrar cdigo
Tecnologa J2EE
78
13
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
public CuentaPK ejbCreate(String cuentaID, String nombreTitular) throws CreateException { this.cuentaID = cuentaID; this. nombreTitular = nombreTitular; this.saldo = 0; try { /* borrado : crear conexin........ */ pstmt = conn.prepareStatement( insert into accounts (id, nombreTitular, balance) values (?, ?, ?)"); pstmt.setString(1, cuentaID); pstmt.setString(2, nombreTitular); pstmt.setDouble(3, saldo); pstmt.executeUpdate(); /* Generar objeto de clave primaria y retornarlo */ return new CuentaPK(cuentaID); } catch (Exception e) { throw new CreateException(e.toString()); } finally {/* borrado ... liberar conexin ...... */ } }
Ral Monge Tecnologa J2EE 79
Desarrollador slo escribe lgica de los datos (clase base) El contenedor la extiende agregando la lgica de persistencia (subclase), en el tiempo de despliegue
Tecnologa J2EE 80
Ral Monge
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
ejb-jar.xml
<abstract-schema-name>CuentaBean</abstract-schema-name> <cmp-field> <field-name>cuentaID</field-name> </cmp-field> <cmp-field> <field-name>nombreTitular</field-name> </cmp-field> <cmp-field> <field-name>saldo</field-name> </cmp-field> <primkey-field>cuentaID</primkey-field>
public String ejbCreate(String cuentaID, String titular) throws CreateException { setCuentaID(cuentaID); setNombreTitular(titular); setSaldo(0); return null; } }
Ral Monge Tecnologa J2EE 81
Clave primaria
82
...
Ral Monge Tecnologa J2EE
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Relaciones
Contrato id fechaComienzo id
203 496
<query> ejb-jar.xml <query-method> <method-name>findByNombreTitular</method-name> <method-params><method-param>java.lang.String</method-param> </method-params> </query-method> <ejb-ql> <![CDATA[SELECT OBJECT(a) FROM cuen taBean a WHERE a.nombreTitular = ?1]]> </ejb-ql> </query> <query> <query-method> <method-name>findTodasCuentas</method-name> <method-params></method-params> </query-method> <ejb-ql> <![CDATA[SELECT OBJECT(a) FROM CuentaBean a WHERE a.cuentaID IS NOT NULL]]> </ejb-ql> </query>
Ral Monge Tecnologa J2EE 83
fechaComienzo rolCK
25-03-2003 14-04-2003 4456-7 4456-7
rol
4456-7 4572-3
telefono
654429 972345
Contrato
Ral Monge Tecnologa J2EE
Contratista
84
14
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
relationships> <ejb-relation> <ejb-relation-name>contrato-contratista</ejb-relation-name> <ejb-relationship-role> <description>contrato</description> <ejb-relationship-role-name>Contrato-Pertenece-a-Contratista</ejb-relationship-role-name> <multiplicity>Many</multiplicity> <relationship-role-source> <description>contrato</description> <ejb-name>Contrato</ejb-name> </relationship-role-source> <cmr-field> <description>contratista</description> <cmr-field-name>contratistaLocal</cmr-field-name> </cmr-field> </ejb-relationship-role>
...
Ral Monge Tecnologa J2EE 85
<ejb-relationship-role> <description>contratista</description> <ejb-relationship-role-name>Contratista-Tiene-Contratos</ejb-relationship-role-name> <multiplicity>One</multiplicity> <relationship-role-source> <description>contratista</description> <ejb-name>Contratista</ejb-name> </relationship-role-source> <cmr-field> <description>contratos del contratista</description> <cmr-field-name>contratosLocal</cmr-field-name> <cmr-field-type>java.util.Set</cmr-field-type> </cmr-field> </ejb-relationship-role> </ejb-relation> </relationships>
Ral Monge Tecnologa J2EE 86
Servicio de Mensajera
Permite comunicar a travs de un mensaje unidireccional Un cliente es un productor o consumidor Desacopla a los clientes de los mensajes: emisor y receptor no requieren conocerse
Middleware de Mensajes (MOM)
Tecnologa J2EE
Aplicacin
Aplicacin
Ral Monge
Tecnologa J2EE
87
Ral Monge
88
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Modelo PTP
mensaje mensaje
Modelo PUB/SUB
suscribir entregar Cliente 2
Cliente 1
Cola enviar
consumir ACK
Cliente 2 Cliente 1
mensaje mensaje
consumir
mensaje
Ral Monge Tecnologa J2EE 89 Ral Monge Tecnologa J2EE 90
15
EX UMBRA
IN
SOLEM
Qu es un MDB?
EX UMBRA
IN
SOLEM
Es un EJB sin estado, al lado del servidor Es slo invocado por el contenedor cuando llega un mensaje
Pool de MDB
Send/ Publish
Cliente
Destino JMS
El cliente que enva el mensaje no requiere conocer al MDB (slo el destino) Permite hacer a los MDB parte de una transaccin
Tecnologa J2EE 91
Instancia MDB
Contenedor EJB es consumidor de mensajes de destinos JMS segn lo especificado en descriptor de despliegue
Ral Monge Tecnologa J2EE 92
Ral Monge
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Ejemplo de MDB
public class LogBean implements MessageDrivenBean, MessageListener { protected MessageDrivenContext ctx; public void setMessageDrivenContext(MessageDrivenContext ctx) {this.ctx = ctx; } public void ejbCreate() { } public void ejbRemove() { } } /* El mtodo de negocio del bean */ public void onMessage(Message msg) { System.out.println("LogBean: onMessage()"); TextMessage tm = (TextMessage) msg; try { String text = tm.getText(); System.out.println(".... Nuevo mensaje recibido : " + text); } catch (JMSException e) { e.printStackTrace(); } } }
Cliente (1/2)
import javax.naming.*; import javax.jms.*; import java.util.*; public class Client { public static void main (String[] args) throws Exception { // preparar propiedades para InitialContext ... (borrado) .... Context ctx = new InitialContext(properties); // 1: Buscar en ConnectionFactory via JNDI TopicConnectionFactory factory = (TopicConnectionFactory) ctx.lookup("ConnectionFactory"); // 2: Usar ConnectionFactory para crear conexin JMS TopicConnection connection = factory.createTopicConnection(); connection.start();
Ral Monge
Tecnologa J2EE
93
Ral Monge
Tecnologa J2EE
94
EX UMBRA
IN
SOLEM
EX UMBRA
IN
SOLEM
Cliente (2/2)
// 3: Usar conexin para crear sesin TopicSession session = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE) ; // 4: Buscar destinatario (topic) via JNDI Topic topic = (Topic) ctx.lookup("topic/testTopic"); // 5: Crear productor de mensajes TopicPublisher publisher = session.createPublisher(topic); // 6: Crear un mensaje de texto y publicarlo TextMessage msg = session.createTextMessage(); msg.setText("Este es un mensaje de prueba."); publisher.publish(msg); // Cerrar la conexin publisher.close(); session.close(); connection.close(); } }
Ral Monge Tecnologa J2EE 95
Resumen
Ral Monge
16
EX UMBRA
IN
SOLEM
Referencias
Ed Roman, Scott W. Ambler, Tyler Jewell, Floyd Marinescu, Mastering Enterprise JavaBeans (2nd Edition), John Wiley & Sons, (December 14, 2001) Budi Kurniawa, Java for the Web with Servlets, JSP, and EJB: A Developer's Guide to J2EE Solutions, New Riders Publishing, (April 12, 2002) Deepak Alur, John Crupi, Dan Malks, Core J2EE Patterns: Best Practices and Design Strategies, Sun Microsystems Press, Prentice Hall, 2001 http://java.sun.com/j2ee Tutorial de J2EE http://java.sun.com/j2ee/tutorial/index.html
Tecnologa J2EE 97
Ral Monge
17