Jsf 2 具有richfaces 4的动态列

Jsf 2 具有richfaces 4的动态列,jsf-2,richfaces,servlet-3.0,Jsf 2,Richfaces,Servlet 3.0,我需要动态的列数。Richfaces在Richfaces 3.3.3-final中提供了,但对于Richfaces 4,他们似乎建议使用 c:forEach 我不能让它正常工作。因为我不能依赖datatable中的var,所以我不知道如何使用正确的列列表来馈送。(每行有自己的值,但标题相同) 基本上,我想显示的数据是一个列表,其中行的大小为x,每行的列值的大小为y。但是如何让告诉支持bean它在哪一行,这样我就可以输入正确的列呢 ui/a4j:重复 我不想重新发明轮子,因为我需要冻结列和许多其他

我需要动态的列数。Richfaces在Richfaces 3.3.3-final中提供了
,但对于Richfaces 4,他们似乎建议使用

c:forEach

我不能让它正常工作。因为我不能依赖datatable中的var,所以我不知道如何使用正确的列列表来馈送
。(每行有自己的值,但标题相同)

基本上,我想显示的数据是一个列表,其中行的大小为x,每行的列值的大小为y。但是如何让
告诉支持bean它在哪一行,这样我就可以输入正确的列呢

ui/a4j:重复

我不想重新发明轮子,因为我需要冻结列和许多其他功能。以这种方式创建html表并将jQuery用于其他功能已被考虑。然而,这将是无望的维持和大量的工作

我还研究了如何从支持bean构建它,动态地创建子对象,但我一点也不喜欢这样。这将是最后的手段

使用:Tomcat7、Servlet3.0、JSF2.1x-Mojarra、RichFaces4.x

更新

好的,我终于得到了一些结果。但是,我的标题不显示。这些值可以完美地显示,但不会显示标题。用迭代或者别的什么方法来做这些工作有问题吗

    <rich:dataTable value="#{controller.rows}"
        var="row">
        <c:forEach items="#{controller.columns}" var="column">
            <rd:column id="name" width="250">
                <f:facet name="header">
                    <h:outputText value="#{row.myArrayList[column].header}" />
                </f:facet>
                <h:inputText value="#{row.myArrayList[column].value}"  disabled="#{row.myArrayList[column].open}"/>
            </rd:column>
        </c:forEach>
    </rich:dataTable>

你能得到的
确实是最好的。
无法工作,因为它在视图渲染期间运行,
UIData
组件确实需要
UIColumn
子级,而不是
UIRepeat
子级

为了使
正常工作,您需要为它提供一个所有属性名称的列表/映射(如果是映射,还可能提供标题标签)。下面是一个具体的启动示例,假设
Item
具有属性
id
name
value
,并且
{bean.itemPropertyNames}
返回一个正好包含这些属性名称的
列表

<rich:dataTable value="#{bean.items}" var="item">
    <c:forEach items="#{bean.itemPropertyNames}" var="itemPropertyName">
        <rich:column>
            #{item[itemPropertyName]}
        </rich:column> 
    </c:forEach>
</rich:dataTable>

#{item[itemPropertyName]}
如果您还需要显示列标题,那么最好是使用
映射
,其中键表示属性名称,值表示标题值

<rich:dataTable value="#{bean.items}" var="item">
    <c:forEach items="#{bean.itemProperties}" var="itemProperty">
        <rich:column>
            <f:facet name="header">#{itemProperty.value}</f:facet>
            #{item[itemProperty.key]}
        </rich:column> 
    </c:forEach>
</rich:dataTable>

#{itemProperty.value}
#{item[itemProperty.key]}
无论哪种方式,唯一的缺点是
{bean}
在这个构造中可能不是视图范围的。除非关闭部分状态保存,否则它将在每个请求上重新创建。它需要是请求范围的(或会话或应用程序)。请注意,它不一定需要与
中的bean相同

另见:

你所做的就是使用#{item[itemPropertyName]}这是我找不到的拼图块。基本上,我对使用参数的理解是使用()而不是[]?我将直接测试这个概念,它不代表参数,而是一个动态属性名。另请参见何谓
“大括号符号”一节?
必须是目标组件的直接子级。因此,如果是标记文件/自定义组件,它必须重新连接到
。很抱歉,我试图将表更改为我们自己的表。使用rich:column时没有更改。硬编码的值可以工作,但不能从迭代开始。如果我用header和value切换place,我会得到相反的结果,因此数据就在那里,只是不显示:(显然,
在视图构建时或其他时候对头部进行求值。要确认它,请使用
。如果“有效”,请更改
{controller.columns}
to-be
Map
,其中
K
是属性名,
V
是标题值,这样您就可以使用
来获取工作id,我使用了c:forEach上定义的id=“input#{theCount.index+1}”varStatus=“theCount”