Как форсировать фазу сборки на странице JSF 1.2, используя JSTL? - PullRequest
5 голосов
/ 09 июня 2011

Я использую теги JSTL в своем приложении JSF.При определенных действиях мне нужно перестроить дерево компонентов, как если бы оно было первоначальной сборкой.Мои текущие симптомы - это неправильные связи объектов с компонентами, идентификаторы дубликатов и другие проблемы с устаревшими компонентами.При этом используется тег ac: foreach (нельзя использовать тег повтора, см. Пример ссылки), который используется на этапе сборки.

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

Пример использования кода см. На этой странице на динамических вкладках в Richfaces.http://in.relation.to/Bloggers/UsingDynamicallyCreatedRichFacesTabPanelForSearchResults

Примечание. Использование ui: repeat или a4j: repeat невозможно.Подробнее см. На странице примера.

Другое Примечание: бины приложения имеют сессионную область, и данные в них должны быть, а не в состоянии дерева компонентов.

Обновление Этот вопрос непосредственно относится к проблеме, поднятой в этой статье и первом комментарии.Я не знал, как на самом деле сделать обходной путь в первом комментарии, и принятый ответ привел меня к нему.

1 Ответ

4 голосов
/ 18 июня 2011

Я не думаю, что устаревшие компоненты - это проблема.Двойные идентификаторы являются побочным эффектом использования тега <c:forEach>.Это связано с тем, что <c:forEach> будет добавлять любые дочерние компоненты в дерево компонентов несколько раз и каждый раз будет пытаться использовать один и тот же идентификатор (в отличие от <ui:repeat>).Это, очевидно, приводит к дублированию идентификаторов (вы заметите, что в приведенном вами примере они не указали никаких идентификаторов в тегах <c:forEach>).

Я не уверен, что они подразумевают под фазой просмотра представления».Если вы посмотрите документацию JSF , вы увидите, что такой фазы нет.В любом случае, когда вы используете <ui:repeat>, поскольку вызов AJAX, который вы используете для выполнения поиска, повторно отображает rich:tabPanel, тогда он должен работать.

Причина, по которой они указали <ui:repeat>, нерабочая была:

Вы не можете использовать повторяющиеся компоненты (ни ui: repeat, ни a4j: repeat) для этого , потому что они работают во время визуализации страницы и не создают компоненты в JSFдерево, но просто повторить тот же экземпляр.

И в своем примере они использовали:

...
<a4j:commandButton action="#{capitalsBean.search}" value="Search" reRender="output" id="search"/>
...
<a4j:outputPanel id="output">
    <rich:tabPanel id="tapPanel" width="700" rendered="#{not empty capitalsBean.foundCapitals}">
        <c:forEach items="#{capitalsBean.foundCapitals}" var="cap">
        ...

Если вы указываете reRender="output" на странице поиска a4j:commandButton как делает 'время рендеринга 'не происходит для tapPanel ??

Таким образом, использование <ui:repeat>, JSTL и JSF, как правило, не очень хорошие подруги.

РЕДАКТИРОВАТЬ: IЯ должен был сделать это в первую очередь, поскольку у меня нет опыта работы с rich:tabPanel, но <ui:repeat>, по-видимому, нельзя использовать с rich:tabPanel (но не по причинам, указанным в примере, на который вы ссылаетесь, отсюда мое замешательство).Не используйте <c:forEach>, используйте привязку компонента к rich:tabPanel.

...