我在 JSF 应用程序中使用 JSTL 标签。通过某些操作,我需要重建组件树,就像它是初始构建一样。我当前的症状是对象与组件关联不正确、重复的 ID 以及陈旧组件的其他问题。这是使用在构建阶段使用的 c:foreach (不能使用重复标记,请参阅示例链接)标记。
我的理解是,可以强制重建,但我无法找到在哪里或如何发生这种情况。我对在客户端或服务器上启动的解决方案持开放态度。
有关我正在使用的代码示例,请参阅 Richfaces 动态选项卡上的此页面。http://in.relation.to/Bloggers/UsingDynamicallyCreatedRichFacesTabPanelForSearchResults http://in.relation.to/Bloggers/UsingDynamicallyCreatedRichFacesTabPanelForSearchResults
注意:使用 ui:repeat 或 a4j:repeat 是不可行的。有关详细信息,请参阅示例页面。
其他注意事项:应用程序 bean 是会话范围的,其中的数据也需要是会话范围的,只是组件树状态不是这样。
Update这个问题直接针对提出的问题本文 http://drewdev.blogspot.com/2008/08/cforeach-with-jsf-could-ruin-your-day.html和第一条评论。我不知道如何实际执行第一条评论中的解决方法,而接受的答案引导我找到了它。
我不认为陈旧的组件是问题所在。重复的 ID 尤其是使用<c:forEach>
标签。这是因为<c:forEach>
会多次将任何子组件添加到组件树中,并且每次都会尝试使用相同的 ID(与<ui:repeat>
)。这显然会导致重复的 ID(您会注意到在链接到的示例中,他们没有在<c:forEach>
tags).
我不确定“视图构建阶段”是什么意思。如果你看一下JSF 文档 http://download.oracle.com/javaee/6/tutorial/doc/bnaqq.html,你会发现没有这样的阶段。无论如何,当您使用<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 通常不是很好的同床异梦。
EDIT:我应该先这样做,因为我没有经验rich:tabPanel
but <ui:repeat>
,看来不能与rich:tabPanel
(但不是出于您链接的示例中所述的原因,因此我很困惑)。不要使用<c:forEach>
不过,使用组件绑定到rich:tabPanel
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)