我正在尝试在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());
}
答案 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
。这样可以更轻松地进行失效和消息处理。