Introducción Framework JBoss Seam
Sebastián Javier Marchano <ul><li>Estudiante Ingeniería Sistema Información - UTN </li></ul><ul><li>Experiencia + 3 años <...
Agenda <ul><li>Introducción a Seam </li></ul><ul><li>Introducción a EJB3 </li></ul><ul><li>Introducción a JSF </li></ul><u...
<ul><li>Seam provee mecanismos potentes para juntar componentes </li></ul><ul><li>Conceptos fundamentales </li></ul><ul><u...
<ul><li>Bijection </li></ul><ul><ul><ul><li>Más de IoC ( Inversion of Control ) </li></ul></ul></ul><ul><ul><ul><li>Compon...
Contexto Conversacional <ul><li>Conversaciones en Seam, una primer mirada… </li></ul><ul><ul><li>Es un contexto entre sesi...
Contexto Conversacional <ul><li>Caso de uso para conversación   </li></ul><ul><ul><li>Mostrar mensajes después de un redir...
Contexto Conversacional <ul><li>Caso de uso para conversación   </li></ul><ul><ul><li>Diálogos múltiples </li></ul></ul><u...
Ejemplo de aplicación <ul><li>Caso de uso </li></ul><ul><ul><li>Mostrar una lista de bicicletas </li></ul></ul><ul><ul><li...
Utilizando componentes Seam @Name(&quot;bikeService&quot;) public class BikeServiceBean { ... @DataModel private List<Bike...
Utilizando componentes Seam <ul><li><h:form> </li></ul><ul><li><h:dataTable value=&quot;#{bikes}&quot; var=&quot;b&quot;> ...
Utilizando componentes Seam JSF Renderiza una página resuelve #{bikes} renderiza #{bikes} busca en el contexto crea BikeSe...
<ul><li>Introducción a Seam </li></ul><ul><li>Introducción a EJB3 </li></ul><ul><li>Introducción a JSF </li></ul><ul><li>V...
Introducción a EJB3 <ul><li>J2EE es un estándar, implementado por varias compañías </li></ul><ul><li>Define una plataforma...
Introducción a EJB3 <ul><li>Session Beans </li></ul><ul><ul><li>Implementa la lógica de negocio </li></ul></ul><ul><ul><li...
Introducción a EJB3 <ul><li>Ejemplo de  Session Bean </li></ul><ul><ul><li>Interface </li></ul></ul><ul><ul><ul><ul><ul><l...
Introducción a EJB3 <ul><li>Funcionalidad de EJB3 </li></ul><ul><ul><li>Inyección de componentes EJB3 es posible (inversió...
Introducción a EJB3 <ul><li>Entity Beans </li></ul><ul><ul><li>Iguales a las clases mapeadas por  Hibernate </li></ul></ul...
Introducción a EJB3 <ul><li>Message Driven Beans </li></ul><ul><ul><li>Usados para comunicación asincrónica </li></ul></ul...
<ul><li>Introducción a Seam </li></ul><ul><li>Introducción a EJB3 </li></ul><ul><li>Introducción a JSF </li></ul><ul><li>V...
Introducción a Java Server Faces <ul><li>Framework Web  orientada a componentes </li></ul><ul><li>Interacción con el servi...
Introducción a Java Server Faces <ul><li>Elementos de  JavaServer Faces </li></ul><ul><ul><li>JSP/XHTML para dibujar la vi...
Introducción a Java Server Faces <ul><li>Componentes de vista </li></ul><ul><ul><li>Una página JSF está compuesta por comp...
Introducción a Java Server Faces <ul><li>Ciclo de vida de un  request </li></ul><ul><li>La actualización del modelo sincro...
<ul><li>Ejemplo de componentes de vista </li></ul><ul><li>public class CustomerBean { </li></ul><ul><li>private HtmlPanelG...
Introducción a Java Server Faces <ul><li>Configuración de componentes y reglas de navegación definido en faces-config.xml ...
Introducción a Java Server Faces <ul><li>Validación </li></ul><ul><ul><li>Los validadores son agregados a las páginas JSF ...
<ul><li>Introducción a Seam </li></ul><ul><li>Introducción a EJB3 </li></ul><ul><li>Introducción a JSF </li></ul><ul><li>V...
Validación de campos <ul><li>Escenarios de valores ingresados incorrectos </li></ul><ul><ul><li>El usuario puede ingresar ...
Validación de campos <ul><li>Diferentes niveles de validación </li></ul><ul><ul><li>Validación básica de parámetros </li><...
Validación de campos <ul><li>¿Dónde ubicar la validación? </li></ul><ul><ul><li>Directamente en la vista </li></ul></ul><u...
Validación de campos <ul><li>Validación en Seam </li></ul><ul><ul><li>Basado en  Hibernate Validator Framework </li></ul><...
Validación de campos <ul><li>Validaciones de fábrica </li></ul><ul><ul><ul><li>// applies to String  // applies to collect...
Validación de campos <ul><li>Personalizar mensajes de las validaciones </li></ul><ul><ul><li>JSF imprime su propio mensaje...
Validación de campos <ul><li>Validaciones propias </li></ul><ul><ul><li>Implementación de la anotación de  Validator </li>...
Validación de campos <ul><li>Validaciones propias </li></ul><ul><ul><li>Implementación de la clase  Validator </li></ul></...
<ul><li>Integración en JSF </li></ul><ul><ul><li>Validación de un campo </li></ul></ul><ul><li><h:inputText id=&quot;name&...
Validación de campos <ul><li>Validación de cada campo usando  AJAX </li></ul><ul><ul><li>Ajax4JSF  se integra por completo...
<ul><li>Introducción a Seam </li></ul><ul><li>Introducción a EJB3 </li></ul><ul><li>Introducción a JSF </li></ul><ul><li>V...
Componentes de JBoss Seam <ul><li>Tipos </li></ul><ul><li>Intercepción </li></ul><ul><li>Utilización </li></ul>
Tipos de componentes <ul><li>Componentes  JavaBeans </li></ul><ul><li>EJB 3.0 </li></ul><ul><ul><ul><li>Stateless Session ...
Tipos de componentes <ul><li>Componentes  JavaBeans </li></ul><ul><ul><li>Pueden ser utilizados en lugar de  EJBs </li></u...
Tipos de componentes <ul><li>Componentes  JavaBeans </li></ul><ul><ul><li>Desventajas comparado con  EJBs </li></ul></ul><...
Tipos de componentes <ul><li>Componentes  Stateless Session Bean </li></ul><ul><ul><li>Imposibilidad de mantener el estado...
Tipos de componentes <ul><li>Componentes  Stateful Session Bean </li></ul><ul><ul><li>Mantiene el estado a través de múlti...
Tipos de componentes <ul><li>Componentes  Entity Beans </li></ul><ul><ul><li>No pueden ser asignados a una variable de con...
Componentes de JBoss Seam <ul><li>Tipos </li></ul><ul><li>Intercepción </li></ul><ul><li>Utilización </li></ul>
Intercepción de componentes <ul><li>Intercepción </li></ul><ul><ul><li>La funcionalidad de  Seam  está implantada a través...
Intercepción de componentes <ul><li>Interceptor usando anotaciones </li></ul><ul><li>@Stateless </li></ul><ul><li>@Interce...
Componentes de JBoss Seam <ul><li>Tipos </li></ul><ul><li>Intercepción </li></ul><ul><li>Utilización </li></ul>
Utilización de componentes <ul><li>Definición de nombres </li></ul><ul><li>@Name(“com.jboss.myseam.LoginAction”) </li></ul...
Utilización de componentes <ul><li>Nombres de componentes </li></ul><ul><ul><li>Los nombres se usan también desde JSF: </l...
Utilización de componentes <ul><li>Scopes  (ámbito) y roles </li></ul><ul><ul><li>Definición de los  scopes  de los compon...
Utilización de componentes <ul><li>Un componente puede tener más de una función en un sistema </li></ul><ul><ul><li>Difere...
Utilización de componentes <ul><li>Component Lifecycle and CallBacks </li></ul><ul><ul><li>Soporta métodos del ciclo de vi...
Utilización de componentes <ul><li>Bijection </li></ul><ul><ul><li>Inyección de componentes (@In) </li></ul></ul><ul><ul><...
<ul><li>Introducción a Seam </li></ul><ul><li>Introducción a EJB3 </li></ul><ul><li>Introducción a JSF </li></ul><ul><li>V...
Contextos en Seam <ul><li>Afecta a todos los componentes  stateful  de  Seam </li></ul><ul><li>Es invocado independienteme...
Contextos en Seam <ul><li>Acceso al contexto </li></ul><ul><ul><li>Acceso declarativo a través de @In </li></ul></ul><ul><...
Contextos en Seam <ul><li>Stateless Context </li></ul><ul><ul><li>Los verdaderos componentes sin estado residen dentro del...
Contextos en Seam <ul><li>Event Context </li></ul><ul><ul><li>Excelente para llamadas cortas </li></ul></ul><ul><ul><li>El...
Contextos en Seam <ul><li>Page Context </li></ul><ul><ul><li>Los componentes en este contexto están atadas a una página es...
Contextos en Seam <ul><li>Conversation Context </li></ul><ul><ul><li>Es un contexto extendido más chico que una sesión de ...
Contextos en Seam <ul><li>Business Context </li></ul><ul><ul><li>Mantiene componentes  stateful  asociados a procesos de n...
Contextos en Seam <ul><li>Application Context </li></ul><ul><ul><li>Similar a la especificación de los  Servlets </li></ul...
Contextos en Seam <ul><li>Session context </li></ul><ul><ul><li>Mantiene el estado asociado con la sesión de un usuario lo...
Contextos en Seam <ul><li>La asignación de contexto por defecto depende del tipo de  Bean </li></ul><ul><ul><ul><li>Statel...
<ul><li>Introducción a Seam </li></ul><ul><li>Introducción a EJB3 </li></ul><ul><li>Introducción a JSF </li></ul><ul><li>V...
Seguridad <ul><li>Modo simple </li></ul><ul><ul><ul><li>Usando un esquema “usuario/roles” </li></ul></ul></ul><ul><ul><ul>...
Seguridad <ul><li>Configuración </li></ul><ul><ul><li>Pasos requeridos </li></ul></ul><ul><ul><ul><li>Instalar el componen...
Seguridad <ul><li>Instalación del componente de identidad </li></ul><ul><li>File: pages.xml </li></ul><ul><li><security:id...
Seguridad <ul><li>Componente de autenticación </li></ul><ul><li>@Name(&quot;authenticator&quot;) </li></ul><ul><li>public ...
Seguridad <ul><li>Formulario de  Login </li></ul><ul><ul><li>El componente  'identity'  de  Seam  tiene la funcionalidad b...
Seguridad <ul><li>Excepciones de seguridad </li></ul><ul><ul><li>NotLoggedInException </li></ul></ul><ul><ul><ul><li>Métod...
Seguridad <ul><li>Manejo de excepciones de seguridad </li></ul><ul><li>File: pages.xml </li></ul><ul><li><exception class=...
Seguridad <ul><li>Redireccionar al usuario después de realizar el  login </li></ul><ul><ul><li>NotLoggedInException </li><...
Seguridad <ul><li>Aplicando seguridad a las páginas </li></ul><ul><li>File: pages.xml </li></ul><ul><li><page view-id=&quo...
Seguridad <ul><li>Aplicando seguridad a partes de una página </li></ul><ul><ul><li>Atributo  Rendered </li></ul></ul><ul><...
Seguridad <ul><li>Aplicando seguridad a los métodos con la anotación @Restrict </li></ul><ul><li>@Name(&quot;account&quot;...
<ul><li>Introducción a Seam </li></ul><ul><li>Introducción a EJB3 </li></ul><ul><li>Introducción a JSF </li></ul><ul><li>V...
<ul><li>Modelo de eventos </li></ul><ul><li>Eventos definidos por  Seam </li></ul><ul><li>Interceptores de  Seam </li></ul...
Modelo de eventos <ul><li>Modelo de eventos JSF </li></ul><ul><ul><li>Los eventos son mapeados a 'observadores' de manera ...
<ul><li>Eventos e Interceptores </li></ul><ul><li>Modelo de eventos </li></ul><ul><li>Eventos definidos por  Seam </li></u...
Eventos definidos por Seam <ul><li>Tipos de eventos definidos por  Seam </li></ul><ul><ul><li>Page action event:  sucede j...
Eventos definidos por Seam <ul><li>Tipos de eventos basados en componentes </li></ul><ul><ul><li>Mantienen bajo acoplamien...
Eventos definidos por Seam <ul><li>Tipos de eventos basados en componentes </li></ul><ul><ul><li>Seam  provee un mecanismo...
Eventos definidos por Seam <ul><li>Tipos de eventos basados en componentes </li></ul><ul><ul><li>.... con una anotación </...
Eventos definidos por Seam <ul><li>Tipos de eventos basados en componentes </li></ul><ul><ul><li>Los observadores se puede...
Eventos definidos por Seam <ul><li>Eventos contextuales en  Seam </li></ul><ul><ul><li>Existen muchos provistos para ser u...
Eventos definidos por Seam <ul><li>Eventos contextuales en Seam </li></ul><ul><li>... </li></ul><ul><li>startTask.<name> —...
<ul><li>Eventos e Interceptores </li></ul><ul><li>Modelo de eventos </li></ul><ul><li>Eventos definidos por  Seam </li></u...
Interceptores de Seam <ul><li>EJB 3.0 define el modelo de interceptores estándar para los  Session Beans </li></ul><ul><ul...
Interceptores de Seam <ul><li>Mejoras de  Seam </li></ul><ul><ul><li>@Interceptors es una anotación para definir intercept...
Interceptores de Seam <ul><li>Mejoras de  Seam   </li></ul><ul><ul><li>Ahora podemos proveer de una anotación a nuestro  a...
Interceptores de Seam <ul><li>Mejoras de  Seam </li></ul><ul><ul><li>El orden relativo a otro interceptores es opcional </...
<ul><li>Introducción a Seam </li></ul><ul><li>Introducción a EJB3 </li></ul><ul><li>Introducción a JSF </li></ul><ul><li>V...
<ul><ul><li>¿Preguntas? </li></ul></ul><ul><ul><li>¿Consultas? </li></ul></ul><ul><ul><li>¿Sugerencias? </li></ul></ul><ul...
Upcoming SlideShare
Loading in …5
×

Introducción Seam

11,313 views

Published on

Presentación de la charla del día 21 de Octubre en la Facultad Regional de Buenos Aires de la Universidad Tecnológica Nacional.
La presentación fue una introducción a los conceptos importantes necesarios para desarrollar una aplicación web utilizando el framework JBoss Seam.

Published in: Technology
0 Comments
11 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
11,313
On SlideShare
0
From Embeds
0
Number of Embeds
512
Actions
Shares
0
Downloads
0
Comments
0
Likes
11
Embeds 0
No embeds

No notes for slide
  • Aca me mando la parte con un ejemplo utilisima
  • Introducción Seam

    1. 1. Introducción Framework JBoss Seam
    2. 2. Sebastián Javier Marchano <ul><li>Estudiante Ingeniería Sistema Información - UTN </li></ul><ul><li>Experiencia + 3 años </li></ul><ul><li>Consultor JBoss Seam </li></ul><ul><ul><li>Perú, Paraguay, Argentina </li></ul></ul><ul><li>Desarrollador Senior JEE </li></ul><ul><ul><li>GranDT - Clarín (Cluster) </li></ul></ul><ul><ul><li>ACG & ElComercio – BristolGroup (Desarrollo) </li></ul></ul><ul><ul><li>Lotería de Buenos Aires (Reingeniería) </li></ul></ul><ul><ul><li>PagoMisCuentas - Banelco (Desarrollo) </li></ul></ul>
    3. 3. Agenda <ul><li>Introducción a Seam </li></ul><ul><li>Introducción a EJB3 </li></ul><ul><li>Introducción a JSF </li></ul><ul><li>Validaciones </li></ul><ul><li>Componentes </li></ul><ul><li>Contextos </li></ul><ul><li>Seguridad </li></ul><ul><li>Eventos e Interceptores </li></ul>
    4. 4. <ul><li>Seam provee mecanismos potentes para juntar componentes </li></ul><ul><li>Conceptos fundamentales </li></ul><ul><ul><li>Contexto </li></ul></ul><ul><ul><ul><li>Seam agrega conversaciones y procesos de negocios </li></ul></ul></ul><ul><ul><li>Componentes </li></ul></ul><ul><ul><ul><li>Objetos stateful (EJB3, Java Bean, virtualmente cualquier clase) </li></ul></ul></ul><ul><ul><ul><li>Una instancia de un componente es asociada a un contexto </li></ul></ul></ul>Seam
    5. 5. <ul><li>Bijection </li></ul><ul><ul><ul><li>Más de IoC ( Inversion of Control ) </li></ul></ul></ul><ul><ul><ul><li>Componentes pueden ser inyectados a otro (inyección) </li></ul></ul></ul><ul><ul><ul><li>Un componente puede poner otro componente en un contexto (eyección) </li></ul></ul></ul><ul><ul><ul><li>Crea alias a los nombres de los componentes internos (variables de instancias) a nombres contextuales </li></ul></ul></ul><ul><ul><ul><li>Permite la creación de árboles de componentes en forma dinámica y la modificación de los mismos a través de Seam </li></ul></ul></ul>Seam
    6. 6. Contexto Conversacional <ul><li>Conversaciones en Seam, una primer mirada… </li></ul><ul><ul><li>Es un contexto entre sesión HTTP y request </li></ul></ul><ul><ul><li>Está asociada a la sesión HTTP y es identificado por un ID </li></ul></ul><ul><ul><li>Es pasado a través de parámetros del request o campos de los formularios </li></ul></ul><ul><ul><li>Le permite a uno claramente separar múltiples diálogos </li></ul></ul><ul><ul><li>Soporta redireccionamiento </li></ul></ul>
    7. 7. Contexto Conversacional <ul><li>Caso de uso para conversación </li></ul><ul><ul><li>Mostrar mensajes después de un redireccionamiento </li></ul></ul><ul><ul><ul><li>Después de eliminar una bicicleta, redireccionar a la lista de bicicletas </li></ul></ul></ul><ul><ul><ul><li>Mostrar el mensaje: La bicicleta XXX fue eliminada </li></ul></ul></ul><ul><ul><li>Diálogos tipo wizard </li></ul></ul><ul><ul><ul><li>Alquilar una bicicleta </li></ul></ul></ul><ul><ul><ul><li>Seleccionar una bicicleta, agregar opciones en la segunda página </li></ul></ul></ul>
    8. 8. Contexto Conversacional <ul><li>Caso de uso para conversación </li></ul><ul><ul><li>Diálogos múltiples </li></ul></ul><ul><ul><ul><li>Un usuario puede tener varias ventanas del navegador para editar información de la bicicleta </li></ul></ul></ul><ul><ul><li>Redireccionamiento después de post </li></ul></ul><ul><ul><ul><li>Presionar F5 no hará un nuevo post de la información, sino que mostrará nuevamente la misma información </li></ul></ul></ul>
    9. 9. Ejemplo de aplicación <ul><li>Caso de uso </li></ul><ul><ul><li>Mostrar una lista de bicicletas </li></ul></ul><ul><ul><li>Seleccionar una bicicleta para editar </li></ul></ul><ul><ul><li>Grabar o eliminar una bicicleta </li></ul></ul>
    10. 10. Utilizando componentes Seam @Name(&quot;bikeService&quot;) public class BikeServiceBean { ... @DataModel private List<Bike> bikes; @Factory(value = &quot;bikes&quot;) public void loadBikes() { bikes = controller.listBikes(); } ... } Componente con nombre “bikeService” Componente con nombre “bikes” contiene la información de una lista de “bikes” Factory, responsable de crear el componente “bikes”
    11. 11. Utilizando componentes Seam <ul><li><h:form> </li></ul><ul><li><h:dataTable value=&quot;#{bikes}&quot; var=&quot;b&quot;> </li></ul><ul><li><h:column> </li></ul><ul><li><f:facet name=&quot;header&quot;>Id</f:facet> </li></ul><ul><li>#{b.id} </li></ul><ul><li></h:column> </li></ul><ul><li><h:column> </li></ul><ul><li><f:facet name=&quot;header&quot;>Name</f:facet> </li></ul><ul><li>#{b.name} </li></ul><ul><li></h:column> </li></ul><ul><li><h:column> </li></ul><ul><li><f:facet name=&quot;header&quot;>Description</f:facet> </li></ul><ul><li>#{b.description} </li></ul><ul><li></h:column> </li></ul><ul><li></h:dataTable> </li></ul><ul><li></h:form> </li></ul>
    12. 12. Utilizando componentes Seam JSF Renderiza una página resuelve #{bikes} renderiza #{bikes} busca en el contexto crea BikeService si es requerido llama al factory agrega al componente “bikes” al contexto devuelve “bikes” Contexts Event Conversation Session Business Process Services Persistence Context Management Application State Management Seam
    13. 13. <ul><li>Introducción a Seam </li></ul><ul><li>Introducción a EJB3 </li></ul><ul><li>Introducción a JSF </li></ul><ul><li>Validaciones </li></ul><ul><li>Componentes </li></ul><ul><li>Contextos </li></ul><ul><li>Seguridad </li></ul><ul><li>Eventos e Interceptores </li></ul>
    14. 14. Introducción a EJB3 <ul><li>J2EE es un estándar, implementado por varias compañías </li></ul><ul><li>Define una plataforma – servidor de aplicaciones J2EE </li></ul><ul><ul><li>APIs y políticas establecidas </li></ul></ul><ul><li>Especifica un modelo de programación de aplicaciones </li></ul><ul><ul><li>Session Beans </li></ul></ul><ul><ul><li>Message Driven Beans </li></ul></ul><ul><ul><li>Entity Beans </li></ul></ul>
    15. 15. Introducción a EJB3 <ul><li>Session Beans </li></ul><ul><ul><li>Implementa la lógica de negocio </li></ul></ul><ul><ul><li>Tipos de session beans </li></ul></ul><ul><ul><ul><li>Stateful Beans  Carrito de compras </li></ul></ul></ul><ul><ul><ul><li>Stateless Beans  Obtener la lista de clientes </li></ul></ul></ul><ul><ul><li>Basado en clases tipo POJO </li></ul></ul><ul><ul><li>Requiere de interfaces </li></ul></ul>
    16. 16. Introducción a EJB3 <ul><li>Ejemplo de Session Bean </li></ul><ul><ul><li>Interface </li></ul></ul><ul><ul><ul><ul><ul><li>import javax.ejb.Local; </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>@Local </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>public interface Bike { </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>public void listBikes(); </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>} </li></ul></ul></ul></ul></ul><ul><ul><li>Implementación </li></ul></ul><ul><ul><ul><ul><ul><li>@Stateless </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>public class BikeServiceBean implements BikeService{ </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>@PersistenceContext </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>private EntityManager em; </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>public void loadBikes() { </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>private List<Bike> bikes = em.createQuery(&quot;select b from Bike b&quot;).getResultList(); </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>} </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>} </li></ul></ul></ul></ul></ul>
    17. 17. Introducción a EJB3 <ul><li>Funcionalidad de EJB3 </li></ul><ul><ul><li>Inyección de componentes EJB3 es posible (inversión de control) </li></ul></ul><ul><li>@PersistenceContext </li></ul><ul><li>private EntityManager em; </li></ul><ul><ul><li>Manejo por defecto de transacciones y excepciones para llamadas a métodos </li></ul></ul><ul><ul><li>Opcional: especificar el comportamiento deseado </li></ul></ul><ul><li>@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW) </li></ul><ul><li>public void loadBikes() { </li></ul><ul><li>bikes = em.createQuery(&quot;select b from Bike b&quot;).getResultList(); </li></ul><ul><li>} </li></ul>
    18. 18. Introducción a EJB3 <ul><li>Entity Beans </li></ul><ul><ul><li>Iguales a las clases mapeadas por Hibernate </li></ul></ul><ul><ul><li>@Entity </li></ul></ul><ul><ul><li>public class Bike { </li></ul></ul><ul><ul><li>@Id </li></ul></ul><ul><ul><li>@GeneratedValue(strategy = GenerationType.AUTO) </li></ul></ul><ul><ul><li>private Long id; </li></ul></ul><ul><ul><li>@NotNull </li></ul></ul><ul><ul><li>private String name; </li></ul></ul><ul><ul><li>public Bike() { </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>public String getDescription() { </li></ul></ul><ul><ul><li>return description; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>public void setDescription(String description) { </li></ul></ul><ul><ul><li>this.description = description; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>..... </li></ul></ul>
    19. 19. Introducción a EJB3 <ul><li>Message Driven Beans </li></ul><ul><ul><li>Usados para comunicación asincrónica </li></ul></ul><ul><ul><li>Pueden ser enviados a sistemas locales o remotos </li></ul></ul><ul><ul><li>Integración simple con JBoss Seam </li></ul></ul>
    20. 20. <ul><li>Introducción a Seam </li></ul><ul><li>Introducción a EJB3 </li></ul><ul><li>Introducción a JSF </li></ul><ul><li>Validaciones </li></ul><ul><li>Componentes </li></ul><ul><li>Contextos </li></ul><ul><li>Seguridad </li></ul><ul><li>Eventos e Interceptores </li></ul>
    21. 21. Introducción a Java Server Faces <ul><li>Framework Web orientada a componentes </li></ul><ul><li>Interacción con el servidor a través de eventos </li></ul><ul><li>Componentes stateful </li></ul><ul><ul><li>Por ejemplo: click item 3 en una lista </li></ul></ul><ul><li>Estándar definido con una implementación de referencia http://java.sun.com/javaee/javaserverfaces </li></ul><ul><li>Disponibilidad de componentes Web opensource y comerciales </li></ul>
    22. 22. Introducción a Java Server Faces <ul><li>Elementos de JavaServer Faces </li></ul><ul><ul><li>JSP/XHTML para dibujar la vista </li></ul></ul><ul><ul><li>Bean de soporte </li></ul></ul><ul><ul><ul><li>Componentes de la vista ( actions ) </li></ul></ul></ul><ul><ul><ul><li>Métodos de actions </li></ul></ul></ul><ul><ul><ul><li>Listener de actions </li></ul></ul></ul><ul><ul><ul><li>Puente a la lógica de negocio </li></ul></ul></ul><ul><ul><li>Reglas de navegación </li></ul></ul><ul><ul><li>Validaciones </li></ul></ul><ul><ul><li>Convertidores </li></ul></ul>
    23. 23. Introducción a Java Server Faces <ul><li>Componentes de vista </li></ul><ul><ul><li>Una página JSF está compuesta por componentes </li></ul></ul><ul><ul><li>Tipos </li></ul></ul><ul><ul><ul><li>Elementos de HTML: input text, checkbox </li></ul></ul></ul><ul><ul><ul><li>Componentes de control secundario </li></ul></ul></ul><ul><ul><ul><li>Librerías de componentes utilitarios </li></ul></ul></ul><ul><ul><li>Funcionalidad </li></ul></ul><ul><ul><ul><li>Renderiza </li></ul></ul></ul><ul><ul><ul><li>Puede tener validadores y convertidores </li></ul></ul></ul>
    24. 24. Introducción a Java Server Faces <ul><li>Ciclo de vida de un request </li></ul><ul><li>La actualización del modelo sincronizará los componentes en memoria </li></ul><ul><li>La fase Invoke llama a los action listeners y ejecuta action methods </li></ul><ul><li>Cada fase dispara eventos y algunas pueden ser salteadas si existe algún error </li></ul>
    25. 25. <ul><li>Ejemplo de componentes de vista </li></ul><ul><li>public class CustomerBean { </li></ul><ul><li>private HtmlPanelGrid panel; </li></ul><ul><li>public String leave() { </li></ul><ul><li>// navigate to home page </li></ul><ul><li>return &quot;home&quot;; </li></ul><ul><li>} </li></ul><ul><li>public void add(ActionEvent event) { </li></ul><ul><li>.... </li></ul><ul><li>// some example customer </li></ul><ul><li>Customer customer = new Customer(4711, &quot;Redhat&quot;, &quot;United States&quot;); </li></ul><ul><li>HtmlOutputText text = (HtmlOutputText) </li></ul><ul><li>application.createComponent(HtmlOutputText.COMPONENT_TYPE); </li></ul><ul><li>text.setValue(customer.getId()); </li></ul><ul><li>panel.getChildren().add(text); </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>Introducción a Java Server Faces
    26. 26. Introducción a Java Server Faces <ul><li>Configuración de componentes y reglas de navegación definido en faces-config.xml (carpeta: /WEB-INF/) </li></ul><ul><li><faces-config ...> </li></ul><ul><li><navigation-rule> </li></ul><ul><li><from-view-id>/customers.jsp</from-view-id> </li></ul><ul><li><navigation-case> </li></ul><ul><li><from-outcome>home</from-outcome> </li></ul><ul><li><to-view-id>/home.jsp</to-view-id> </li></ul><ul><li></navigation-case> </li></ul><ul><li></navigation-rule> </li></ul><ul><li><managed-bean> </li></ul><ul><li><managed-bean-name>customerBean</managed-bean-name> </li></ul><ul><li><managed-bean-class>com.jboss.jsf.CustomerBean</managed-bean-class> </li></ul><ul><li><managed-bean-scope>session</managed-bean-scope> </li></ul><ul><li></managed-bean> </li></ul><ul><li></faces-config> </li></ul>
    27. 27. Introducción a Java Server Faces <ul><li>Validación </li></ul><ul><ul><li>Los validadores son agregados a las páginas JSF </li></ul></ul><ul><ul><li>Los mensajes de error son guardados </li></ul></ul><ul><li><h:inputText value=&quot;#{customerBean.name}&quot;> </li></ul><ul><li><f:validateLength minimum=&quot;4&quot; maximum=&quot;20&quot;/> </li></ul><ul><li></h:inputText> </li></ul>
    28. 28. <ul><li>Introducción a Seam </li></ul><ul><li>Introducción a EJB3 </li></ul><ul><li>Introducción a JSF </li></ul><ul><li>Validaciones </li></ul><ul><li>Componentes </li></ul><ul><li>Contextos </li></ul><ul><li>Seguridad </li></ul><ul><li>Eventos e Interceptores </li></ul>
    29. 29. Validación de campos <ul><li>Escenarios de valores ingresados incorrectos </li></ul><ul><ul><li>El usuario puede ingresar valores incorrectos en cualquier momento </li></ul></ul><ul><ul><li>Combinaciones de valores no permitidos </li></ul></ul><ul><ul><ul><li>Por ejemplo: fecha final anterior a fecha inicial </li></ul></ul></ul><ul><ul><li>Manipulación de parámetros de request </li></ul></ul>
    30. 30. Validación de campos <ul><li>Diferentes niveles de validación </li></ul><ul><ul><li>Validación básica de parámetros </li></ul></ul><ul><ul><ul><li>No nulo, longitud, mayor a, menor a, es una fecha .. </li></ul></ul></ul><ul><ul><li>Validación en el contexto de lógica de negocio </li></ul></ul><ul><ul><ul><li>El nombre de usuario todavía no existe </li></ul></ul></ul><ul><ul><ul><li>Si un entrenamiento es mayor a 8 horas, es necesario que se seleccione algún tipo de almuerzo también </li></ul></ul></ul>
    31. 31. Validación de campos <ul><li>¿Dónde ubicar la validación? </li></ul><ul><ul><li>Directamente en la vista </li></ul></ul><ul><li>Ejemplo de un validador de JSF </li></ul><ul><li><h:inputText value=&quot;#{customerBean.name}&quot;> </li></ul><ul><li><f:validateLength minimum=&quot;4&quot; maximum=&quot;20&quot;/> </li></ul><ul><li></h:inputText> </li></ul><ul><ul><li>¿Por qué no? </li></ul></ul><ul><ul><ul><li>Un cliente de Web service no pasa a través de esta validación </li></ul></ul></ul><ul><ul><ul><li>Mal diseño: las reglas de validación son parte del dominio del objeto (encapsulación) </li></ul></ul></ul><ul><ul><ul><li>Podemos olvidarnos de alguna validación en una página </li></ul></ul></ul>
    32. 32. Validación de campos <ul><li>Validación en Seam </li></ul><ul><ul><li>Basado en Hibernate Validator Framework </li></ul></ul><ul><ul><li>Usa anotaciones </li></ul></ul><ul><ul><li>Extendible con validaciones programadas </li></ul></ul><ul><ul><li>Ejemplo: </li></ul></ul><ul><li>public class Bike implements Serializable { </li></ul><ul><li>@Length(min = 3, max = 254) </li></ul><ul><li>private String name; </li></ul><ul><li>@Min(0) </li></ul><ul><li>private double price; </li></ul><ul><li>.... </li></ul>
    33. 33. Validación de campos <ul><li>Validaciones de fábrica </li></ul><ul><ul><ul><li>// applies to String // applies to collections </li></ul></ul></ul><ul><ul><ul><li>@Length(min=, max=) @Size(min=, max=) </li></ul></ul></ul><ul><ul><ul><li>// numeric field /* validate nested object or </li></ul></ul></ul><ul><ul><ul><li>// or String holding a number collection */ </li></ul></ul></ul><ul><ul><ul><li>@Max(value=) @Valid </li></ul></ul></ul><ul><ul><ul><li>@Min(value=) private Address address; </li></ul></ul></ul><ul><ul><ul><li>@Range(min=, max=) </li></ul></ul></ul><ul><ul><ul><li>@Email </li></ul></ul></ul><ul><ul><ul><li>@NotNull </li></ul></ul></ul><ul><ul><ul><li>@NotEmpty /* = NotNull + non empty // regular expressions </li></ul></ul></ul><ul><ul><ul><li>String or Collection */ @Pattern(regex=&quot;regexp&quot; , flag=) </li></ul></ul></ul><ul><ul><ul><li>@Patterns( {@Pattern(...)} ) </li></ul></ul></ul><ul><ul><ul><li>// Date specific </li></ul></ul></ul><ul><ul><ul><li>@Past </li></ul></ul></ul><ul><ul><ul><li>@Future </li></ul></ul></ul>
    34. 34. Validación de campos <ul><li>Personalizar mensajes de las validaciones </li></ul><ul><ul><li>JSF imprime su propio mensaje si los campos requeridos son vacíos, por defecto están en jsf-impl.jar </li></ul></ul><ul><li>javax.faces.component.UIInput.REQUIRED=I really need it. </li></ul><ul><ul><li>Mensajes de Hibernate Validator , por defecto están en hibernate-validator.jar </li></ul></ul><ul><ul><li>@Length(min=3, &quot;The name is by far to short.&quot;) </li></ul></ul><ul><ul><li>private String name; </li></ul></ul><ul><ul><li>Seam Generator sobrescribe todos los mensajes por defecto </li></ul></ul><ul><ul><ul><li>Archivo 'messages.properties' en la carpeta 'resources' </li></ul></ul></ul>
    35. 35. Validación de campos <ul><li>Validaciones propias </li></ul><ul><ul><li>Implementación de la anotación de Validator </li></ul></ul><ul><ul><li>// anotación GooName.java </li></ul></ul><ul><ul><li>@ValidatorClass(GoodNameValidatior.class) </li></ul></ul><ul><ul><li>@Target({ElementType.METHOD, ElementType.FIELD}) </li></ul></ul><ul><ul><li>@Retention(RetentionPolicy.RUNTIME) </li></ul></ul><ul><ul><li>@Documented </li></ul></ul><ul><ul><li>public @interface GoodName { </li></ul></ul><ul><ul><li>String message() default &quot;{validator.goodName}&quot;; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>// en el archivo message.properties </li></ul></ul><ul><ul><li>validator.goodName=Good bike names start with Seam </li></ul></ul>
    36. 36. Validación de campos <ul><li>Validaciones propias </li></ul><ul><ul><li>Implementación de la clase Validator </li></ul></ul><ul><ul><ul><li>public class GoodNameValidatior implements Validator<GoodName> { </li></ul></ul></ul><ul><ul><ul><li>private GoodName goodName; </li></ul></ul></ul><ul><ul><ul><li>public boolean isValid(Object o) { </li></ul></ul></ul><ul><ul><ul><li>if (o == null) return true; </li></ul></ul></ul><ul><ul><ul><li>if (o instanceof String) { </li></ul></ul></ul><ul><ul><ul><li>String value = (String) o; </li></ul></ul></ul><ul><ul><ul><li>return value.startsWith(&quot;Seam&quot;); </li></ul></ul></ul><ul><ul><ul><li>} else </li></ul></ul></ul><ul><ul><ul><li>return false; </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul><ul><ul><ul><li>public void initialize(GoodName goodName) { </li></ul></ul></ul><ul><ul><ul><li>this.goodName = goodName; </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul>
    37. 37. <ul><li>Integración en JSF </li></ul><ul><ul><li>Validación de un campo </li></ul></ul><ul><li><h:inputText id=&quot;name&quot; required=&quot;true&quot; value=&quot;#{bike.name}&quot;> </li></ul><ul><li><s:validate/> </li></ul><ul><li></h:inputText> </li></ul><ul><ul><li>Validación de todos los campos </li></ul></ul><ul><li><s:validateAll> </li></ul><ul><li>Username: <h:inputText value=&quot;#{user.username}&quot; required=&quot;true&quot;/> </li></ul><ul><li>Real Name: <h:inputText value=&quot;#{user.name}&quot; required=&quot;true&quot;/> </li></ul><ul><li>Password: <h:inputSecret value=&quot;#{user.password}&quot; required=&quot;true&quot;/> </li></ul><ul><li></s:validateAll> </li></ul>Validación de campos No olvidarse del required=”true”
    38. 38. Validación de campos <ul><li>Validación de cada campo usando AJAX </li></ul><ul><ul><li>Ajax4JSF se integra por completo con el ciclo de vida de los request de JSF </li></ul></ul><ul><ul><li>Ejemplo cuando un campo pierde foco </li></ul></ul><ul><li><s:validateAll> </li></ul><ul><li><h:inputText id=&quot;bikename&quot; </li></ul><ul><li>required=&quot;true&quot; </li></ul><ul><li>value=&quot;#{bike.name}&quot;> </li></ul><ul><li><a:support event=&quot;onblur&quot; reRender=&quot;bikename&quot;/> </li></ul><ul><li></h:inputText> </li></ul><ul><li></s:validateAll> </li></ul><ul><ul><li>Tener cuidado con los eventos (presionar tab todo el tiempo) </li></ul></ul>
    39. 39. <ul><li>Introducción a Seam </li></ul><ul><li>Introducción a EJB3 </li></ul><ul><li>Introducción a JSF </li></ul><ul><li>Validaciones </li></ul><ul><li>Componentes </li></ul><ul><li>Contextos </li></ul><ul><li>Seguridad </li></ul><ul><li>Eventos e Interceptores </li></ul>
    40. 40. Componentes de JBoss Seam <ul><li>Tipos </li></ul><ul><li>Intercepción </li></ul><ul><li>Utilización </li></ul>
    41. 41. Tipos de componentes <ul><li>Componentes JavaBeans </li></ul><ul><li>EJB 3.0 </li></ul><ul><ul><ul><li>Stateless Session Beans </li></ul></ul></ul><ul><ul><ul><li>Stateful Session Beans </li></ul></ul></ul><ul><ul><ul><li>Entity Beans </li></ul></ul></ul><ul><ul><ul><li>Message-Driven Beans </li></ul></ul></ul><ul><li>Son POJOs , cualquier clase puede ser un componente </li></ul>
    42. 42. Tipos de componentes <ul><li>Componentes JavaBeans </li></ul><ul><ul><li>Pueden ser utilizados en lugar de EJBs </li></ul></ul><ul><ul><li>Contexto Seam: por defecto son puestos al contexto event </li></ul></ul><ul><ul><li>Request concurrentes a JBs en contexto de sesión son serializados </li></ul></ul>
    43. 43. Tipos de componentes <ul><li>Componentes JavaBeans </li></ul><ul><ul><li>Desventajas comparado con EJBs </li></ul></ul><ul><ul><ul><li>No hay demarcación de transacción declarativa </li></ul></ul></ul><ul><ul><ul><li>No hay seguridad declarativa </li></ul></ul></ul><ul><ul><ul><li>Replicación de estado en cluster no eficiente </li></ul></ul></ul><ul><ul><ul><li>No se puede definir timeouts a nivel de método </li></ul></ul></ul><ul><ul><ul><li>No usa persistencia EJB 3.0 </li></ul></ul></ul>
    44. 44. Tipos de componentes <ul><li>Componentes Stateless Session Bean </li></ul><ul><ul><li>Imposibilidad de mantener el estado a través de varias invocaciones </li></ul></ul><ul><ul><li>Útil para JSF action listeners </li></ul></ul><ul><ul><li>Siempre en el contexto stateless </li></ul></ul>
    45. 45. Tipos de componentes <ul><li>Componentes Stateful Session Bean </li></ul><ul><ul><li>Mantiene el estado a través de múltiples invocaciones/múltiples requests </li></ul></ul><ul><ul><li>Contexto Seam : por defecto son puestos en el contexto de la conversación </li></ul></ul><ul><ul><li>No es posible utilizarlos en el contexto Stateless </li></ul></ul><ul><ul><li>Ejemplo de instanciación </li></ul></ul><ul><ul><ul><li>@In(create=true) </li></ul></ul></ul><ul><ul><ul><li>Object myComponent = Component.getInstance(&quot;componentName&quot;); </li></ul></ul></ul>
    46. 46. Tipos de componentes <ul><li>Componentes Entity Beans </li></ul><ul><ul><li>No pueden ser asignados a una variable de contexto </li></ul></ul><ul><ul><li>No soportan bijection (inyección/eyección) o demarcación de contexto </li></ul></ul><ul><ul><li>Óptimos como backing beans </li></ul></ul><ul><ul><li>Asignados al contexto de conversación por defecto </li></ul></ul>
    47. 47. Componentes de JBoss Seam <ul><li>Tipos </li></ul><ul><li>Intercepción </li></ul><ul><li>Utilización </li></ul>
    48. 48. Intercepción de componentes <ul><li>Intercepción </li></ul><ul><ul><li>La funcionalidad de Seam está implantada a través de la intercepción de las invocaciones a componentes </li></ul></ul><ul><ul><li>Opciones de configuración </li></ul></ul><ul><ul><ul><li>Para cada Bean </li></ul></ul></ul><ul><ul><ul><li>Global para todos los Beans </li></ul></ul></ul>
    49. 49. Intercepción de componentes <ul><li>Interceptor usando anotaciones </li></ul><ul><li>@Stateless </li></ul><ul><li>@Interceptors(SeamInterceptor.class) </li></ul><ul><li>public class LoginAction implements Login{ </li></ul><ul><li>Session Beans , la mejor forma de definir interceptores </li></ul><ul><li>File: ejb-jar.xml </li></ul><ul><li><interceptors> </li></ul><ul><li><interceptor> </li></ul><ul><li><interceptor-class>org.jboss.seam.ejb.SeamInterceptor</interceptor-class> </li></ul><ul><li></interceptor> </li></ul><ul><li></interceptors> </li></ul><ul><li><assembly-descriptor> </li></ul><ul><li><interceptor-binding> </li></ul><ul><li><ejb-name>*</ejb-name> </li></ul><ul><li><interceptor-class>org.jboss.seam.ejb.SeamInterceptor</interceptor-class> </li></ul><ul><li></interceptor-binding> </li></ul><ul><li></assembly-descriptor> </li></ul>
    50. 50. Componentes de JBoss Seam <ul><li>Tipos </li></ul><ul><li>Intercepción </li></ul><ul><li>Utilización </li></ul>
    51. 51. Utilización de componentes <ul><li>Definición de nombres </li></ul><ul><li>@Name(“com.jboss.myseam.LoginAction”) </li></ul><ul><li>@Stateless </li></ul><ul><li>public class LoginAction implements Login{ </li></ul><ul><li>Se debe considerar el uso de nombres calificados </li></ul>
    52. 52. Utilización de componentes <ul><li>Nombres de componentes </li></ul><ul><ul><li>Los nombres se usan también desde JSF: </li></ul></ul><ul><li><h:commandButton type=”submit” value=”LogIn” </li></ul><ul><li>action=”#{com.jboss.myseam.LoginAction.login}”/> </li></ul><ul><ul><li>Usando un Factory como alias (definidos en components.xml): </li></ul></ul><ul><li><factory name=”loginAction” scope=”STATELESS” </li></ul><ul><li>value=”#{com.jboss.myseam.LoginAction.login}”/> </li></ul><ul><li><h:commandButton type=”submit” value=”LogIn” action=”#{loginAction}”/> </li></ul>
    53. 53. Utilización de componentes <ul><li>Scopes (ámbito) y roles </li></ul><ul><ul><li>Definición de los scopes de los componentes </li></ul></ul><ul><ul><ul><li>Scopes definidos en org.jboss.seam.ScopeType </li></ul></ul></ul><ul><ul><ul><li>La anotación @Scope permite sobrescribir el valor por defecto </li></ul></ul></ul><ul><li>@Name(“User”) </li></ul><ul><li>@Entity </li></ul><ul><li>@Scope(SESSION) </li></ul><ul><li>public class User{ </li></ul><ul><li>.... </li></ul><ul><li>} </li></ul>
    54. 54. Utilización de componentes <ul><li>Un componente puede tener más de una función en un sistema </li></ul><ul><ul><li>Diferentes roles en diferentes contextos </li></ul></ul><ul><ul><li>Uso de las anotaciones @Role & @Roles </li></ul></ul><ul><li>@Name(“User”) </li></ul><ul><li>@Entity </li></ul><ul><li>@Scope(CONVERSATION) </li></ul><ul><li>@Roles({@Role(name=”currentUser”, scope=SESSION), </li></ul><ul><li>@Role(name=”guestUser”, scope=EVENT)}) </li></ul><ul><li>public class User{ </li></ul><ul><li>. . . </li></ul><ul><li>} </li></ul>
    55. 55. Utilización de componentes <ul><li>Component Lifecycle and CallBacks </li></ul><ul><ul><li>Soporta métodos del ciclo de vida de EJB 3.0 con Entity/Session Beans </li></ul></ul><ul><ul><li>También con componentes JavaBeans! </li></ul></ul><ul><ul><ul><li>@PostConstruct & @PreDestroy definidos por Seam </li></ul></ul></ul><ul><ul><ul><li>@Create </li></ul></ul></ul><ul><ul><ul><li>@Destroy </li></ul></ul></ul><ul><ul><ul><li>@Remove (solo SFSB) </li></ul></ul></ul><ul><ul><ul><li>@Startup </li></ul></ul></ul><ul><ul><ul><li>@Startup(depends={. . . }) </li></ul></ul></ul>
    56. 56. Utilización de componentes <ul><li>Bijection </li></ul><ul><ul><li>Inyección de componentes (@In) </li></ul></ul><ul><ul><ul><li>Demarca una dependencia </li></ul></ul></ul><ul><ul><li>Eyección de componentes hacia contextos (@Out) </li></ul></ul><ul><li>@Name(“loginAction”) </li></ul><ul><li>@Stateless </li></ul><ul><li>public class LoginAction implements Login { </li></ul><ul><li>@In User user; </li></ul><ul><li>@Out Account account; </li></ul><ul><li>. . . </li></ul><ul><li>} </li></ul>
    57. 57. <ul><li>Introducción a Seam </li></ul><ul><li>Introducción a EJB3 </li></ul><ul><li>Introducción a JSF </li></ul><ul><li>Validaciones </li></ul><ul><li>Componentes </li></ul><ul><li>Contextos </li></ul><ul><li>Seguridad </li></ul><ul><li>Eventos e Interceptores </li></ul>
    58. 58. Contextos en Seam <ul><li>Afecta a todos los componentes stateful de Seam </li></ul><ul><li>Es invocado independientemente del componente de la aplicación </li></ul><ul><li>Inspirado por Declarative Context Model </li></ul><ul><li>Agrega granularidad a alto nivel </li></ul><ul><li>Provee múltiples estados de contextos stateful </li></ul>
    59. 59. Contextos en Seam <ul><li>Acceso al contexto </li></ul><ul><ul><li>Acceso declarativo a través de @In </li></ul></ul><ul><li>@In private Context sessionContext </li></ul><ul><ul><li>Los contextos pueden ser inyectados a un POJO : </li></ul></ul><ul><ul><ul><li>Event Context </li></ul></ul></ul><ul><ul><ul><li>PageContext </li></ul></ul></ul><ul><ul><ul><li>ConversationContext </li></ul></ul></ul><ul><ul><ul><li>SessionContext </li></ul></ul></ul><ul><ul><ul><li>BusinessProcessContext </li></ul></ul></ul><ul><ul><ul><li>ApplicationContext </li></ul></ul></ul><ul><ul><ul><li>StatelessContext </li></ul></ul></ul>
    60. 60. Contextos en Seam <ul><li>Stateless Context </li></ul><ul><ul><li>Los verdaderos componentes sin estado residen dentro del “ stateless context ” </li></ul></ul><ul><ul><li>Permite JavaBeans en estado stateless </li></ul></ul><ul><li>@Stateless </li></ul><ul><li>@Name(“sessionExample”) </li></ul><ul><li>@Scope(ScopeType.STATELESS) </li></ul><ul><li>public class SessionExample{ </li></ul><ul><li>@Out(scope= ScopeType.SESSION, required=true) </li></ul><ul><li>private String userName; </li></ul><ul><li>public String login(){ </li></ul><ul><li>userName= “Joseph </li></ul><ul><li>return “/pageOne.jsp”' </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    61. 61. Contextos en Seam <ul><li>Event Context </li></ul><ul><ul><li>Excelente para llamadas cortas </li></ul></ul><ul><ul><li>El estado es mantenido a través del procesamiento de un solo request JSF </li></ul></ul>
    62. 62. Contextos en Seam <ul><li>Page Context </li></ul><ul><ul><li>Los componentes en este contexto están atadas a una página específica </li></ul></ul><ul><ul><li>El acceso de los componentes está acotado a todos los eventos emitidos desde la página </li></ul></ul>
    63. 63. Contextos en Seam <ul><li>Conversation Context </li></ul><ul><ul><li>Es un contexto extendido más chico que una sesión de usuario </li></ul></ul><ul><ul><li>El usuario puede simular varias mini sesiones sin necesidad de tenerlas realmente </li></ul></ul><ul><ul><li>Permite transaccionar con tiempos de ejecución largos </li></ul></ul><ul><ul><li>Se crean y se destruyen manualmente </li></ul></ul>
    64. 64. Contextos en Seam <ul><li>Business Context </li></ul><ul><ul><li>Mantiene componentes stateful asociados a procesos de negocios de ejecución prolongada a través de un BPM </li></ul></ul><ul><ul><li>Estos se acceden de manera similar que componente en otro contexto </li></ul></ul><ul><li>@Stateless </li></ul><ul><li>@Name(“shoppingExample”) </li></ul><ul><li>@Scope(ScopeType.STATELESS) </li></ul><ul><li>public class Shopping { </li></ul><ul><li>@In(scope=ScopeType.BUSINESS_PROCESS) </li></ul><ul><li>private Ticket ticket; </li></ul><ul><li>} </li></ul>
    65. 65. Contextos en Seam <ul><li>Application Context </li></ul><ul><ul><li>Similar a la especificación de los Servlets </li></ul></ul><ul><ul><li>La anotación “@Synchronized” permite la llamada concurrente a SFSB </li></ul></ul><ul><li>@Name(“configurationData”) </li></ul><ul><li>@Scope(ScopeType.APPLICATION) </li></ul><ul><li>public class ConfigurationData implements Serializable{ </li></ul><ul><li>//contents here please </li></ul><ul><li>} </li></ul>
    66. 66. Contextos en Seam <ul><li>Session context </li></ul><ul><ul><li>Mantiene el estado asociado con la sesión de un usuario logueado </li></ul></ul><ul><ul><li>Permite JavaBeans en forma de stateful </li></ul></ul><ul><li>@Name(“statelessHelloSeamWorld”) </li></ul><ul><li>@Scope(ScopeType.SESSION) </li></ul><ul><li>public class StatelessHelloSeamWorld{ </li></ul><ul><li>@RequestParameter(“name”) </li></ul><ul><li>String userName; </li></ul><ul><li>public String getText() { </li></ul><ul><li>return HelloSeamWorld!!! - + username </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    67. 67. Contextos en Seam <ul><li>La asignación de contexto por defecto depende del tipo de Bean </li></ul><ul><ul><ul><li>Stateless Session Beans </li></ul></ul></ul><ul><ul><ul><ul><li>Stateless context es el único posible </li></ul></ul></ul></ul><ul><ul><ul><li>Entities </li></ul></ul></ul><ul><ul><ul><ul><li>Por defecto en Conversation context </li></ul></ul></ul></ul><ul><ul><ul><li>Message-Driven Beans </li></ul></ul></ul><ul><ul><ul><ul><li>Ningún contexto por defecto </li></ul></ul></ul></ul><ul><ul><ul><li>Stateful Session Beans </li></ul></ul></ul><ul><ul><ul><ul><li>Por defecto en Conversation context </li></ul></ul></ul></ul><ul><ul><ul><li>JavaBeans </li></ul></ul></ul><ul><ul><ul><ul><li>Por defecto en Event context </li></ul></ul></ul></ul>
    68. 68. <ul><li>Introducción a Seam </li></ul><ul><li>Introducción a EJB3 </li></ul><ul><li>Introducción a JSF </li></ul><ul><li>Validaciones </li></ul><ul><li>Componentes </li></ul><ul><li>Contextos </li></ul><ul><li>Seguridad </li></ul><ul><li>Eventos e Interceptores </li></ul>
    69. 69. Seguridad <ul><li>Modo simple </li></ul><ul><ul><ul><li>Usando un esquema “usuario/roles” </li></ul></ul></ul><ul><ul><ul><li>Las restricciones se aplican según el rol del usuario </li></ul></ul></ul><ul><li>Modo avanzado </li></ul><ul><ul><ul><li>Chequeo de permisos complejos </li></ul></ul></ul><ul><ul><ul><ul><li>Verificación de combinaciones user/role , permiso y entidad </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Ejemplo: ¿puede el usuario modificar la bicicleta con Id 3? </li></ul></ul></ul></ul><ul><ul><ul><li>Usa del motor JBoss Rules para definir permisos </li></ul></ul></ul>
    70. 70. Seguridad <ul><li>Configuración </li></ul><ul><ul><li>Pasos requeridos </li></ul></ul><ul><ul><ul><li>Instalar el componente de identidad </li></ul></ul></ul><ul><ul><ul><li>Crear una clase de autenticación </li></ul></ul></ul><ul><ul><ul><li>Crear un formulario de login </li></ul></ul></ul>
    71. 71. Seguridad <ul><li>Instalación del componente de identidad </li></ul><ul><li>File: pages.xml </li></ul><ul><li><security:identity authenticate-method=&quot;#{authenticator.authenticate}&quot;/> </li></ul>
    72. 72. Seguridad <ul><li>Componente de autenticación </li></ul><ul><li>@Name(&quot;authenticator&quot;) </li></ul><ul><li>public class Authenticator implements Serializable{ </li></ul><ul><li>@In Identity identity; </li></ul><ul><li>public boolean authenticate() { </li></ul><ul><li>return identity.getUsername().equals( identity.getPassword() ); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    73. 73. Seguridad <ul><li>Formulario de Login </li></ul><ul><ul><li>El componente 'identity' de Seam tiene la funcionalidad básica </li></ul></ul><ul><li><h:form> </li></ul><ul><li><h:panelGrid columns=”2”> </li></ul><ul><li><h:outputLabel for=&quot;name&quot; value=&quot;Username&quot;/> </li></ul><ul><li><h:inputText id=&quot;name&quot; value=&quot;#{identity.username}&quot;/> </li></ul><ul><li><h:outputLabel for=&quot;password&quot; value=&quot;Password&quot;/> </li></ul><ul><li><h:inputSecret id=&quot;password&quot; value=&quot;#{identity.password}&quot;/> </li></ul><ul><li><h:commandButton value=&quot;Login&quot; action=&quot;#{identity.login}&quot;/> </li></ul><ul><li></h:panelGrid> </li></ul><ul><li></h:form> </li></ul>
    74. 74. Seguridad <ul><li>Excepciones de seguridad </li></ul><ul><ul><li>NotLoggedInException </li></ul></ul><ul><ul><ul><li>Método o página están restringidos a usuarios identificados </li></ul></ul></ul><ul><ul><li>AuthorizationException </li></ul></ul><ul><ul><ul><li>El usuario está logueado </li></ul></ul></ul><ul><ul><ul><li>Carece de los privilegios necesarios </li></ul></ul></ul><ul><ul><li>Es preciso configurar una página de manejo normal de excepciones </li></ul></ul>
    75. 75. Seguridad <ul><li>Manejo de excepciones de seguridad </li></ul><ul><li>File: pages.xml </li></ul><ul><li><exception class=&quot;org.jboss.seam.security.NotLoggedInException&quot;> </li></ul><ul><li><redirect view-id=&quot;/login.xhtml&quot;> </li></ul><ul><li><message>You must be logged in to perform this action</message> </li></ul><ul><li></redirect> </li></ul><ul><li></exception> </li></ul><ul><li><exception class=&quot;org.jboss.seam.security.AuthorizationException&quot;> </li></ul><ul><li><end-conversation/> </li></ul><ul><li><redirect view-id=&quot;/security_error.xhtml&quot;> </li></ul><ul><li><message>You do not have the necessary security privileges to perform this </li></ul><ul><li>action.</message </li></ul><ul><li></redirect> </li></ul><ul><li></exception> </li></ul>
    76. 76. Seguridad <ul><li>Redireccionar al usuario después de realizar el login </li></ul><ul><ul><li>NotLoggedInException </li></ul></ul><ul><ul><ul><li>Lo redirecciona a login.xhtml </li></ul></ul></ul><ul><ul><ul><li>Después de login , envía al usuario nuevamente a la página original </li></ul></ul></ul><ul><li>File:component.xml </li></ul><ul><li><event type=&quot;org.jboss.seam.notLoggedIn&quot;> </li></ul><ul><li><action expression=&quot;#{redirect.captureCurrentView}&quot;/> </li></ul><ul><li></event> </li></ul><ul><li><event type=&quot;org.jboss.seam.postAuthenticate&quot;> </li></ul><ul><li><action expression=&quot;#{redirect.returnToCapturedView}&quot;/> </li></ul><ul><li></event> </li></ul>
    77. 77. Seguridad <ul><li>Aplicando seguridad a las páginas </li></ul><ul><li>File: pages.xml </li></ul><ul><li><page view-id=&quot;/members/*&quot; login-required=&quot;true&quot;/> </li></ul><ul><li><page view-id=&quot;/reports.xhtml&quot;> </li></ul><ul><li><restrict>#{s:hasRole('admin')}</restrict> </li></ul><ul><li></page> </li></ul>
    78. 78. Seguridad <ul><li>Aplicando seguridad a partes de una página </li></ul><ul><ul><li>Atributo Rendered </li></ul></ul><ul><ul><ul><li>Disponible en la mayoría de los tags </li></ul></ul></ul><ul><ul><ul><li>Renderiza el contenido si la expresión es verdadera </li></ul></ul></ul><ul><li><h:outputLink action=&quot;#{reports.listManagerReports}&quot; </li></ul><ul><li>rendered=&quot;#{s:hasRole('manager')}&quot;> </li></ul><ul><li>Manager Reports </li></ul><ul><li></h:outputLink> </li></ul><ul><li><s:fragment rendered=&quot;#{s:hasRole('admin')}&quot;> </li></ul><ul><li><div> </li></ul><ul><li>... </li></ul><ul><li></div> </li></ul><ul><li></s:fragment> </li></ul>
    79. 79. Seguridad <ul><li>Aplicando seguridad a los métodos con la anotación @Restrict </li></ul><ul><li>@Name(&quot;account&quot;) </li></ul><ul><li>public class AccountAction { </li></ul><ul><li>@Restrict(&quot;#{s:hasRole('admin')}&quot;) </li></ul><ul><li>public void delete() { </li></ul><ul><li>... </li></ul>
    80. 80. <ul><li>Introducción a Seam </li></ul><ul><li>Introducción a EJB3 </li></ul><ul><li>Introducción a JSF </li></ul><ul><li>Validaciones </li></ul><ul><li>Componentes </li></ul><ul><li>Contextos </li></ul><ul><li>Seguridad </li></ul><ul><li>Eventos e Interceptores </li></ul>
    81. 81. <ul><li>Modelo de eventos </li></ul><ul><li>Eventos definidos por Seam </li></ul><ul><li>Interceptores de Seam </li></ul>Eventos e Interceptores
    82. 82. Modelo de eventos <ul><li>Modelo de eventos JSF </li></ul><ul><ul><li>Los eventos son mapeados a 'observadores' de manera declarativa </li></ul></ul><ul><li>Configuración con anotaciones e implementación con interceptores </li></ul><ul><li>Eventos de Seam (patrón observer ) </li></ul><ul><ul><li>De una acción de página </li></ul></ul><ul><ul><li>Generado por un componente </li></ul></ul><ul><ul><li>Contextual </li></ul></ul>
    83. 83. <ul><li>Eventos e Interceptores </li></ul><ul><li>Modelo de eventos </li></ul><ul><li>Eventos definidos por Seam </li></ul><ul><li>Interceptores de Seam </li></ul>
    84. 84. Eventos definidos por Seam <ul><li>Tipos de eventos definidos por Seam </li></ul><ul><ul><li>Page action event: sucede justo antes de que una página sea renderizada </li></ul></ul><ul><ul><li>Puede ser definida para un view id de JSF </li></ul></ul><ul><li>File: WEB-INF/pages.xml </li></ul><ul><li><pages> </li></ul><ul><li><page view-id=&quot;/hello.jsp&quot; action=&quot;#{helloWorld.sayHello}&quot;/> </li></ul><ul><li></pages> </li></ul><ul><ul><li>Se puede usar con patrones para especificar una acción para múltiples vistas </li></ul></ul><ul><li>File: WEB-INF/pages.xml </li></ul><ul><li><pages> </li></ul><ul><li><page view-id=&quot;/hello/*&quot; action=&quot;#{helloWorld.sayHello}&quot;/> </li></ul><ul><li></pages> </li></ul>
    85. 85. Eventos definidos por Seam <ul><li>Tipos de eventos basados en componentes </li></ul><ul><ul><li>Mantienen bajo acoplamiento al interactuar indirectamente con otros componentes </li></ul></ul><ul><ul><li>Se utiliza un patrón Observador/Observable </li></ul></ul><ul><ul><li>Cuando un evento sucede, las acciones registradas son llamadas en el orden en que aparecen </li></ul></ul><ul><li>File: components.xml </li></ul><ul><li><components> </li></ul><ul><li><event type=&quot;hello&quot;> </li></ul><ul><li><action execute=&quot;#{helloListener.sayHelloBack}&quot;/> </li></ul><ul><li><action execute=&quot;#{logger.logHello}&quot;/> </li></ul><ul><li></event> </li></ul><ul><li></components> </li></ul>
    86. 86. Eventos definidos por Seam <ul><li>Tipos de eventos basados en componentes </li></ul><ul><ul><li>Seam provee un mecanismo propio para que los componentes generen eventos </li></ul></ul><ul><li>@Name(&quot;helloWorld&quot;) </li></ul><ul><li>public class HelloWorld { </li></ul><ul><li>public void sayHello() { </li></ul><ul><li>FacesMessages.instance().add(&quot;Hello World!&quot;); </li></ul><ul><li>Events.instance().raiseEvent(&quot;hello&quot;); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>O... </li></ul>
    87. 87. Eventos definidos por Seam <ul><li>Tipos de eventos basados en componentes </li></ul><ul><ul><li>.... con una anotación </li></ul></ul><ul><li>@Name(&quot;helloWorld&quot;) </li></ul><ul><li>public class HelloWorld { </li></ul><ul><li>@RaiseEvent(&quot;hello&quot;) </li></ul><ul><li>public void sayHello() { </li></ul><ul><li>FacesMessages.instance().add(&quot;Hello World!&quot;); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    88. 88. Eventos definidos por Seam <ul><li>Tipos de eventos basados en componentes </li></ul><ul><ul><li>Los observadores se pueden definir usando anotaciones </li></ul></ul><ul><li>@Name(&quot;helloListener&quot;) </li></ul><ul><li>public class HelloListener { </li></ul><ul><li>@Observer(&quot;hello&quot;) </li></ul><ul><li>public void sayHelloBack() { </li></ul><ul><li>FacesMessages.instance().add(&quot;Hello to you too!&quot;); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    89. 89. Eventos definidos por Seam <ul><li>Eventos contextuales en Seam </li></ul><ul><ul><li>Existen muchos provistos para ser usados por la aplicación en tareas que requieran una integración especial con el framework </li></ul></ul><ul><ul><li>Los componentes pueden observar estos eventos como lo harían con uno propio </li></ul></ul><ul><li>validationFailed — called when JSF validation fails </li></ul><ul><li>noConversation — called when there is no long running conversation and a long </li></ul><ul><li>running conversation is required </li></ul><ul><li>preSetVariable.<name> — called when the context variable <name> is set </li></ul><ul><li>postSetVariable.<name> — called when the context variable <name> is set </li></ul><ul><li>preRemoveVariable.<name> — called when the context variable <name> is unset </li></ul><ul><li>... </li></ul>
    90. 90. Eventos definidos por Seam <ul><li>Eventos contextuales en Seam </li></ul><ul><li>... </li></ul><ul><li>startTask.<name> — called when the task <name> is started </li></ul><ul><li>endTask.<name> — called when the task <name> is ended </li></ul><ul><li>postCreate.<name> — called when the component <name> is created </li></ul><ul><li>preDestroy.<name> — called when the component <name> is destroyed </li></ul><ul><li>beforePhase — called before the start of a JSF phase </li></ul><ul><li>afterPhase — called after the end of a JSF phase </li></ul><ul><li>postInitialization — called when Seam has initialized and started up all </li></ul><ul><li>components </li></ul><ul><li>postAuthenticate.<name> — called after a user is authenticated </li></ul><ul><li>preAuthenticate.<name> — called before attempting to authenticate a user </li></ul><ul><li>... </li></ul>
    91. 91. <ul><li>Eventos e Interceptores </li></ul><ul><li>Modelo de eventos </li></ul><ul><li>Eventos definidos por Seam </li></ul><ul><li>Interceptores de Seam </li></ul>
    92. 92. Interceptores de Seam <ul><li>EJB 3.0 define el modelo de interceptores estándar para los Session Beans </li></ul><ul><ul><li>@AroundInvoke </li></ul></ul><ul><ul><li>Anotación @Interceptor </li></ul></ul><ul><li>public class LoggedInInterceptor { </li></ul><ul><li>@AroundInvoke </li></ul><ul><li>public Object checkLoggedIn(InvocationContext invocation) throws Exception { </li></ul><ul><li>boolean isLoggedIn = Contexts.getSessionContext().get(&quot;loggedIn&quot;)!=null; </li></ul><ul><li>if (isLoggedIn) { </li></ul><ul><li>//the user is already logged in </li></ul><ul><li>return invocation.proceed(); </li></ul><ul><li>}else { //the user is not logged in, fwd to login page </li></ul><ul><li>return &quot;login&quot;; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    93. 93. Interceptores de Seam <ul><li>Mejoras de Seam </li></ul><ul><ul><li>@Interceptors es una anotación para definir interceptores </li></ul></ul><ul><ul><li>Puede ser utilizada con anotaciones propias </li></ul></ul><ul><li>@Target(TYPE) </li></ul><ul><li>@Retention(RUNTIME) </li></ul><ul><li>@Interceptors(LoggedInInterceptor.class) </li></ul><ul><li>public @interface LoggedIn {} </li></ul>
    94. 94. Interceptores de Seam <ul><li>Mejoras de Seam </li></ul><ul><ul><li>Ahora podemos proveer de una anotación a nuestro action listener, al que se le aplicará el interceptor </li></ul></ul><ul><li>@Stateless </li></ul><ul><li>@Name(&quot;changePasswordAction&quot;) </li></ul><ul><li>@LoggedIn </li></ul><ul><li>public class ChangePasswordAction implements ChangePassword { </li></ul><ul><li>... </li></ul><ul><li>public String changePassword() { ... } </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>
    95. 95. Interceptores de Seam <ul><li>Mejoras de Seam </li></ul><ul><ul><li>El orden relativo a otro interceptores es opcional </li></ul></ul><ul><ul><li>La implementación del interceptor usa la misma lógica que en EJB 3.0 </li></ul></ul><ul><li>@Interceptor(around={BijectionInterceptor.class, </li></ul><ul><li>ValidationInterceptor.class, </li></ul><ul><li>ConversationInterceptor.class}, </li></ul><ul><li>within=RemoveInterceptor.class) </li></ul><ul><li>public class LoggedInInterceptor { </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>
    96. 96. <ul><li>Introducción a Seam </li></ul><ul><li>Introducción a EJB3 </li></ul><ul><li>Introducción a JSF </li></ul><ul><li>Validaciones </li></ul><ul><li>Componentes </li></ul><ul><li>Contextos </li></ul><ul><li>Seguridad </li></ul><ul><li>Eventos e Interceptores </li></ul>Resumen
    97. 97. <ul><ul><li>¿Preguntas? </li></ul></ul><ul><ul><li>¿Consultas? </li></ul></ul><ul><ul><li>¿Sugerencias? </li></ul></ul><ul><li>¡Muchas Gracias! </li></ul><ul><li>Sebastian Javier Marchano </li></ul>

    ×