Вы находитесь на странице: 1из 10

VALIDADORES EN LA CAPA DE PRESENTACION

Existen varios mtodos para agregar validaciones a un control, pueden aparecer todos en un
mismo control, no son incompatibles entre ellos.
Existen propiedades para etiquetas de control que se cargan con true o false para adaptar
comportamiento del control al hacer un submit (envo del formulario).
Se puede implementar mtodos en el bean de respaldo (backbean) o de otro que exista en el
alcance de la pgina que validen datos introducidos en el control mediante expresin EL de JSF.
Llamar a un mtodo validate del objeto que implemente el control (binding).
Con etiquetas para asignar un cierto validador a un control, etiqueta hija del control, permite ms
de una, son creados como clases independientes.
PROCESO
Se enva pgina, se invoca validadores asociados a un control, si todos los validadores del control
son vlidos, el control es vlido, si falla la validacin, los datos no se cargan en el modelo de datos
(backbean), en esta fase de validacin se genera respuesta a usuario, cada mtodo de validacin
DEBE CREAR UNA INSTANCIA DE FacesMessage donde mostrar mensaje. El FacesMessage se
rodea de una EXCEPCIN ValidatorException que ser lanzada por el mtodo. Se muestra de
forma apropiada los mensajes de error.
USANDO VALIDADORES EN JSF
Propiedad required: true o false para exigir valor diferente de vaco. Si no se indica el valor
entonces no se ejecuta el resto de procesos de validacin que tenga el control.
<h:inputText id=valor required=true />
VALIDADORES BSICOS: Se declaran como hijos de la etiqueta que defina el control.
MTODOS DE VALIDACIN: Indicando en propiedad validator del control, el mtodo que se
invocar para validar, este puede ser del propio bean de respaldo o de otro bean que est a su
alcance. til para validaciones especficas a nivel de aplicacin.
<h:inputText id=emailInput validator=#{registrationBean.validateEmail}
value=#{registrationBean.email}>
VALIDADORES A MEDIDA CREADOS PARA VALIDACIONES ESPECFICAS: Se declaran dentro de
etiqueta del control. Ejemplo: Hacer un validador con identificador Email que compruebe que el
control contiene una direccin de correo electrnico correcta.
<h:inputTtext>

<f:validator validatorId=Email />


</h:inputText>
VALIDADORES POR DEFECTO EN JSF
JSF provee validadores estndares e implementa sus validadores.
Ejemplo de validaciones:
* Chequear longitud de una cadena de caracteres
* Chequear lmites para un valor numrico (Ejm. Mayor que 0 o menos igual a 100)
* Chequear que valor haya sido proporcionado
CLASE DE VALIDADOR
DoubleRangeValidator

TAG JSF
validateDoubleRange

ATRIBUTOS
minimum, maximum

LengthValidator

validateLength

minimum, maximum

LongRangeValidator

validateLongRange

minimum, maximum

DESCRIPCIN
Valida que valor del
componente
sea
mayor que un mnimo
y menor que un
mximo. Este valor
debe ser de tipo float
Valida que longitud
del
valor
del
componente
est
entre un valor mnimo
y un valor mximo
Valida que el valor del
componente
sea
mayor que un mnimo
y menor que un
mximo. Este valor
debe ser tipo entero

VALIDANDO LONGITUDES DE CADENAS DE CARACTRES Y RANGOS NUMRICOS


Usar validadores JSF dentro de pginas JSF, aadiendo etiquetas validadoras al cuerpo del
componente etiqueta:
<h:inputText value=#{cuestionario.nombre}>
<f:validateLength mximum=12 />
</h:inputText>
Al aceptar campo de texto, el validador verifica que texto introducido tiene como mximo 12
caracteres. Si validador falla, si nmero de caracteres es mayor que 12, genera un mensaje de

