Validación de fechas en JSF con RichFaces: Un enfoque híbrido y eficiente 📅

¡Hola a todos! En el desarrollo de aplicaciones web, la validación de formularios es una tarea crítica. Un error común, y a veces difícil de detectar, ocurre cuando los usuarios interactúan con componentes como calendarios. Por ejemplo, al usar un calendario de RichFaces, es posible que el usuario haga clic en un botón de acción sin haber seleccionado una fecha, lo que puede causar un error en la lógica de negocio.

Para evitar este tipo de problemas, la mejor práctica es validar los datos tanto en el frontend como en el backend. En este artículo, te mostraré un enfoque práctico utilizando JavaScript y los componentes de RichFaces para validar si un rango de fechas ha sido seleccionado antes de enviar el formulario.


El problema: Envío de valores nulos desde el calendario

El problema surge cuando un usuario no selecciona una fecha en el calendario, pero activa una acción (como un botón de "Filtrar"). El valor del componente de la fecha se envía como nulo a la capa de lógica, lo que puede provocar un NullPointerException u otros errores no manejados.

Para solucionar esto, podemos interceptar la acción del botón con JavaScript y verificar si las variables de la fecha tienen un valor. Esto nos permite mostrar un mensaje de error al usuario de manera inmediata, antes de que se haga la llamada al servidor.


El código paso a paso

Aquí te presento el código para implementar esta solución:

1. El formulario con los calendarios y el botón

En el código XHMTL, tenemos los componentes de RichFaces. El componente rich:calendar tiene un evento onchanged que llama a una función JavaScript para capturar el valor de la fecha seleccionada. El botón a4j:commandButton tiene un evento onclick que llama a la función de validación.

<s:decorate id="fechaFin" template="/layout/edit.xhtml">
    <ui:define name="label">
        <h:outputText value="Fecha hasta" />
    </ui:define>
    <rich:spacer width="10"/>
    <rich:calendar id="fechaFinValue" value="#{filterProcessorNew.fechaFin}"
                   datePattern="yyyy-MM-dd" onchanged="setFechaFin(this.value)" />
</s:decorate>

<rich:panel align="left" rendered="#{filterProcessorNew.isOpen}" style="border:0;">
    <s:div styleClass="actionButtons">
        <a4j:commandButton value="filtrar"
                           action="#{filterProcessorNew.doFilter(filterList)}"
                           id="filtro"
                           reRender="#{tableName}"
                           onclick="validaDate()">
        </a4j:commandButton>
    </s:div>
</rich:panel>

2. El código JavaScript para la validación

Este es el script que realiza la validación.

<script type ="text/javascript">
    var fechaFin;
    var fechaIni;
    
    // Función que captura el valor de la fecha final
    function setFechaFin(fechaF) {
        fechaFin = fechaF;
    }
    
    // Función que captura el valor de la fecha inicial
    function setFechaIni(fechaI) {
        fechaIni = fechaI;
    }
    
    // Función que valida las fechas antes de enviar
    function validaDate() {
        if (fechaIni === null || fechaFin === null) {
            alert('No seleccionó un rango de fechas para el filtro. Por favor, seleccione ambas fechas.');
        } else if (fechaIni === null) {
            alert('Fecha Inicial vacía. Por favor, seleccione una fecha para el filtro.');
        } else if (fechaFin === null) {
            alert('Fecha Final vacía. Por favor, seleccione una fecha para el filtro.');
        }
    }
</script>

Análisis de la lógica:

  • Funciones setFechaIni y setFechaFin: Estas funciones se encargan de capturar el valor de la fecha seleccionada en los calendarios y almacenarlo en variables globales de JavaScript.

  • Función validaDate: Esta es la función principal que se ejecuta al hacer clic en el botón. Utiliza condicionales para verificar si las variables fechaIni y fechaFin son nulas. Si lo son, muestra un mensaje de alerta al usuario y detiene la llamada al servidor.

  • a4j:commandButton: El uso del atributo onclick permite que la validación se ejecute antes de la acción del servidor, lo que ahorra tiempo de respuesta y recursos del servidor.


Conclusión

Este enfoque de validación en la capa de presentación mejora la experiencia del usuario y reduce la carga del servidor. Sin embargo, como bien mencionaste, no está de más validar estos valores también en la capa de negocio. Una validación en ambas capas garantiza la robustez y seguridad de tu aplicación.

¿Qué otros métodos de validación utilizas en tus proyectos JSF? ¡Déjanos un comentario y comparte tu experiencia!

Publicar un comentario

0 Comentarios