如何在bean的action方法中收集UIData组件内的UIInput组件的值?

时间:2012-05-19 12:56:32

标签: jsf-2 datatable richfaces

我正在尝试在bean的action方法中收集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());
}

1 个答案:

答案 0 :(得分:1)

数据表没有任何问题。 JSF组件树中只有只有一个 UIInput组件,只要父UIData组件迭代模型的每个项目,其状态就会随时更改。因此,状态仅在 UIData迭代期间可用,而不是在之前或之后。您正在尝试访问bean的action方法中单个组件的值,而父UIData组件没有迭代它,因此值将始终返回null

您需要UIData上的UIComponent#visitTree()访问组件树,并收集VisitCallback实施中感兴趣的信息。

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;
    }
});

顺便说一句,您通常会使用Validator组件上的正常UIInput执行验证,或者在这种特殊情况下可能更好,ValueChangeListener。这样可以更轻松地进行失效和消息处理。