Прежде всего, используйте real Validator
для проверки ввода.Не делайте этого в методе события действия.
Что касается конкретной проблемы, вам просто нужно указать оба поля в атрибуте execute
<f:ajax>
, этоа именно по умолчанию только текущий компонент.Если вы присоедините валидатор к первому входу и отправите значение второго входа как <f:attribute>
, то вы сможете получить его в валидаторе.Вы можете использовать атрибут binding
для привязки компонента к представлению.Таким образом, вы можете передать переданное значение на UIInput#getSubmittedValue()
.
Вот пример запуска:
<h:outputLabel for="password" value="Password:" />
<h:inputSecret id="password" value="#{bean.password}" required="true">
<f:validator validatorId="confirmPasswordValidator" />
<f:attribute name="confirm" value="#{confirmPassword.submittedValue}" />
<f:ajax event="blur" execute="password confirm" render="m_password" />
</h:inputSecret>
<h:message id="m_password" for="password" />
<h:outputLabel for="confirm" value="Password (again):" />
<h:inputSecret id="confirm" binding="#{confirmPassword}" required="true">
<f:ajax event="blur" execute="password confirm" render="m_password m_confirm" />
</h:inputSecret>
<h:message id="m_confirm" for="confirm" />
(обратите внимание, что я добавил required="true"
к обоим компонентам, а также обратите внимание, что вам не обязательно связывать компонент подтверждения паролязначение свойства управляемого бина, оно все равно там бесполезно)
с этим валидатором
@FacesValidator("confirmPasswordValidator")
public class ConfirmPasswordValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
String password = (String) value;
String confirm = (String) component.getAttributes().get("confirm");
if (password == null || confirm == null) {
return; // Just ignore and let required="true" do its job.
}
if (!password.equals(confirm)) {
throw new ValidatorException(new FacesMessage("Passwords are not equal."));
}
}
}