introduccion jee5

50
Slide 1 JEE5 www.heinsohn.com.co

Upload: jorgeslax14

Post on 12-Jun-2015

2.437 views

Category:

Technology


9 download

DESCRIPTION

En esta presentacion veran todo lo relacionado con el manejo de JEE5 en entorno java como framework para desarrollar paginas web Dimanicas.

TRANSCRIPT

Page 1: Introduccion JEE5

Slide 1

JEE5

www.heinsohn.com.co

Page 2: Introduccion JEE5

Meta-Framework Core511/24/09 Slide 2

• Justificación de la adopción del estándar JEE5

• Arquitectura simple de JEE5– JEE5– JBOSS SEAM

• Soporte del estándar JEE5• Caracteristicas del estándar JEE5

Agenda

Page 3: Introduccion JEE5

Justificación de la adopción del estándar Java EE 5

• Estandar publicado hace más de 4 años (Mayo 2006)– J2EE es obsoleto

• Simplifica el mantenimiento:– elimina patrones y clases intermediarias de J2EE => arquitectura más

simple y código reducido

• Código independiente de las bases de datos:– código conciso y robusto en términos de entidades y no tablas

• Modelo unificado de datos– simplifica el desarrollo

• Páginas web JSF con facilidades AJAX y de validación – se elimina el javascript y las clases intermediarias backing bean

Page 4: Introduccion JEE5

Arquitectura simple de Java EE 5

Page 5: Introduccion JEE5

JEE 5

Arquitectura

Page 6: Introduccion JEE5

Arquitectura

JBOSS SEAM

Page 7: Introduccion JEE5

JBOSS SEAM

Arquitectura

Page 8: Introduccion JEE5

Soporte del estándar Java EE 5 por los proveedores

Page 9: Introduccion JEE5

Empresas y proyectos que desarrollan en Java EE 5

• Empresas colombianas:– DAS - Departamento Administrativo de Seguridad– Banco de la República– Publicar S.A.– Insurance Information Technologies Inc (Guillermo Turk): aplicación de Seguros

para la China.

• Empresas a nivel mundial :– Infosys empresa muy grande de software de la India– New energy (subsidiaria de Siemens) desarrolla en Java EE– Teléfonica de España– Ministerio de Trabajo y Seguridad Social de Uruguay– FiSer (aplicación de manejo de tarjetas de crédito)

• +50 Proyectos a nivel mundial desarrollados con el framework Seam para Java EE 5– ver http://www.seamframework.org/Documentation/SeamInProduction

Page 10: Introduccion JEE5

• Servidores y bases de datos soportados– Servidores soportados por Seam: JBoss, Oracle OC4J, Oracle-BEA WebLogic,

IBM Websphere.

– Todas las bases de datos (es transparente para la aplicación con JPA)

Page 11: Introduccion JEE5

Pruebas de concepto

Item Medido J2EE 1.4 Platform Java EE 5 Platform Mejora (%)

Número de Clases 98 14 86% menos clasesLineas de código 25918 1610 94% menos lineas de codigoLineas de descriptores XML 5221 3493 33% menos lineas de descriptores XML Lineas de páginas xhtml 596 294 51% menos lineas de páginas xhtml

30,5 17,2 44% menos horas desarrolloPromedio horas desarrollo (implantación CRUDs)

(aprox. 2,25 veces más rápido)1,63 sg3,67 sg.consultar un siguiente lote de 500 registros

(aprox. 1,11 veces más rápido)3,55 sg3,95 sgconsultar un primer lote de 500 registros

(aprox. 33 veces más rápido)0,04 sg1,32 sginsertar 1 registro

(aprox. 27 veces más rápido)0,12 sg3,22 sgeliminar 1 registro

(aprox. 47 veces más rápido)0,03 sg1,4 sgmodificar 1 registro

Observacionesversión en Java

EE 5 (SEAM)versión en

J2EE (CORE)Operación CRUD

(aprox. 2,25 veces más rápido)1,63 sg3,67 sg.consultar un siguiente lote de 500 registros

(aprox. 1,11 veces más rápido)3,55 sg3,95 sgconsultar un primer lote de 500 registros

