Проверка подтверждения пароля JSF с использованием ADF 11

Как я могу создать валидатор, который проверяет, ввел ли пользователь одни и те же значения в поле пароля и поле подтверждения пароля?

Я сделал это в управляемом компоненте, но предпочитаю использовать валидатор JSF...

Реальный вопрос заключается в том, как создать валидатор, который обращается к другим компонентам JSF, отличным от проверяемого компонента?

Я использую ADF Faces 11.

Спасибо...


person razenha    schedule 29.09.2009    source источник


Ответы (2)


Реальный вопрос заключается в том, как создать валидатор, который обращается к другим компонентам JSF, отличным от проверяемого компонента?

Не пытайтесь получить доступ к компонентам напрямую; ты пожалеешь об этом. Механизм проверки JSF лучше всего предотвращает попадание мусора в модель.

Вы можете использовать другой тип управляемого компонента; что-то в форме:

/*Request scoped managed bean*/
public class PasswordValidationBean {
  private String input1;
  private String input2;
  private boolean input1Set;

  public void validateField(FacesContext context, UIComponent component,
      Object value) {
    if (input1Set) {
      input2 = (String) value;
      if (input1 == null || input1.length() < 6 || (!input1.equals(input2))) {
        ((EditableValueHolder) component).setValid(false);
        context.addMessage(component.getClientId(context), new FacesMessage(
            "Password must be 6 chars+ & both fields identical"));
      }
    } else {
      input1Set = true;
      input1 = (String) value;
    }
  }
}

Это связано с использованием механизма привязки метода:

<h:form>
  Password: <h:inputSecret
    validator="#{passwordValidationBean.validateField}"
    required="true" />
  Confirm: <h:inputSecret
    validator="#{passwordValidationBean.validateField}"
    required="true" />
  <h:commandButton value="submit to validate" />
  <!-- other bindings omitted -->
  <h:messages />
</h:form>

В будущем вы сможете делать подобные вещи с помощью проверки компонентов (JSR 303< /а>).

person McDowell    schedule 29.09.2009
comment
Выглядит немного некрасиво, но это нормально - person razenha; 29.09.2009
comment
Проверка JSF работает на уровне поля, а не страницы (что-то, что JSF 2 + JSR 303 стремится изменить). Тем не менее, боб, вероятно, можно было бы улучшить. Альтернативой может быть собственный рендерер и/или компонент, но это, возможно, слишком много работы для чего-то подобного. - person McDowell; 30.09.2009

Вы всегда можете получить значение других полей из карты контекста и выполнить проверку нескольких полей. Что-то вроде ниже:

public void  validatePassword2(FacesContext facesContext, UIComponent uIComponent, Object object) throws ValidatorException{
    String fieldVal = (String)object;

    String password1 = (String)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("password1");
    if(!password1.equalsIgnoreCase(fieldVal)){
        FacesMessage message = new FacesMessage("Passwords must match");
        throw new ValidatorException(message);
    }
}   

и jsf выглядит примерно так:

<h:inputSecret value="#{profile.password2}" validator="#{brokerVal.validatePassword2}" required="true" requiredMessage="*required" id="password2" />

ХТН

person Romeo Foxtrot    schedule 28.12.2009
comment
Это не работает для меня :( у меня есть bean-компонент с Bean.password и bean.password2, но если я проверю пароль2 и попытаюсь получить значение пароля, я когда-либо получу нулевое значение - person Markus; 19.10.2010