如何使用JSTL强制在JSF 1.2页面中构建阶段?

Ada*_*dam 5 jstl richfaces jsf-1.2

我在JSF应用程序中使用JSTL标记.通过某些操作,我需要重建组件树,就好像它是初始构建一样.我当前的症状是不正确的对象到组件关联,重复的ID以及陈旧组件的其他问题.这是使用在构建阶段使用的ac:foreach(不能使用重复标记,请参见示例链接)标记.

我的理解是可以强制重建,但我无法找到发生的位置或方式.我对在客户端或服务器上启动的解决方案持开放态度.

有关我正在使用的代码的示例,请参阅Richfaces中动态选项卡上的此页面. http://in.relation.to/Bloggers/UsingDynamicallyCreatedRichFacesTabPanelForSearchResults

注意:使用ui:repeat或a4j:repeat是不可行的.有关详细信息,请参见示例页面

其他注意:应用程序bean是会话作用域,其中的数据需要,而不是组件树状态.

更新此问题直接针对本文中提出的问题和第一条评论.我不知道如何在第一条评论中实际解决方法,并且接受的答案引导我.

Gya*_*uyn 4

我认为陈旧的组件不是问题所在。重复的 ID 尤其是使用标签的副作用<c:forEach>。这是因为<c:forEach>会将任何子组件多次添加到组件树中,并且每次都会尝试使用相同的 ID(与 不同<ui:repeat>)。这显然会导致重复的 ID(您会注意到在链接到的示例中,他们没有在标签内指定任何 ID <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">
        ...
Run Code Online (Sandbox Code Playgroud)

reRender="output"如果您在搜索中指定a4j:commandButton“页面渲染时间”如何不会发生tapPanel

总之,use <ui:repeat>、JSTL 和 JSF 通常不是很好的伙伴。

编辑:我应该先这样做,因为我没有使用rich:tabPanelbut的经验<ui:repeat>,但似乎不能与 with 一起使用rich:tabPanel(但不是出于您链接到的示例中所述的原因,因此我很困惑)。但不要使用<c:forEach>,而是使用绑定到rich:tabPanel.