(aprox. 33 veces más rápido)0,04 sg1,32 sginsertar 1 registro

(aprox. 27 veces más rápido)0,12 sg3,22 sgeliminar 1 registro

(aprox. 47 veces más rápido)0,03 sg1,4 sgmodificar 1 registro

Observacionesversión en Java

EE 5 (SEAM)versión en

J2EE (CORE)Operación CRUD

Page 12: Introduccion JEE5

Pruebas de concepto

(aprox. 1,45 veces más rápido)

0,67 minutos0,46 minutosactualización voluminosa sobre 770.000 registros de una tabla

(aprox. 1,7 veces más rápido)

59 minutos100 minutosconsulta voluminosa que procesa 770.000 registros sobre una sola tabla

(aprox. 1,97 veces más rápido)

121 minutos239 minutosconsulta voluminosa que procesa 823.000 registros mediante join de 2 tablas

(aprox. 2,13 veces más rápido)

41 minutos88 minutosconsulta voluminosa que procesa 500.000 registros mediante join de 2 tablas

Observacionesversión en Java EE 5 (SEAM)

versión en J2EE

(CORE)Operación voluminosa

(aprox. 1,45 veces más rápido)

0,67 minutos0,46 minutosactualización voluminosa sobre 770.000 registros de una tabla

(aprox. 1,7 veces más rápido)

59 minutos100 minutosconsulta voluminosa que procesa 770.000 registros sobre una sola tabla

(aprox. 1,97 veces más rápido)

121 minutos239 minutosconsulta voluminosa que procesa 823.000 registros mediante join de 2 tablas

(aprox. 2,13 veces más rápido)

41 minutos88 minutosconsulta voluminosa que procesa 500.000 registros mediante join de 2 tablas

Observacionesversión en Java EE 5 (SEAM)

versión en J2EE

(CORE)Operación voluminosa

Page 13: Introduccion JEE5

Core511/27/09 Slide 13

EJB 3.0

Stateful

Stateless

Interceptores

Inyección de dependencias @EJB

Page 14: Introduccion JEE5

Core511/27/09 Slide 14

EJB 3.0 Stateful

Las instancias de beans de sesion contienen un estado conversacional que debe sobrevivir a traves de métodos y transacciones.

Stateful@Scope(ScopeType.SESSION)@Name("login")public class LoginAction implements Login {

@Remove public void destroy() { }

}

