gpt4 book ai didi

jsf - 如何通过ajax验证两个密码字段?

转载 作者:行者123 更新时间:2023-12-02 08:38:27 24 4
gpt4 key购买 nike

我正在尝试使用 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>

这就是我的 Controller :

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);
}

大家有什么想法吗?

最佳答案

首先,使用真实 Validator 验证输入。不要在操作事件方法中执行此操作。

对于您的具体问题,您只需指定 execute 中的两个字段即可。 <f:ajax> 的属性,即默认仅当前组件。如果将验证器附加到第一个输入并将第二个输入的值作为 <f:attribute> 发送,然后您就可以在验证器中获取它。您可以使用 binding属性将组件绑定(bind)到 View 。这样您就可以通过 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",并且还请注意,您不一定需要将确认密码组件值绑定(bind)到托管 bean 属性,无论如何它在那里毫无值(value))

使用此验证器

@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."));
}
}

}

关于jsf - 如何通过ajax验证两个密码字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7489893/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com