在渲染响应阶段究竟发生了什么?

Ald*_*ian 0 jsf page-lifecycle

我在我的应用程序中添加了一个受BalusC 代码教程启发的生命周期侦听器,并添加了时间戳以监控每个阶段花费的时间。我原以为“调用应用程序”阶段会花费最长的时间,但是日志让我意识到它花费了大约 827 毫秒,而“渲染响应”阶段花费了 2890 毫秒,然后我想知道在此期间花费了多少时间“渲染响应”阶段。

据我快速浏览后了解规范,在此阶段唯一完成的事情就是“渲染”(并且还保存响应的状态,但在这里无关紧要),而所有应用程序代码都应该更早地调用. 它总是真的吗?

例如,如果我的页面包含一个默认值为 #{myBean.valueAfterPost} 的表单,则 valueAfterPost 的 getter 是在“调用应用程序”期间还是在“渲染响应”期间调用?

什么容易在渲染响应阶段消耗大量时间?

Xtr*_*ica 5

如果要呈现的内容很复杂(需要大量评估)或者您的 getter 方法中有一些逻辑,则很容易花费更多时间,无论如何您都必须避免,因为您无法控制何时使用 getter由框架调用。请注意,JSF 在此阶段基于您的模型构建整个视图。

只要在RENDER RESPONSE期间调用 getter (或者如果应用程序设计良好,它们应该调用)在INVOKE APPLICATION 时调用操作方法。

为了提供启动示例,只需使用以下代码检查此代码PhaseListener

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">

<h:head />

<h:body>
    <h:form>

        <ui:repeat var="str" value="#{bean.strings}">
            #{str}
        </ui:repeat>

        <h:commandButton value="send" action="#{bean.action}" />

    </h:form>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">

<h:head />

<h:body>
    <h:form>

        <ui:repeat var="str" value="#{bean.strings}">
            #{str}
        </ui:repeat>

        <h:commandButton value="send" action="#{bean.action}" />

    </h:form>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)

这将在第一次点击时带来此输出:

RESTORE_VIEW 1 started
RESTORE_VIEW 1 finished
RENDER_RESPONSE 6 started
Get called
Get called
RENDER_RESPONSE 6 finished
Run Code Online (Sandbox Code Playgroud)

请注意,getter 被调用了两次,实际上您无法控制调用 getter 的次数,这就是为什么您不必在 getter 中执行任何逻辑。

稍后,如果提交表单,我们会得到以下输出:

RESTORE_VIEW 1 started
Get called
Get called
RESTORE_VIEW 1 finished
APPLY_REQUEST_VALUES 2 started
Get called
APPLY_REQUEST_VALUES 2 finished
PROCESS_VALIDATIONS 3 started
PROCESS_VALIDATIONS 3 finished
UPDATE_MODEL_VALUES 4 started
UPDATE_MODEL_VALUES 4 finished
INVOKE_APPLICATION 5 started
Strings [item1, item2] sent
INVOKE_APPLICATION 5 finished
RENDER_RESPONSE 6 started
Get called
Get called
RENDER_RESPONSE 6 finished
Run Code Online (Sandbox Code Playgroud)

在这种情况下,在RENDER RESPONSE期间调用 getter 方法,但也在RESTORE VIEWAPPLY REQUEST VALUES 中调用。JsfINVOKE APPLICATION期间访问 action 方法。