Guía No. 4 Programación IV
Guía No. 4 Programación IV
4 1
Introducción Teórica
▪ Como Bean CDI (Contexts and Dependency Injection), antes del nombre de la clase: @Named. Debe
agregar un archivo llamado “beans.xml” en la carpeta “web/WEB-INF” (en la versión JAVA EE 8 es
opcional).
▪ En el archivo faces-config.xml: <managed-bean>…</managed-bean>
2. Validación por campo interdependientes: se ejecuta dentro de los métodos de tipo “action”.
Para desplegar errores que no tienen que ver directamente con un componente sino con errores
generales de la página, podemos utilizar la etiqueta “h:messages”, la cual se utiliza para mostrar varios
errores de una sola vez.
Validador personalizado:
<h:inputText id=”ipId” required=”true” value=”#{ipBean.ipValor}”>
<f:validator validatorId=”validadorIp”/>
</h:inputText>
En este caso, el nombre del validador debe de estar definido en el archivo faces-config o debe de utilizar la
notación de “faces validator” e implementar el método “validate” dentro de este Bean.
Convertidores en JSF.
Los convertidores cubren la necesidad de asignar valores entre la vista y el modelo de manera automática
manejando tipos distintos al default, es decir, el manejo de cadenas.
Programación IV. Guía No. 4 3
Los convertidores cubren la necesidad de desplegar la información del modelo. Por ejemplo podemos convertir
una cadena que representa a su vez una fecha y esa fecha podemos convertirla a un tipo de asignarlas a nuestro
modelo. Con ello logramos la conversión del tipo de dato “String” y lo asignamos a un tipo “Date” en nuestro
modelo.
De igual manera los convertidores cubren la necesidad de desplegar la información del modelo con un formato
en específico por ejemplo un tipo entero o un tipo decimal podríamos desplegarlo con cierto formato a la vista
del usuario.
En JSF podemos manejar:
Conversiones implícitas: son los tipos de conversiones que JSF realiza de manera automática, por
ejemplo al utilizar tipos primitivos, BigInteger o String.
Ejemplo:
<h:inputText id=”edadId” value=”#{empleadoBean.edad}”>
En este caso, se está utilizando un atributo “edad” dentro del bean “empleadoBean” y este valor es de tipo
entero. Entonces el elemento que capturemos asociado a este campo de texto se va a convertir de un string
directamente a un tipo entero al asignarlo en nuestro Managed Bean.
En este caso, lo que hacemos es agregar un nuevo elemento anidado de tipo “converter” y definimos
el tipo de dato al cual queremos convertir el valor que estemos capturando en el “inputText”.
JSF también permite crear convertidores personalizados. Los pasos para crear y utilizar una clase personalizada
de tipo “Converter” son los siguientes:
❖ En la página JSF:
<h:inputText id=”fechaId” value=”#{empleadoBean.fechaNacimiento}”
convert=”util.ConvertidorFecha”/>
4 Programación IV. Guía No. 4
Para utilizar este tipo de convertidores basta con definir el atributo “convert” y especificar cuál es la
clase que va a ser la conversión respectiva.
Clase Java de tipo “Converter” contiene el código del convertidor. Esta clase debe de implementar la
interfaz “javax.faces.convert.Converter”.
Procedimiento
Crear una carpeta con el nombre Practica 4 para guardar los ejemplos y ejercicios, en el escritorio de su
computadora.
Luego indicamos el nombre del proyecto y la ruta donde lo deseamos guardar y damos clic en el botón Next:
Programación IV. Guía No. 4 5
Seleccionamos el Servidor Web y la versión que utilizaremos y damos clic en el botón Next:
De esta manera hemos creado nuestro primer proyecto Web JSF con Java.
Observemos que la estructura de este tipo de proyecto es distinta a la que hemos venido trabajando hasta el
momento. Nos muestra un archivo llamado “index.xhtml”, otro llamado “web.xml” y también se agrega la
librería “JSF 2.3 – javax.faces.jar”:
Debemos agregar también a nuestro proyecto la librería “Java EE Web 8 API Library” con los pasos que ya
conocen.
En el archivo “index.xhtml” podemos cambiar la etiqueta “h:head” y la etiqueta “h:body” con información
personalizada, así:
De esta forma hemos creado y ejecutado nuestro primer proyecto Web JSF con Java.
Programación IV. Guía No. 4 7
Guía 4 Ejemplo 2. Ejemplo de uso de Managed Bean.
En el proyecto creado en el ejemplo 1, agregamos una clase Java en el package “beans.modelo”, le colocamos
el nombre “Candidato” y agregamos el siguiente código:
Si recordamos de la teoría este concepto es más bien una clasificación de los Managed Beans que vamos a
tener en JSF. Así que vamos a crear a continuación otro Managed Bean, el cual va a hacer las veces del
controlador de nuestra aplicación.
Agregamos una clase Java en el package “backing”, le colocamos el nombre “VacanteForm” y agregamos el
siguiente código:
El siguiente paso es modificar el archivo index.xhtml, agregando un botón que llame al método “enviar”, de
la siguiente manera:
Para que funcione el injection realizado en el Backing Bean, debemos crear en la carpeta WEB-INF un archivo
de tipo “xml”, le colocaremos el nombre “beans” y agregamos el siguiente código (podemos copiar las
referencias “http” del archivo “web.xml” y cambiamos la parte final de la última url):
A continuación, modificaremos la página index.xhtml, para agregar los nuevos atributos de la clase Candidato,
y también para agregar las validaciones, así:
En este archivo hemos agregado cada uno de los mensajes que queremos modificar de nuestro formulario JSF,
así que vamos a representar cada uno de los campos de nuestro formulario.
Para ello podemos utilizar un identificador único para nuestro formulario para que no tengamos problemas, en
dado caso de que tengamos muchos formularios.
En ocasiones también es necesario cambiar los mensajes de error que nos manda JSF.
Así que para poder cambiarlos podemos realizar un proceso similar al anterior creando un archivo de
propiedades y posteriormente a través del archivo de faces-config especificar cuál es el archivo que vamos a
utilizar para modificar los mensajes que maneja JSF. Así que vamos a agregar otro archivo llamado
“jsf.properties” en la carpeta Other Sources:
14 Programación IV. Guía No. 4
El mensaje que vamos a modificar en este caso el mensaje de valor requerido, y para ello vamos a hacer
referencia al componente de tipo UIInput y en particular al mensaje que se maneja en los campos que se marcan
como requeridos:
Así que en este caso en lugar de mostrar el mensaje por default que se muestra en inglés ahora vamos a
especificar la cadena “Valor Requerido”.
Ahora como siguiente paso para que nos reconozca este cambio en el componente que marquemos como
requerido vamos a crear nuestro archivo “faces-config.xml” ya que aquí es donde vamos a realizar la
asociación de nuestros nuevos archivos de propiedades para que muestren las nuevas etiquetas.
Además también en este archivo podemos especificar cuál es el lenguaje que queremos mostrar por default
pudiendo ser por ejemplo inglés, español, etc.
Creamos nuestro archivo dentro de la carpeta WEB-INF, así:
Programación IV. Guía No. 4 15
En el archivo creado, agregamos el siguiente código:
Como siguiente paso vamos a modificar nuestro archivo index.xhtml para que podamos asociar ahora los
mensajes que estamos agregando en nuestro archivo mensajes.properties, ya que lo hemos agregado al archivo
faces-config. Hacemos los siguientes cambios:
Recordemos que estas son las etiquetas que se están mostrando en nuestro formulario así que todas estas
etiquetas son las que vamos a modificar.
Bien ya tenemos todos los cambios y ahora vamos a ejecutar nuestro proyecto.
Cualquier cambio que hagamos en nuestro archivo mensajes.properties, se aplicará en nuestro JSF.
Lo primero que vamos a hacer es agregar un nuevo archivo de propiedades en la carpeta Other Sources y le
colocamos el nombre “mensajes_en”. En este archivo, agregamos el siguiente código:
Vamos a agregar también en la carpeta Other Sources otro archivo de propiedades con el nombre “jsf_en” y
agregamos el siguiente código:
El siguiente paso es indicar qué idioma vamos a manejar en nuestra aplicación. Esto lo podemos hacer de dos
formas. Podemos hacerlo de manera programática o podemos hacerlo en el archivo faces-config, de esta
manera:
De esta manera podemos identificar y modificar el lenguaje de nuestra aplicación sin afectar la programación
y solamente agregando archivos de propiedades respetando el estándar de internacionalización de Java
conocido como “i18n” podemos agregar nuevos idiomas a nuestras aplicaciones JSF.
Vamos a hacer otros cambios, pero ahora a nuestra clase vacanteForm. Vamos a agregar un método de tipo
valueChangeListener para que cuando modifiquemos el valor en el campo codigoPostal, en automático se
llenen los campos colonia y ciudad. Para ello, agregamos el siguiente método:
Como siguiente paso, vamos a modificar nuestros archivos de Properties, vamos al archivo de mensajes tanto
en inglés como en español. Vamos a agregar los atributos que hemos definido anteriormente, así:
Programación IV. Guía No. 4 19
Con eso ya tenemos todos los cambios y vamos a ejecutar nuestra aplicación:
Lo siguiente que vamos a hacer es agregar un campo de comentario para que se muestre u oculte dependiendo
de la acción que seleccionemos. Para ello vamos a aplicar el concepto de “actionEvent” en nuestro proyecto
JSF. Lo primero que vamos a hacer es agregar el campo de comentario a nuestro Bean Candidato:
Como siguiente paso vamos a modificar nuestra página index.html para agregar este campo, así:
20 Programación IV. Guía No. 4
Ahora, vamos a modificar la clase vacanteForm creando el método “ActionEvent” de mostrar u ocultar el
campo de comentario:
El siguiente paso es agregar las etiquetas en los archivos de propiedades, así en el archivo mensajes_es
agregamos el siguiente código:
Con eso ya tenemos todos nuestros cambios, por lo que podemos probar nuestra aplicación:
Programación IV. Guía No. 4 21
Como siguiente paso vamos a modificar nuestros archivos de propiedades, los archivos que manejan las
etiquetas. Abrir nuestro archivo en español y hacemos estos cambios:
22 Programación IV. Guía No. 4
A continuación, vamos a modificar el archivo index.xhtml para manejar este cambio en el campo “colonia”,
de la siguiente manera:
El siguiente paso es modificar nuestro Managed Bean vacanteForm para que ahora pueda manejar el
componente “selectOneMenu” según la opción que hayamos seleccionado. Ahora debe de procesar ese valor:
Programación IV. Guía No. 4 23
Hemos finalizado los cambios. Podemos probar la funcionalidad del aplicativo:
Lo que vamos a hacer ahora es que vamos a separar el componente de “colonia”, ya no vamos a tener los
valores de la colonia directamente en el Managed Bean, sino que tendremos una clase de modelo para manejar
exclusivamente los valores de las colonias; así que vamos a crear una clase “Colonia” para simular una lista
obtenida de una base de datos, pero realmente con esto ya queda un diseño muy simple para poder obtener los
valores de manera dinámica, así que vamos a realizar los siguientes cambios en nuestro proyecto.
Lo primero que vamos a hacer es en el package beans.model crear nuestra clase “Colonia” de la siguiente
manera:
24 Programación IV. Guía No. 4
Ahora vamos a crear una clase llamada “ColoniaHelper” en el package “beans.helper”. Esta clase realmente
va a ser un intermediario para conectarse a una base de datos o alguna fuente donde venga la información de
cada una de las colonias y nuestro Managed Bean para poder separar la funcionalidad y no tener todo en una
misma clase:
Programación IV. Guía No. 4 25
Finalmente, debemos modificar la clase vacanteForm, vamos a inyectar nuestro componente “coloniaHelper”
para poder hacer las validaciones respectivas:
26 Programación IV. Guía No. 4
Con este ejemplo ya tenemos todo preparado para que se pueda obtener algún tipo de información de otra
fuente sin ningún problema, ya está todo perfectamente separado. De igual forma, en este ejemplo seguimos
utilizando el componente de tipo selectItem, pero ahora también utilizamos el componente selectItems y con
ayuda de las clases que hemos creado, hemos hecho las modificaciones a nuestra clase para manejar de manera
dinámica el código postal y que cargue la colonia respectiva. Ya no tenemos más esta información mezclada
en nuestro Managed Bean, sino que lo hemos pasado a otra clase que maneja el catálogo de colonias.
El siguiente paso es dentro de la carpeta WEB-INF crear una nueva carpeta llamada “plantillas”. Dentro de
esta carpeta vamos a crear un nuevo archivo de tipo xhtml que tendrá el nombre “plantilla”, y agregamos el
siguiente código:
Ahora vamos a aplicar esta plantilla a las páginas que ya tenemos creadas. Vamos a abrir la página index.xhtml
y vamos a aplicarle la plantilla, de esta manera:
28 Programación IV. Guía No. 4
Así ya tenemos todos los cambios en nuestra aplicación. Vamos a ejecutarla para ver como luce:
De esta manera, en esta práctica hemos revisado e implementado las funcionalidades de un proyecto de tipo
JSF.