error asociado al componente responsable, mostrndose en la pgina JSF por etiquetas h:message
o h:messages.
VALIDANDO LMITES PARA UN VALOR NUMRICO: Comprueba el rango de un dato introducido.
<h:inputText value=#{regalo.cantidad}>
<f:validateLongRange mnimum=10 mximum=10000 />
</h:inputText>
Validador verifica que valor dado sea mayor igual a 10 y menor o igual a 10000
CHEQUEANDO VALORES REQUERIDOS
Validador no se anida dentro de etiqueta. Sino se usa atributo required=true
<h:inputText value=#{informe.fecha} required=true />
Todas las etiquetas JSF de entrada, soportan atributo required. Se puede combinar un atributo
required con un validador anidado:
<h:inputText value=#{informe.telefono} required=true>
<f:validateLength mnimum=9 />
</h:inputText>
Comunicacin de errores en la validacin
JSF, en su estndar, define la existencia de un sistema centralizado de gestin de mensajes, una cola,
en donde se irn depositando los mensajes que se generen durante las diferentes fases del ciclo de
vida JSF. Este sistema de mensajes admite diferentes niveles de gravedad en los mensajes, de menor
a mayor: SEVERITY_INFO, SEVERITY_WARN, SEVERITY_ERROR y SEVERITY_FATAL. Estos niveles son
fijados por el cdigo subyacente, bien de la implementacin JSF, bien de la propia aplicacin, en el
momento de creacin del mensaje, mediante los mtodos de la clase FacesMessage. Un mensaje
contiene, adems de su marca de gravedad, un resumen y un detalle, datos estos que se pueden
tanto indicar en el momento de la creacin del mensaje (segn el constructor que se use) o bien
mediante los apropiados get/set.
La cola de mensajes es accesible a travs de los siguientes mtodos del objeto FacesContext
correspondiente:

public void addMessage(String clientId, FacesMessage message);


public Interator getClientIdsWithMessages();
public Severity getMaximumSeverity();
public Iterator getMessages(String clientId);
public Iterator getMessages();
Estos mtodos acceden directamente a la cola de mensajes, con la idea de que la aplicacin acumule
mensajes en su proceso para el usuario, tanto en la funcionalidad que aporte la implementacin, como

en la especfica de la aplicacin. Sin embargo, en el caso de los validadores el sistema se realiza de


una forma diferente, sin acceder a este API: se debe crear un mensaje y lanzarlo en forma de
excepcin para detener el ciclo JSF en el caso de encontrar un error en la validacin de un control.
En cuanto al sistema para devolver todos estos mensajes al usuario, la especificacin indica dos
controles, UIMessage y UIMessages, que disponen de sus etiquetas en la librera html de JSF:
<h:message> y <h:messages>.

<h:message>: Se asocia a un control determinado mediante su propiedad for, donde se debe poner el
identificador del control. Este control admite clases y estilos CSS especficos para cada nivel de
gravedad de los mensajes que tenga que mostrar. Mostrar exclusivamente los mensajes de error que
haya generado el proceso de los datos del control al que est asociado.

<h:messages>: Panel para mensajes globales. Aqu se mostrarn tanto los mensajes de proceso de
cada control como los mensajes generales que la aplicacin haya depositado en la cola de mensajes.
Tambin acepta diferentes estilos CSS para modificar su aspecto segn la gravedad de los mensajes
que se muestren, da la posibilidad de mostrar exclusivamente los mensajes globales (propiedad
globalOnly) y definir la disposicin de los mensajes (propiedad layout, que puede ser table o list).

Como crear un validador a medida


En muchas ocasiones resulta interesante crear un validador necesario para un control (especialmente
si vamos a tener controles similares y queremos reutilizar la comprobacin). Para ello podemos seguir
el siguiente proceso:

Implementar el interfaz javax.faces.validator.Validator. Este interfaz incluye un mtodo validate que


ser llamado por el gestor del ciclo JSF en la fase de aplicacin de validadores. El interfaz de llamada
de este mtodo es:

