Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Empresarial
PROYECTO EMPRESARIAL
CIBERTEC
PR OY EC T O E MP R ES A R I AL
ndice
Presentacin
Red de contenidos
5
7
Unidad de Aprendizaje 1
9
12
12
13
14
15
17
19
19
1.2 Tema 2
1.2.1
1.2.2
1.2.3
1.2.4
1.2.5
:
:
:
:
:
:
1.3 Tema 3
1.3.1
1.3.2
1.3.3
1.3.4
1.3.5
1.3.6
1.3.7
:
:
:
:
:
:
:
:
Conceptos bsicos
Relacin Many To One
Relacin One to One
Bidireccionalidad de la relacin One-To-One
Relacin One To Many
Relacin Many To Many
Opciones de Fetch
38
38
40
42
43
44
46
49
1.4 Tema 4
1.4.1
1.4.2
1.4.3
1.4.4
1.4.5
1.4.6
:
:
:
:
:
51
51
56
58
60
61
63
23
23
28
28
32
35
Anotaciones
Manejo de la Llave Primaria
Generacin de la Llave Primaria
Llave Primaria Compuesta
Objetos Embebidos
Unidad de Aprendizaje 2
JAVA SERVER
2.1 Tema 5 :
2.1.1 :
2.1.2 :
2.1.3 :
2.1.4 :
2.1.5 :
2.1.6 :
2.1.7 :
CIBERTEC
FACES 2
Fundamentos de JSF
Introduccin a JSF
Arquitectura de JSF
Ciclo de vida de un request
Facelets
Managed Bean
Lenguaje de Expresiones JSF
Backing Beans
69
72
72
73
77
81
89
92
95
PROYECTO EMPRESARIAL
97
97
98
102
108
117
117
119
119
119
122
123
131
2.4 Tema 8
2.4.1
2.4.2
2.4.3
2.4.4
2.4.5
127
127
136
137
141
148
:
:
:
:
:
:
Unidad de Aprendizaje 3
SPRING FRAMEWORK
3.1 Tema 9 : Spring Core
3.1.1 : Introduccin
3.1.2 : Arquitectura
155
157
157
161
164
164
164
174
174
CIBERTEC
PR OY EC T O E MP R ES A R I AL
Presentacin
CIBERTEC
PROYECTO EMPRESARIAL
CIBERTEC
PR OY EC T O E MP R ES A R I AL
Red de contenidos
Proyecto Empresarial
Java
Persistence
API
(JPA)
Spring
Spring Core
Java Server
Faces
(JSF)
Tpicos
avanzados de
JSF
Spring Web
Conversiones,
Validaciones
y Eventos
Spring Mdulos
Introduccin a
la API de
Persistencia
Componentes
de Interfaz de
usuario
OR-Mapping
con JPA
Arquitectura de
JSF, Configuracin
y estructura bsica
Relaciones
entre
entidades
Lenguaje de
Consultas
JPQL
CIBERTEC
PROYECTO EMPRESARIAL
CIBERTEC
PR OY EC T O E MP R ES A R I AL
UNIDAD
1
JAVA PERSISTENCE API
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, el alumno puede realizar transacciones y consultas
para reportes usando JPQL a nivel empresarial.
TEMARIO
1.1 Tema 1
1.1.1
1.1.2
1.1.3
1.1.4
1.1.5
1.1.6
1.1.7
:
:
:
:
:
:
:
:
1.2 Tema 2
1.2.1
1.2.2
1.2.3
1.2.4
1.2.5
:
:
:
:
:
:
1.3 Tema 3
1.3.1
1.3.2
1.3.3
1.3.4
1.3.5
1.3.6
1.3.7
:
:
:
:
:
:
:
:
CIBERTEC
PROYECTO EMPRESARIAL
1.4 Tema 4
1.4.1
1.4.2
1.4.3
1.4.4
1.4.5
1.4.6
:
:
:
:
:
10
ACTIVIDADES PROPUESTAS
CIBERTEC
PR OY EC T O E MP R ES A R I AL
CIBERTEC
11
PROYECTO EMPRESARIAL
12
http://www.hibernate.org/
TopLink
http://www.oracle.com/technetwork/middlew
are/toplink/overview/index.html
OpenJPA
http://openjpa.apache.org/
EclipseLink
http://www.eclipse.org/eclipselink/
1.1.1. Entidad
El concepto de Entidad fue introducido por Peter Chen en un documento llamado
The Entity-relationship model Howard a unified view of data publicado en ACM
Transactions on Database Systems en el ao de 19761.
En dicho documento, se describa a las entidades como cosas que tenan atributos y
relaciones con la expectativa de que dichos atributos y relaciones pudieran ser
almacenados en la base de datos.
En la actualidad, dicha definicin es vigente dado que cualquier objeto dentro de una
aplicacin JPA puede ser una entidad, hay que definir las caractersticas que debe
poseer una Entidad:
CIBERTEC
PR OY EC T O E MP R ES A R I AL
13
1.1.2. Metadata
Cada entidad tiene asociado una metadata que la describe. Dicha informacin puede
estar almacenada dentro de la entidad Java o puede existir en un archivo externo: en
ambos casos, esa informacin no se almacena en la base de datos.
Existen dos maneras de especificar la metadata:
Usando Anotaciones
Usando XML
CIBERTEC
PROYECTO EMPRESARIAL
14
No se debe olvidar que al ser un JavaBean, sigue las reglas de este (con los
getter/setter).
1.1.3. EntityManager
La mayora de llamadas a las APIs de JPA se encapsulan dentro de lo que se conoce
como Entity Manager y mediante el cual se puede alcanzar a la base de datos.
Esta encapsulacin es implementada dentro de una interface conocida como
EntityManager que es la que ejecuta todo el trabajo de persistencia. Por tanto, una
entidad mientras que no se trabaje con el Entity Manager es un objeto Java simple
como cualquier otro.
Cuando el Entity manager obtiene una referencia a una Entidad, se dice que dicha
entidad est en estado managed
El conjunto de entidades en estado managed dentro de un Entity Manager se conoce
como persistence context.
Los Entity Managers son configurados para trabajar con determinados tipos de
objetos, bases de datos y son implementados por un proveedor (provider) conocido
como persistence provider. En trminos prcticos este provider es la
implementacin de la especificacin JPA.
Los Entity Managers se generan a partir de una factora de tipo
EntityManagerFactory, que genera una especie de plantilla para la persistencia, pero
toma la configuracin particular desde una unidad de persistencia conocida como
persistence unit, la cual contiene la configuracin implcita o explcita (con un
nombre asociado ) para las entidades y para el Entity Manager.
El grfico2 resume las relaciones entre los conceptos mencionados:
CIBERTEC
PR OY EC T O E MP R ES A R I AL
15
Clase esttica
CIBERTEC
PROYECTO EMPRESARIAL
16
CIBERTEC
PR OY EC T O E MP R ES A R I AL
17
Se instancia el objeto
Java
Se cargan los valores
de los atributos
CIBERTEC
PROYECTO EMPRESARIAL
18
Para ubicar a una Entidad empleando el mtodo find, generalmente se requiere solo
una lnea de cdigo:
Clase de la Entidad a ser ubicada
Evita hacer un cast
Llave primaria de la Entidad
lanzar
la
excepcin
CIBERTEC
PR OY EC T O E MP R ES A R I AL
19
1.1.6. Transacciones
El nico mtodo que puede estar fuera de una transaccin es el find dado que no
cambia atributos de las entidades.
En una aplicacin Java StandAlone (Java SE), se debe invocar el contexto
transaccional de forma explcita, mientras que en una aplicacin Java EE, se asume
que el container proporciona dicho contexto transaccional.
Se inicia finaliza la
transaccin
CIBERTEC
PROYECTO EMPRESARIAL
20
Las anotaciones que proporciona JPA para manejar los Callbacks son:
CIBERTEC
PR OY EC T O E MP R ES A R I AL
21
CIBERTEC
PROYECTO EMPRESARIAL
22
Resumen
1.
2.
3.
Recordar la ubicacin del archivo persistence.xml que debe ir siempre dentro del
folder META-INF.
4.
5.
Las operaciones bsicas sobre una Entidad: find, persist, merge, remove
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
o
o
EclipseLink: http://www.eclipse.org/eclipselink/jpa.php
Entidades JPA: http://www.agiledata.org/essays/mappingObjects.html
CIBERTEC
PR OY EC T O E MP R ES A R I AL
23
Las anotaciones dentro de una clase Java se pueden colocar a nivel de atributos o a
nivel de mtodos. Si se colocan a nivel de atributos se denomina Field Access
mientras que si se coloca a nivel de mtodos se denomina Property Access.
Anotacin de tipo
Field Access
Atributos de la clase
Es equivalente a:
CIBERTEC
PROYECTO EMPRESARIAL
24
Anotacin @Table
Por defecto no es necesario incluir ninguna anotacin para referenciar a una tabla.
JPA asume que la tabla se llama igual que la clase Java en donde se define la entidad.
Sin embargo, si se desea especificar un nombre de tabla en particular para asociarlo
con la entidad, es preciso utilizar la anotacin @Table con el parmetro name
respectivo.
Se puede indicar adems el esquema de base de datos con el atributo schema (para
aquellos motores de base de datos que lo soporten):
Anotacin @Basic
Cuando se persiste una propiedad de una entidad, el persistente provider verifica
que el tipo de dato corresponda a un tipo soportado y trata de pasarlo hacia la base de
datos va el driver JDBC.
Los tipos de datos soportados son:
Tipos primitivos
Clases que encapsulan a tipos
primitivos
Arreglos de bytes y caracteres
Nmeros
Cadenas de caracteres
Tipos de datos que manejan fechas
CIBERTEC
PR OY EC T O E MP R ES A R I AL
Java
Tipos de datos que manejan fecha
JDBC
Tipos enumerados
Objetos serializables
25
java.sql.Date, java.sql.Time,
java.sql.Timestamp
Cualquiera
Cualquiera
Se debe tener cuidado con el comportamiento del driver JDBC cuando los tipos de
datos no coinciden entre lo que se define en la entidad y lo que soporta la base de
datos, pues el driver intentar ejecutar la mejor conversin posible.
La anotacin @Basic (que es opcional) se utiliza para indicar de forma explcita que
dicho atributo debe ser almacenado en la base de datos.
Anotacin @Transient
Se emplea para marcar aquellos atributos de la entidad que NO deben ser guardados
en la base de datos.
Anotacin @Column
Es una anotacin de tipo fsico, pues indica las caractersticas fsicas de la columna
en la base de datos.
Si no se especifica para un atributo determinado marcado como persistente, JPA
asume que la columna se llama igual que dicho atributo. En cambio, si la columna
tiene un nombre diferente, se deber especificar con el uso de la anotacin @Column.
CIBERTEC
PROYECTO EMPRESARIAL
Elemento
26
Descripcin
String
(Opcional)
columnDefinition Es el fragmento de SQL utilizado para generar el DDL de la
columna (depende del manejador de base de datos)
boolean
(Opcional) Indica si la columna ser incluir dentro de una
insertable
sentencia SQL INSERT generada por el Persistence Provider.
int length
(Opcional) Indica la longitud de la columna en la tabla y
funciona nicamente cuando la columna es un String o cadena
de caracteres.
String name
(Opcional) Indica el nombre de la columna. POr defecto se
asume que la columna se llama igual que el atributo de la
entidad.
boolean nullable
(Opcional) Indica si la columna permite valores nulos.
int precision
(Opcional) Indica la precisin para una columna numrica
(vlido solo para columnas decimales).
int scale
(Opcional) Indica la escala para una columna numrica (vlido
solo para columnas decimales).
String table
(Opcional) Indica el nombre de la tabla en donde se asocial la
columna.
boolean unique
(Opcional) Se emplea cuando la clave nica corresponde a
una sola columna.
boolean
(Opcional) Indica si la columna ser incluir dentro de una
updatable
sentencia SQL UPDATE generada por el Persistence
Provider.
Valor por
defecto
true
255
true
0
0
false
true
Ejemplo 1:
Ejemplo 2:
Anotacin @Lob
Para el manejo de objetos binarios (imgenes o archivos generalmente) se requieren
accesos especiales en el driver JDBC para efectuar conversiones entre el objeto Java
y la columna en la tabla de la base de datos.
La anotacin @Lob sirve para indicar que el atributo de dicha entidad requiere efectuar
las conversiones va JDBC.
Ahora bien, los campos LOB (acrnimo de Large Object) se pueden clasificar de dos
maneras, siendo el manejo de cada manera un tanto diferente:
CIBERTEC
PR OY EC T O E MP R ES A R I AL
Si el objeto es
Character Large Objets ( CLOB )
27
Character[]
String
byte[]
Byte[]
tipos serializables
Anotacin
Tipo de dato
Anotacin @Temporal
Sirve para especificar tipos de datos basados en el tiempo. Estos tipos de datos se
pueden clasificar en dos ramas: los que vienen del paquete java.sql y los que vienen
del paquete java.util.
En el paquete java.sql, los tipos se trabajan directamente:
java.sql.Date
java.sql.Time
java.sql.Timestamp
java.util.Calendar
CIBERTEC
PROYECTO EMPRESARIAL
28
Anotacin
Tipo de dato
java.util.Date
Equivalencia JDBC
CIBERTEC
PR OY EC T O E MP R ES A R I AL
29
TABLE
SEQUENCE
IDENTITY
ESTRATEGIA GenerationType.AUTO
Este tipo de estrategia delega en el Persistence Provider la seleccin de la mejor
forma de generacin de los ID. Cualquiera sea la forma elegida por el provider, se
confiar en los recursos de la base de datos para la obtencin de los IDs.
En el caso particular de EclipseLink con MySQL, la estrategia AUTO emplea una tabla
denominada sequence.
Ejemplo:
ESTRATEGIA GenerationType.TABLE
Esta estrategia es la ms flexible y portable, pues permite que la aplicacin genere
IDs diferentes de acuerdo a las necesidades.
La tabla requiere de dos columnas, una conteniendo el identificador para generar la
secuencia y la otra columna contiene el ltimo valor generado. Cada fila de la tabla es
un generador diferente para los IDs.
Un ejemplo sencillo es el siguiente:
CIBERTEC
PROYECTO EMPRESARIAL
30
CIBERTEC
PR OY EC T O E MP R ES A R I AL
31
ESTRATEGIA GenerationType.SEQUENCE
Esta estrategia depende de las capacidades de la base de datos para manejar objetos
de tipo secuencia (caso de Oracle).
Al igual que en la estrategia TABLE, basta con escribir la anotacin para que el
Persistence Provider seleccione la mejor secuencia dentro de la base de datos.
Ejemplo:
Estrategia
CIBERTEC
PROYECTO EMPRESARIAL
32
ESTRATEGIA GenerationType.IDENTITY
Esta estrategia aprovecha las facilidades de la bases de datos para utilizar columnas
de tipo autoincremento. Sin embargo, es menos eficiente porque el identificador
generado no est disponible hasta despus que ocurra el INSERT.
No requiere una anotacin para el generador dado que el campo autoincremental es
parte de la definicin de la tabla que corresponde a la entidad.
Ejemplo:
Estrategia
@IdClass
@EmbeddedId
CIBERTEC
PR OY EC T O E MP R ES A R I AL
33
La Entidad y la clase Java que maneja la llave primaria pueden representarse as (no
olvidar que se debe generar los mtodos getter/setter en ambas clases Java):
Observe que la anotacin @IdClass especifica el nombre de la clase Java que maneja
la llave primaria.
CIBERTEC
PROYECTO EMPRESARIAL
34
Observe, tambin, que la clase Java que maneja la llave primaria no posee
anotaciones. Sin embargo, debe implementar los mtodos nombrados lneas arriba:
El mtodo equals () lo que hace es comparar uno a uno los atributos de la llave
primaria contra los atributos de otra entidad para verificar que no se trate de la misma
entidad.
El mtodo hashCode () lo que hace es devolver un cdigo hash de los valores de la
llave primaria.
Para consultar una entidad con una llave primaria compuesta, solo se requiere generar
una instancia de la clase que maneja la llave primaria, cargarle los valores necesarios
y pasar dicha variable al EntityManager.
Ejemplo:
CIBERTEC
PR OY EC T O E MP R ES A R I AL
35
CIBERTEC
PROYECTO EMPRESARIAL
36
Anotacin
@Embeddable
Anotacin
@Embedded
CIBERTEC
PR OY EC T O E MP R ES A R I AL
37
Resumen
1. Una clase Java se convierte en Entidad al agregar la anotacin @Entity. Adems,
existen otras anotaciones que permiten el mapeo contra columnas de la tabla en
la base de datos.
2.
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
CIBERTEC
Anotaciones: http://www.objectdb.com/api/java/jpa/annotations/orm
PROYECTO EMPRESARIAL
38
Direccionalidad
Existen maneras de crear, remover y actualizar las relaciones para darles
mantenimiento. Si una entidad tiene relacin con otra, existir un atributo que sirve
para identificar la relacin y referirse a la entidad relacionada identificando as el rol
que juega en la relacin.
Cuando las entidades se referencian mutuamente se dice que la relacin es bidireccional. Ejemplo: El empleado sabe en qu Proyecto trabaja y el Proyecto conoce
quines son sus miembros (las flechas indican el sentido de la direccin).
Ahora bien, la relacin Bi-direccional puede ser descompuesta en dos relaciones unidireccionales. Cada relacin tendr un origen (source o rol de referencia) y un
destino (target o rol referido). Se debe tener en cuenta esto, pues el origen y destino
varan segn la perspectiva que estemos usando para analizar la relacin.
Cardinalidad
CIBERTEC
PR OY EC T O E MP R ES A R I AL
39
Ordinalidad
Un rol puede especificarse de forma ms detallada para indicar si puede o no estar
presente en una relacin. La ordinalidad sirve para indicar si la entidad target
necesita ser especificada cuando la entidad source es creada.
Debido a que la ordinalidad es un valor lgico (verdadero o falso) es ms prctico
referirse a ella como opcionalidad de la relacin.
Mapeo de Relaciones
Existen bsicamente dos formas de asociacin:
A nivel de Base de Datos, la relacin entre entidades significa que una tabla referencia
a otra tabla: aparece el concepto de Foreign Key para indicar aquellos campos de
una tabla que hacen referencia a la Primary Key de otra tabla.
A nivel de JPA las columnas que forman la Foreign Key se conocen como Join
Columns y emplean la anotacin @JoinColumn para indicar dicha funcionalidad.
CIBERTEC
PROYECTO EMPRESARIAL
40
CIBERTEC
PR OY EC T O E MP R ES A R I AL
41
CIBERTEC
PROYECTO EMPRESARIAL
42
A nivel de base de datos esta relacin implica un criterio de unicidad o llave nica en
la Foreign Key de la entidad source.
CIBERTEC
PR OY EC T O E MP R ES A R I AL
43
CIBERTEC
PROYECTO EMPRESARIAL
44
Cuando una entidad se asocia con una coleccin de otras entidades estamos ante
una relacin de uno a muchos.
En el ejemplo del Empleado vs. El Departamento, la relacin es bidireccional por
naturaleza. En una relacin bidireccional, siempre existen dos mapeos: uno por cada
relacin.
A nivel de base de datos, las tablas siguen siendo las mismas.
CIBERTEC
PR OY EC T O E MP R ES A R I AL
45
NOTA: En este caso se est usando una coleccin indicado el tipo de los elementos
que almacena dicha coleccin: Collection<Type>. Esto genera una dependencia al
compilar por lo que no es recomendable.
CIBERTEC
PROYECTO EMPRESARIAL
46
CIBERTEC
PR OY EC T O E MP R ES A R I AL
47
CIBERTEC
PROYECTO EMPRESARIAL
48
A nivel de base de datos, una Join Table consiste simplemente de dos Foreign Key
o columnas de join que referencian (cada una) a un lado de la relacin.
La anotacin @JoinTable se usa para configurar la tabla de join de la relacin:
a) Cada columna de Join se distingue dependiendo del papel dentro de la
relacin: lado owner o lado inverso.
b) La columna de Join que pertenece al lado owner se describe usando el
elemento joinColumns.
c) La columna de Join que pertenece al lado inverse se describe usando el
elemento inverseJoinColumns.
CIBERTEC
PR OY EC T O E MP R ES A R I AL
49
CIBERTEC
PROYECTO EMPRESARIAL
50
Resumen
1. Recordar que en JPA, existen cuatro tipos de relaciones entre entidades:
One To One
One To Many
Many To One
Many To Many
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
JPA: http://www.javaworld.com/javaworld/jw-01-2008/jw-01-jpa2.html
CIBERTEC
PR OY EC T O E MP R ES A R I AL
51
La API de criterios, que sirve para construir consultas basadas en objetos Java
en lugar de escribir los queries en strings.
b) AGGREGATE, los queries de este tipo son variaciones de los queries del tipo
SELECT, con la salvedad que agrupan resultados para producir informacin
sumarizada (de ah la necesidad de usar la clusula GROUP BY).
CIBERTEC
PROYECTO EMPRESARIAL
52
Al utilizar los queries se debe considerar que las entidades son referenciadas por su
nombre. Si una entidad no tiene asignado un nombre de forma explcita, JPA asume el
nombre de la clase como nombre por defecto: este nombre se conoce como abstract
schema name de la entidad dentro del contexto del query.
Tambin, es importante resaltar que para los queries es indiferente el uso de
maysculas y minsculas salvo en dos casos: nombre de entidades y nombres de
atributos de cada entidad.
Dada una entidad como la siguiente (entidad Employee):
Observe que la notacin es muy similar al SQL normal, pero con ligeras diferencias:
CIBERTEC
PR OY EC T O E MP R ES A R I AL
53
En este caso, como el campo nombre es un String, el resultado del query devolver
uno o ms Strings. De la misma forma puede trabajarse para cualquier otro atributo,
sea una lista, coleccin o campos simples.
El seleccionar algunos campos de la entidad (al igual que en SQL) recibe el nombre de
proyeccin. Se debe tener en cuenta su uso si es que se van a descartar (no usar)
varios atributos de la entidad al momento de generar reportes (dada la sobrecarga que
se genera en el framework JPA).
En el siguiente ejemplo, se puede seleccionar una entidad que no est en la clusula
FROM:
FILTROS
Al igual que en SQL, se puede filtrar los resultados a obtener utilizando la clusula
WHERE y la notacin dot.
JPQL incluye operadores como IN, LIKE y BETWEEN, funciones como SUBSTRING y
LENGTH adems de soportar subqueries.
Ejemplo:
CIBERTEC
PROYECTO EMPRESARIAL
54
INNER JOIN
Un inner join entre dos entidades se puede especificar de cualquiera de la maneras
indicadas anteriormente. Sin embargo, la forma preferida es mediante el uso del
operador JOIN en la clusula FROM.
La sintaxis bsica es:
[INNER] JOIN <path_expression> [AS] <identifier>
CIBERTEC
PR OY EC T O E MP R ES A R I AL
55
Ejemplo 1: se asume que phones contiene una relacin JPA entre Employee y
Phone
OUTER JOIN
Un outter join entre dos entidades produce un mbito en el cual solo un lado de la
relacin es requerido para completar el resultado. Por ejemplo, un outer join entre
Empleado y Departamento mostrar todos los empleados y los departamentos a los
que han sido asignados, pero con la salvedad que el Departamento ser retornado
nicamente si existe dentro de la relacin (a diferencia de un inner join).
Su sintaxis es la siguiente:
LEFT [OUTER] JOIN <path_expression> [AS] <identifier>
Ejemplo 1:
FETCH JOIN
Este tipo de Join sirve para ayudar a los programadores a optimizar los accesos a la
base de datos. Permite que los queries especifiquen una o ms relaciones que deben
ser navegadas y pre-cargadas por el mecanismo de recuperacin de datos de tal
forma que no se ejecuten lazy load en tiempo de ejecucin. En otras palabras,
reduce la cantidad de accesos a la base de datos.
Ejemplo:
CIBERTEC
PROYECTO EMPRESARIAL
56
QUERIES AGREGADOS
La sintaxis es muy similar a SQL: se requiere el uso del agrupamiento con GROUP BY
Es opcional el uso del filtro mediante la clusula HAVING.
JPA incluye cinco funciones agregadas:
Ejemplo:
QUERIES
Existen dos formas para definir queries en JP-QL:
CIBERTEC
PR OY EC T O E MP R ES A R I AL
57
Para aquellas aplicaciones que utilizan muchos queries, se debe considerar el costo
de compilar la sentencia JPQL:
1) Se ejecuta un parse de la cadena JPQL en un rbol de sintaxis para verificar
que est correctamente escrito.
2) Para cada entidad dentro de la expresin se obtiene la metadata.
3) Se genera la sentencia SQL equivalente.
Se debe tener en consideracin (al igual que en JDBC) las implicancias de concatenar
un query y luego pasarlo al EntityManager para evitar la inyeccin de cdigo SQL
malicioso. Por ello es preferible usar parmetros. Tambin, para aquellos queries
empleados con mayor frecuencia, es preferible usar los queries nombrados
(NamedQueries).
Un ejemplo con TypeQuery:
TypedQuery
La sentencia JP-QL
CIBERTEC
PROYECTO EMPRESARIAL
58
Query
Se invoca as:
Se especifica que es NamedQuery
CIBERTEC
PR OY EC T O E MP R ES A R I AL
59
Anotacin
Query JPQL #1
Query JPQL #2
CIBERTEC
PROYECTO EMPRESARIAL
60
PARMETROS NOMBRADOS
Se utilizan cuando dentro de la sentencia JPQL, los parmetros van precedidos por el
smbolo de : seguido del nombre del parmetro.
Al momento de ejecutar el query, el programador debe especificar el nombre del
parmetro (empleando el mtodo setParameter) y el valor a ser cargado para
reemplazarlo dentro de la sentencia JPQL.
Los parmetros nombrados proporcionan claridad al cdigo de la sentencia JPQL
(cuando se utilizan nombres adecuados), por lo que son preferidos respecto a los
parmetros ordinales.
Ejemplo usando parmetros nombrados:
La sentencia JP-QL
PARMETROS ORDINALES
Se utilizan cuando dentro de la sentencia JPQL, los parmetros van precedidos por el
smbolo de ? seguido del nmero del parmetro.
Al momento de ejecutar el query, el programador debe especificar el nmero del
parmetro y el valor a ser cargado para reemplazarlo dentro de la sentencia JPQL.
Ejemplo con parmetros ordinales:
CIBERTEC
PR OY EC T O E MP R ES A R I AL
61
La sentencia JP-QL
Observe el uso de
parmetros ordinales
Se cargan los valores
CIBERTEC
PROYECTO EMPRESARIAL
62
CIBERTEC
PR OY EC T O E MP R ES A R I AL
63
Trmino
Descripcin
entityName
variable
state_field_exp
single_rel_exp
multi_rel_exp
rel_field
constructor_method
Input_param
literal
pattern_value
escape_char
CIBERTEC
PROYECTO EMPRESARIAL
64
CIBERTEC
PR OY EC T O E MP R ES A R I AL
CIBERTEC
65
PROYECTO EMPRESARIAL
66
CIBERTEC
PR OY EC T O E MP R ES A R I AL
67
Resumen
1. Diferenciar las clases Query y TypedQuery.
2. Recordar que el mtodo createQuery del EntityManager sirve para la creacin de
consultas dinmicas.
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
CIBERTEC
JPQL: http://www.objectdb.com/java/jpa/query/parameter
PROYECTO EMPRESARIAL
68
CIBERTEC
PR OY EC T O E MP R ES A R I AL
69
UNIDAD
2
JAVA SERVER FACES 2
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, el alumno, construye una aplicacin Web utilizando el
modelo MVC y toda la funcionalidad provista por el framework JSF (Java
Server Faces) en Primefaces en la capa Vista y JPA en la capa controlador
TEMARIO
2.1 Tema 5
2.1.1
2.1.2
2.1.3
2.1.4
2.1.5
2.1.6
2.1.7
:
:
:
:
:
:
:
:
Fundamentos de JSF
Introduccin a JSF
Arquitectura de JSF
Ciclo de vida de un request
Facelets
Managed Bean
Lenguaje de Expresiones JSF
Backing Beans
CIBERTEC
PROYECTO EMPRESARIAL
2.4 Tema 8
2.4.1
2.4.2
2.4.3
2.4.4
2.4.5
:
:
:
:
:
:
70
ACTIVIDADES PROPUESTAS
CIBERTEC
PR OY EC T O E MP R ES A R I AL
CIBERTEC
71
PROYECTO EMPRESARIAL
72
En resumen, toma los mejores elementos de los frameworks que le precedieron (CGI,
Servlet, JSP, Struts, Spring MVC) y los combina en un conjunto de APIs estndares
para el desarrollo de interfaces de usuario.
La versin actual es JSF 2.0 y est soportada por las siguientes especificaciones:
JavaServer
Faces
Components
CIBERTEC
PR OY EC T O E MP R ES A R I AL
73
CIBERTEC
Forma de Implementacin
JSF proporciona una API basada en
componentes que se pueden usar para
ensamblar aplicaciones web.
Los componentes UI estndar proporcionados
por la especificacin, estn acompaados de
tag libraries de tipo core y html (con
funcionamiento muy similar a JSTL)
PROYECTO EMPRESARIAL
74
Objetivo #5:
Definir APIs para validacin de datos de
entrada.
Objetivo #6:
Especificar un modelo para el manejo de
i18N en los componentes UI.
Objetivo #7:
Proporcionar una generacin automtica
del formato apropiado de salida hacia un
cliente determinado.
Objetivo #8:
Soportar accesibilidad
JSF confa plenamente en las tecnologas existentes de Java EE. Eso significa que
una aplicacin JSF es bsicamente una aplicacin desarrollada bajo los estndares
Java EE con algunas configuraciones especficas:
Configuracin #1: Dentro del deployment descriptor (archivo web.xml) de la
aplicacin, se debe registrar el servlet controlador (llamado Faces Controller). Tener
en cuenta que en algunos contenedores web como GlassFish v3 no se requiere el
archivo web.xml.
CIBERTEC
PR OY EC T O E MP R ES A R I AL
75
/faces/*
*.jsf
*.faces
CIBERTEC
PROYECTO EMPRESARIAL
76
Estas reglas se
conocen como JSF
Navigation Model
La construccin de pginas se realiza con Facelets XHTML empleando para ello tag
libraries. Se puede declarar las libreras usando XML namespaces o usando la
forma tradicional:
CIBERTEC
PR OY EC T O E MP R ES A R I AL
77
En resumen, una aplicacin JSF es como cualquier aplicacin web que incluye los
siguientes elementos:
Las pginas web.
Las libreras de etiquetas (o tags) para insertar componentes UI a las pginas.
Un conjunto de backed beans, que son componentes que definen las
propiedades y funcionalidad de los componentes de UI.
Archivos de configuracin para el modelo navigacional (aunque es opcional).
El indispensable archivo descriptor web.xml
Archivos desarrollados por los programadores: convertidores, validadores,
listeners.
Opcionalmente algunas etiquetas personalizadas para objetos UI
personalizados.
CIBERTEC
PROYECTO EMPRESARIAL
78
A diferencia de una estructura de rbol DOM que se forma en el navegador, en el caso de la Faces
View, se genera en el lado del servidor.
4
Grfico tomado de Java Server Faces 2.0: The Complete Reference, pg 40.
Grfico tomado de Java Server Faces 2.0: The Complete Reference, pg 41.
CIBERTEC
PR OY EC T O E MP R ES A R I AL
79
Aquellos que pueden aceptar valores: campos de texto, cajas de chequeo, etc.
Es bueno saber que se puede alterar el curso normal de las fases para casos
especiales. Para ello se debe configurar el atributo immediate en un componente UI.
Tambin es bueno especificar que existen 3 tipos de interfaces usadas:
CIBERTEC
PROYECTO EMPRESARIAL
80
Grfico tomado de: Java Server Faces 2.0: The Complete Reference, pg 43.
CIBERTEC
PR OY EC T O E MP R ES A R I AL
81
Adicionalmente, se graba el estado actual de la Faces View para que est disponible
en los subsiguientes requests.
Java Server Faces permite adems que se pueda codificar phase listeners para
controlar la ejecucin de cdigo en algn punto exacto del ciclo de vida del request.
Para ello se debe:
2.1.4. Facelets
La tecnologa denominada Facelets View Declaration Language (VDL) fue
desarrollada como una extensin de JSF por Jacob Hookom e incorporada a la
especificacin JSF 2.0. El objetivo fue reemplazar el uso de JSP (aunque se mantiene
el reconocimiento de los JSP por motivos de compatibilidad).
Los Facelets permiten a los desarrolladores declarar componentes UI en diferentes
tecnologas de presentacin utilizando para ello plantillas (templates) HTML.
La meta de diseo principal fue permitir la composicin de una vista a partir de
diferentes pginas fsicas separadas7.
Algunos conceptos importantes en esta tecnologa:
a) Pgina (page): Se define as a la totalidad de la pgina web que es mostrada al
usuario. Se asocia con una viewId en el modelo de navegacin.
b) Fragmento de pgina (page fragment): se generan y utilizan como si fueran
pginas, siendo la principal diferencia que los fragmentos no son pginas web
completas sino que se emplean para armar pginas completas.
7
CIBERTEC
PROYECTO EMPRESARIAL
82
jsp:incluye
<%@include
%>
CIBERTEC
PR OY EC T O E MP R ES A R I AL
83
El primer parmetro define que la extensin .xhtml es el sufijo por defecto de todas
las pginas que manejan contenido JSF.
El segundo parmetro indica que la implementacin de JSF ignore los comentarios
XML en las pginas Facelets.
Una comparativa8 entre JSP y Facelets:
Una gran caracterstica de los Facelets (no disponible en JSP) es el poder generar
templates. Un template es una pgina XHTML que emplea algunos tags de
Facelets para definir varias divisiones lgicas de la vista como por ejemplo:
cabecera, pie de pgina y contenido. La idea es tener partes reusables de cdigo sin
tener que repetir el mismo cdigo en diferentes pginas.
Tomada del Libro: Java Server Faces 2.0: The Complete Reference , pg 58
CIBERTEC
PROYECTO EMPRESARIAL
84
Template Cliente file: es el archivo que corresponde con una viewId. Emplea
una o ms pginas para generar el contenido basado en el Template File. Este
archivo contiene:
a. La especificacin del template file mediante el tag <ui:composition>
b. La especificacin del contenido a reemplazar con el tag <ui: define>
(que se asocia al tag <ui: insert> del template file).
CIBERTEC
PR OY EC T O E MP R ES A R I AL
85
ui:decorate
ui:define
ui:insert
ui:include
ui:param
ui:component
ui:fragment
ui:remove
ui:debug
CIBERTEC
Descripcin
Se usa en archivos que funcionan como
Template Client.
Este tag le dice a JSF que los tags
internos deben incorporarse a la jerarqua
de UIComponent
Especifica el template a emplear.
El texto que se encuentre fuera de los tags
<ui: composition> no se toma en cuenta
para el render de la pgina.
Se diferencia del anterior en que el
contenido dentro del tag es incluido en la
pgina antes que recortado (como en el
caso del ui:composition)
Es muy til cuando se tiene una serie de
elementos de una pgina que requieren la
misma apariencia.
Se usa en archivos que funcionan como
Template Client.
Define una regin que ser insertada
dentro de la composicin (ui: composition).
PROYECTO EMPRESARIAL
86
Ejemplo de Template:
CIBERTEC
PR OY EC T O E MP R ES A R I AL
87
CIBERTEC
PROYECTO EMPRESARIAL
88
CIBERTEC
PR OY EC T O E MP R ES A R I AL
89
CIBERTEC
PROYECTO EMPRESARIAL
90
CIBERTEC
PR OY EC T O E MP R ES A R I AL
91
Y la pgina de respuesta:
mbito
none
@NoneScoped
(slo JSF 2.0)
Descripcin
Puede referenciar
a otros managed
Beans del mbito
Los Managed Beans con ste none
mbito no se generan ni
almacenan en ningn mbito.
Ellos son generados bajo
demanda por otros Managed
Beans.
request
@RequestScoped
CIBERTEC
PROYECTO EMPRESARIAL
view
@ViewScoped
(slo JSF 2.0)
session
@SessionScoped
application
@ApplicationScoped
Custom
@CustomScoped(value="#{so
meMap}")
92
otra pgina.
Permanecen
disponibles none,
view,
durante el tiempo que el usuario session,
permanezca en la misma vista.
application
Al salir de dicha vista, los
Managed
Beans
son
eliminados.
Se almacenan en la sesin
HTTP. Esto significa que los
valores de sus atributos son
almacenados a lo largo de
mltiples peticiones HTTP para
un usuario.
Retienen sus valores a lo largo
de la vida de una aplicacin, por
lo que estn disponibles para
TODOS los usuarios.
El bean se almacena en un
Mapa y el desarrollador tiene el
control del ciclo de vida del
mismo.
none, session,
application
none,
application
Por ejemplo:
CIBERTEC
PR OY EC T O E MP R ES A R I AL
93
NOTA: Para que E.L. sea lo ms simple posible, no est permitido el envo de
parmetros a los mtodos.
JSF busca los objetos en un orden jerrquico comenzando por los objetos implcitos
para luego buscar en los managed beans de la aplicacin. El siguiente cuadro resume
los objetos implcitos que pueden constituir la BASE:
CIBERTEC
PROYECTO EMPRESARIAL
94
NOTA:
1) Las propiedades de los objetos que son de tipo Map se acceden usando:
# {MapObject [key]}
2) El objetoFlash es un tipo de almacenamiento temporal que permite que los
datos estn presentes en el siguiente request.
OPERADORES E.L.
Adems de los corchetes (para Map) y del punto (.) existen otros operadores como se
muestra en la tabla siguiente:
CIBERTEC
PR OY EC T O E MP R ES A R I AL
95
CIBERTEC
PROYECTO EMPRESARIAL
96
Resumen
1. JSF es una especificacin, por tanto tiene varias implementaciones de diversos
fabricantes.
2. Bsicamente tiene 4 libreras: core, html, user interface y composite que pueden
ser complementadas con libreras de otros fabricantes.
3. El lenguaje de expresiones requiere la sintaxis: # {} y permite la referencia a
propiedades de managed beans como tambin a mtodos.
4. JSF tiene dos formas de navegacin: la implcita y la explcita ( que requiere el
uso del archivo faces-config.xml )
5. JSF permite el empleo de plantillas mediante el uso de los tags d ela librera ui.
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
o
o
Facelets:http://www.mkyong.com/jsf2/jsf-2-templating-with-facelets-example/
JSF: http://www.mkyong.com/jsf2/jsf-2-0-hello-world-example/
CIBERTEC
PR OY EC T O E MP R ES A R I AL
97
CIBERTEC
PROYECTO EMPRESARIAL
98
CIBERTEC
PR OY EC T O E MP R ES A R I AL
99
Interfaz
EditableValueHolder
ActionSource2
Ocasiona la ejecucin de un
ActionEvent cuando el usuario
presiona
click
sobre
el
componente.
Tiene un estado que necesita Cada
componente
mantenerse
entre
peticiones UIComponent
y
cada
HTTP.
componente de ayuda (Helper
class )
Tiene un valor que no puede ser
UIOutput
editado por el usuario.
Es diferente al componente cuya
capacidad de edicin puede ser
deshabilitada.
Proporciona
un
mbito
de
UIForm
nombres para sus componentes
UINamingContainer
hijos.
UIData
PartialStateHolder
ValueHolder
NamingContainer
10
Fuente: Libro Java Server Faces 2.0: The Complete Reference, pg 140.
CIBERTEC
PROYECTO EMPRESARIAL
100
CIBERTEC
PR OY EC T O E MP R ES A R I AL
101
CIBERTEC
PROYECTO EMPRESARIAL
102
CIBERTEC
PR OY EC T O E MP R ES A R I AL
103
Este tag maneja una serie de patrones para formateo de los valores.
Tag <f: converter>
Este tag crea una instancia de la clase Java registrada con el ID especificado, la cual
debe implementar a la interfaz javax.faces.convert.Converter. Luego, asocia esta
instancia con el componente UI ms cercano.
declarativa
un
CIBERTEC
PROYECTO EMPRESARIAL
104
Este tag permite manejar el modelo de i18N especificando un recurso (bundle) para el
locale de la vista actual. El contenido del bunle es cargado en un Map.
Tag <f:param>
Se utiliza para sustituir parmetros cuando se emplea dentro de un tag
<h:outputFormat> o para agregar valores query-string a un URL cuando se utiliza
dentro de <h:commandLink> o <h:outputLink>
Tag <f: phaseListener>
Sirve para registrar una instancia de PhaseListener sobre el UIViewRoot en donde se
encuentra anidado el tag.
Tag <f: selectItem>
Agrega un componente hijo de tipo UISelectItem al componente UIComponent ms
cercano.
Ejemplo:
CIBERTEC
PR OY EC T O E MP R ES A R I AL
105
CIBERTEC
PROYECTO EMPRESARIAL
106
CIBERTEC
PR OY EC T O E MP R ES A R I AL
107
CIBERTEC
PROYECTO EMPRESARIAL
108
CIBERTEC
PR OY EC T O E MP R ES A R I AL
109
Es el tag que muestra un formulario para captura de datos. Todos los tags que se
encuentren en el interior sern enviados con el formulario. Configura un atributo
action apuntando a un URL que define la accin a ejecutar y el atributo method
configurado en POST.
CIBERTEC
PROYECTO EMPRESARIAL
110
CIBERTEC
PR OY EC T O E MP R ES A R I AL
111
CIBERTEC
PROYECTO EMPRESARIAL
112
CIBERTEC
PR OY EC T O E MP R ES A R I AL
113
CIBERTEC
PROYECTO EMPRESARIAL
114
CIBERTEC
PR OY EC T O E MP R ES A R I AL
115
CIBERTEC
PROYECTO EMPRESARIAL
116
Este componente est diseado para situaciones en las que se necesita mostrar un
men de opciones al usuario para permitirle seleccionar mltiples opciones pero
utilizando un men que solo muestra una opcin a la vez.
La principal diferencia entre los select y los mens en JSF es el atributo size. Los
mens siempre tienen el size en 1 mientras que las listas pueden tener el tamao
variable.
NOTA: Este componente no se visualiza correctamente en todos los navegadores.
CIBERTEC
PR OY EC T O E MP R ES A R I AL
117
y se le
CIBERTEC
PROYECTO EMPRESARIAL
118
Resumen
1. La librera CORE: se asocia al namespace f: y proporciona utilidades para
validacin, conversin, internacionalizacin, etc.
2. La librera HTML: se asocia al namespace h: y est diseada especficamente
para clientes HTML.
3. La librera de tags para Plantillas FACELET: asociada al namespace ui: permite
agregar funcionalidades de plantillas y formatos. Fue introducida en JSF 2.0.
4. La librera de tags para Componentes Compuestos: introducida tambin con JSF
2.0, se registra bajo el namespace cc:.
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
JSF: http://javaserverfaces.java.net/users.html
CIBERTEC
PR OY EC T O E MP R ES A R I AL
119
Conversin: la realizan los Converters y garantiza que los datos sean del tipo
esperado.
Los
converters
implementan
la
interfaz
javax.faces.convert.Converter.
Validacin: la realizan los validators para garantizar que los datos sean
vlidos en funcin a las restricciones de la aplicacin. Los validators son
implementaciones de la interfaz javax.faces.validator.Validator.
Donde:
El parmetro context es la instancia FacesContext del request.
El parmetro component es el componente cuyo valor ser convertido.
El parmetro value es el valor a ser convertido.
El mtodo getAsObject es invocado durante el procesamiento de entrada, para
convertir los valores String que llegan en el request, al tipo de dato deseado.
CIBERTEC
PROYECTO EMPRESARIAL
120
El mtodo getAsString es invocado durante la fase de salida para mostrar los valores
en formato de String en cualquiera de las tecnologas de rendering que soporta el
cliente.
Si se lanza una excepcin de tipo ConverterException, el componente se marca
como invlido y se coloca un mensaje en el FacesContext.
Los convertidores estndares son:
Todos los converters se puede llamar usando el tag <f: converter> y especificando
el ID, a excepcin de DateTimeConverter y NumberConverter que tienen sus propios
tags: <f: convertDateTime> y <f: convertNumber>.
La forma implcita de conversin se realiza cuando JSF conoce el tipo de dato del
valor. Por ejemplo, asumiendo que age es un atributo de tipo Integer del managed
bean user, en el siguiente caso la conversin es implcita:
La forma explcita es cuando se usan los tres tags que proporciona la librera core de
JSF.
Tag #1: <f: convertDateTime>
CIBERTEC
PR OY EC T O E MP R ES A R I AL
121
Donde:
El dateStyle puede ser: short, medium, long, full o default.
El valor de type puede ser: date, time o both (default).
El valor de binding es una expresin que apunta a un mtodo de una clase
que implementa la interfaz javax.faces.convert.Converter.
Donde:
type puede ser number, currency o percentage.
currencyCode es el cdigo ISO 4217 de las monedas. Por ejemplo, USD es
para los dlares americanos y EUR para el euro. Para la moneda peruana se
tiene el cdigo PEN.
currencySymbol se puede especificar para indicar el smbolo de la moneda a
utilizar (pero se debe tener en cuenta que esto es vlido con JDK 1.4 o
superior). El atributo currencyCode toma preferencia sobre este.
groupingUsed es un flag boolean que sirve para indicar cuando se debe usar
un delimitador.
El valor de binding es una expresin que apunta a un mtodo de una clase
que implementa la interfaz javax.faces.convert.Converter.
Donde:
converter-id es el valor registrado en el archivo faces-config.xml de la
aplicacin.
El valor de binding es una expresin que apunta a un mtodo de una clase
que implementa la interfaz javax.faces.convert.Converter.
CIBERTEC
PROYECTO EMPRESARIAL
122
Tag Handler
f:validateDoubleRange
javax.faces.Length
f:validateLength
javax.faces.LongRange
f:validateLongRange
javax.faces.Bean
f:validateBean
Descripcin
Valida que el tipo de
dato sea
java.lang.Double y se
encuentre dentro del
rango especificado.
Valida que el tipo de
dato sea String y que
tenga la longitud mnima
especificada en el
parmetro.
Valida que el tipo de
dato sea java.lang.Long
y se encuentre dentro
del rango especificado.
Sirve para indicar que el
valor sea validado por el
framework de validacin
CIBERTEC
PR OY EC T O E MP R ES A R I AL
123
javax.faces.RegularExpression f:validateRegex
javax.faces.Required
f:validateRequired
EE.
Permite el uso de
expresiones regulares
Tiene la misma
funcionalidad que el
atributo required:
campo obligatorio.
Para que JSF no valide campos que estn vacos se debe agregar lo siguiente al
web.xml:
Usando el MethodBinding:
CIBERTEC
PROYECTO EMPRESARIAL
124
CIBERTEC
PR OY EC T O E MP R ES A R I AL
125
CIBERTEC
PROYECTO EMPRESARIAL
126
Tener en cuenta que este archivo requiere que los tags vayan en cierto orden
(debido al DTD). En este ejemplo se est indicando que el archivo de mensajes
se llama MyMessages.properties y que los idiomas soportados son espaol e
ingls.
Adems, se debe tener en cuenta que para sobre escribir los mensajes por
defecto, el archivo de mensajes debe tener como key los messagesID del
framework y como value, los textos que se desea para la aplicacin.
Algunos de los messageID estndares que pueden ser sobre escritos son:
javax.faces.component.UIInput.CONVERSION
javax.faces.component.UIInput.REQUIRED
javax.faces.component.UISelectOne.INVALID
javax.faces.component.UISelectMany.INVALID
javax.faces.converter.BigDecimalConverter.DECIMAL
javax.faces.converter.BigIntegerConverter.BIGINTEGER
javax.faces.converter.BooleanConverter.BOOLEAN
javax.faces.converter.ByteConverter.BYTE
javax.faces.converter.CharacterConverter.CHARACTER
javax.faces.converter.DateTimeConverter.DATE
javax.faces.converter.DateTimeConverter.TIME
javax.faces.converter.DateTimeConverter.DATETIME
javax.faces.converter.DateTimeConverter.PATTERN_TYPE
javax.faces.converter.DoubleConverter.DOUBLE
javax.faces.converter.FloatConverter.FLOAT
javax.faces.converter.IntegerConverter.INTEGER
javax.faces.converter.LongConverter.LONG
javax.faces.converter.NumberConverter.CURRENCY
javax.faces.converter.NumberConverter.PERCENT
javax.faces.converter.NumberConverter.NUMBER
javax.faces.converter.NumberConverter.PATTERN
javax.faces.converter.ShortConverter.SHORT
javax.faces.converter.STRING
javax.faces.validator.NOT_IN_RANGE
javax.faces.validator.DoubleRangeValidator.MAXIMUM
javax.faces.validator.DoubleRangeValidator.MINIMUM
javax.faces.validator.DoubleRangeValidator.NOT_IN_RANGE
javax.faces.validator.DoubleRangeValidator.TYPE
javax.faces.validator.LengthValidator.MAXIMUM
javax.faces.validator.LengthValidator.MINIMUM
javax.faces.validator.LongRangeValidator.MAXIMUM
javax.faces.validator.LongRangeValidator.MINIMUM
CIBERTEC
PR OY EC T O E MP R ES A R I AL
127
javax.faces.validator.LongRangeValidator.NOT_IN_RANGE
javax.faces.validator.LongRangeValidator.TYPE
Los eventos pueden ser publicados a lo largo del ciclo de vida de una aplicacin JSF.
Este ciclo de vida puede ser dividido en tres etapas:
inicio (start-up).
ejecucin de procesamiento del ciclo de vida del request. La mayor parte del
tiempo, la aplicacin se ejecuta en esta etapa.
finalizacin (shutdown).
CIBERTEC
PROYECTO EMPRESARIAL
128
Los eventos publicados durante la etapa de procesamiento del ciclo de vida de los
request se muestran en el siguiente grfico:
ValueChangeEvent
CIBERTEC
PR OY EC T O E MP R ES A R I AL
129
En general, para manejar eventos Faces se puede escribir una clase listener que
implemente la interfaz apropiada (javax.faces.event.ActionListener) y que se vincule al
componente (en este caso, al UIComponent).
Para Action Events sin embargo, se puede escribir: o un mtodo en una clase
Action o un mtodo en una clase Listener. La explicacin es la siguiente:
a) Un action method es un simple mtodo Java que tiene lugar en un managed
bean, no tiene argumentos y retorna un String. Estos action methods son
manejados por un ActionListener, que por defecto toma el valor del String y lo
enva al NavigationHandler con el fin de determinar el siguiente paso de
navegacin.
Un action method se asocia a un UIComponent con el atributo action.
Ejemplo:
Los Value Change Events son eventos que se emplean para indicar que el valor
de un componente UI ha cambiado. Generalmente, se emplea para componentes que
implementan las interfaces ValueHolder o EditableValueHolder.
CIBERTEC
PROYECTO EMPRESARIAL
130
Al igual que los action events, los value change events pueden manejarse de la
misma manera.
Sin embargo, debe tenerse presente que el evento ocurre cuando se hace el submit
del formulario. Es ms, el evento sucede en la fase de Process Validations. Un
siguiente envo del formulario sin alterar el valor, no genera que se dispare el evento
debido a que no ha cambiado el valor del campo.
Si se agrega el atributo immediate y se configura en true, se puede disparar el
evento de cambio en la fase deApply Request Values.
EVENTOS DE FASE
Los eventos de fase
(o Phase Events) se procesan entre cada fase del
procesamiento de ciclo de vida de un request.
Se puede crear un Listener simplemente implementando la interfaz PhaseListener.
Esta interfaz posee tres mtodos que deben ser implementados:
beforePhase()
afterPhase()
getPhaseId()
CIBERTEC
PR OY EC T O E MP R ES A R I AL
131
Los mtodos beforePhase () y afterPhase () se ejecutan para todas las fases del ciclo
de procesamiento de un request, por tanto, si se desea ejecutar alguna lgica especial
en determinada fase, se deber obtener el ID de la fase y en base a condiciones,
controlar el flujo del cdigo.
El mtodo getPhaseId () sirve para determinar a qu fase est asociado el listener.
Cuando se usa para cualquier fase retorna el valor ANY_PHASE:
EVENTOS DE SISTEMA
Este tipo de eventos fueron introducidos con la especificacin JSF 2.0 y proporcionan
mayores detalles que los ofrecidos por los eventos de fase.
CIBERTEC
PROYECTO EMPRESARIAL
132
Resumen
1. Dentro del procesamiento del ciclo de vida de un request, lo primero que se
ejecuta es la conversin de datos que llegan desde el request. SI todo funciona
bien, recien se ejecuta la validacin de los mismos.
2. Un conversor personalizado implementa la interfaz javax.faces.convert.Converter.
El mtodo getAsObject se aplica cuando se reciben los datos del request y el
mtodo getAsString se aplica para devolver la visualizacin al cliente.
3. Un validador personalizado implementa la interfaz javax.faces.validator.Validator.
Tiene un nico mtodo validate en donde se debe escribir la lgica de validacin
deseada.
4. Los mensajes de error se muestran con los tags <h: message> y <h: messages>.
Para personalizarlos, se requiere definir el archivo de recursos en el facesconfig.xml
5. Los eventos ms utilizados en JSF estn relacionados con la pulsacin de
botones o el cambio de valores en la pgina: ActionEvent y ValueChangeEvent.
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
o
JSF: https://javaserverfaces.java.net/
CIBERTEC
PR OY EC T O E MP R ES A R I AL
133
render
listener
immediate
disabled
CIBERTEC
PROYECTO EMPRESARIAL
134
soportados.
onevent
onerror
Ejemplo:
JAVASCRIPT ESTNDAR
Todas las implementaciones de JSF 2 deben contener una librera denominada
javax.faces la cual contiene un Script llamado jsf.js que expone una serie de
APIs estndares para ejecutar las invocaciones Ajax.
Existen dos objetos principales dentro del javaScript: ajax y til. El objeto ajax tiene
las funciones siguientes:
Funcin JavaScript
addOnError(callback)
addOnEvent(callback)
request(source, event, options)
response( request, context )
Significado
Proporciona la misma implementacin
que el atributo onerror del tag <f:ajax>
Proporciona la misma implementacin
que el atributo onevent del tag <f:ajax>
Proporciona la misma implementacin de
la parte del request del tag <f:ajax>
Proporciona la misma implementacin de
manejo del response que el tag <f:ajax>
CIBERTEC
PR OY EC T O E MP R ES A R I AL
135
Significado
Todos los componentes de la vista
@none
@this
@form
CIBERTEC
PROYECTO EMPRESARIAL
136
En este caso, se define el evento onkeypress: cada vez que se pulse una tecla, dicho
valor aparecer en el campo con id outNombre.
CIBERTEC
PR OY EC T O E MP R ES A R I AL
137
CIBERTEC
PROYECTO EMPRESARIAL
138
CIBERTEC
PR OY EC T O E MP R ES A R I AL
139
CIBERTEC
PROYECTO EMPRESARIAL
140
CIBERTEC
PR OY EC T O E MP R ES A R I AL
141
CIBERTEC
Tipo
Expresin que
retorna un valor
String
boolean
Descripcin
La referencia a una instancia de opcional
un componente UI.
Identificador del componente.
opcional
Indica si el componente se opcional
mostrar durante la fase Render
PROYECTO EMPRESARIAL
142
footerClass
String
headerClass
String
Tipo
String
border
int
cellpadding
int
cellspacing
int
first
int
frame
rendered
String
boolean
Descripcin
El color de fondo de la tabla
HTML generada
El tamao (en pixels) del borde
de la tabla HTML generada
El atributo cellpadding de la
tabla HTML generada
El atributo cellspacing de la
tabla HTML generada
Primera fila a ser mostrada (inicia
en cero )
Especifica en qu lado del frame
se mostrar la tabla:
none
above
below
hsides
vsides
lhs
rhs
box
border
Indica si el componente se
mostrar durante la fase Render
Opcional
Opcional
Opcional
Opcional
Opcional
Opcional
Opcional
CIBERTEC
PR OY EC T O E MP R ES A R I AL
rows
int
rules
String
summary
String
var
String
width
String
143
Opcional
Opcional
Opcional
Opcional
Opcional
Tipo
Expresin que
retorna un valor
String
String
String
Descripcin
La referencia a una instancia de
un componente UI
Identificador del componente
El ttulo del componente. Se pasa
a la tabla HTML generada
El valor del componente
opcional
opcional
opcional
opcional
Tipo
String
footerclass
String
headerclass
String
rowclasses
String
CIBERTEC
Descripcin
Lista (separada por comas) de
los estilos que se aplicarn a las
columnas.
Los estilos CSS se aplican
repetidamente a las columnas de
un componente panelGrid
El estilo aplicado a la ltima fila
de la tabla.
El estilo aplicado a la primera fila
de la tabla.
Lista (separada por comas) de
opcional
opcional
opcional
opcional
PROYECTO EMPRESARIAL
144
style
String
styleclass
String
Donde el tipo de dato de value puede ser: Array, List, ResultSet, Result (JSTL),
DataModel (JSF).
Ejemplo 1:
CIBERTEC
PR OY EC T O E MP R ES A R I AL
145
CIBERTEC
PROYECTO EMPRESARIAL
146
Tipo
String
border
int
cellpadding
int
Descripcin
El color de fondo de la tabla Opcional
HTML generada
El tamao (en pixels) del borde Opcional
de la tabla HTML generada
El atributo cellpadding de la Opcional
tabla HTML generada
CIBERTEC
PR OY EC T O E MP R ES A R I AL
cellspacing
int
columns
int
frame
rendered
String
boolean
rules
String
summary
String
width
String
147
El atributo cellspacing de la
tabla HTML generada
Nmero de columnas a ser
generadas en la tabla HTML
Especifica en qu lado del frame
se mostrar la tabla:
none
above
below
hsides
vsides
lhs
rhs
box
border
Indica si el componente se
mostrar durante la fase Render
Response. Por defecto es true.
Atributo rules pasado a la tabla
HTML generada. Indica si se
muestra la trama de celdas (como
en excel):
none
groups
rows
cols
all
Atributo summary que se enva
a la tabla HTML generada.
Genera una descripcin pero no
es visible en la mayora de
navegadores.
Es el atributo width pasado a la
table HTML generada (en pixels
es un nmero entero y en
porcentaje lleva el smbolo
respectivo).
Opcional
Opcional
Opcional
Opcional
Opcional
Opcional
Opcional
Tipo
Expresin que
retorna un valor
String
String
Descripcin
La referencia a una instancia de opcional
un componente UI.
Identificador del componente.
opcional
El ttulo del componente. Se pasa opcional
a la tabla HTML generada.
CIBERTEC
Tipo
Descripcin
PROYECTO EMPRESARIAL
148
columnclasses
String
footerclass
String
headerclass
String
rowclasses
String
style
String
styleclass
String
opcional
opcional
opcional
opcional
opcional
opcional
DATAMODEL
Un DataModel es una abstraccin arbitraria alrededor de alguna tecnologa que puede
ser usada para adaptar una variedad de fuentes de datos para ser empleados por
componentes JSF de tal forma que soporten el procesamiento fila por fila por parte de
los componentes hijos.
La coleccin de datos se modelo como una coleccin de filas de objetos, las cuales
pueden ser accedidas por un cursor (que inicia en cero) conocido como row index. La
API proporciona una serie de mecanismos para posicionar los cursos y recuperar los
objetos.
CIBERTEC
PR OY EC T O E MP R ES A R I AL
149
Crear una clase Bean.java (que es el managed bean de la aplicacin) que tenga la
siguiente estructura. Observe que se utiliza la clase DataModel:
CIBERTEC
PROYECTO EMPRESARIAL
150
CIBERTEC
PR OY EC T O E MP R ES A R I AL
151
Hasta aqu, se debe mostrar los datos y los botones de edicin y borrado.
Ahora, codificar la parte de edicin:
CIBERTEC
PROYECTO EMPRESARIAL
152
CIBERTEC
PR OY EC T O E MP R ES A R I AL
153
Resumen
1. JSF 2 soporta Ajax de dos formas: la primera es mediante el uso de la API de
JavaScript: jsf,ajax.request(); la segunda forma es mediante el tag <f:ajax>
2. La API de JavaScript proporciona un puente para el manejo de las peticiones
ajax y permite un cierto nivel de control.
3. El tag <f: ajax> permite que el programador se olvide del JavaScript.
4. Para integrar JSF con JPA, slo debe configurarse los archivos requeridos por
JPA. El resto de temas se manejan con la unidad de persistencia y el
EntityManager.
5. JSF proporciona una manera fcil de visualizar datos sin tener que realizar
iteraciones en la pgina, mediante el uso del tag <h:dataTable>
6. Las tablas se pueden refrescar con Ajax o se puede convertir en tablas editables.
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
CIBERTEC
AJAX: http://java.dzone.com/articles/ajax-jsf-joined
PROYECTO EMPRESARIAL
154
CIBERTEC
PR OY EC T O E MP R ES A R I AL
155
UNIDAD
3
SPRING FRAMEWORK
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad el alumno implementa una aplicacin web utilizando
Spring, donde podr integrar Spring, JSF y JPA en su aplicacin.
TEMARIO
3.1 Tema 9 : Spring Core
3.1.1 : Introduccin
3.1.2 : Arquitectura
3.2 Tema 10 : Spring Web
3.2.1 : Introduccin
3.2.2 : Configuracin
3.3 Tema 11 : Spring Mdulos
3.3.1 : Spring security
ACTIVIDADES PROPUESTAS
CIBERTEC
PROYECTO EMPRESARIAL
156
CIBERTEC
PR OY EC T O E MP R ES A R I AL
157
CIBERTEC
PROYECTO EMPRESARIAL
158
CIBERTEC
PR OY EC T O E MP R ES A R I AL
159
CIBERTEC
PROYECTO EMPRESARIAL
160
CIBERTEC
PR OY EC T O E MP R ES A R I AL
161
de un Bean que cumpliese esos requisitos, tendramos que decirle a Spring cul es el
Bean correcto.
3.1.2. Arquitectura
Spring podra potencialmente ser nica para todas sus aplicaciones empresariales, sin
embargo, Spring es modular, lo que le permite seleccionar y elegir los mdulos que se
aplican a usted, sin tener que poner el resto. Despus de la seccin da detalles acerca
de todos los mdulos disponibles en Spring Framework.
El Spring Framework proporciona cerca de 20 mdulos que se pueden utilizar en base
a los requisitos establecidos.
Contenedor Core:
El Core Container consiste en el Core, Beans, Contexto y mdulos de lenguaje de
expresin cuyo detalle es el siguiente:
El mdulo Core proporciona las partes fundamentales de la estructura, incluyendo las
caractersticas de inyeccin COI y de dependencia.
El mdulo bean proporciona BeanFactory que es una sofisticada implementacin del
patrn de fbrica.
El mdulo de contexto se basa en la slida base proporcionada por los mdulos del
ncleo y Frijoles y es un medio para acceder a los objetos definidos y configurados. La
interfaz ApplicationContext es el punto central del mdulo de contexto.
El mdulo de lenguaje de expresin proporciona un poderoso lenguaje de expresin
para consultar y manipular un grfico de objetos en tiempo de ejecucin.
CIBERTEC
PROYECTO EMPRESARIAL
162
CIBERTEC
PR OY EC T O E MP R ES A R I AL
163
Resumen
1. El mdulo ORM provee capas de integracin para APIs de mapeo objetorelacional populares, incluyendo JPA, JDO, Hibernate, y iBatis.
2. El mdulo de AOP ofrece implementacin de programacin orientada a aspectos
que le permite definir el mtodo-interceptores y puntos de corte para desvincular
limpiamente cdigo que implementa la funcionalidad que debe ser separada.
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
Spring-Arquitectura: http://www.tutorialspoint.com/spring/spring_architecture
CIBERTEC
PROYECTO EMPRESARIAL
164
3.2.2. Configuracin
Debido a la explosin de las aplicaciones mviles cada da nos encontramos con una
mayor necesidad de utilizar frameworks web que generen paginas HTML sencillas de tal
forma que luego puedan decorarse con otras tecnologas tipo Bootstrap ,JQuery mobile
o similares. A este tipo de categora pertenece el framework Spring MVC que cada da
es ms utilizado en las empresas. La siguiente comparativa es interesante para ver que
cuota de mercado tiene cada framework.
Como podemos ver, aunque JSF es el standard Spring MVC, hoy por hoy, es el
framework web ms utilizado. Recordemos que un modelo de FrontController funciona
de la siguiente manera:
CIBERTEC
PR OY EC T O E MP R ES A R I AL
165
pom.xml
</pre>
<dependencies>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-servlet_3.0_spec</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
</dependencies>
<pre>
CIBERTEC
PROYECTO EMPRESARIAL
166
En nuestro caso, vamos a optar por un primer ejemplo muy bsico que usa dos beans
que gestionan las distintas urls a las que accedemos utilizando el patrn MVC2.
Cdigo ListaController:
package com.arquitecturajava;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
CIBERTEC
PR OY EC T O E MP R ES A R I AL
167
Una vez que tenemos claro cmo funcionan los controladores que hemos definido es
momento de ver el contenido de los ficheros JSP a los que hacen referencia. Lista.jsp
</pre>
<html>
<head>
CIBERTEC
PROYECTO EMPRESARIAL
168
Formulario.jsp
</pre>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF8">
<title>Lista de Personas</title>
</head>
<body>
<form action="Lista">
Nombre<input type="text" name="nombre" /></br>
Apellidos<input type="text" name="apellidos" /></br>
<input type="submit" value="Aceptar"/>
</form>
</body>
</html>
<pre>
Si solicitamos la url /Lista Spring MVC, nos devolver el contenido el fichero Lista.jsp.
CIBERTEC
PR OY EC T O E MP R ES A R I AL
169
Se trata de un bean sencillo que parametriza la URL de las distintas vistas que
cargamos. A partir de este momento, nuestros controladores podrn devolver algo
como lo siguiente:
return new ModelAndView ("Lista");
package com.arquitecturajava;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class PersonaController {
@RequestMapping("/Lista")
public String Lista() {
return "Lista";
}
@RequestMapping("/Formulario")
public String Formulario() {
return "Formulario";
}
}
CIBERTEC
PROYECTO EMPRESARIAL
170
CIBERTEC
PR OY EC T O E MP R ES A R I AL
171
super();
this.nombre = nombre;
this.apellidos = apellidos;
}
//omitimos equals y hashcode eclipse
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApellidos() {
return apellidos;
}
public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}
}
Realizada esta operacin, el siguiente paso ser modificar el controlador para que
genere una lista de Personas.
package com.arquitecturajava;
import
import
import
import
import
java.util.ArrayList;
java.util.List;
org.springframework.stereotype.Controller;
org.springframework.ui.Model;
org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class PersonaController {
@RequestMapping("/Lista")
public String Lista(Model modelo) {
List<Persona> milista= new ArrayList<Persona>();
Persona persona1= new Persona ("pedro","perez");
Persona persona2=new Persona ("mara","gonzalez");
milista.add(persona1);
milista.add(persona2);
modelo.addAttribute("listaPersonas",milista);
return "Lista";
}
@RequestMapping("/Formulario")
public String Formulario() {
return "Formulario";
}
}
Como podemos observar, ahora, el mtodo lista soporta un objeto de tipo Model. Es
en este objeto en el cual nosotros aadimos la lista. Realizado este paso, nos quedar
modificar la pgina JSP para que nos muestre una lista utilizando JSTL. Para ello,
antes deberemos aadir la dependencia a Maven.
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
CIBERTEC
PROYECTO EMPRESARIAL
172
</dependency>
CIBERTEC
PR OY EC T O E MP R ES A R I AL
173
Resumen
1. @Controller: Anotacin que registra el controlador para Spring MVC
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
CIBERTEC
PROYECTO EMPRESARIAL
174
CIBERTEC
PR OY EC T O E MP R ES A R I AL
175
SpringSecurity.xml
CIBERTEC
PROYECTO EMPRESARIAL
176
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security3.2.xsd">
<http auto-config="true">
<intercept-url pattern="/**" access="ROLE_Usuario" />
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="manuel" password="1234" authorities="ROLE_Usuario" />
</user-service>
</authentication-provider>
</authentication-manager>
</bean:beans>
En este caso, est toda la aplicacin protegida /** y solo se permite el acceso al role
ROLE_Usuario.
AutenticationManager o gestor de autentificacin que decide cuando un usuario
es vlido. Este gestor est ntimamente relacionado con el concepto de
AutenticationProvider o proveedor de autentificacin.
<authentication-manager>
<authentication-provider>
<user-service>
<user name="manuel" password="1234" authorities="ROLE_Usuario" />
</user-service>
</authentication-provider>
CIBERTEC
PR OY EC T O E MP R ES A R I AL
177
CIBERTEC
PROYECTO EMPRESARIAL
178
CIBERTEC
PR OY EC T O E MP R ES A R I AL
179
Resumen
1. Puede agregar, en el web.xml, el parmetro del archivo de configuracin del
Security.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/springSecurity.xml
</param-value>
</context-param>
Pueden revisar los siguientes enlaces para ampliar los conceptos vistos en esta
unidad:
Adictos al trabajo:
http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=introSpring
Security
CIBERTEC