2

我试图在 bean 的操作方法期间收集UIInput组件内的UIData组件值,以验证重复值。我试图将UIInput组件绑定到一个 bean 属性并获取它的值,但它会打印null. 如果我将它放在数据表之外,那么它会打印预期值。数据表有问题吗?

<rich:dataTable binding="#{bean.table}" value="#{bean.data}" var="item">
    <h:column>
        <f:facet name="header">
            <h:outputText value="Field1" />
        </f:facet>
        <h:inputText binding="#{bean.input}" value="#{item.field1}" />
    </h:column>
</rich:dataTable>

这是支持 bean 的代码:

private UIData table;
private UIInput input;

public void save() {
    System.out.println(input.getId() + " - " + input.getValue());
}
4

1 回答 1

1

数据表没有任何问题。JSF 组件树中只有一个 UIInput组件,每当父UIData组件遍历模型的每个项目时,它的状态都会改变。因此,状态仅UIData迭代期间可用,而不是之前或之后。您试图在 bean 的 action 方法中访问单个组件的值,而父UIData组件没有对其进行迭代,因此这些值将始终返回null

您需要访问组件树并收集执行中感兴趣的UIComponent#visitTree()信息。UIDataVisitCallback

table.visitTree(VisitContext.createVisitContext(FacesContext.getCurrentInstance()), new VisitCallback() {
    @Override
    public VisitResult visit(VisitContext context, UIComponent target) {
        if (target instanceof UIInput) {
            UIInput input = (UIInput) target;
            System.out.println("id: " + input.getId());
            System.out.println("value: " + input.getValue());
        }

        return VisitResult.ACCEPT;
    }
});

顺便说一句,您通常会ValidatorUIInput组件上使用法线执行验证,或者在这种特殊情况下可能更好,使用ValueChangeListener. 这允许更容易的失效和消息处理。

于 2012-05-19T15:00:27.700 回答