6

我想知道如何调用转换器和验证器的调用顺序或流程。我正在共享相同的示例代码:

<f:view>
    <h:form>
        <h:inputText value="#{myBean.field}">
            <f:validateLength minimum="5" maximum="50"></f:validateLength>
            <f:validator validatorId="nameValidator" />
        </h:inputText>
        <br>
        <h:inputText id="date" value="#{myBean.date}">
            <f:convertDateTime pattern="dd-MMM-yyyy" />
            <f:converter converterId="dateConvertor" />
        </h:inputText>
        <br>
        <h:commandButton action="#{myBean.execute}" value="Submit"></h:commandButton>
    </h:form>
    <h:messages></h:messages>
</f:view>
4

1 回答 1

15

所有UIInput组件(<h:inputText>和朋友)都按照它们在 JSF 组件树中出现的顺序进行处理。在处理这样的组件期间,首先调用转换器(看,不是复数!),然后按照在组件上声明它们的相同顺序调用验证器。

在过度简化的 Java 代码中,在验证阶段的过程是这样的:

for (UIInput input : inputs) {
    String id = input.getClientId(context);
    Object value = input.getSubmittedValue();
    try {
        value = input.getConvertedValue(context, value);
        for (Validator validator : input.getValidators())
           validator.validate(context, input, value);
        }
        input.setSubmittedValue(null);
        input.setValue(value);
    } catch (ConverterException | ValidatorException e) {
        facesContext.addMessage(id, e.getFacesMessage());
        facesContext.validationFailed(); // Skips phases 4+5.
        input.setValid(false);
    }
}

(你可以在方法中看到真正的源代码UIInput#validate()

因此,基本上,它的顺序与您在 XHTML 标记中看到的顺序完全相同。只有在您的第二个输入上,第二个转换器才覆盖了第一个转换器。一个输入组件只能有一个转换器。多个转换器在技术上没有任何意义。

于 2013-08-27T10:37:04.443 回答