validation - validateregex - jsf validar dos campos a la vez
validateregex primefaces (3)
Esta pregunta ya tiene una respuesta aquí:
¿Puedo validar dos campos interdependientes con un validador?
<h:form>
<h:inputText value="#{logRegBean.person.name}" >
<f:validator validatorId="loginCorrectValidator" />
</h:inputText>
<h:inputSecret value="#{logRegBean.person.password}" />
<h:commandButton action="#{logRegBean.login}" />
</h:form>
Quiero buscar al usuario en la base de datos y, si está el usuario, probaré si las contraseñas (en db e ingresadas) coinciden. Pero, ¿cómo puedo acceder incluso al campo de contraseña en un validador? Intenté evaluar el valor en el otro campo a través de createValueExpression()
, pero parece que no puedo acceder al valor en ese momento ya que siempre obtengo cadenas vacías.
Creo que la función s:validateForm
SeamFaces puede ser justo lo que necesitas. ( Seam Faces es una biblioteca muy útil que trae algunas funciones ingeniosas basadas en CDI a JSF).
Lo mejor que puede hacer es tomar el otro componente UIInput
por UIViewRoot#findComponent()
dentro del método validate()
y luego determinar el valor enviado por UIInput#getSubmittedValue()
(cuando ocurre después del componente validado actualmente en el árbol de componentes ) o UIInput#getValue()
(cuando ocurre antes del componente actual y por lo tanto ya está validado).
P.ej
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
UIInput otherInput = (UIInput) context.getViewRoot().findComponent("clientId");
String otherValue = (String) otherInput.getSubmittedValue();
// ...
}
Ver también:
El mecanismo de validación en JSF fue diseñado para validar un solo componente.
Sin embargo, en la práctica, a menudo es necesario asegurarse de que los componentes relacionados tengan valores razonables antes de permitir que los valores se propaguen en el modelo.
Por ejemplo, no es una buena idea pedir a los usuarios que ingresen una fecha en un solo campo de texto.
En su lugar, utilizarías tres campos de texto diferentes, para el día, el mes y el año.
Si el usuario ingresa una fecha ilegal, como el 30 de febrero, le gustaría mostrar un error de validación y evitar que los datos ilegales ingresen al modelo.
El truco consiste en adjuntar el validador al último de los componentes. En el momento en que se llama a su validador, los componentes anteriores pasaron la validación y tenían sus valores locales establecidos. El último componente ha pasado la conversión y el valor convertido se pasa como el parámetro Objeto del método de validación.
Por supuesto, necesitas tener acceso a los otros componentes. Puede lograr ese acceso fácilmente utilizando un bean de respaldo que contenga todos los componentes del formulario actual. Simplemente adjunte el método de validación al bean de respaldo:
public class BackingBean {
private int day;
private int month;
private int year;
private UIInput dayInput;
private UIInput monthInput;
private UIInput yearInput;
// PROPERTY: day
public int getDay() { return day; }
public void setDay(int newValue) { day = newValue; }
// PROPERTY: month
public int getMonth() { return month; }
public void setMonth(int newValue) { month = newValue; }
// PROPERTY: year
public int getYear() { return year; }
public void setYear(int newValue) { year = newValue; }
// PROPERTY: dayInput
public UIInput getDayInput() { return dayInput; }
public void setDayInput(UIInput newValue) { dayInput = newValue; }
// PROPERTY: monthInput
public UIInput getMonthInput() { return monthInput; }
public void setMonthInput(UIInput newValue) { monthInput = newValue; }
// PROPERTY: yearInput
public UIInput getYearInput() { return yearInput; }
public void setYearInput(UIInput newValue) { yearInput = newValue; }
public void validateDate(FacesContext context, UIComponent component, Object value) {
int d = ((Integer) dayInput.getLocalValue()).intValue();
int m = ((Integer) monthInput.getLocalValue()).intValue();
int y = ((Integer) value).intValue();
if (!isValidDate(d, m, y)) {
throw new ValidatorException(new FacesMessage("Invalid Date"));
}
}
private static boolean isValidDate(int d, int m, int y) {
//DO YOUR VALIDATION HERE
}
}
Aquí está tu JSP
<html>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<f:view>
<head></head>
<body>
<h:form>
<h:panelGrid columns="3">
<h:inputText value="#{bb.day}" binding="#{bb.dayInput}" size="2" required="true"/>
<h:inputText value="#{bb.month}" binding="#{bb.monthInput}" size="2" required="true"/>
<h:inputText value="#{bb.year}" binding="#{bb.yearInput}" size="4" required="true" validator="#{bb.validateDate}"/>
<h:message for="year" styleClass="errorMessage"/>
</h:panelGrid>
<h:commandButton value="Submit" action="submit"/>
</h:form>
</body>
</f:view>
</html>
Referencia: Core JavaServer ™ Faces Por DAVID GEARY, CAY HORSTMANN
Publicador: Addison Wesley Pub Fecha: 15 de junio de 2004 ISBN: 0-13-146305-5