Search code examples
jsfjakarta-eejsf-2primefaces

JSF 2.0: Validate equality of 2 InputSecret Fields (confirm password) without writing Code?


I'm developing a pure JavaEE6 application with JSF 2.0 and Glassfish. My JSF implementation is Primefaces (beside Mojarra provided by Glassfish).

I want to verify if the values of 2 password fields in a JSF form are equal. With Seam, there is the neat component <s:validateEquality for="pw1"/>. I want do to the same without Seam, just using JSF (or maybe a component of a JSF library). Until now i only saw examples which validate the form with a custom validator. But i would like to compare the fields without writing Java code or Javascript code. Is that possible?

This what it looks like with Seam:

...
<h:inputSecret id="passwort" value="#{personHome.instance.password}" 
    redisplay="true" required="true">
  <f:validateLength minimum="8"/>
  <a:support event="onblur" reRender="passwortField" bypassUpdates="true" ajaxSingle="true" />
</h:inputSecret>
...    
<h:inputSecret id="passwort2" required="true" redisplay="true">
  <!-- find the JSF2.0-equivalent to this tag: -->
  <s:validateEquality for="passwort"/>
  <a:support event="onblur" reRender="passwort2Field" bypassUpdates="true" ajaxSingle="true" />
</h:inputSecret>
...

Solution

  • This is the way i finally did it, which i like cause it's short and easy. The only problem is that it's not really re-usable, but as i only need this in one case, i rather save some LOCs and do it this way. Snippet from my view:

    <h:inputSecret id="password" value="#{personHome.person.password}">
      <f:ajax event="blur" render="passwordError" />
    </h:inputSecret> 
    <h:message for="password" errorClass="invalid" id="passwordError" />
    
    <h:inputSecret id="password2" validator="#{personHome.validateSamePassword}">
      <f:ajax event="blur" render="password2Error" />
    </h:inputSecret> 
    <h:message for="password2" errorClass="invalid" id="password2Error" />
    

    My Backing Bean (just the important part):

    @Named @ConversationScoped
    public class PersonHome {
      private Person person;
    
      public Person getPerson() {
        if (person == null) return new Person();
        else return person;
      }
    
      public void validateSamePassword(context:FacesContext, toValidate:UIComponent, value:Object) {
        String confirmPassword = (String)value;
        if (!confirmPassword.equals(person.getPassword()) {
          FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Passwords do not match!", "Passwords do not match!")
          throw new Validatorexception(message);
        }
      }