我使用自定义验证器。困难在于我只需要检查两个字段inputText并进行比较。第一个字段必须大于第二个字段。如果没有,那么我必须显示带有错误信息的消息。所以我需要传递我的自定义验证器第一个inputText字段的值。为此,我需要读取验证器类中第一个InputText字段的值。如何在验证器类中获取必要组件的id?使用标签的解决方案不适合我。我需要直接转到所需的组件也许这可以通过FacesContext的任何方法来完成?
答案 0 :(得分:11)
只需通过<f:attribute>
传递整个组件。
<h:form id="formId">
<h:inputText value="#{bean.start}">
<f:validator validatorId="rangeValidator" />
<f:attribute name="endComponent" value="#{endComponent}" />
</h:inputText>
...
<h:inputText binding="#{endComponent}" value="#{bean.end}" />
...
</h:form>
(注意:binding
代码是原样的,不要让它引用bean属性!)
with in validator
UIInput endComponent = (UIInput) component.getAttributes().get("endComponent");
Object endComponentValue = endComponent.getSubmittedValue();
// ...
重要提示是组件按照它们在树中的显示顺序进行处理,转换和验证。 UIInput#getSubmittedValue()
可以获得尚未转换/验证的任何组件的提交值,UIInput#getValue()
可以获得已经转换/验证的任何组件。因此,在您的特定示例中,您应该按UIInput#getSubmittedValue()
而不是UIInput#getValue()
获取值。
如果您希望使用UIInput#getValue()
提供的已转换和验证的值,则需要将验证器移动到第二个组件,然后再传递第一个组件。
<h:form id="formId">
<h:inputText binding="#{startComponent}" value="#{bean.start}" />
...
<h:inputText value="#{bean.end}" />
<f:validator validatorId="rangeValidator" />
<f:attribute name="startComponent" value="#{startComponent}" />
</h:inputText>
...
</h:form>
UIInput startComponent = (UIInput) component.getAttributes().get("startComponent");
Object startComponentValue = startComponent.getValue();
// ...
答案 1 :(得分:0)
您可以使用输入字段'name属性从请求参数映射中获取其他字段的值。要获取输入字段的name属性,请执行视图源以查看生成的内容。见下面的例子。
public void validate(FacesContext fc, UIComponent uic, Object o) throws ValidatorException {
String newPassword = fc.getExternalContext().getRequestParameterMap().get("centerForm:newPassword");
String newPassword2 = (String) o;
if(!newPassword.equals(newPassword2)){
FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,"New Passwords do not match", null);
throw new ValidatorException(msg);
}
}