带有richfaces 4的动态列

Posted

技术标签:

【中文标题】带有richfaces 4的动态列【英文标题】:Dynamic columns with richfaces 4 【发布时间】:2012-11-29 21:48:43 【问题描述】:

我需要动态列数。 Richfaces 在richfaces 3.3.3-final 中为其提供<rich:columns>,但对于Richfaces 4,他们似乎推荐<c:forEach>

c:forEach

我无法让它正常工作。由于我不能依赖数据表中的 var,我无法弄清楚如何为 <c:forEach> 提供正确的列列表。 (每一行都有自己的值,但标题相同)

基本上我要显示的数据是一个 x 大小的行列表,每一行都有一个 y 大小的列值列表。但是如何让<c:forEach> 告诉支持 bean 它在哪一行,以便我可以提供正确的列?

ui/a4j:重复

我不想重新发明***,因为我需要冻结列和许多其他功能。已经考虑过以这种方式创建表格 html 并使用 jQuery 来实现其他功能。然而,这将是毫无希望的维护和大量的工作。

我还研究了从支持 bean 动态创建子级来构建它,但我一点也不喜欢那样。这必须是最后的手段。

使用:Tomcat 7、servlet 3.0、JSF 2.1x - Mojarra、Richfaces 4.x

更新

好的,我终于得到了一些结果。但是我的标题没有显示。这些值显示完美,但不显示标题。用迭代或其他东西做它们有什么问题吗?

    <rich:dataTable value="#controller.rows"
        var="row">
        <c:forEach items="#controller.columns" var="column">
            <rd:column id="name" >
                <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>

【问题讨论】:

为了让 id 工作,我使用了 c:forEach 上定义的 id="input#theCount.index+1" varStatus="theCount" 【参考方案1】:

&lt;c:forEach&gt; 确实是你能得到的最好的。 &lt;ui/a4j:repeat&gt; 不会在视图渲染期间运行,而 UIData 组件确实需要 UIColumn 子级,而不是 UIRepeat 子级。

为了让&lt;c:forEach&gt; 工作,您需要向它提供所有属性名称的列表/映射(如果是映射,可能还有标题标签)。这是一个具体的启动示例,假设Item 具有属性idnamevalue,并且#bean.itemPropertyNames 返回具有这些属性名称的List&lt;String&gt;

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

如果您还需要显示列标题,那么最好有一个Map&lt;String, String&gt;,其中键代表属性名称,值代表标题值。

<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>

无论哪种方式,唯一的缺点是&lt;c:forEach items&gt;#bean 在此构造中不能是视图范围的。除非您关闭部分状态保存,否则它将在每次请求时重新创建。它需要是一个请求范围的请求(或会话或应用程序)。请注意,它不一定需要与 &lt;rich:dataTable value&gt; 中的 bean 相同。

另见:

Dynamically generate h:column based on list of hashmaps

【讨论】:

您所做的是使用#item[itemPropertyName] 那是我永远找不到的缺失拼图。基本上我对使用参数的理解是你使用()而不是[]?我将立即测试这个概念 不代表参数,而是动态属性名。另请参阅***.com/tags/el/info 的“大括号表示法”部分 什么是&lt;rd:column&gt;&lt;f:facet&gt; 必须是目标组件的直接子级。因此,如果是标记文件/自定义组件,则必须将其重新附加到 &lt;rich:column&gt; 对不起,我试图将表更改为我们自己的。使用rich:column 时没有变化。硬编码值有效,但不适用于迭代。如果我用标题和值切换位置,我会得到相反的结果,所以数据在那里,只是没有显示:( 显然&lt;rich:column&gt; 在视图构建时间或其他时间评估标题。要确认它,请使用&lt;h:outputText value="#column" /&gt;。如果“有效”,请将#controller.columns 更改为Map&lt;K,V&gt;,其中K 是属性名称,V 是标头值,以便您可以使用&lt;h:outputText value="#column.value" /&gt;&lt;h:inputText value="#row.myArrayList[column.key].value" /&gt;

以上是关于带有richfaces 4的动态列的主要内容,如果未能解决你的问题,请参考以下文章

带有 Mojarra 2.1.28 和 RichFaces 4.3 的 Internet Explorer Ajax 错误

集群环境中的故障​​转移不适用于 JSF 2、Richfaces 4、Tomcat 7

使用带有 JBoss AS7 的 SSL 中断连接(Richfaces 页面)

Richfaces 列过滤器:如何在介绍键上触发事件

未找到 JSF2.0 标记

RichFaces 中的服务器端 DataTable 排序