0

如何实现复合组件的跨字段验证?我使用的复合组件是一个输入文本框(一个用于电子邮件,第二个用于确认电子邮件)。我为 confirmEmail 组件应用了 f:validator 标签。如何在 validate 方法中获取 email 复合组件的值。是 UIComponent 还是 UINamingContainer?

4

2 回答 2

0

我已经实现了上面讨论的 validate 方法。我认为我的代码的问题是在复合组件上使用 f:validate 标记的位置。

<eg:inputText id="confirmEmail" value="backingbean.email"/>

<eg:inputText id="email" value="backingbean.email">
<f:validator validatorId="core.jsf.CompareValidator" for="inputText"/>
</eg:inputText>

但是当我提交表单时,不会调用验证器。我应该将验证器包裹在组件周围还是这是正确的实现方式。

于 2011-03-25T01:19:52.970 回答
0

从技术上讲,您的组合是一个 UINamingcontainer,但任何组件都可以找到它的子组件。

我怀疑类似以下的东西应该有效

public void validate(FacesContext context, UIComponent component, Object value) {
    UIInput first = (UIInput)component.findComponent("compositesFirstInputID");
    UIInput second = (UIInput)component.findComponent("compositessecondInputID");

    Object firstEntry = first.getSubmittedValue();
    Object secondEntry = second.getSubmittedValue();
    if(!firstEntry.equals(secondEntry))
        throw new ValidatorException(...);
}

可能想要添加一些空值检查,可能是 trim() 并使用 equlasIgnoreCase。

于 2011-03-23T21:58:58.020 回答