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

时间:2011-06-09 19:30:11

标签: richfaces jstl jsf-1.2

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

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

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

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

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

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

1 个答案:

答案 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:commandButtontapPanel没有“页面呈现时间”?

总之,使用<ui:repeat>,JSTL和JSF通常不是很好的同床人。

编辑:我应该先完成此操作,因为我没有使用rich:tabPanel的经验,但<ui:repeat>似乎无法与rich:tabPanel一起使用(但不是因为您链接到的示例中所述的原因,因此我的困惑)。不要使用<c:forEach>,使用绑定到rich:tabPanel的组件。