【发布时间】:2012-04-17 22:39:02
【问题描述】:
我采用了以下 BalusC kickoff example 并通过添加提交按钮和附加 h:messages 并从 h:inputSecret's 中删除 f:ajax 对其进行了一些修改(当我离开时出于某种原因删除了 f:ajax第一个h:inputSecret 它立即显示第二个h:inputSecret 的“值是必需的”错误 - 但用户没有机会输入它...... ???
好的,长话短说:
我试图弄清楚如何在全局 h:messages 中而不是在密码字段的单个 h:message 中显示关于两个密码字段(密码不相等)的验证错误
我确实希望 required="true" 将显示在每个字段的<h:message...
但现在验证消息(由我的异常抛出)和 required="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;
【问题讨论】:
标签: validation jsf jsf-2