public void validate(FacesContext context,


UIComponent component,
Object value)
throws ValidatorException
Recibe el contexto JSF en el que es llamado, el objeto en el servidor que representa al control y el
valor que el usuario ha introducido. En el caso de que su validacin resulte no vlida, debe crear un
mensaje FacesMessage, encapsularlo en una ValidatorException y lanzarla:

...
throw new ValidatorException(new FacesMessage(ResumenDelMensaje));
...

Incluir una constante en su implementacin para identificacin en el sistema JSF. Este identificador lo
usar el sistema JSF para referirse al validador en los archivos de configuracin o en los controles que
se inserten en las pginas jsf.

public final String VALIDATOR_ID = "IDENTIFICADOR DEL VALIDADOR";

En el caso de que el validador necesite parmetros, la clase debe implementar una interfaz ms:
javax.faces.component.StateHolder. Este interfaz permite almacenar los parmetros del validador
entre llamadas.

Adicionalmente, la clase debe disponer de un constructor sin parmetros.

Ejemplos

Ejemplo de validador a medida


Se va a comprobar que el valor de un componente se corresponde un nmero de NIF vlido. El
algoritmo que se utiliza para validar el NIF es el siguiente
1.

Comprobar que el valor a validar tiene una longitud igual a 9. Los primeros 8 caracteres deben ser
nmeros (corresponden al DNI) y el ltimo debe ser una letra (la del NIF)

2.

Almacenar la siguiente lista de letras en una variable: TRWAGMYFPDXBNJZSQVHLCKE

3.

Calcular el mdulo entero de 23.

4.

Recuperar de la lista de letras la que se encuentra en la posicin resultado de efectuar el mdulo


entero de 23

Creamos el Validador

import
import
import
import
import
import
import

java.util.regex.Matcher;
java.util.regex.Pattern;
javax.faces.application.FacesMessage;
javax.faces.component.UIComponent;
javax.faces.context.FacesContext;
javax.faces.validator.Validator;
javax.faces.validator.ValidatorException;

import org.apache.commons.lang.StringUtils;

