我在JSF应用程序中使用JSTL标记。通过某些操作,我需要重建组件树,就好像它是初始构建一样。我当前的症状是不正确的对象到组件关联,重复的ID以及陈旧组件的其他问题。这是使用在构建阶段使用的c:foreach(不能使用重复标记,请参阅示例链接)标记。
我的理解是可以强制重建,但我无法找到发生的位置或方式。我对在客户端或服务器上启动的解决方案持开放态度。
有关我正在使用的代码的示例,请参阅Richfaces中动态选项卡上的此页面。 http://in.relation.to/Bloggers/UsingDynamicallyCreatedRichFacesTabPanelForSearchResults
注意:使用ui:repeat或a4j:repeat是不可行的。有关详细信息,请参阅示例页面。
其他注意:应用程序bean是会话作用域,其中的数据需要是,而不是组件树状态。
更新此问题直接针对this article中提出的问题和第一条评论。我不知道如何在第一条评论中实际解决方法,并且接受的答案引导我。
答案 0 :(得分:4)
我认为陈旧的组件不是问题。重复的ID尤其是使用<c:forEach>
标记的副作用。这是因为<c:forEach>
会多次将任何子组件添加到组件树中,并且每次尝试使用相同的ID(与<ui:repeat>
不同)。这显然导致重复的ID(您将在链接到的示例中注意到它们未在<c:forEach>
标记中指定任何ID)。
我不确定'视图构建阶段'是什么意思。如果你看一下JSF documentation,你会发现没有这样的阶段。在任何情况下,当您使用<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通常不是很好的同床人。
编辑:我应该先完成此操作,因为我没有使用rich:tabPanel
的经验,但<ui:repeat>
似乎无法与rich:tabPanel
一起使用(但不是因为您链接到的示例中所述的原因,因此我的困惑)。不要使用<c:forEach>
,使用绑定到rich:tabPanel
的组件。