@Localpublic interface Login { //declaracion de metodos}

@Remotepublic interface Login { //declaracion de metodos}

@Stateful: Indica que el Bean de Sesión es con estado.

name - por defecto el nombre de la clase pero se puede especificar otra diferente.

mappedName - si se quiere que el contenedor maneje el objeto de manera específica. Si incluimos esta opción nuestra aplicación puede que no sea portable y no funcione en otro servidor de aplicaciones.

description - descripción de la anotación

@Remove: Indica que el contenedor debe llamar al método cuando quiera destruir la instancia

del Bean

@Local: Indica que la interfaz es local.

@Remote: Indica que la interfaz es remota

Métodos CallBack que interceptan el ciclo de vida del EJB: @PostConstruct, @PreDestroy,@ PrePassivate, and @PostActivate

Page 15: Introduccion JEE5

El ciclo de vida de un bean de sesion STATELESS no requiere que el usuario declare un metodo Remove , la eliminacion de un bean de sesion STATELESS es ejecutada por el contenedor y es transparente al cliente. Si se declaran metodos callback PrePassivate or PostActivate estos seran Ignorados.

@Stateless@Name("cache")public class CacheBean implements Cache {

...}

@Localpublic interface Cache { //declaracion de metodos}

@Remotepublic interface Cache { //declaracion de metodos}

@Remote: Indica que la interfaz es remota

@Local: Indica que la interfaz es local.

@Stateless: Indica que el Bean de Sesión es sin estado.

*mismos atributos que @Stateful

EJB 3.0 Stateless

15SlideCore5

11/27/09

Page 16: Introduccion JEE5

Core511/27/09 Slide 16

EJB 3.0 Interceptores

@Interceptors({ProcessTimeInterceptor.class, ExceptionInterceptor.class}) public boolean authenticate() throws CoreException, Exception {

.... }

import javax.interceptor.Interceptors;

public class ProcessTimeInterceptor {

public ProcessTimeInterceptor() {

} @AroundInvoke public Object registerProcessTime(InvocationContext invocation) throws Exception { long tiempoInicial = System.currentTimeMillis(); Object result = invocation.proceed(); long tiempoFinal = System.currentTimeMillis(); long tiempoTotal = tiempoFinal - tiempoInicial;

}

@AroundInvoke: Designado a un método de un Interceptor. Se llamará; a este método siempre que se llame a un método anotado con @Interceptors ({NombreInterceptor.class}) donde NombreInterceptor es la clase donde se declara el método anotado con @AroundInvoke

@Interceptors: Interceptores asociados con el Bean. Entre paréntesis y llaves se indican las clases donde se declaran.

Page 17: Introduccion JEE5

Core511/27/09 Slide 17

EJB 3.0 Inyeccion de dependencias @EJB

El concepto de inyección de dependencias se refiere a la separación entre la construcción de un objeto a la de su utilización. El contenedor es el encargado de la creación y destrucción del objeto que es devuelto a quien lo solicita.

@EJB private Login login;

@EJB: Mediante esta anotación el contenedor asignará; la referencia del EJB indicado.

* name – nombre del recurso. * BeanIntefface – tipo de la interfaz de referencia * BeanName - nombre del Bean especificado con el atributo name en caso de que varios Beans implementen la misma interfaz . * description - descripción de la anotación para la inyección de dependencia.

@Resource: Referencia de un recurso específico.

name – nombre del recurso. type - tipo del objeto (Object.class por defecto) authenticationType - especifica dónde se debe realizar el proceso de autenticación,

por defecto AuthSenticationType.CONTAINER shareable - indica si el objeto se comparte, por defecto true. mappedName - si se quiere que el contenedor maneje el objeto indicado de manera

específica. description - descripción de la anotación para la inyección de dependencia.

Donde Login hace referencia a la interfaz del EJB

Page 18: Introduccion JEE5

Core511/27/09 Slide 18

JPA (Java Persistence API)

Caracteristicas de las Entidades Java Persistence

Generación de llaves primarias

Relaciones de asociación, bidireccional y unidireccional. @OneToMany, -@ManyToMany - @OneToOne- @ManyToOne (Paralelo Entidad - Tabla)

Servicios de persistencia

Page 19: Introduccion JEE5

11/27/09 Colocar aqui la Línea de Negocio a la que pertenece esta presentación

Entidades

Este mapeo puede realizarse a través de un producto objeto relacional, llamado proveedor de persitencia, como hibernate, que automatiza el proceso de asignación de entidades a tablas.

Page 20: Introduccion JEE5

11/27/09 Colocar aqui la Línea de Negocio a la que pertenece esta presentación

Las anotaciones de JPA se clasifican en dos categorías:

Anotaciones de mapeo lógico que permiten describir modelo de objeto, asociaciones de clase, etc.

Anotaciones de mapeo físico que describen esquemas físicos de base de datos, tablas, columnas, índices, etc.

Anotaciones

Page 21: Introduccion JEE5

Core511/27/09 Slide 21

Caracteristicas de las Entidades Java Persistence

/* Indica que el Bean es de Entidad */@Entity/* Tabla a mapear el bean EmpleadoEB, en este caso se mapeará a la tabla 'empleado' */@Table(name = "empleado")/* Los Beans de Entidad deben implementar la interfaz Serializable */public class EmpleadoEB implements Serializable {

private static final long serialVersionUID = -4746762732969376696L;private int idEmpleado;private String nombre;private String apellidos;/* algunos de los tipos de arreglo permitidos */private Collection<Order> orders = new HashSet();private Set<PhoneNumber> phones = new HashSet();

/* Deben tener un constructor sin argumentos */public EmpleadoEB() { ….}

/* Clave primaria de la tabla 'empleado’ */@Id/* Indica que la generación de la clave será automática (la aporta la base de datos) */@GeneratedValue(strategy = GenerationType.AUTO)

public int getIdEmpleado() {return idEmpleado;

}

}

Page 22: Introduccion JEE5

Generación Automatica de

claves primarias

En EmpleadoEB se han usado anotaciones especiales en la propiedad de la clave primaria para que:

Los valores se generen mediante una secuencia (si la BD proporciona secuencias)

Se mapee a una columna contador (si la BD ofrece columnas contador)

@GeneratedValue

strategy

•Especifica la estrategia de generación de identificadores numéricos

•Es de tipo GenerationType(enumerado). Entre otros, es posible especificar los

siguientes valores

SEQUENCE: usar una secuencia

IDENTITY: mapear la clave a una columna contador

AUTO: Hibernate decide la estrategia en función de la BD usada

Generator

Especifica el nombre del generador que se usará en el caso de la estrategia

SEQUENCE

Page 23: Introduccion JEE5

Atributo correspondiente a una columna voluminosa (BLOB):

@Lob

private byte [ ] foto;

Atributo que toma valores de una enumeración:

puede guardar los valores como enteros o como cadenas:

public enum Status {PENDING,CANCELLED,ACTIVE}

private Status status = Status.PENDING;

@Enumerated (EnumType.STRING)

private Status status = Status.PENDING;

valor por omisión: @Enumerated (EnumType.ORDINAL)

Otros tipos de datos

Page 24: Introduccion JEE5

Core511/27/09 Slide 24

Relaciones de asociación

Generalidades: @OneToMany : atributo que es lista de detalles: indica que la entidad mantiene con

este atributo una relación maestro-detalles

@ManyToOne : en un atributo de una entidad detalle, indica que el atributorepresenta a la entidad maestra

@OneToOne: atributo que representa entidad con la cual se mantiene relación 1-1

@ManyToMany: atributo lista de entidades con las cuales se mantiene relación N-N

Opcionalmente

(mappedBy="atribMaestro",cascade=CascadeType.ALL) : indica atributo maestro en la entidad detalle y si hay efecto cascada

@OrderBy("description asc") : para un atributo lista de detalles indica el orden en que deben ser obtenidos sus miembros

Evaluación temprana (EAGER) o perezosa (LAZY) de entidades relacionadas

–@OneToOne y @ManyToOne implican por omisión evaluación temprana; se puedecambiar a perezosa,

–@OneToMany y @ManyToMany implican por omisión evaluación perezosa; se puede

cambiar a temprana.

Page 25: Introduccion JEE5

Core511/27/09 Slide 25

Relaciones bidireccionales

@Entitypublic class Employee {// La entidad Employee hace una referencia simple a la entidad Cubicleprivate Cubicle assignedCubicle;@OneToOnepublic Cubicle getAssignedCubicle() {return assignedCubicle;}public void setAssignedCubicle(Cubicle cubicle) {this.assignedCubicle = cubicle;} ...}

@Entitypublic class Cubicle {// La entidad Cubicle hace una referencia simple a la entidad employeeprivate Employee residentEmployee;// se hace el mapeo a la entidad Employee lo que indica que la entidad Employee es la entidad maestra ó dueña@OneToOne(mappedBy="assignedCubicle")public Employee getResidentEmployee() {return residentEmployee;}public void setResidentEmployee(Employee employee) {this.residentEmployee = employee;} ...}

OneToOne:

Page 26: Introduccion JEE5

Core511/27/09 Slide 26

Relaciones bidireccionales

ManyToOne / OneToMany@Entitypublic class Employee {//Entity Employee references a single instance of Entity Department.private Department department;@ManyToOnepublic Department getDepartment() {return department;}public void setDepartment(Department department) {this.department = department;}...}

@Entitypublic class Department {//Entity Department references a collection of Entity Employee.private Collection<Employee> employees = new HashSet();//Entity Employee is the owner of the relationship.@OneToMany(mappedBy="department")public Collection<Employee> getEmployees() {return employees;}public void setEmployees(Collection<Employee> employees) {this.employees = employees;}...}

Page 27: Introduccion JEE5

Core511/27/09 Slide 27

Relaciones bidireccionales

ManyToMany@Entitypublic class Project {//Entity Project references a collection of Entity Employee.private Collection<Employee> employees;@ManyToManypublic Collection<Employee> getEmployees() {return employees;}public void setEmployees(Collection<Employee> employees) {this.employees = employees;}...}

@Entitypublic class Employee {//Entity Employee references a collection of Entity Project.private Collection<Project> projects;//Entity Project is the owner of the relationship.@ManyToMany(mappedBy="employees")public Collection<Project> getProjects() {return projects;}public void setProjects(Collection<Project> projects) {this.projects = projects;}...}

Page 28: Introduccion JEE5

Core511/27/09 Slide 28

Archivos XML

Los datos de persistencia estan especificados con el uso de anotaciones, de archivos xml ó una mezcla de ambos, en el último caso las declaraciones que esten en el archivo xml tienen prioridad sobre las anotaciones en caso de conflictos. Si esta usando el archivo XML este debe estar disponible en tiempo de ejecucion, y se debe encontrar en alguno de estos lados:

1. En un recurso con el nombre orm.xml en el directorio META-INF.2. Declarado en el archivo de configuracion persistence.xml .

<entity-mappings><entity class="Subscription">

<attributes><id name="id"/><basic name="payment"/><basic name="startDate"/><version name="version"/>

...</attributes>

</entity><entity class="LifetimeSubscription"

name="Lifetime"><attributes>

<basic name="eliteClub" fetch="LAZY"/>...

</attributes></entity>

</entity-mappings></entity-mappings>

Page 29: Introduccion JEE5

Core511/27/09 Slide 29

Entity Manager

Es la interfaz que permite acceder a las entidades en el contexto de persistencia y realizar operaciones CRUD sobre ellas.

•Pueden definirse varias unidades de persistencia y hacer uso de cada uno de ellas en la aplicación

•En datasource (<proyecto>-ds.xml) se registra el nombre JNDI de la conexión

Page 30: Introduccion JEE5

02/06/2010 Core 5

EntityManager

Unidad de persistencia

En el persistence.xml se establece el nombre de la unidad de persistencia y se asocia a la conexión del datasource.

Page 31: Introduccion JEE5

02/06/2010 Fábrica de SW

EntityManager

Unidad de persistencia

En el components.xml se registra la fabrica como componente SEAM.

Page 32: Introduccion JEE5

02/06/2010 Fábrica de SW

EntityManager

Unidad de persistencia* En las clases en las que se vaya a utilizar se inyecta el contexto de persistencia (componente SEAM)

* Uso en clase plana

Page 33: Introduccion JEE5

Core511/27/09 Slide 33

Servicios de Persistencia

•persist (entity)

•find(entity.class, Id)

•merge(entity)

Servicios sobre una entidad manejada

•refresh(entity)

•remove(entity)

•flush()

Inserta en la BD el registro de la entidad

Select de una entidad existente, dada la PK

Update – la entidad se vuelve manejada – se refleja en la BD su versión en memoria.

Select BD de una entidad existente – cancelando posibles cambios en memoria

Delete BD

Aplicar cambios que se tienen acumulados en memoria a la BD.

Page 34: Introduccion JEE5

JPQL

Java Persistence Query Language•Consultas sobre entidades.•Sentencias de consultas en una forma portable (independiente del motor de Base de Datos).

@PersistenceContextEntityManager em;

Object obj = em.createQuery("SELECT c FROM Cliente c WHERE c.nombre = :param1").setParameter(“param1”,”Ana”).getSingleResult();

“SELECT f FROM File f WHERE f.line.name =:?”

NamedQuery@NamedQuery(name = "findCostumerByName", query = "SELECT c FROM Cliente c WHERE c.nombre =: param1")

List clientes <Cliente> = em.createNamedQuery("findCustomerByName") .setParameter("param1", "diana”).getResultList();();

em.createNativeQuery(queryString)

Page 35: Introduccion JEE5

Taylor

El framework Taylor permite modelar gráficamente entidades sencillas o complejas y sus relaciones incluyendo herencia. Igualmente Taylor permite generar las clases Java correspondientes al modelo de entidades.

http://taylor.sourceforge.net/index.php/Tutorial

Page 36: Introduccion JEE5

Colocar aqui la Línea de Negocio a la que pertenece esta presentación11/27/09 Slide 36

SEAM

Introducción

Contextos seam

Conversación

Sistema de bijeccion

Características de componentes seam

Seguridad

Page navigation (pages.xml)

Page 37: Introduccion JEE5

Seam es un framework que facilita el desarrollo de aplicaciones Java EE 5 a nivel empresarial, que se rige, entre otros, por los siguientes principios:

Se basa en un modelo de componentes uniforme para toda la lógica de aplicación.Unifica los modelos de componentes de JSF y EJB3, eliminando código intermedio y permitiendo al desarrollador concentrarse en la lógica de negocio.Permite el manejo declarativo de estado (conversation management).Facilita el control de valores de variables de contexto (bijection). Las anotaciones son preferibles a XML.Facilita la ejecución de pruebas: ya que los componentes Seam son clases simples de Java.

Introducción

Page 38: Introduccion JEE5

Core511/27/09 Slide 38

SEAM Contextos

Tipos de contextos en Seam•StatelessContext: variables sinestado (ej: ejbs sin estado); en realidad no es un contexto•EventContext: equivale al request context, asociado a un 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 servidorEl orden de búsqueda de una

variable en los contextos va desde event hasta application

@Scope(CONVERSATION)

Page 39: Introduccion JEE5

Core511/27/09 Slide 39

SEAM- Conversación

Una conversación es un una unidad de trabajo creada por Seam en el cual el usuario puede establecer su alcance. (donde inicia y donde termina) todas sus variables se encuentran en contexto de conversacion.

Una conversación se puede iniciar por medio de un control de navegación SEAM (s:button, s:link.. ) ó utilizando la anotación @Begin en un método.

Una conversación se puede finalizar por medio de un control de navegación SEAM (s:button, s:link.. ) ó utilizando la anotación @End en un método.

<s:link view-id=”/main.xhtml” value=”Return to main”propagation=”begin” />

@Beginpublic void selectHotel(Hotel selectedHotel){hotel = em.merge(selectedHotel);}

@Endpublic void confirm(){em.persist(booking);...

Page 40: Introduccion JEE5

Core511/27/09 Slide 40

SEAM Componente

Los componentes Seam son en particular JavaBeans ó EJB 3.0 enterprise beans. Para que su componente pueda hacer uso de anotaciones Seam es necesario realizar el registro de dicho componente.

Todos los componentes Seam necesitan tener un nombre unico, esto se hace por medio de la anotacion @Name

@Name("loginAction")@Statelesspublic class LoginAction implements Login {

...

Es posible modificar el contexto por defecto de un componente usando la anotacion @Scope la cual nos permite definir el contexto en el cual se ubicara el componente cuando sea instaciado. Sea

@Name("user")@Entity@Scope(SESSION)public class User {...}

Page 41: Introduccion JEE5

Core511/27/09 Slide 41

SEAM Sistema de bijección

Bijección es una caracteristica que nos permite adicionar y tomar variables de un contexto por medio de anotaciones.

@In anotacion a nivel de campo. Toma campo con su valor del contexto.

@Out anotacion a nivel de campo ó metodo. Pone el campo con su valor en el contexto.

contexto.

@In(required = false)@Out(required = false, scope = ScopeType.SESSION) private User user;

Page 42: Introduccion JEE5

Core511/27/09 Slide 42

SEAM Seguridad

Seguridad por Roles.

por anotaciones se puede proteger todo un EJB o un servicio particular de un EJB 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

@In private Identity identity;identity.addRole(role);

@Restrict ("#{s:hasRole('bookingList')}") a nivel de clase ó de metodo

•habilitando / deshabilitando el elemento según el rol del usuario, ej:<h:inputText id="searchString" value="#{hotelSearching.searchString}"disabled="#{!s:hasRole('hotelSearching')}">

•mostrando / ocultando el elemento según el rol del usuario, por ej:<s:button id="viewHotel" value="Ver hotel" action="#{hotelBooking.selectHotel(hot)}"styleClass="buttonSmall" rendered="#{s:hasRole('hotelBooking_selectHotel')}"/>

Page 43: Introduccion JEE5

Core511/27/09 Slide 43

SEAM pages.xml

Seam provee un lenguaje de navegacion que incorpora manejo de conversación, seguridad, manejo de excepciones, entre otros.

Page 44: Introduccion JEE5

Core511/27/09 Slide 44

Capa de presentación

Controles JSF de SEAM

Anotaciones SEAM para usar con JSF

Validaciones Hibernate

JBOSS EL Functions.

RichFaces (algunos componentes)

Page 45: Introduccion JEE5

Core511/27/09 Slide 45

Controles JSF de SEAM I

• Controles de navegación

• Convertidores y Validadores

<s:button> permite controlar lapropagación de una conversación

<s:link> permite controlar la propagación de una conversación

<s:conversationPropagation>

permite controlar la propagación de una conversación en botones y links jsf

<s:defaultAction> Permite que un botón sea la acción por defecto al presionar la tecla enter

<s:convertEntity> Convierte a entidad manejada un item seleccionado.

<<s:convertEnum> Convierte a enum un item seleccionado.

<s:validateEquality> Valida la equivalencia de 2 valores. Se pueden usar operadores (<,>.=<)

<s:validate> <s:validateAll>

Se valida el valor contra las anotaciones Hibernate en la entidad.

<s:selectItems> Crea una lista de tipo SelectItem.

<h:inputText id="nameVerification" > <s:validateEquality for="name" /></h:inputText>

Page 46: Introduccion JEE5

Controles JSF de SEAM II

– Formatos

– Otros

Slide 46Core5

11/27/09

<s:decorate> Permite ‘decorar’ un elemento input JSF, para adicionar el campo de error, s:validate ó required = true.

<s:fragment> permite renderizar un area con componentes que no lo permitirian

<s:label> Se ubica el Label al componente inputText jsf mas cercano.

<s:enumItem>

Crea un selectItem de un enum

<s:fileUpload> Control para cargar un archivo

<s:graphicImage>

permite crear la imagen en un componente seam para futuras modificaciones

<s:enumItem enumValue="ONCE" label="Only Once" />

<s:fileUpload id="picture" data="#{register.picture}"accept="image/png"contentType="#{register.pictureContentType}" />

Page 47: Introduccion JEE5

Validadores Hibernate

Slide 47Core

511/27/09

Page 48: Introduccion JEE5

Slide 48Core5

11/27/09

JBoss EL

Seam hace uso de JBoss EL el cual provee unas mejoras al estandar Unified Expression Language (EL). Algunas de estas mejoras son:

El estandar EL no permite el uso de métodos con parametros definidos por el usuario. JBoss EL si lo permite.

<h:commandButton action="#{hotelBooking.bookHotel(hotel)}" value="Book Hotel"/>

@Name("hotelBooking")public class HotelBooking {public String bookHotel(Hotel hotel) {// Book the hotel}}

•Si se usa más de un parametro , estos deben ir separados por comas:

action="#{hotelBooking.bookHotel(hotel, user)}"

•Los valores deben ser expresados en parametros:

action="#{hotelBooking.bookHotel(hotel.id, user.username)}"

•Si desea expresar un String literalmente solo se debe usar '':

action="#{printer.println('Hello world!')}"

JBoss EL permite acceder a propiedades/métodos sin que tengan la convecion set ó get.

• <h:outputText value="#{person.name}" rendered="#{person.name.length() > 5}" />

• Collection

#{searchResults.size()}

• Una expresión como #{obj.property} es quivalente a {obj.getProperty()}.

Page 49: Introduccion JEE5

Slide 49Core5

11/27/09

RichFaces II

rich:extendedDataTable adiciona las siguientes funcionalidades al componente rich:dataTable:

* Scroll * Seleccion de filas. * Administracion de modos de seleccion (sin seleccion, 1 linea ó multiples lineas) * Reordenar columnas haciendo drag and drop de los headers. * Mostrar/Esconder columnas * Agrupar filas por Columnas

Page 50: Introduccion JEE5

Core511/27/09 Slide 50

Referecias

http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=AnotacionesEJB3

http://java.sun.com/javaee/5/docs/tutorial/doc/bnbrm.html

http://www.seamframework.org/