我在理解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>
当我点击menuitem时,首先调用“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
有什么解决方案吗?我做错了什么?
答案 0 :(得分:3)
我相信你混淆了JSF组件(通常用'h','f','p'的前缀看到)与facelet组件(通常用前缀'ui')。他们不是一回事。 JSF组件通常成为树的一部分并参与JSF阶段。 Facelet组件仅在RESTORE_VIEW
期间存在。我通常认为facelet组件是预处理器。它们通常生成JSF组件。
在您的示例中,<ui:include src="#{navigationHandler.currentPage}" />
替换为navigationHandler.currentPage
时RESTORE_VIEW
引用的源文件中指定的任何JSF组件。 RESTORE_VIEW
之后,不再有<ui:include />
,因此不会重新评估,也不会更新。
在INVOKE_APPLICATION
期间,navigationHandler.currentPage
已更新,但组件树仍然相同。如果您可以在INVOKE_APPLICATION
期间强制进行自我重定向,则会重新启动生命周期并重新评估<ui:include src="#{navigationHandler.currentPage}"/>
。