2015-03-23 5 views
3

При использовании компонента мы указываем, как его проверить с помощью required, maxlength или validator, и эти проверки выполняются на сервере, который является отличным.Проверка правильности подключения к серверу на основе интерфейсов

При использовании Primefaces inputMask мы можем указать маску. Маска заставляет нас думать, что пользовательский ввод всегда будет соответствовать этой маске. К сожалению, это не так, и мы должны ввести код validator, чтобы убедиться, что пользовательский ввод будет таким, каким мы хотим. Таким образом, если мне не хватает чего-то, поведение «только на стороне клиента» inputMask достаточно хорошее, чтобы дать подсказку пользователю о том, как заполнить поле.

Есть общегоvalidator чем может быть сопряжено с p:inputMask, чтобы убедиться, что пользовательский ввод действительно соответствие маски?

ответ

5

PrimeFaces не предлагает это из коробки.

Однако должно быть относительно тривиально преобразовать шаблон маски в шаблон регулярного выражения, используя простой цикл для массива символов. Затем вы можете использовать этот шаблон регулярного выражения для проверки значения.

E.g.

<p:inputMask ... validator="maskValidator"> 

с

@FacesValidator("maskValidator") 
public class MaskValidator implements Validator { 

    @Override 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
     String submittedValue = context.getExternalContext().getRequestParameterMap().get(component.getClientId(context)); 

     if (submittedValue == null || submittedValue.isEmpty()) { 
      return; // Let @NotNull/required="true" handle. 
     } 

     InputMask input = (InputMask) component; 
     String mask = input.getMask(); 
     StringBuilder regex = new StringBuilder(); 

     for (char c : mask.toCharArray()) { 
      switch (c) { 
       case 'a': regex.append("[a-zA-Z]"); break; 
       case '9': regex.append("[0-9]"); break; 
       case '?': case '+': case '*': regex.append(c); break; 
       default: regex.append(Pattern.quote(Character.toString(c))); break; 
      } 
     } 

     if (!submittedValue.matches(regex.toString())) { 
      throw new ValidatorException(new FacesMessage(submittedValue + " does not match " + mask)); 
     } 
    } 
} 

Обратите внимание, что валидатор работает с превращенным представленным значением, а не переданный в 3-й аргументе, который может быть (неявно) преобразуется заранее и, таким образом, иметь потенциально различное toString() представления ,