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

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

问题描述:

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

我的理解是,可以强制重建,但我一直无法找到发生的地点或方式。我愿意在客户端或服务器上启动解决方案。

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

注意:使用ui:repeat或a4j:repeat是不可行的。详情请参阅示例页面。

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

更新此问题直接涉及this article和第一条评论中提出的问题。我不知道如何在第一条评论中真正采取解决方法,并且接受的答案让我知道了。

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

我不确定'视图构建阶段'是什么意思。如果你看看JSF documentation,你会发现没有这样的阶段。无论如何,当你使用<ui:repeat>时,只要你用来执行搜索的AJAX调用重新渲染rich:tabPanel那么它应该工作。

他们引为<ui:repeat>没有工作的原因是:

你不能使用重复的组件(没有用户界面:重复,也不A4J:重复)为,因为他们页面中工作的渲染时间和不在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"> 
     ... 

如果您指定的搜索的a4j:commandButton怎么做的网页渲染时间“为tapPanel不会发生reRender="output"

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

编辑:我应该做这个第一,因为我没有与rich:tabPanel<ui:repeat>的经验,它的出现,不能使用rich:tabPanel(但不是给你链接到的例子中陈述的理由,因此我的混乱)。尽管不要使用<c:forEach>,请使用绑定到rich:tabPanel的组件。

+0

我的问题是不重复的ID由于c:forEach标记重复一个硬编码的ID,只是在c:foreach我使用f:子视图。问题是当页面有时候组件树变旧时。我会研究组件绑定以查看这是否是一种解决方案。我会尝试找到“查看构建短语”的正确词组。 – Adam 2011-06-20 16:24:37

+0

我相信“视图构建阶段”的含义是恢复视图阶段的“新视图”或“初始视图”路径,然后绕过渲染响应阶段? – Adam 2011-06-20 16:31:52

+0

老实说,我不知道JSF生命周期的内部工作。虽然你不需要。 AJAX调用以与任何常规JSF回发相同的方式调用JSF生命周期。唯一的区别是,您可以选择使用'process'和'reRender'属性在不同阶段处理哪些组件。我看不出为什么你会得到一个'过时的'组件树。唯一可能在客户端“陈旧”的东西是那些不包含在'reRender'属性中的东西。 – 2011-06-20 23:05:38