【问题标题】:How to force the build phase in a JSF 1.2 page using JSTL?如何使用 JSTL 在 JSF 1.2 页面中强制构建阶段?
【发布时间】:2011-09-11 23:52:52
【问题描述】:

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

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

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

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

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

更新 这个问题直接针对this article 中提出的问题和第一条评论。我不知道如何在第一条评论中实际解决该问题,而接受的答案引导我找到它。

【问题讨论】:

    标签: richfaces jstl jsf-1.2


    【解决方案1】:

    我认为陈旧的组件不是问题所在。重复的 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">
            ...
    

    如果您在搜索的a4j:commandButton 上指定reRender="output"tapPanel 如何不会出现“页面呈现时间”??

    总的来说,使用&lt;ui:repeat&gt;,JSTL 和 JSF 通常不是很好的伙伴。

    编辑:我应该先这样做,因为我没有使用 rich:tabPanel 的经验,但似乎 &lt;ui:repeat&gt; 不能与 rich:tabPanel 一起使用(但不是出于原因在您链接到的示例中说明,因此我感到困惑)。不过不要使用&lt;c:forEach&gt;,使用绑定到rich:tabPanel 的组件。

    【讨论】:

    • 我的问题不是重复的 id,因为 c:forEach 标签重复了一个硬编码的 id,就像在 c:foreach 中一样,我使用了一个 f:subview。问题是当页面更改时,组件树有时会过时。我将研究组件绑定,看看这是否是一个解决方案。我会尝试为“查看构建短语”找到正确的短语。
    • 我相信我所说的“视图构建阶段”是指恢复视图阶段的“新视图”或“初始视图”路径,然后绕过渲染响应阶段?
    • 说实话,我不知道 JSF 生命周期的内部工作原理。你不应该需要。 AJAX 调用调用 JSF 生命周期的方式与任何常规 JSF 回发相同。唯一的区别是您可以使用processreRender 属性来选择不同阶段处理的组件。我不明白为什么你会得到一个“陈旧”的组件树。唯一可能在客户端“过时”的是那些未包含在 reRender 属性中的内容。
    • 我还没有满意地回答您的问题...感谢您同样接受它。尝试绑定并回复我。
    • 绑定让我找到了解决方案的正确路径,如下所示:tabPanel.getParent().getChildren().clear(); 这会从组件树中清除选项卡面板,它将被重建。
    猜你喜欢
    • 1970-01-01
    • 2022-12-30
    • 2013-03-06
    • 2010-12-31
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    相关资源
    最近更新 更多