/**
* Validador de NIF
* @author Ejemplo
*/
public class NifValidator implements Validator
{
/**
* Efecta el proceso de validacin
*/
public void validate(FacesContext contex,UIComponent
component, Object value) throws ValidatorException
{
// Si el valor es null, lo transformamos en un
valor vaco
String valor =
StringUtils.defaultString((String)value);

// el valor debe tener 9 posiciones, de las


cuales las primeras deben ser dgitos y la ltima letra
valor=valor.toUpperCase();
Pattern mask = Pattern.compile("[09]{8,8}[A-Z]");
Matcher matcher =
mask.matcher(valor);
if(!matcher.matches())
throw new
ValidatorException(new FacesMessage("El componente " +
component.getId() + " no contiene un NIF vlido. Las 8
primeras posiciones deben ser numricas"));
String dni=valor.substring(0,8);
String digitoControl =
valor.substring(8,9);
// Calculamos la letra de control
String letras =
"TRWAGMYFPDXBNJZSQVHLCKE";
int posicion_modulo =
Integer.parseInt(dni)%23;
String digitoControlCalculado =
letras.substring(posicion_modulo,posicion_modulo+1);
if(!digitoControl.equalsIgnoreCase(di
gitoControlCalculado))
throw new
ValidatorException(new FacesMessage("El componente " +
component.getId() + " no contiene un NIF
vlido"));
}
}

Registramos el nuevo Validador en el contexto de JSF


Para ello, editamos el fichero descriptor WEB-INF/validaciones-config.xml e insertamos las siguientes
lneas:

<validator>
<validator-id>ejemplo.nifValidator</validator-id>
<validator-class>
com.ejemplo.tutorialValidacion.NifValidator
</validator-class>

</validator>

Creamos la pgina
La llamaremos validacion_ejemplo.jsp y colgar de WebContent; su contenido es el siguiente:

<%@ taglib
<%@ taglib
<%@ taglib
prefix="t"

uri="http://java.sun.com/jsf/html" prefix="h" %>


uri="http://java.sun.com/jsf/core" prefix="f" %>
uri="http://myfaces.apache.org/extensions"
%>

<html>
<head>
<title>EJEMPLO VALIDACIONES</title>
<link rel="stylesheet"
type="text/css" href="/servicios/madeja/css/estilos.css">
</head>
<body>
<f:view>
<h:form id="idUsuarios" name="gestionUsuariosBean">
<h:messages id="messageList" styleClass="error"
showSummary="true" showDetail="true" />
<h:panelGrid columns="2"
styleClass="gestionUsuariosFormTable"
headerClass="gestionUsuariosFormHead
er"
footerClass="gestionUsuariosFormFoot
er"
columnClasses="gestionUsuariosFormLa
bels, gestionUsuariosFormInputs" width="600">
<!-- Nombre -->
<h:outputLabel for="login" value="Nombre"/>
<h:panelGroup>
<h:inputText id="nombre"
styleClass="CajasTexto" size="30" maxlength="100"
value="#{gestionUsuariosBean.
nombre}">
<f:validateLength maximum="50"
/>
</h:inputText>
</h:panelGroup>
<!-- Nif -->

<h:outputLabel for="nif" value="Nif"/>


<h:panelGroup>
<h:inputText id="elNif" styleClass="CajasTexto"
size="30" maxlength="10"
value="#{gestionUsuariosBean.n
if}" required="true">
<f:validator
validatorId="ejemplo.nifValidator"/>
</h:inputText>
</h:panelGroup>
<h:panelGroup>
<h:commandButton
action="resultado_validacion_nuestra" value="Validar" />
<f:verbatim> </f:verbatim>
</h:panelGroup>
</h:panelGrid>
</h:form>
</f:view>
</body>
</html>

Aadimos en WEB-INF/validaciones-config.xml la navegabilidad para el botn Validar:

<navigation-rule>
<from-view-id>/validacion_ejemplo.jsp</fromview-id>
<navigation-case>
<fromoutcome>resultado_validacion_nuestra</from-outcome>
<to-viewid>/resultado_validacion_nuestra.jsp</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>

Y creamos la pgina de resultados WebContent/resultado_validacion_nuestra.jsp:

<%@ taglib
<%@ taglib
<%@ taglib
prefix="t"
<html>
<head>

uri="http://java.sun.com/jsf/html" prefix="h" %>


uri="http://java.sun.com/jsf/core" prefix="f" %>
uri="http://myfaces.apache.org/extensions"
%>

<title>Ejemplo VALIDACIONES</title>
<link rel="stylesheet"
type="text/css" href="/servicios/madeja/css/estilos.css">
</head>
<body>
<f:view>
<h:form id="idUsuarios" name="gestionUsuariosBean">
<h:messages id="messageList" styleClass="error"
showSummary="true" showDetail="true" />
<h:panelGrid columns="2"
styleClass="gestionUsuariosFormTable"
headerClass="gestionUsuariosFormHead
er"
footerClass="gestionUsuariosFormFoot
er"
columnClasses="gestionUsuariosFormLa
bels, gestionUsuariosFormInputs" width="600">
<!-- Nombre -->
<h:outputLabel for="login" value="Nombre"/>:
<h:panelGroup>
<h:outputText
value="#{gestionUsuariosBean.nombre}"/>
</h:panelGroup>
<!-- Nif -->
<h:outputLabel for="nif" value="Nif"/>
<h:panelGroup>
<h:outputText value="#{gestionUsuariosBean.nif}"/>
</h:panelGroup>
<h:panelGroup>
<h:commandButton action="home" value="Volver" />
<f:verbatim> </f:verbatim>
</h:panelGroup>
</h:panelGrid>
</h:form>
</f:view>

</body>
</html>

Вам также может понравиться