Look at the "for" field in validators like compareTo or equals.
You can use a validator whith some parameters to tell it which the
address input text and others are.
El vie, 29-12-2006 a las 13:21 +0100, Job de Noo escribió:
> Hi all,
>
> i have to make a Validator that is generic in use and can validate
> more then one field for example a zip-code validator that checks if
> the zipcode is correct and if the street and housnumber are within the
> range of the zipcode.
>
> I read about the options there are to validate multiple fields but the
> problem with the options i found is that your validator must be aware
> of the id you give your components on the pages, since i have 2
> different Adresses on my page with a zipcode validation rule it
> would(at least i think) not be possible to use one validator. If i'm
> mistaken please say so.
>
> I now made a component that u can put anywhere on your page to have
> multiple field validations, but i don't know if it is a correct way to
> do so,
> so could anyone give me feed back.
>
> My component can be put on the form with for example the following tag.
>
> <svb:multiplefieldvalidation forComponents="componentId1,
> componentId2, component3" keys="street, housenumber, zipcode">
> <f:validator id="zipcodeValidator">
> </svb:multiplefieldvalidation>
>
> and now exist (still in development so really stupid code) of this code
>
>
> package nl.svb.faces.component;
>
> import java.io.IOException;
> import java.util.HashMap;
> import java.util.Iterator;
> import java.util.Map;
> import java.util.StringTokenizer;
>
> import javax.faces.application.FacesMessage;
> import javax.faces.component.UIInput;
> import javax.faces.context.FacesContext;
> import javax.faces.validator.Validator;
> import javax.faces.validator.ValidatorException;
>
> /**
> * @author jgdenoo *
> */
> public class UIMultipleFieldValidation extends UIInput {
> private String forComponents;
> private String keys;
> private Map submittedValues = new HashMap();
>
> public final static String COMPONENT_FAMILY = "svb.MultipleFields";
> public final static String COMPONENT_TYPE = "svb.MultipleFields";
>
> public void encodeBegin(FacesContext context) throws IOException {
>
> }
>
> public void encodeEnd(FacesContext context) throws IOException {
> }
>
> /* (non-Javadoc)
> * @see
> javax.faces.component.UIInput#decode(javax.faces.context.FacesContext)
> */
> public void decode(FacesContext arg0) {
>
> }
>
> /* (non-Javadoc)
> * @see
> javax.faces.component.UIInput#validate(javax.faces.context.FacesContext)
> */
> public void validate(FacesContext context) {
> System.out.println("in validate");
> System.out.println("validators" + getValidators()[0]);
> System.out.println("validator" + getValidator());
> parse(forComponents, keys);
>
> // TODO Auto-generated method stub
>
> System.out.println(isValid());
>
> Validator validator = (Validator) getValidators()[0];
> validator.validate(context, this, submittedValues);
>
> }
>
> /**
> * @param forComponents
> * @param keys
> */
> private void parse(String forComponents, String keys) {
> StringTokenizer forTokenizer = new
> StringTokenizer(forComponents, ",");
> StringTokenizer keyTokenizer = new
> StringTokenizer(keys, ",");
>
> if (forTokenizer.countTokens() !=
> keyTokenizer.countTokens()) {
> //TODO: Message met ongelijke hoeveelheid
> tokens gooien!.
> }
>
> while (keyTokenizer.hasMoreTokens()) {
>
> UIInput component = (UIInput)
> this.findComponent(forTokenizer.nextToken());
>
> submittedValues.put(keyTokenizer.nextToken(),
> component.getLocalValue());
> }
>
> }
>
> public void setForComponents(String forValue) {
> forComponents = forValue;
> }
>
> public Map getSubmittedValues() {
> return submittedValues;
> }
>
> public Object getSubmittedValue(String key) {
> return submittedValues.get(key);
> }
>
> /* (non-Javadoc)
> * @see
> javax.faces.component.UIInput#saveState(javax.faces.context.FacesContext)
> */
> public Object saveState(FacesContext context) {
> Object[] values = new Object[5];
> values[0] = super.saveState(context);
> values[1] = submittedValues;
> values[2] = forComponents;
> values[3] = keys;
> return values;
>
> }
>
> /* (non-Javadoc)
> * @see
> javax.faces.component.UIInput#restoreState(javax.faces.context.FacesContext,
> java.lang.Object)
> */
> public void restoreState(FacesContext context, Object object) {
> Object[] values = (Object[]) object;
> super.restoreState(context, values[0]);
> submittedValues = (Map) values[1];
> forComponents = (String) values[2];
> keys = (String) values[3];
>
> }
>
> public String getFamily() {
> // we need this because we are subclassing
> UIComponentBase and not
> a concrete subclass
> return COMPONENT_FAMILY;
> }
>
> /**
> * @return
> */
> public String getKeys() {
> return keys;
> }
>
> /**
> * @param string
> */
> public void setKeys(String string) {
> keys = string;
> }
>
> }
>
>
> The validator then can get the Map with local/submitted values from
> this component and can so validate the fields.
>
> I know this is not really a myfaces issue but more a general JSF issue
> i think but i wondered if any of u could give me some advise if this
> is a good way to go, or better do something else.
>
> Greetings ,
> Job de Noo
>