¡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
ysetFechaFin
: 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 variablesfechaIni
yfechaFin
son nulas. Si lo son, muestra un mensaje de alerta al usuario y detiene la llamada al servidor.a4j:commandButton
: El uso del atributoonclick
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!
Comentarios
Publicar un comentario