Curso de JSF 2
Validación de formularios
La validación es un aspecto fundamental en cualquier aplicación web. En esta lección, aprenderemos cómo implementar la validación de un campo de nombre en un formulario utilizando JSF. Aplicaremos validadores estándar y personalizados para asegurarnos de que el nombre ingresado cumpla con las reglas de negocio.
1. Validación estándar con f:validateLength
JSF incluye validadores estándar que permiten realizar validaciones comunes. Por ejemplo, podemos usar <f:validateLength> para verificar la longitud de un nombre.
Vista (validarNombre.xhtml):
<h:form>
<h:panelGrid columns="2">
<h:outputLabel for="nombre" value="Nombre:" />
<h:inputText id="nombre" value="#{validacionNombreBB.nombre}" required="true">
<f:validateLength minimum="3" maximum="20" />
</h:inputText>
</h:panelGrid>
<h:message for="nombre" style="color:red" />
<h:commandButton value="Enviar" action="#{validacionNombreBB.guardar}" />
</h:form>
<h:outputLabel for="nombre">Nombre:</h:outputLabel>
<h:inputText id="nombre" value="#{pacienteBB.paciente.nombre}" >
<f:validator validatorId="validacionNombre" />
</h:inputText>
<h:message id="m2b" for="nombre" style="color:red" />
Explicación:
required="true": Hace que el campo sea obligatorio.<f:validateLength>: Valida que la longitud del nombre sea entre 3 y 20 caracteres.<h:message>: Muestra mensajes de error asociados al camponombre.
2. Validación personalizada con un validador
Si necesitas reglas más complejas, puedes crear un validador personalizado.
Crear el validador (NombreValidator.java):
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import javax.faces.validator.FacesValidator;
@FacesValidator("nombreValidator")
public class NombreValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
String nombre = value.toString();
// Regla de validación personalizada: solo letras y espacios
if (!nombre.matches("[a-zA-Z ]+")) {
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
"El nombre solo debe contener letras y espacios", null));
}
// Otra regla: mínimo 3 caracteres
if (nombre.length() < 3) {
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
"El nombre debe tener al menos 3 caracteres", null));
}
}
}
Usar el validador en la vista:
<h:form>
<h:panelGrid columns="2">
<h:outputLabel for="nombre" value="Nombre:" />
<h:inputText id="nombre" value="#{validacionNombreBB.nombre}" required="true">
<f:validator validatorId="nombreValidator" />
</h:inputText>
</h:panelGrid>
<h:message for="nombre" style="color:red" />
<h:commandButton value="Enviar" action="#{validacionNombreBB.guardar}" />
</h:form>
3. Backing Bean para manejar los datos
El Backing Bean es donde se maneja el campo nombre y la acción asociada al botón.
Código (ValidacionNombreBB.java):
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean(name = "validacionNombreBB")
@RequestScoped
public class ValidacionNombreBB {
private String nombre;
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String guardar() {
System.out.println("Nombre válido: " + nombre);
return "exito"; // Redirige a una página de éxito
}
}
4. Mensajes personalizados con messages.properties
Puedes externalizar los mensajes de error en un archivo messages.properties para facilitar su gestión.
Archivo messages.properties:
javax.faces.component.UIInput.REQUIRED=El campo es obligatorio.
nombreValidator.LETRAS_ESPACIOS=El nombre solo debe contener letras y espacios.
nombreValidator.MINIMO=El nombre debe tener al menos 3 caracteres.
Configurar el validador para usar mensajes personalizados:
if (!nombre.matches("[a-zA-Z ]+")) {
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
context.getApplication().getResourceBundle(context, "msg").getString("nombreValidator.LETRAS_ESPACIOS"), null));
}