如何遍历屏幕上显示的所有组件

时间:2010-09-18 22:35:25

标签: java jsf

我有一个高度动态的单页面界面,其中各种用户事件触发新字段显示在屏幕上。我使用jsf 1.1和基本ajax而无法使用部分提交。由于这些限制,我已将所有字段标记为虚假且立即错误。这个想法是仅在用户尝试转换到动作方法中的下一页时才进行验证,而不是当它们选中并执行ajax事件时。我立即设置为false,因为我需要输入才能使其成为模态,因此我可以根据业务逻辑有条件地呈现某些字段。

问题:我提前知道“可能的”UIInput ID列表,它可能会在任何给定时间显示在屏幕上,也可能不会显示。我的目标是迭代所有这些UIInputs,检查它们是否被渲染,而不是null,而不是为空,否则将UIInput标记为错误。

除了屏幕上未显示的字段外,此方法有效。例如,我有一个字段“amountInput”,它将XHTML呈现属性设置为false,因此它不会显示在屏幕上。从显示的角度来看,这是有效的,但是在调用我的动作时,该字段仍然将其呈现的属性显示为true,因此我无法知道是否应该验证它。

我有什么选择?

    public boolean validate() {
    boolean hasValidMinimumData = true;

    final List<UIInput> componentList = getComponentList();
    if (CollectionUtils.isNotEmpty(componentList)) {
        for (UIInput curComponent : componentList) {
            final Object curComponentValue = curComponent.getValue();
            if (curComponent.isRendered() && (curComponentValue == null || isNoValue(curComponent))) {
                setError(curComponent); // applies the error
                hasValidMinimumData = false;
            }
        }
    }

    return hasValidMinimumData;
}

2 个答案:

答案 0 :(得分:1)

您需要注意在表单提交请求期间保留与rendered属性结果完全相同的条件,就像在初始显示期间一样。

最简单的方法是将bean负责条件在会话范围内。如果您希望将其纳入请求范围(这是一个非常合理的决定),那么我建议您为此获取Tomahawk's t:saveState

<t:saveState value="#{bean}" />

那就是说,你有没有考虑过Ajax4jsf?它与JSF 1.1兼容,并提供Ajax与JSF的透明集成。

答案 1 :(得分:0)

解决!问题是,在我的XHTML中,我在包含输入组件的表组件上设置了呈现属性。我认为这会在所有孩子身上适当地设置渲染属性,但显然不是。

在我的XHTML中简单地在实际输入组件上设置条件渲染属性解决了这个问题。