DataTable с динамическими столбцами - PullRequest
15 голосов
/ 01 июня 2010

Я совершенно новичок в 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>

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

Ответы [ 2 ]

12 голосов
/ 01 июня 2010

JSTL и JSF не работают синхронно, как вы ожидаете от кодирования. Тем более, что JSTL сначала обрабатывает всю страницу сверху вниз, а затем передает результат в JSF для дальнейшей обработки. #{row} недоступен, когда JSTL занят, поэтому ваша попытка действительно не будет работать.

Связанная тема действительно упоминает устаревшие методы, но тема также устарела и обсуждает устаревшую версию JSF 1.0 / 1.1. Если вы изучите текущие Javadocs упомянутых методов, вы увидите, что, как обычно, упоминаются методы замены. Например, Application#createValueBinding() упоминает следующее:

Устаревшие . Это было заменено вызовом getExpressionFactory() затем ExpressionFactory.createValueExpression(javax.el.ELContext, java.lang.String, java.lang.Class).

Вы можете найти конкретные примеры динамического заполнения данных таким способом в этой статье .

Что касается сторонних библиотек компонентов, RichFaces имеет компонент rich:columns, который предназначен именно для этой цели.

0 голосов
/ 01 сентября 2014

Сторонняя библиотека PrimeFaces имеет компонент p:columns для динамического создания столбцов из источника данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...