Как использовать ui:include внутри forEach и использовать переменную цикла внутри включенной страницы?

Я обновляюсь до JSF 2.0.2 внутри Tomcat 7.0.12, и у меня есть страница с переменным количеством повторно используемых виджетов. Я использовал для этой цели t: aliasBean, но, похоже, он не работает. Сейчас я пытаюсь сделать следующее в своем Xhtml:

<c:forEach items="${viewBean.currentView.parts}" var="part">
<t:div styleClass="div#{viewBean.partNumber[part]}">
    <c:forEach items="${part.widgets}" var="widget">
        <f:subview id="div#{viewBean.widgetId[widget]}">
            <ui:include src="widgets/#{widget.widgetPage}">
                <ui:param name="widget" value="#{widget}" />
            </ui:include>
        </f:subview>
    </c:forEach>
</t:div>
</c:forEach> 

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

Изменить: я пробовал ui:repeat - не работает. Я также попытался удалить ui:include, как тест на работоспособность; цикл работает нормально. Кроме того, я использую Spring 2.5.6.SEC01, хотя это не имеет значения.


person Adam L Davis    schedule 26.04.2011    source источник
comment
Я пытаюсь сделать что-то подобное. Вы нашли решение с тех пор, как опубликовали этот вопрос? Прошло некоторое время с тех пор, как кто-то еще ответил.   -  person Mr. Lance E Sloan    schedule 08.08.2012
comment
Я программно создаю новый xhtml и копирую в него виджеты. Затем я включаю это. Это не идеально, но я не могу заставить его работать иначе.   -  person Adam L Davis    schedule 27.09.2012


Ответы (1)


Я предлагаю использовать ui:repeat вместо c:forEach.

Почему?

Самое важное, что нужно понять о тегах jstl в Facelets, это то, что они не представляют компоненты и никогда не становятся частью дерева компонентов после построения представления. Скорее, это теги, которые в первую очередь отвечают за построение дерева. Как только они выполнили свою работу, они истекают, их больше нет, они перестают существовать и т. д. и т. д.

Источник [здесь][1]. Очень рекомендую прочитать всю статью.

ОБНОВЛЕНИЕ:

Обратите внимание, я не говорю, что c:forEach плохой. Хочу подчеркнуть, что смешивать его с ui:repeat не рекомендуется. [1]: https://rogerkeays.com/jsf-c-foreach-vs-ui-repeat

person Cristian Boariu    schedule 26.04.2011
comment
Согласен с этим пунктом, и эта ссылка превосходна. Одна проблема, с которой он все еще может столкнуться, заключается в том, что атрибут id f:subview (и, честно говоря, id большинства компонентов jsf) не принимает ValueExpression, а только строку, поэтому я не уверен, что переход на ui:repeat поможет в этом. Это дело. - person digitaljoel; 27.04.2011
comment
Я это читал. Очевидно, вы этого не сделали, потому что в нем упоминается использование ui:include внутри ui:repeat и рекомендуется использовать c:forEach. - person Adam L Davis; 27.04.2011
comment
Я согласен с приведенной вами цитатой. Это приводит меня к ответу, в котором я так не уверен, что поставлю его здесь: проблема в том, что c: forEach оценивается в Facelets, но ссылка #{widget} откладывается на более поздний срок, когда срок действия виджета истекает, и т. д. и т. д. - person Adam; 10.05.2011
comment
Этот ответ недействителен, поскольку рассматриваемая проблема включает ui:include - person Karl Kildén; 20.01.2014