Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation 验证ui内项目的顺序:重复_Validation_Jsf_Uirepeat - Fatal编程技术网

Validation 验证ui内项目的顺序:重复

Validation 验证ui内项目的顺序:重复,validation,jsf,uirepeat,Validation,Jsf,Uirepeat,我正在用JSF2编写一个验证器方法。我的页面中有一个ui:repeat元素,用于呈现项目列表。每个项目都有一个date属性,我需要确保日期按照特定顺序相互对应,例如列表中最后一个项目的日期不早于第一个项目的日期。我试图获取ui中的所有子元素:重复并迭代它们来进行比较,但我真的不知道从哪里开始。我已经了解了如何通过ID获取特定元素: UIInput input = (UIInput) context.getViewRoot().findComponent(elementId); 然而,在ui:r

我正在用JSF2编写一个验证器方法。我的页面中有一个
ui:repeat
元素,用于呈现项目列表。每个项目都有一个date属性,我需要确保日期按照特定顺序相互对应,例如列表中最后一个项目的日期不早于第一个项目的日期。我试图获取ui中的所有子元素:重复并迭代它们来进行比较,但我真的不知道从哪里开始。我已经了解了如何通过ID获取特定元素:

UIInput input = (UIInput) context.getViewRoot().findComponent(elementId);
然而,在
ui:repeat
中,ID值由JSF设置为唯一的,因此我不知道编译时它们是什么。此外,在编译时,我不知道列表中会有多少项


我已经研究了
UIViewRoot
和其他相关类的Javadoc,并尝试了一些方法,但是我发现了一些错误,这些方法都不起作用,我真的不知道我是否已经接近成功。我将我尝试的代码从这篇文章中删除,因为它们可能是一个笑话。

实际上只有一个
组件,其状态根据当前的
UIRepeat
迭代周期而变化。它仅通过其客户端ID可用,而不需要
UIRepeat
索引:
findComponent(“formId:inputId”)
UIRepeat
索引仅在客户端具有重要意义)。但是,如果以这种方式在
UIRepeat
上下文之外以编程方式访问组件,那么它确实会返回一个看似空的状态

要在
UIRepeat
中访问处于所有这些状态的
UIInput
组件并收集其值,您需要运行
UIRepeat

以下是一个启动示例:

<ui:repeat value="#{bean.items}" var="item">
    <f:event type="postValidate" listener="#{bean.validateOrder}" />
    <h:inputText value="#{item.value}" />
</ui:repeat>
注意,它访问树两次;第一次收集值,第二次将这些输入标记为无效。还要注意,这个非常具体的需求不能用标准的JSF验证器来完成。您不能在
上附加
。从理论上讲,将它附加到
上是可能的,但它会导致同一个验证器运行的次数与重复项的数量相同,这是没有意义的。此外,验证器需要以这种方式考虑
getSubmittedValue()
vs
getValue()


OmniFaces有一个在固定组件上执行类似操作的组件,但它不是为在动态重复的组件中使用而设计的。

此验证发生在JSF
postvalidate
阶段,可能会产生一些副作用。然而,对我来说,它似乎是有效的。@Sined:应该没有副作用,除非对生命周期有误解。嗨@BalusC,
h:inputText
中的
f:attribute
似乎不可用?!知道为什么吗?非常感谢。
@SuppressWarnings("rawtypes")
public void validateOrder(ComponentSystemEvent event) {
    final FacesContext context = FacesContext.getCurrentInstance();
    final List<Comparable> values = new ArrayList<Comparable>();

    event.getComponent().visitTree(VisitContext.createVisitContext(context), new VisitCallback() {
        @Override
        public VisitResult visit(VisitContext context, UIComponent target) {
            if (target instanceof UIInput) {
                values.add((Comparable) ((UIInput) target).getValue());
            }
            return VisitResult.ACCEPT;
        }
    });

    boolean ordered = new ArrayList<Comparable>(new TreeSet<Comparable>(values)).equals(values);

    if (!ordered) {
        event.getComponent().visitTree(VisitContext.createVisitContext(context), new VisitCallback() {
            @Override
            public VisitResult visit(VisitContext context, UIComponent target) {
                if (target instanceof UIInput) {
                    ((UIInput) target).setValid(false);
                }
                return VisitResult.ACCEPT;
            }
        });

        context.validationFailed();
        context.addMessage(null, new FacesMessage("Values are not in order!"));
    }
}