Este es el comienzo para mi blog

Mi día a día en el desarrolo de Software (JEE, Glassfish, JBoss EAP, Primefaces, Ajax, Android)

jueves, 14 de mayo de 2015

Ocultar/mostrar un componente JSF 2.0 en Primefaces 5.0 usando Ajax

Problema

Muchos de nosotros alguna vez nos hemos encontrado con el problema de mostrar u ocultar un componente JSF (con la librería Primefaces) dependiendo de una condición (eje: si edad es >= 18); y que para obtener dicha condición sea necesario la acción de otro componente JSF (eje: la selección de una fecha en un calendario para el cálculo de la edad); lo que en principio parece ser una tarea fácil, termina convirtiéndose en un trabajo verdaderamente difícil de realizar, y lo que se pensaba implementar en "pocos minutos" termina implementandose en horas, incluso días (para desarrolladores que están empezando).

Solución

Para mostrar u ocultar un componente JSF lo primero que hay que entender y tener en cuenta es el ciclo de vida de una página JSF, ya que es éste el que gestiona de manera absoluta la forma en que se mostrará la página luego de que el usuario haga una petición (Request) al servidor de aplicaciones. Aquí pueden encontrar un enlace en donde se habla del tema.
Otra situación a tomar en cuenta y que por lo general se nos pasa por alto, es la construcción del árbol de componentes JSF (mostrados en elementos HTML) luego de que el usuario haga una petición,  un claro ejemplo de esto es si un componente JSF en primera instancia no se muestra (propiedad rendered = false) y al hacer una petición al servidor indicamos que el componente JSF se muestre, no podremos setear la propiedad rendered = true, puesto que en el árbol de componentes JSF este componente nunca estuvo presente.

Para solucionar el problema anteriormente planteado, lo que debemos hacer es lo siguiente:
  • Al componente JSF que deseamos que tenga el comportamiento de mostrarse u ocultarse según el valor que tome  alguna propiedad del backin bean lo debemos incluir en un contenedor (componente <h:panelGroup> ... </h:panelGroup>).
  • Al contenedor anteriormente mencionado debemos incluirle la propiedad "id", puesto que esta nos servirá para actualizarlo cuando se haga la petición.
  • Al hacer la petición al servidor, en la que se determinará si el componente JSF se muestra u oculta, se deberá solicitar que se actualice (propiedad update) el contenedor del componente JSF, mas no el propio componente, ya que si actualizamos el contenedor, por ende actualizamos todo lo que hay dentro de él.

Implementación

Luego de abordar el problema y ver su solución, a continuación dejo las líneas de código de la implementación de dicho problema.

Aquí está la implementación de la página JSF diseñada con la librería PrimeFaces V. 5.0, la misma que tiene cuatro componentes JSF, dos p:outputLabel (Fecha de nacimiento y Observación), un p:calendar y un p:inputTextarea, tanto el componente JSF de Observacion y la caja de texto no se muestran hasta cuando el usuario realiza una petición al servidor solicitando el cálculo de la edad,  y la esta es mayor o igual a 18.


Esta es la implementación del backing bean que controla la página JSF.


A continuación pongo las imágenes de como se ve la aplicación desplegada en el servidor de aplicaciones.

La propiedad edad del backing bean al cargar la página por primera vez es cero, por ende no se mostrarán los componentes JSF de Observación y la caja de texto.


Cuando el usuario elige la fecha de nacimiento, el sistema calcula mediante el evento SelectEvent del componente p:calendar la edad de la persona, y si esta es mayor o igual a 18, los componente JSF Observación y la caja de texto se muestran, caso contrario no lo hacen.

Espero haya sido de su utilidad.

lunes, 4 de mayo de 2015

¿Cómo calcular los meses entre dos fechas en Java?

Problema

Muchos de nosotros alguna vez nos hemos encontrado con el problema de calcular la diferencia en meses entre dos fechas en el lenguaje Java, la tarea al principio parece fácil, pero al analizar detalladamente nos encontramos con una serie de validaciones e interpretaciones que hacen difícil el programar el algoritmo. 

Como es conocido para muchos desarrolladores Java, el trabajar con fechas (Date) es algo muy tedioso, y tareas que al principio parecen fáciles de realizar, terminan convirtiéndose en un suplicio...

Solución

Para calcular la diferencia en meses entre dos fechas en Java lo primero que debemos hacer es asegurarnos de dar formato ("dd/MM/yyyy") a las fechas con las que trabajaremos, esto debido a que no es lo mismo tener "04/05/2015" a "04/05/2015 11:13:25"; evidentemente en Java la primera fecha es "menor" que la segunda, pese a ser el mismo día, mes y año.

Otro aspecto muy importante a considerar y aunque pareciera evidente, es que la fecha de finalización debe ser mayor que la fecha de inicio para calcular la diferencia en meses entre las dos fechas.

Lo siguiente a tomar en cuenta es que un mes cumplido es cuando el día de la fecha de finalización es mayor o igual al día de la fecha inicio de comparación. Por ejemplo:
Fecha inicio: 04/05/2015
Fecha finalización: 04/07/2015
Como nos podemos dar cuenta del 04 de mayo del 2015 al 04 de julio del 2015 han pasado dos meses; pero si la Fecha de finalización para el cálculo de meses entre las dos fechas es 03/07/2015, los meses cumplidos únicamente sería uno; así también, si la fecha de finalización sería 03/08/2015, los meses entre las dos fechas seguirían siendo dos.

Implementación

Luego de haber analizado los problemas para calcular la diferencia en meses entre dos fechas en Java, aquí dejo el código fuente de la implementación del algoritmo en lenguaje Java.



Espero sea de utilidad y solucione su problema.