Tipo 1: Validación tipo required
Para mostrar mensajes de error de tipo requiered (Cuadro rojo)
Vamos a hacer un ejemplo de la fecha final no puede ser anterior a la fecha inicial
objetivoOperativoAnualInstitucionalEditForm.xhtml
<!-- Fecha Inicial -->
<p:outputLabel id="fechaInicialOutputLabel"
for="fechaInicialCalendar"
value="#{i18n.objetivoPOAI_fechaInicial_label}" />
<p:outputPanel id="fechaInicialOutputPanel">
<p:calendar id="fechaInicialCalendar"
value="#{objetivoPOAIBean.metaPOAI.fechaInicial}"
required="#{not empty param[agregar.clientId]}"
showOn="button"
locale="es"
pattern="dd/MM/yyyy"
navigator="true"
timeZone="America/Costa_Rica"
mindate="#{objetivoPOAIBean.calendarioFechaInicio}"
maxdate="#{objetivoPOAIBean.calendarioFechaFin}">
<p:ajax event="dateSelect"
process="@this"
listener="#{objetivoPOAIBean.onFechaInicialSelect}"
update="fechaFinalCalendar"/>
</p:calendar>
</p:outputPanel>
<p:message id="fechaInicialMessage"
for="fechaInicialCalendar" />
Aqui lo que destaca es que debemos hacer un metodo que cuando se seleccione una fecha incial limpie la fecha final
Y ademas que actualice el componente fecha final
<p:ajax event="dateSelect"
process="@this"
listener="#{objetivoPOAIBean.onFechaInicialSelect}"
update="fechaFinalCalendar"/>
El componente de fecha final queda así
<!-- Fecha Final -->
<p:outputLabel id="fechaFinalOutputLabel"
for="fechaFinalCalendar"
value="#{i18n.objetivoPOAI_fechaFinal_label}" />
<p:outputPanel id="fechaFinalOutputPanel">
<p:calendar id="fechaFinalCalendar"
value="#{objetivoPOAIBean.metaPOAI.fechaFinal}"
required="#{not empty param[agregar.clientId]}"
showOn="button"
locale="es"
pattern="dd/MM/yyyy"
navigator="true"
timeZone="America/Costa_Rica"
mindate="#{objetivoPOAIBean.calendarioFechaInicio}"
maxdate="#{objetivoPOAIBean.calendarioFechaFin}"
disabled="#{empty objetivoPOAIBean.metaPOAI.fechaInicial}"
>
<p:ajax event="dateSelect"
process="@this, @form" update="fechaFinalMessage" />
<f:validator binding="#{objetivoPOAIBean.fechaFinalValidator}" />
</p:calendar>
</p:outputPanel>
<p:message id="fechaFinalMessage"
for="fechaFinalCalendar" />
Aquí lo que destaca es que que cuando se seleccione una fecha actuilice el mensaje
Y ademas la creación de un validator binding
Y que este deshabilitado hasta que se seleccione una fecha inicio
disabled="#{empty objetivoPOAIBean.metaPOAI.fechaInicial}"
<p:ajax event="dateSelect"
process="@this, @form" update="fechaFinalMessage" />
<f:validator binding="#{objetivoPOAIBean.fechaFinalValidator}" />
ObjetivoPOAIBean.java
Aquí agregamos los imports necesarios
import java.util.Date;
import javax.faces.application.FacesMessage;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.validator.ValidatorException;
import javax.faces.validator.Validator;
import javax.faces.component.UIComponent;
public Validator getFechaFinalValidator() {
ObjetivoPOAIBean bean = this;
return new Validator() {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
Date fechaFinal = (Date) value;
Date fechaInicial = bean.getMetaPOAI().getFechaInicial();
if (fechaInicial != null && fechaFinal != null && fechaFinal.before(fechaInicial)) {
FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Fecha final no puede ser anterior a la fecha inicial", null);
throw new ValidatorException(msg);
}
}
};
}
public void onFechaInicialSelect(AjaxBehaviorEvent event) {
// Al Seleccionar una fecha Inicial limpiamos la fecha final
this.getMetaPOAI().setFechaFinal(null);
}