O'Reilly logo

JavaServer Faces by Hans Bergsten

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

An Alternative for the Lazy

Creating a special custom action for your custom validators makes it easier for a page author to use them, but JSF actually provides a generic custom action that you can use to attach any validator to a component. It’s named <f:validator>:

    <h:inputText id="to" size="8" required="true"
      value="#{reportHandler.to}">
      <f:convertDateTime dateStyle="short" />
      <f:validator validatorId=" com.mycompany.jsf.validator.LATER_THAN" />
                     <f:attribute name="peerId" value="from" />
    </h:inputText>

The validatorId attribute value is the identifier the validator is registered with in the faces-config.xml file.

Because the generic <f:validator> action doesn’t allow you to set validator-specific properties, you must provide the peer component ID through a generic component attribute instead, set by the <f:attribute> action. This means we must also modify the LaterThanValidator code slightly to get the peer ID from the generic attribute instead. This code in the validate() method replaces the setPeerId() method to deal with this difference:

...
    public void validate(FacesContext context, UIComponent component,
        Object value) throws ValidatorException {

    // Get the peer component ID
    String peerId = (String) component.getAttributes( ).get("peerId");
    ...

I recommend that you take the time to create a custom action, though. It’s well worth the five minutes or so that it takes.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required