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.
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access