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, но это может измениться, если это абсолютно необходимо. Может кто-нибудь пролить свет на правильный способ сделать это? Кажется, это должно быть довольно просто, так что я уверен, что просто упускаю что-то очевидное.