繁体   English   中英

理解 JSF 阶段的问题

[英]Problems understanding JSF Phases

我在理解 JSF 阶段时遇到问题。 我有以下问题。

在我的主页上,我创建了一个 panelGroup,并动态包含了一个 xhtml。

    <h:panelGroup id="padding">
        <ui:include src="#{navigationHandler.currentPage}" />
    </h:panelGroup>

在我的菜单栏中,我有一些这样的代码:

    <p:submenu label="#{translator.menuentry_insured}">
        <p:menuitem value="#{translator.menuentry_add_insured}"    actionListener="#{navigationHandler.addInsured}"    update=":padding" />
        <p:menuitem value="#{translator.menuentry_search_insured}" actionListener="#{navigationHandler.searchInsured}" update=":padding"/>
    </p:submenu>

当我点击菜单项时,首先调用“currentPage”方法,返回当前活动的页面。 之后,调用 actionListener,将页面设置为新页面。 如果我再次单击同一链接,则会显示正确的页面。

我知道问题出在 JSF 生命周期(“调用应用程序”阶段之前的“恢复视图”阶段),但我不知道如何解决这个问题。

这是来自我自己的 PhaseListener 的 output,仅用于调试目的:

BEFORE: RESTORE_VIEW 1
    Using current page: addInsured.xhtml
AFTER: RESTORE_VIEW 1
BEFORE: APPLY_REQUEST_VALUES 2
AFTER: APPLY_REQUEST_VALUES 2
BEFORE: PROCESS_VALIDATIONS 3
AFTER: PROCESS_VALIDATIONS 3
BEFORE: UPDATE_MODEL_VALUES 4
AFTER: UPDATE_MODEL_VALUES 4
BEFORE: INVOKE_APPLICATION 5
    Setting current page to searchInsured.xhtml
AFTER: INVOKE_APPLICATION 5
BEFORE: RENDER_RESPONSE 6
AFTER: RENDER_RESPONSE 6

有什么解决办法吗? 我做错了什么?

我相信您将 JSF 组件(通常带有前缀“h”、“f”、“p”)与 facelet 组件(通常带有前缀“ui”)混淆了。 他们不是一回事。 JSF 组件通常成为树的一部分并参与 JSF 阶段。 Facelet 组件仅在RESTORE_VIEW期间存在。 我通常将 facelet 组件视为预处理器。 它们通常生成 JSF 组件。

在您的示例中, <ui:include src="#{navigationHandler.currentPage}" />替换为在RESTORE_VIEW时由navigationHandler.currentPage引用的源文件中指定的任何 JSF 组件。 RESTORE_VIEW之后,没有更多的<ui:include /> ,因此不会重新评估并且不会更新。

INVOKE_APPLICATION期间, navigationHandler.currentPage会更新,但组件树仍然相同。 如果您可以在INVOKE_APPLICATION期间强制进行自我重定向,则生命周期将重新启动并且<ui:include src="#{navigationHandler.currentPage}"/>将重新评估。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM