JSF转换器和验证器的调用序列
我想知道调用顺序或流程,以及如何调用转换器和验证器。我正在分享一个相同的示例代码:JSF转换器和验证器的调用序列,jsf,Jsf,我想知道调用顺序或流程,以及如何调用转换器和验证器。我正在分享一个相同的示例代码: <f:view> <h:form> <h:inputText value="#{myBean.field}"> <f:validateLength minimum="5" maximum="50"></f:validateLength> <f:validator validat
<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>
所有组件(
和好友)的处理顺序与它们在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);
}
}
(您可以在方法中看到真实的源代码)
因此,基本上,它的顺序与您在XHTML标记中看到的完全相同。仅在第二次输入时,第二个转换器已超过第一个转换器。一个输入组件只能有一个转换器。多个转换器在技术上没有任何意义