Я не думаю, что устаревшие компоненты - это проблема.Двойные идентификаторы являются побочным эффектом использования тега <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
.