DataTable с динамическими столбцами

Я совершенно новичок в JSF и просто пытаюсь проверить концепцию, чтобы решить, будет ли она полезна для проекта. Мой POC просто состоит из одной страницы с таблицей, содержащей некоторые данные.

Количество столбцов (а также количество строк) является динамическим и загружается из базы данных перед визуализацией страницы.

С помощью следующего я получаю два статических столбца с соответствующим количеством строк, как и следовало ожидать:

<h:dataTable id="data" value="#{viewDataBean.dataRows}" var="row">
    <h:column>
        <f:facet name="header">
            <h:outputText value="Col 1"/>
        </f:facet>
        <h:outputText value="#{row.values[0].value}"/>
    </h:column>
    <h:column>
        <f:facet name="header">
            <h:outputText value="Col 2"/>
        </f:facet>
        <h:outputText value="#{row.values[1].value}"/>
    </h:column>
</h:dataTable>

Что я хотел сделать, это добавить<c:forEach...> вокруг одного набора<h:column>...</h:column> теги, для итерации по количеству столбцов, но это не сработало - я пробовал различные комбинации, но ожидал, что что-то подобное сработает:

<h:dataTable id="data" value="#{viewDataBean.dataRows}" var="row">
    <c:forEach items="#{row.values}" var="val">
        <h:column>
            <f:facet name="header">
                <h:outputText value="Col 1"/>
            </f:facet>
            <h:outputText value="#{val.value}"/>
        </h:column>
    </c:forEach>
</h:dataTable>

От Google, я читал различные расплывчатые комментарии, такие как «это не способ сделать это», но я не смог найти особо убедительных примеров правильного пути. Кто-то упомянул создание DataTable в компоненте поддержки, но единственный пример, который я смог найти, былhttp://forums.sun.com/thread.jspa?threadID=577589, Это сработало, но выглядело немного неуклюже, тем более что некоторые из используемых методов устарели.

На данный момент маловероятно, что я смогу использовать любые библиотеки, кроме ядра JSF, но это может измениться, если это абсолютно необходимо. Может кто-нибудь пролить свет на правильный способ сделать это? Кажется, это должно быть довольно просто, так что я уверен, что просто упускаю что-то очевидное.

Ответы на вопрос(2)

Ваш ответ на вопрос