¡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
setFechaIniysetFechaFin: 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 variablesfechaIniyfechaFinson nulas. Si lo son, muestra un mensaje de alerta al usuario y detiene la llamada al servidor.a4j:commandButton: El uso del atributoonclickpermite 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!
0 Comentarios