Я взял следующий пример запуска BalusC и немного изменил его, добавив кнопку отправки и дополнительные сообщения h: и удалив f:ajax
из h:inputSecret's
(удалите причину f:ajax
по какой-то причине, когда я покидаю первый h:inputSecret
, он сразу же отображает ошибку "значение требуется" для второго h:inputSecret
- но у пользователя нет возможности ввести его в... Другой вопрос в будущем?:))
ОК, чтобы сделать длинный рассказ коротким:
Я пытаюсь выяснить, как отображать ошибки проверки в отношении обоих полей пароля (что пароли не равны) в глобальных h: сообщениях, а не в отдельном h: сообщении полей пароля
Я хочу, чтобы в поле <h:message
каждого поля отображалось требуемое value = "true"...
Но прямо сейчас сообщение проверки (брошенное моим исключением) и требуемое = "true" отображаются в одном и том же месте
Вот код:
<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}" />
</h:inputSecret>
<h:message id="m_password" for="password" />
<h:outputLabel for="confirm" value="Password (again):" />
<h:inputSecret id="confirm" binding="#{confirmPassword}" required="true">
</h:inputSecret>
<h:message id="m_confirm" for="confirm" />
И еще h:commandButton
с h:messages
ниже этого кода:
<h:commandButton value="doSomething" action="#{myBean.myAction}">
<f:ajax execute="password confirm" render="m_password m_confirm"></f:ajax>
</h:commandButton>
<h:messages globalOnly="true" styleClass="validation_value_required"/>
@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."));
}
}
}
Кроме
Спасибо,
Решение (благодаря BalusC)
изменено
<f:attribute name="confirm" value="#{confirmPassword.submittedValue}" />
к
<f:attribute name="confirm" value="#{confirmPassword}" />
и
String confirm = (String) component.getAttributes().get("confirm");
в
UIInput confirmPasswordComponent = (UIInput) component.getAttributes().get("confirm");
String confirm = (String) confirmPasswordComponent.getSubmittedValue();
и
throw new ValidatorException(new FacesMessage("Passwords are not equal."));
в
context.addMessage(null, new FacesMessage("Passwords are not equal."));
context.validationFailed();
((UIInput) component).setValid(false);
confirmPasswordComponent.setValid(false);
return;