Apache MyFaces Trinidad: динамические теги <tr: column /> внутри <tr: table /> - PullRequest
1 голос
/ 11 июня 2011

У меня есть простое требование: число столбцов в моем <tr:table/> является динамическим. У меня будет список объектов, someBean.features, который будет определять количество отображаемых столбцов.

Следующая диаграмма должна прояснить мое требование.

Table with dynamic columns

В коде, который мне дали, было использование тега JSTL <c:forEach/>, что, очевидно, создавало проблемы при использовании в среде JSF. Они сделали что-то вроде этого:

<tr:table value="#{someBean.values}">
    <tr:column headerText="Name">
        <tr:outputText value="#{someBean.name}"/>
    </tr:column>
    <c:forEach var="col" items="#{someBean.features}">
        <tr:column headerText="Column-#{col.id}">
            <tr:outputText value="#{col.name}"/>
        </tr:column>
    </c:forEach>
</tr:table>

Но когда я профилировал приведенный выше код, метод someBean.getValues, который является входом для тега <tr:table/> выше, вызывался несколько тысяч раз, а не примерно 20. Это - как я выяснил - было связано с тот факт, что тег <c:forEach/> является тегом времени компиляции, где <tr:*/> - теги времени рендеринга.

Итак, вот что я намерен сделать (заменить <c:forEach/> на <tr:iterator/>:

<tr:table value="#{someBean.values}">
    <tr:column headerText="Name">
        <tr:outputText value="#{someBean.name}"/>
    </tr:column>
    <tr:iterator var="col" value="#{someBean.features}">
        <tr:column headerText="Column-#{col.id}">
            <tr:outputText value="#{col.name}"/>
        </tr:column>
    </tr:iterator>
</tr:table>

Но по какой-то причине <tr:iterator/> не похоже на то, что его помещают в <tr:table/>, и он никогда не выполняется.

Любое решение, советы, рекомендации будут с благодарностью.

Да, и мы используем JSF 1.1 с реализацией MyFaces Trinidad 1.0.13.

Спасибо.

Ответы [ 2 ]

1 голос
/ 03 июля 2011

Единственный способ, которым я думаю (о котором вы, возможно, уже знаете;)) - это написать extension UIXTable и предоставить собственный обработчик тегов для обработки <tr:columns items="#{columns}"> и развернуть массив столбцов в столбцы html

1 голос
/ 11 июня 2011

Геттер-вызов - это особенно дешевая операция.Если ваши добытчики выполняют свою работу так, как они предназначены, просто возвращая свойство бина , то это действительно не должно причинить вреда.

Эта проблема создает у меня впечатление, что вы неправильно выполняете какую-то дорогостоящую бизнес-работу внутри метода получения, а не конструктора или какого-либо метода события, который вызывается только один раз по запросу.Вы должны действительно исправить это соответственно.Геттеры не должны выполнять какую-либо деловую работу или, в лучшем случае, просто выполнять ленивую загрузку.

Относительно того, почему <c:forEach> работает, а <tr:iterator> нет, это потому, что теги JSTL выполняются во время построения представления, а не во время визуализации представления, и что единственный действительный дочерний элемент компонента UIData являетсяUIColumn компонент.В основном, когда представление должно быть построено, все JSTL-теги будут работать, и вы получите чистый JSF-вид со всеми <tr:column> уже в нужных местах.Когда представление будет отображено, все теги JSF будут запущены, и вы получите чистый HTML-результат, который затем можно будет отправить в браузер.

См. Также:

...