5

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

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

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

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

其他注意事项:应用程序 bean 是会话范围的,其中的数据必须是,而不是组件树状态。

更新这个问题直接针对本文提出的问题和第一条评论。我不知道如何在第一条评论中实际解决解决方法,而接受的答案让我想到了它。

4

1 回答 1

4

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

我不确定“视图构建阶段”是什么意思。如果您查看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

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

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

于 2011-06-18T04:34:07.487 回答