ADF和JDeveloper都是新手。也是第一次在Stack Exchange上发帖。
商业案例:
我想从数据库中获取一些数据,显示为只有叶子(最低级别节点)的复选框的树。 然后,我希望用户能够检查任意复选框,单击提交按钮,然后让应用程序对托管bean中的数据(特别是选中的复选框)执行各种操作。数据不需要保存回数据库,只能以编程方式进行操作。
我采取的步骤:
我已经设置了与数据库绑定的实体对象,创建了View Objects并将它们添加到了Application Module。然后,我将名为Selected的布尔瞬态属性添加到最低级别的视图对象,将Updatable设置为Always。我创建了Facelets页面并进行拖放以创建一个像我想要的那样显示的树。
我从Data Control创建了另一个与Selected属性的绑定,并在nodeStamp facet下的outputText之后创建了一个selectBooleanCheckbox。然后我调整了渲染的属性,因此它只会渲染最低级别的节点。
到目前为止一切顺利。树显示并且看起来很棒。
然后我创建了一个commandButton,并在名为TreeTest的请求范围的托管bean中创建了一个绑定到名为submitTree的方法的操作。我的Facelet页面的表单组件现在看起来像这样:
<af:form id="f1">
<af:commandButton text="Submit" id="cb2" action="#{TreeTestBean.submitTree}" />
<af:tree summary="A generic summary." id="t1"
value="#{bindings.TopLevelVO.treeModel}" var="node" rowSelection="none"
selectionListener="#{bindings.TopLevelVO.treeModel.makeCurrent}">
<f:facet name="nodeStamp">
<af:group id="g1">
<af:selectBooleanCheckbox value="#{node.Selected}" id="sbc1"
rendered="#{node.AccessDisplayName != null ? true : false}" />
<af:outputText value="#{node}" id="ot1"/>
</af:group>
</f:facet>
</af:tree>
</af:form>
我现在在绑定上使用迭代器方法,并编辑了我的支持bean代码,如下所示:
public class TreeTestBean {
public void submitTree(){
BindingContainer bindings = ADFUtils.getBindingContainer();
DCIteratorBinding dcIteratorBinding = (DCIteratorBinding) bindings.get("TopLevelVOIterator");
TopLevelVOImpl topLevelVO = (TopLevelVOImpl) dcIteratorBinding.getViewObject();
RowSetIterator rowSetIterator = topLevelVO.createRowSetIterator(null);
while (rowSetIterator.hasNext()){
TopLevelVORowImpl applicationVORow = (TopLevelVORowImpl) rowSetIterator.next();
ViewRowSetImpl secondLevelRowSet = (ViewRowSetImpl) topLevelVORow.getsecondLevelVO();
while (secondLevelRowSet.hasNext()){
SecondLevelVORowImpl secondLevelVORow = (SecondLevelVORowImpl) secondLevelRowSet.next();
ViewRowSetImpl bottomLevelRowSetImpl = (ViewRowSetImpl) secondLevelpVORow.getBottomLevelVO();
while (bottomLevelRowSetImpl.hasNext()){
BottomLevelVORowImpl bottomLevelVORow = (BottomLevelVORowImpl) bottomLevelRowSetImpl.next();
logger.info(bottomLevelVORow.getBottomLevelName() + " selected: " + bottomLevelVORow.getSelected());
}
}
}
rowSetIterator.closeRowSetIterator();
}
所以,似乎我正在迭代树。 getBottomLevelName正确打印出我想要的值。复选框从null开始。当我检查其中的一些时,我检查的那些将显示为假(并且检查被清除)。所有其余的都保持无效。我觉得在范围和/或生命周期中有一些我误解的东西。