在JSF中处理复杂的Bean树

时间:2009-05-06 22:16:05

标签: jsf javabeans

让我们来看看这个bean结构,例如:

public class Abean {
   private Bbean b;
}

public class Bbean {
   private ArrayList<Cbean> c;
}

public class Cbean {
   private ArrayList<Dbean> d;
}

public class Dbean {
    ....
}

所以基本上Abean包含了一切。现在我想为所有这些bean创建JSP,例如,用户可以在Cbean中告诉他/她想要多少Bbean。所以我的问题是我想自动显示所有“子”实例的表单,例如:在d.jsp上我想为Dbean内的每个Cbeans显示一个表单。

我试图嵌入<h:dataTable> - s,但没有成功。任何帮助或想法将不胜感激。我希望我的解释清楚。

提前致谢, 丹尼尔

3 个答案:

答案 0 :(得分:1)

我认为既然你正在使用JSP而你没有使用Facelets?

如果你是,那么你可以利用它并手动建立一个带有嵌套表的表。

例如

<table> 
<ui:repeat value="#{myCBEan.d}" var="myDBean">
   <tr>
      <td><h:outputText value="#{myDBean.someText}"/></td>
   </tr>
</ui:repeat>
</table>

另外,Richfaces有一个 a4j:repeat ,它可以做同样的事情,毫无疑问可以用于JSP。此外,Richfaces还有一个 rich:subTable ,可用于嵌套表格。

答案 1 :(得分:1)

嵌套dataTable通常不是一个好主意。使用这种深度数据结构,您最终可能会对子控件进行O(n ^ 4)次迭代,这可能会对性能产生影响。标准的dataTable控件很原始。更好的方法是使用某种形式的master/detail设计或编写自定义树控件。由于编写自定义控件需要详细了解JSF体系结构,因此您可能首先要查看第三方JSF库,看看是否能找到适合您需求的库。

答案 2 :(得分:0)

我不确定这会解决您的问题,但是例如在您的CBean中,如果您有列表“d”的getter,则可以使用JSTL遍历您的CBean中的DBean。

<c:forEach items="#{myCBean.d}" var="myDBean">
    <h:form>
        <!-- example form content -->
        <h:outputText value="#{myDBean.someText}"/>
        <h:inputText value="#{myDBean.exampleInput}"/>
        <h:commandButton value="#{myDBean.anAction}"/>
    </h:form>
</c:forEach>