Как проверить два поля пароля с помощью ajax?
Я пытаюсь проверить два поля пароля с помощью JSF, но до сих пор нехорошо, я искал его в google, но все было о JSF 1.2 и довольно запутанно, я использую JSF 2.0.
Это то, что я делаю до сих пор:
<h:outputLabel for="password" value="Password:" />
<h:inputSecret id="password" value="#{register.user.password}" >
<f:ajax event="blur" listener="#{register.validatePassword}" render="m_password" />
</h:inputSecret>
<rich:message id="m_password" for="password"/>
<h:outputLabel for="password_2" value="Password (again):" />
<h:inputSecret id="password_2" value="#{register.user.password_2}" >
<f:ajax event="blur" listener="#{register.validatePassword}" />
</h:inputSecret>
Вот как я это мой контроллер:
public void validatePassword() {
FacesMessage message;
if (!user.getPassword().equals(user.getPassword_2()) ){
message = new FacesMessage(FacesMessage.SEVERITY_ERROR, null, "different password");
}else{
message = new FacesMessage(FacesMessage.SEVERITY_INFO, null, "ok");
}
FacesContext.getCurrentInstance().addMessage("form:password", message);
}
Любые идеи ребята?
Ответы
Ответ 1
Прежде всего, для подтверждения ввода используйте реальный 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"
к обоим компонентам, а также обратите внимание, что вам необязательно привязывать значение компонента подтверждения пароля к управляемому свойству bean, оно все равно бесполезно)
с помощью этого валидатора
@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."));
}
}
}
Ответ 2
С швом 2 у вас есть компонент <s:validateEquality>
, и вам не нужно писать код. Для JSF2 у вас есть модули Seam 3, особенно Faces module и проверка прозрачности в поперечном поле. Пример:
Сначала вы должны использовать тег s:validateForm
:
<h:form id="passwordForm">
<h:inputSecret id="newPassword"
required="true"
redisplay="true"
value="#{passwordController.newPassword}">
</h:inputSecret>
<h:inputSecret id="confirmationPassword"
value="#{passwordController.confirmPassword}"
required="true"
redisplay="true">
</h:inputSecret>
<h:commandButton id="submit" value="Submit" action="#{passwordController.submitPassword}" />
<s:validateForm validatorId="passwordValidator" />
</h:form>
и соответствующий валидатор для формы пароля выше будет выглядеть так:
@FacesValidator("PasswordValidator")
public class PasswordValidator implements Validator
{
@Inject
@InputField
private String newPassword;
@Inject
@InputField
private String confirmPassword;
@Override
public void validate(final FacesContext context, final UIComponent comp, final Object values) throws ValidatorException
{
if (!confirmPassword.equals(newPassword))
{
throw new ValidatorException(new FacesMessage("Passwords do not match!"));
}
}
}
Ответ 3
Вы можете использовать Primefaces p: пароль. См. Демонстрационный пример . Он имеет атрибут match, который должен быть идентификатором пароля подтверждения.
<p:panel header="Match Mode">
<p:messages id="messages" showDetail="true" autoUpdate="true"/>
<h:panelGrid columns="2" id="matchGrid">
<h:outputLabel for="pass" value="Password " />
<p:password id="pass" value="#{passwordBean.password}" match="confirmPass" required="true"/>
<h:outputLabel for="confirmPass" value="Confirm Password " />
<p:password id="confirmPass" value="#{passwordBean.confirmPassword}" required="true"/>
</h:panelGrid>
<p:commandButton id="saveButton" update="matchGrid" value="Save" />
</p:panel>