9fcfd50916764d54ee
-
Upload
jose-gonzales -
Category
Documents
-
view
13 -
download
2
Transcript of 9fcfd50916764d54ee
1
Java EE 5 (sucesor de J2EE): Java EE 5 (sucesor de J2EE): el reto de volver a empezarel reto de volver a empezar
MarMaríía Consuelo Frankya Consuelo FrankyAbril de 2007Abril de 2007
CincoSOFT Ltda.CincoSOFT [email protected]@cincosoft.com
http://www.cincosoft.comhttp://www.cincosoft.com
2
IntroducciIntroducci óónn
• Java EE 5 reemplazó a J2EE hace menos de 1 año: cambio profundo de modelo conceptual, arquitectura y estrategia de desarrollo
• Aplicaciones Java EE 5 son mucho más concisas y eficientes: reducen el código a la tercera parte
• El reto es volver a aprender a hacer aplicaciones de una manera completamente distinta
• Objetivo de la conferencia: visión general del desarrollo de aplicaciones Java EE 5 con sus ventajas y dificultades
3
ContenidoContenido
A: Arquitectura de una aplicación Java EE 5
B: Concepto y programación de un caso de uso
C: Facilidades para el desarrollo de aplicaciones Java EE 5
D: Elementos JSF para pantallas
E: Meta-framework para acelerar el desarrollo en Java EE 5 (experiencia CincoSOFT)
5
•Manejainteraccióncon usuario
•Despliegue HTML
•Validación sintáctica
PresentaciPresentacióónn
Cliente conCliente con
navegador Webnavegador Web
•Invoca servicios
•Validaciónsintáctica
•Adaptarespuestasa interfaz usuario
•Maneja excepciones
AplicaciAplicacióónn
ServidorServidor WebWeb
•Realiza servicios sobre objetos deldominio
•Implanta reglas del negocio
•Estado desesión-usuario
•Control transacción
ServiciosServicios
Servidor de ComponentesServidor de Componentes
•Servicios básicos depersistenciade objetosdel dominio
•Transforma-ción Objeto-Relacional
•Soporte transacción
PersistenciaPersistencia
Servidor BDServidor BD
•Modelaentidades del negocioy sus reglasbásicas
•Validación semántica
DominioDominio
Niveles de una arquitecturaNiveles de una arquitectura multimulti --nivelnivel
6
Elementos del estElementos del est áándar Java EE 5ndar Java EE 5
Múltiples frameworks
Framework:• librería• reglas de uso
• soporta 1 aspecto del desarrollo
8
� Pantallas se contruyen con componentes gráficos que reaccionan a eventos:�son componentes de alto nivel que encapsulan elementos
HTML y tienen comportamiento asociado
�como reacción a eventos (por ej: oprimir un botón) invocan directamente métodos de clases java ("backing beans")
� Aspectos de validación de los datos del usuario:�Validación automática asociada a cada componente gráfico
�Cuando la validación falla se vuelve a mostrar la pantalla junto con los mensajes de error
�Procesamiento de eventos solo cuando la validación es exitosa
Nivel web basado en JSFNivel web basado en JSF
9
Framework JSF
NavegadorCliente
PresentaciPresentacióónn AplicaciAplicacióónn ServiciosServicios PersistenciaPersistencia
servlet Faces
Servidor Web Servidor BD Servidor de componentes
DominioDominio
JSP pantallazo1
HTML 1
JSP pantallazo2
Backing Bean 2
VISTAS
MODELO
CONTROLADOR
Backing Bean 1
BD
rela-
cional
HTML 2
EJB sesión
A
EJB entidad
C
10
� Concepto de EJB de entidad�modela una entidad de negocio persistente
� Concepto de EJB de sesión�componente de negocio: implementa los servicios ofrecidos
por la aplicación
� Simplificación de Java EE 5 respecto a J2EE�clases simples para implementar entidades y componentes de
negocio: • se regresa a un POJO: “Plain Old Java Objects”
�descriptores desaparecen (pero ahora hay @anotaciones no obligatorias)
• más trabajo para el Contenedor, menos para el desarrollador
� persistencia automática: desaparece SQL burocrático
� ahora sí se programa en términos de objetos (entidades) y no en términos de tablas de la BD
• código se reduce a la tercera parte (y más robusto)
Niveles de Servicio y Dominio Niveles de Servicio y Dominio basados en EJBs 3.0basados en EJBs 3.0
11
J2EE: J2EE: Arquitectura MVC de una aplicaciArquitectura MVC de una aplicaci óónn
NavegadorCliente
PresentaciPresentacióón n AplicaciAplicacióónn ServiciosServicios PersistenciaPersistencia
Servidor Web Servidor BD Servidor de componentes
DominioDominio
VISTAS
MODELO
CONTROLADOR
BD
rela-
cional
servlet controlador
EJB sesiónA
EJB entidadC
StateMachine
javaBean 1
javaBean2
� WebProxy
EJB controlador
��
ScreenFlow-Manager
JSP pantallazo1
JSP pantallazo2
JSPtemplate
�
HTML 1
RequestProcessor
HTML 2
MainServlet �
DAO
ModelDAO
Value
BD
�
12
Java EE 5: Java EE 5: Arquitectura de una aplicaciArquitectura de una aplicaci óón n
utilizando frameworks JSF, EJB 3.0 y Seamutilizando frameworks JSF, EJB 3.0 y Seam
Navegador Cliente
JSP
N. AplicaciN. Aplicaci óón (Web)n (Web)
ejb aplicación
N. ServiciosN. Servicios N. PersistenciaN. Persistencia
Servidor Web Servidor de BD
N. PresentaciN. Presentaci óónn
Servidor de componentes
BD relacional
HTML
JSP
entidades
Convenciones: interacción HTTP invocación acceso BD uso de atributos
de entidades (get y set)
servlet JSF
servlet Seam
ejb Seam
ejb aplicación
entity manager
forw
ard
frameworks
13
� Seam logra que las entidades estén asociadas directamente a las pantallas� las pantallas muestran valores de atributos de entidades� el usuario modifica o suministra valores para estos atributos
� Procesamiento de eventos de pantallas es realizado directamente por los componentes EJB de sesión
� Se eliminan intermediarios => muchos patrones se vuelven innecesarios
� Portabilidad de Seam a cualquier servidor que soporte JSF y EJB 3.0
Acople entre niveles utilizando el Acople entre niveles utilizando el framework JBoss Seamframework JBoss Seam
14
B:B:
Concepto y programaciConcepto y programaci óón n de un caso de uso de un caso de uso
(propuesta CincoSOFT)(propuesta CincoSOFT)
15
J2EE: J2EE: Arquitectura para soportar un caso de usoArquitectura para soportar un caso de uso
NavegadorCliente
PresentaciPresentacióón n AplicaciAplicacióónn ServiciosServicios PersistenciaPersistencia
Servidor Web Servidor BD Servidor de componentes
DominioDominio
VISTAS MODELO
BD
rela-
cionalJSP
pantallazo1
JSP pantallazo2
JSPtemplate
servlet controladorCONTROLADOR
WebProxy
EJB sesiónA
DAO
EJB controlador
StateMachine
XxxEjbHandler
XxxModel
ScreenFlow-Manager
XxxFlow-Handler
HTML 1
RequestProcessor
HTML 2
MainServlet
RequestToEventTrans
XxxRequest-Handler
XxxValue
EJB entidadC
DAO
16
Java EE 5: Java EE 5: Arquitectura para soportar un caso de usoArquitectura para soportar un caso de uso
Navegador Cliente
JSP 2
N. AplicaciN. Aplicaci óón (Web)n (Web) N. ServiciosN. Servicios N. PersistenciaN. Persistencia
Servidor Web Servidor de BD
N. PresentaciN. Presentaci óónn
Servidor de componentes
BD relacional
HTML
JSP 1
Entidades(compartidas por los casos de uso)
Convenciones: interacción HTTP invocación acceso BD uso de atributos
de entidades (get y set)
Ejb para el caso de uso
forw
ard
Frameworks JSF, EJB 3.0 y Seam
17
pantalla P
Concepto de un caso de usoConcepto de un caso de uso� Es un conjunto de servicios sobre entidades de nego cio,
implementado por un ejb de sesión y por un conjunto de pantallas desde donde se solicitan estos servicios
ejb de sesión
entidad A
entidad B
pantalla Q pantalla Rcampos de pantallas
asociados a atributos de entidades y
del ejb
botones de pantallas que invocan servicios del ejb
entidades compartidas por todos los casos de uso
los servicios del ejb consultan y modifican las entidades
18
� Un ejb de sesión que soporta un caso de uso puede e xponerse como Web service ofreciendo públicamente un subconj unto de sus servicios
ejb de sesión
Web service
entidad A
entidad B
19
AplicaciAplicaci óón = n = entidades + ejbs + web services + pantallasentidades + ejbs + web services + pantallas
caso de uso 1 caso de uso 2
Web service 1 Web service 2
ejb sesión caso uso 1
entidad A
entidad B
entidad C
entidad D
entidades de negocio
ejb sesión caso uso 1
ejb sesión
20
Flujo de negocio para Flujo de negocio para un nuevo caso de usoun nuevo caso de uso
� Caso de uso “inscribir nuevo hotel”� invocar servicio newHotel() para iniciar conversacion creando
nuevo objeto Hotel vacio
�mostrar pantalla "editHotel" que muestra el objeto Hotel para que el usuario de valor a sus atributos
� invocar servicio verifyNewHotel() para validar el objeto Hotel:• si hay errores de validacion volver a mostrar la pantalla "editHotel”• si no hay errores mostrar la pantalla "confirmHotel" para pedir al
usuario su confirmacion o cancelación
�cuando el usuario confirma:• invocar servicio confirm() para agregar el nuevo Hotel a la BD y
cerrar la conversacion• mostrar la pantalla "main" del sistema, la cual mostrará un mensaje
de confirmacion
�cuando el usuario cancela:• invocar servicio cancel() para cerrar conversacion• mostrar pantalla "main"
21
/hotels/editHotel.xhtmlhotels/confirmHotel.xhtml
common/main.xhtml
editHotel
newHotel()
confirmHotel
verifyNewHotel()
confirm()
Flujo de negocio:Flujo de negocio:caso de uso caso de uso ““ inscribir nuevo hotelinscribir nuevo hotel ””
ftProceed
B
Cancel
cancel()
E
main
Revise
Confirm
E
Cancel
Reglas de navegación de pantallas se describen en a rchivos de configuración: faces-config.xml, pages.xml
22
� pages.xml : reglas de navegación entre pantallas� desde cualquier pantalla con la acción newHotel se solicita ir
a la pantalla editHotel de entrada al caso de uso
� en la pantalla editHotel el usuario suministra los datos del nuevo hotel e invoca la acción verifyNewHotel ; después vaa la pantalla confirmHotel solo si el nuevo hotel es válido
<!-- reglas desde cualquier pantalla --><page view-id="*">
...<navigation from-action=" #{hotelInscription.newHotel} ">
<redirect view-id=" /pages/hotels/hotelInscription/editHotel.xhtml "/>
</navigation></page>
<!-- reglas desde pantalla editHotel --><page view-id=" /pages/hotels/hotelInscription/editHotel.xhtml "
conversation-required="true"> <navigation from-action=" #{hotelInscription.verifyNewHotel} ">
<rule if=" #{hotelInscription.hotelValid} "><redirect view-id=
" /pages/hotels/hotelInscription/confirmHotel.xhtml "/></rule>
</navigation></page>
23
Ejb de sesiEjb de sesi óón para el caso de uson para el caso de uso� Atributos:
� atributos que representan los frameworks de control� atributos que son entidades� atributo que indica el resultado de validar la nueva entidad Hotel� inyección/extracción de atributos
@Stateful@Name("hotelInscription")public class HotelInscriptionAction
implements HotelInscription {@PersistenceContextprivate EntityManager em;
@Inprivate FacesMessages facesMessages ;
@In(required=false)@Out(required=false)private Hotel hotel ;
private boolean hotelValid ;
public boolean isHotelValid (){return hotelValid;
}
@Destroy @Removepublic void destroy () {}
24
� Servicios:� servicios que inician o terminan conversación de inscribir un hotel� servicio que valida el nuevo hotel � servicio que ingresa el nuevo hotel a la BD
@Beginpublic void newHotel () {
hotel = new Hotel();}
public void verifyNewHotel () {if ( ! hotel.getCountry().equals("USA") ) {
facesMessages.add("Only accepts hotels in USA ");
return;}if ( ! hotel.getZip().matches("^\\d*$") ) {
facesMessages.add("Zipcode must be numeric");return;
}hotelValid = true;
}
@Endpublic void confirm () {
em.persist (hotel);facesMessages.add("Thank you, your inscription"
+ " of #{hotel.name} has id #{hotel.id}");}
@Endpublic void cancel (){}
}
25
Entidades que participan Entidades que participan en el caso de usoen el caso de uso
� entidad maestra Hotel @Entity@Name("hotel")@Scope(CONVERSATION)@Table(name="Lodge")public class Hotel implements Serializable {
private Long id ;private String name;...private List<Atraction> atractions
= new ArrayList<Atraction>();
public Hotel () {}
@Id @GeneratedValuepublic Long getId () {
return id;}public void setId (Long id) {
this.id = id;}
• Observar: – atributo de relación con otra entidad (detalles)– anotación indicando el atributo llave
26
@NotNull@Length (min = 1, max = 50, message = "name is required and must be at most {max} charact ers long" )
public String getName () {return name;
}public void setName (String name) {
this.name = name;}
... @OneToMany(mappedBy="hotel", cascade=CascadeType.ALL)@OrderBy("description asc")public List<Atraction> getAtractions () {
return atractions;}public void setAtractions (List<Atraction> atractions) {
this.atractions = atractions;}
}
• Observar: – anotación de validación de un atributo– anotación de relación con otra entidad
27
Pantalla Pantalla ““ editHoteleditHotel ””de edicide edici óón de una entidad Hoteln de una entidad Hotel
28
� Expone directamente los atributos de la entidad Hot el...<div class="label">Name:</div><div class="input">
<h:inputText id="name" value=" #{hotel.name} " required="true" />
<br/><span class="errors"> <h:message for="name" /> </span>
</div>
� Hay una zona para los mensajes FacesMessages<div class="entry errors">
<h:messages globalOnly="true" /></div>
� Los botones invocan servicios<div class="input">
<t:commandButton id="proceed" value="Proceed" action=" #{hotelInscription.verifyNewHotel} " styleClass="button" />  
<s:button value="Cancel" id="cancel" action=" #{hotelInscription.cancel} " styleClass="button" />
</div>
30
C:C:
Facilidades para el desarrollo de Facilidades para el desarrollo de aplicaciones Java EE 5aplicaciones Java EE 5
31
Variables en contextos Seam: Variables en contextos Seam: inyecciinyecci óón y extraccin y extracci óón (biyeccin (biyecci óón)n)
hotelbooking
hotelsatractions
hotelSearching
hotelInscription
hotelBooking
outin
entidadlista de
entidadesejb de sesión
Convenciones
� Biyección: asociación dinámica, contextual y bidireccional entre las variables de los contextos y los atributos de los componentes
32
hotelInscription
editHotel.xhtml
outin
entidadlista de
entidadesejb de sesión
Convenciones
action
� Uso de las variables por las pantallas �ej: editHotel
hotel
33
� Tipos de contextos en Seam:�StatelessContext: variables sin estado (como ejbs sin estado); en
realidad es un no contexto
�EventContext: equivale al request context, asociado a pedido JSF
�PageContext: estado asociado a una pantalla mostrada
�ConversationContext: unidad de trabajo para el usuario, puede durar varios pedidos
�SessionContext: asociada a toda la sesión de un usuario
�BusinessContext: asociado a un proceso de negocio que puede involucrar múltiples interaccionees con múltiples usuarios
�ApplicationContext: asociado al estado global del servidor
34
Servicios de persistenciaServicios de persistenciadel EntityManager (framework EJB3.0)del EntityManager (framework EJB3.0)
� Invocados desde los ejb de sesión�Obtener la referencia al EntityManager por inyección:
@PersistenceContextprivate EntityManager em;
� insert en la BD una nueva entidad :em.persist (hotel); // el objeto adquiere PK
� select en la BD una entidad existente, conociendo su PK:Hotel hotel = (Hotel)em. find (Hotel.class, hotelId);
� select en la BD una entidad existente, cancelando posibles modificaciones en memoria:
em. refresh (hotel);
� update diferido en la BD con modificaciones de una entidad existente (se difiere hasta el commit de la transacción):
hotel.setName("Hotel Rey");em.merge (hotel);
� delete en la BD de una entidad existente:em. remove (hotel);
35
� createQuery() : consulta o actualización en la BD según diversos criterios (EJB QL):
�select una entidad:Hotel hotel = (Hotel)em. createQuery(" from Hotel h where h.name=:name and h.city=:city ")
.setParameter("name", "Hotel Rey")
.setParameter("city", "Bogota")
.getSingleResult();
�select una lista de entidades:List<Hotel> theList = em. createQuery
(" from Hotel h where h.city = :city ").setParameter("city", ”Bogota").getResultList();
�update una o varias entidades:em.createQuery(" update Hotel h set h.city = :city ")
.setParameter("city", "Bogota")
.executeUpdate();
�delete una o varias entidades:em.createQuery("delete from Hotel h where h.city = :city")
.setParameter("city", ”Bogota")
.executeUpdate();
36
Otras facilidades importantesOtras facilidades importantes
� Facilidades de Log proporcionadas por Seam�permite mostrar banderas que combinan texto parametrizado y
variables de contextos:log.info("Cancel booking: #0 for #{user.username} ",
booking.getId());
� Seguridad por roles�por anotaciones se puede proteger un ejb o un servicio particular
para que solo pueda ser invocado por un rol particular�Cada botón de una pantalla se puede habilitar o mostrar solo para
un rol particular
� Internacionalización: se pueden lograr las siguiente s características:�el usuario escoge el idioma de su preferencia�existe idioma por defecto según localización del usuario� los letreros de las pantallas salen en el idioma vigente� los mensajes de errores de validación salen en el idioma vigente
38
Pantallas Pantallas ““ faceletsfacelets ””construidas con templates y <div>construidas con templates y <div>
� Concepto de template :� pantalla base que define estructura común de las pantallas reales� contiene partes fijas y partes que deben ser redefinidas por cada pantalla� ejemplo de estructura de pantalla:
banner
contentsidebar
footer
39
� Ejemplo de template: template.xhtml
<!-- librerias de etiquetas --><html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"xmlns:h="http://java.sun.com/jsf/html"xmlns:f="http://java.sun.com/jsf/core"xmlns:s="http://jboss.com/products/seam/taglib"xmlns:t="http://myfaces.apache.org/tomahawk">
<!-- referencia al archivo que define estilos de los div --><head>
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" />
<title>Hotels reservation system</title><link href="../css/ screen.css " rel="stylesheet" type="text/css"/>
</head>
40
<body><!-- div que define la estructura global de toda pan talla --><div id="document" >
<!-- toda pantalla tiene un banner fijo --><div id="headerMenu">
<div id="titleMenu"><h4>CincoSOFT framework</h4></d iv><div id="statusMenu">
<t:jscookMenu layout="hbr" theme="ThemeIE"><t:navigationMenuItems value="#{login.menu}" />
</t:jscookMenu></div>
</div>
<!-- toda pantalla tiene un contenido variable: las partes sidebar y content deben ser definidos por c/pantall a real-->
<div id="container"><div id="sidebar" style=" width : 150px;">
<ui:insert name=" sidebar " /></div>
<div id="content" style="width : 500px;"><ui:insert name=" content " /><ui:include src=" footer.xhtml " />
</div></div>
</div></body></html>
41
� Pantalla real que se basa en el template:� la etiqueta más externa <ui:composition> indica que se usa un template� la etiqueta <ui:define> redefine partes variables del template� se diseña con <div> que tienen estilos asociados� ejemplo: password.xhtml :
<!-- librerias de etiquetas e indicacion del templat e utilizado --><ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"xmlns:h="http://java.sun.com/jsf/html"xmlns:f="http://java.sun.com/jsf/core"xmlns:t="http://myfaces.apache.org/tomahawk"xmlns:s="http://jboss.com/products/seam/taglib"template="../common/template.xhtml" >
<!-- definicion de la parte content --><ui:define name=" content " >
<div class="section"> <h1>Change Your Password</h1> </div><div class="section">
...</div>
</ui:define>
<!-- definicion de la parte content --><ui:define name=" sidebar " >
<h1>changePassword use case</h1></ui:define>
</ui:composition>
42
Elementos avanzados de JSFElementos avanzados de JSF� Menú jerárquico dinámico: etiqueta <t:jscookMenu>
47
E:E:
MetaMeta--framework para acelerar el framework para acelerar el desarrollo en Java EE 5 desarrollo en Java EE 5
(experiencia CincoSOFT)(experiencia CincoSOFT)
48
� Su control se apoya en frameworks: JSF, EJB3.0, Seam
� Debe contener un módulo de seguridad:� basado en roles JEE para autenticación y autorización� entidades y casos de uso para: cambiar password, manejar perfiles
de seguridad (basados en roles), manejo de usuarios e inscripción en perfiles ,...
� Debe contener los descriptores correctamente config urados
� Debe disponer de un menú jerárquico que se carga de la BD según perfil del usuario
� Sus fuentes deben estar organizados por módulos y d entro de cada módulo por casos de uso� inicialmente nace solo con el módulo de seguridad
� Debe disponer de un ANT para compilación, empaque y despliegue
� Debe manejar logs
El esqueleto de una aplicaciEl esqueleto de una aplicaci óón Java EE 5n Java EE 5
49
� Genera el esqueleto de una aplicación Java EE 5� se apoya en frameworks estándares JEE5:
� JSF: implementado por Apache Myfaces
� EJB 3.0: implementado por el servidor JBoss; en el futuro debe operar también con otros servidores (BEA, IBM WebSphere, …)
� JBoss Seam: acopla JSF y EJB 3.0 � JBoss jBPM: workflow� otros: Log4j, Quartz, Jasper, ….
� Además ofrece generadores de esqueletos para agrega r a la aplicación:� una nueva Entidad� un nuevo EJB� un nuevo Web-Service� una nueva pantalla� un nuevo Caso de Uso� un nuevo Módulo
� El Meta-Framework de CincoSOFT no amarra a la aplic ación a utilizar permanentemente el Meta-Framework� el código generado es claro y documentado� organizado según el estándar: por módulos y casos de uso� indica secciones que deben ser llenadas por el programador
MetaMeta--framework de CincoSOFTframework de CincoSOFT
50
Esqueleto inicial de una aplicaciEsqueleto inicial de una aplicaci óón Java EE 5 n Java EE 5 generado por el Metagenerado por el Meta --framework de CincoSOFTframework de CincoSOFT
Navegador Cliente
N. AplicaciN. Aplicaci óón (Web)n (Web) N. ServiciosN. Servicios N. PersistenciaN. Persistencia
Servidor Web Servidor de BD
N. PresentaciN. Presentaci óónn
Servidor de componentes
BD relacional
HTML
password.xhtml
Module, Usecase, Service, Profile, ProfileService,
User, UserProfile,Menu
Convenciones: interacción HTTP invocación acceso BD uso de atributos de entidades (get y set)
Ejb ChangePassword
forw
ard
Frameworks JSF, EJB 3.0 y Seam
acople mediante descriptores generados por el meta-framework CincoSOFT
users.xhtml
profiles.xhtml
Ejb UserGestion
Ejb ProfileGestion
ENTIDADES
51
ConclusionesConclusiones� Atractivos de Java EE 5:
�Conciso y eficiente; reduce código a la tercera parte�Desaparece JDBC (código burocrático SQL) y varios patrones� Integración de múltiples frameworks que ofrecen muchas
facilidades: persistencia, seguridad, logs, internacionalización, BPM, testing, ...
�Pantallas con elementos ricos de interfaz y relativa facilidad de uso: múltiples implementaciones de JSF por Apache MyFaces, Oracle ADF, …
� Dificultades planteadas por Java EE 5:�comenzar de nuevo ….�Pérdida del control a un nivel fino de detalle porque los
frameworks actúan como cajas negras => dificultad de depurar�Actualmente no es soportado por todos los proveedores de la
tecnología Java
� Utilidad de un meta-framework�disminuir sustancialmente la curva de aprendizaje�acelera el proceso de desarrollo
52
ReferenciasReferencias
� Libros sobre Java EE 5:• “JavaServer Faces: The Complete Reference”, Mc Graw Hill,
2007.• “Pro EJB 3: Java Persistence API”, Apress, 2006.
� Fuentes en internet:• http://java.sun.com/javaee/5/docs/tutorial/doc : "The Java EE 5
Tutorial " es el tutorial oficial de Sun (versiones HTML y PDF)
• http://labs.jboss.com/portal/jbossseam/docs: Manuales de referencia de JBoss Seam
• http://java.sun.com/javaee/technologies/javaee5.jsp: “Get Started with the Java EE 5 SDK": son tutoriales y demos para comenzar
• http://java.sun.com/reference/blueprints: Patrones y guías para el desarrollo de aplicaciones Java EE en general