Problem with h:message and richfaces
balteo Jul 30, 2008 12:44 PMHello,
I noticed a strange problem occurring with my richfaces application. It is as follows:
I have a contact form with "real-time" validation of each field. When a valid submission of the form occurs, the form is reRendered and strangely, the first field shows a validation passed status even though it is empty.
Here is my jsp:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:rest="http://restfaces.dev.java.net" xmlns:a4j="http://richfaces.org/a4j" xmlns:rich="http://richfaces.org/rich"> <body> <ui:composition template="/template.xhtml"> <ui:define name="title"> <title><h:outputText value="todo: accueil" /></title> </ui:define> <ui:define name="body"> <a4j:outputPanel id="wrapper" layout="block" styleClass="wrapper"> <rest:link value="contactAction" hreflang="fr" lang="fr"> <f:param name="language" value="fr" /> <h:outputText value="#{msg['langue.francais.libelle']}" /> </rest:link> <rest:link value="contactAction" hreflang="en" lang="en"> <f:param name="language" value="en" /> <h:outputText value="#{msg['langue.anglais.libelle']}" /> </rest:link> <br /> <br /> <a4j:outputPanel rendered="#{contactView.envoiReussi}" ajaxRendered="true"> <h:outputText value="envoi reussi todo"/> </a4j:outputPanel> <a4j:form id="formulaireContact" reRender="wrapper"> <h:panelGrid columns="3" columnClasses="libellesColonne,champsColonne,validiteColonne"> <f:facet name="header"> <a4j:outputPanel layout="block" styleClass="formulaireContactHeader"> <h:outputText value="todo header" /> </a4j:outputPanel> </f:facet> <h:outputText value="#{msg['message.from.email']}" /> <a4j:outputPanel id="fromEmail"> <a4j:region id="fromEmailRegion"> <h:inputText id="emailI" value="#{contactView.message.email}" required="true" requiredMessage="#{msg['message.valeurRequise.email']}" validatorMessage="#{msg['message.erreur.email']}" binding="#{contactView.bb.emailI}"> <a4j:support id="emailS" event="onblur" reRender="fromEmail, emailMP" ajaxSingle="true" actionListener="#{contactView.valider}" limitToList="true" ignoreDupResponses="true" /> <f:validator validatorId="adresseEmailValidator" /> </h:inputText> <a4j:status> <f:facet name="start"> <h:graphicImage value="#{img['ajax-loader']}" /> </f:facet> </a4j:status> </a4j:region> </a4j:outputPanel> <a4j:outputPanel id="emailMP"> <h:message for="emailI" infoClass="champValide" /> </a4j:outputPanel> <h:outputText value="#{msg['message.from.nom']}" /> <a4j:outputPanel id="nom"> <a4j:region id="nomRegion"> <h:inputText id="nomI" value="#{contactView.message.nom}" required="true" requiredMessage="#{msg['message.valeurRequise.nom']}" validatorMessage="todo: nom non valide" binding="#{contactView.bb.nomI}"> <a4j:support id="nomS" event="onblur" reRender="nom, nomMP" ajaxSingle="true" actionListener="#{contactView.valider}" limitToList="true" /> <f:validateLength minimum="2" /> </h:inputText> <a4j:status> <f:facet name="start"> <h:graphicImage value="#{img['ajax-loader']}" /> </f:facet> </a4j:status> </a4j:region> </a4j:outputPanel> <a4j:outputPanel id="nomMP"> <h:message for="nomI" infoClass="champValide" /> </a4j:outputPanel> <h:outputText value="#{msg['message.sujet']}" /> <a4j:outputPanel id="sujet"> <a4j:region id="sujetRegion"> <h:inputText id="sujetI" value="#{contactView.message.sujetMessage}" required="true" requiredMessage="#{msg['message.valeurRequise.sujet']}" validatorMessage="#{msg['message.erreur.sujet']}" binding="#{contactView.bb.sujetI}"> <a4j:support id="sujetS" event="onblur" reRender="sujet, sujetMP" ajaxSingle="true" actionListener="#{contactView.valider}" limitToList="true"/> <f:validateLength minimum="2" /> </h:inputText> <a4j:status> <f:facet name="start"> <h:graphicImage value="#{img['ajax-loader']}" /> </f:facet> </a4j:status> </a4j:region> </a4j:outputPanel> <a4j:outputPanel id="sujetMP"> <h:message for="sujetI" infoClass="champValide" /> </a4j:outputPanel> <h:outputText value="#{msg['message.corps']}" /> <a4j:outputPanel id="corps"> <a4j:region> <h:inputTextarea id="corpsI" value="#{contactView.message.corpsMessage}" cols="20" rows="5" required="true" requiredMessage="#{msg['message.valeurRequise.corps']}" validatorMessage="#{msg['message.erreur.corps']}" binding="#{contactView.bb.corpsI}"> <a4j:support id="corpsS" event="onblur" reRender="corps, corpsMP" ajaxSingle="true" actionListener="#{contactView.valider}" /> <f:validateLength minimum="20" /> </h:inputTextarea> <a4j:status> <f:facet name="start"> <h:graphicImage value="#{img['ajax-loader']}" /> </f:facet> </a4j:status> </a4j:region> </a4j:outputPanel> <a4j:outputPanel id="corpsMP"> <h:message for="corpsI" infoClass="champValide" style="vertical-align: top" /> </a4j:outputPanel> <a4j:outputPanel/> <a4j:outputPanel> <rich:paint2D id="captcha" width="#{contactView.captchaWidth}" height="#{contactView.captchaHeight}" format="jpeg" paint="#{contactView.paintCaptcha}"> <f:attribute name="alt" value="todo" /> </rich:paint2D> </a4j:outputPanel> <a4j:outputPanel /> <a4j:outputPanel> <h:outputText value="todo Text on Image:" /> </a4j:outputPanel> <a4j:outputPanel id="secureText"> <h:inputText id="secureTextI" value="#{contactView.secureText}" size="20" required="true" binding="#{contactView.bb.secureTextI}"> <f:validator validatorId="captchaValidator" /> </h:inputText> </a4j:outputPanel> <a4j:outputPanel id="secureTextMP"> <h:message for="secureTextI" /> </a4j:outputPanel> <f:facet name="footer"> <a4j:outputPanel layout="block" styleClass="formulaireContactFooter"> <a4j:commandButton value="#{msg['message.envoyer']}" action="#{contactView.envoyer}"/> </a4j:outputPanel> </f:facet> </h:panelGrid> </a4j:form> <a4j:outputPanel layout="block" styleClass="push" /> <a4j:log popup="false" level="ALL" style="width: 800px; height: 600px;"></a4j:log> </a4j:outputPanel> </ui:define> </ui:composition> </body> </html>
Here is the managed bean method upon which submission is performed:
public String envoyer() { log.debug("envoyer"); service.envoyerMessage(this.message); try { service.envoyerSms(this.message); } catch (MalformedURLException ex) { log.debug(ex.fillInStackTrace());//todo } catch (IOException ex) { log.debug(ex.fillInStackTrace());//todo } this.bb.setLocalValuesSet(false); this.bb.setSubmittedValues(null); this.bb.setValues(""); this.envoiReussi = true; return null; }
Can anyone tell me why the first h:message located within the following panel: (emailMP) displays this strange behavior?
Thanks in advance,
Julien.