Tutorial :Custom validator with attributes in facelets



Question:

I have written a custom Validator that expects an attribute to be set. I know I have to write a Handler (TagHandler or ValidatorHandler?) to set that attribute, but I am having trouble doing it.

<tag>      <tag-name>validateCustom</tag-name>      <validator>          <validator-id>package.CUSTOM_VALIDATOR</validator-id>      </validator>  </tag>  

Where do i put the handler-class element? And how do I write the handler so that it will pass the attributes to my custom validator?

Thanks in advance!


Solution:1

Here is a validator with custom attribute skeleton:

public class CustomValidator implements Validator, Serializable  {      private static final long serialVersionUID = ...;      private String someAttribute;        public void setSomeAttribute(String someAttribute)      {          this.someAttribute = someAttribute;      }        @Override      public void validate(FacesContext context, UIComponent component, Object value)      throws ValidatorException       {          // Do validation      }  }  

Here is the tag handler:

public class CustomValidatorHandler extends ValidateHandler  {      private final TagAttribute someAttribute;        public CustomValidatorHandler(ValidatorConfig config)      {          super(config);            someAttribute = this.getAttribute("someAttribute");      }        @Override      protected Validator createValidator(FaceletContext ctx)      {          CustomValidator result = (CustomValidator) ctx          .getFacesContext()          .getApplication()          .createValidator("package.CUSTOM_VALIDATOR");            if (someAttribute != null) result.setSomeAttribute(someAttribute.getValue(ctx));            return result;      }  }  

And here is part of the taglib file:

<tag>      <tag-name>validateCustom</tag-name>      <validator>          <validator-id>package.CUSTOM_VALIDATOR</validator-id>      <handler-class>package.CustomValidatorHandler</handler-class>      </validator>  </tag>  


Solution:2

The suggested solution doesn't work and it's overcomplicated as well. There is no need of a handler class in JSF 1.2 and there is no support for a handler class in the validator tag at all.

So all you need is.

The Validator:

public class CustomValidator implements Validator, Serializable  {      private static final long serialVersionUID = ...;      private String someAttribute;        public void setSomeAttribute(String someAttribute)      {          this.someAttribute = someAttribute;      }        @Override      public void validate(FacesContext context, UIComponent component, Object value)      throws ValidatorException       {       // Do validation      }   }  

The declaration/registration of the custom validator in the faces-config.xml

<validator>      <validator-id>customValidator</validator-id>      <validator-class>package.CustomValidator</validator-class>  </validator>  

The taglib.xml (e.g. my.taglib.xml):

<?xml version="1.0"?>  <!DOCTYPE facelet-taglib PUBLIC   "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"   "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">  <facelet-taglib>  <namespace>http://myNS.com/jsf</namespace>  <tag>      <tag-name>myCustomValidator</tag-name>      <validator>          <validator-id>customValidator</validator-id>      </validator>  </tag>  </facelet-taglib>  

Finally the registration of the taglib.xml in web.xml:

<context-param>      <param-name>facelets.LIBRARIES</param-name>      <param-value>/WEB-INF/my.taglib.xml</param-value>  </context-param>  

So thats all no need of a handler :-)


Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »