理解JSF阶段的问题

  • 本文关键字:问题 JSF 理解 jsf
  • 更新时间 :
  • 英文 :


我在理解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的输出,仅用于调试目的:
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期间存在。我通常认为facet组件是预处理器。它们通常生成JSF组件。

在您的示例中,<ui:include src="#{navigationHandler.currentPage}" />被替换为navigationHandler.currentPageRESTORE_VIEW时引用的源文件中指定的JSF Components。在RESTORE_VIEW之后,没有更多的<ui:include />,所以它不会被重新计算,也不会更新。

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

相关内容

  • 没有找到相关文章

最新更新