Jsf 在渲染响应阶段到底发生了什么?

Jsf 在渲染响应阶段到底发生了什么?,jsf,page-lifecycle,Jsf,Page Lifecycle,我在我的应用程序中添加了一个生命周期监听器,该监听器的灵感来自于的教程,并添加了时间戳来监控每个阶段所需的时间。我原以为“调用应用程序”阶段将花费最长的时间,但日志让我意识到它花费了827ms,而“呈现响应”阶段花费了2890ms,然后我想知道在“呈现响应”阶段花费了这么多时间是什么 在快速浏览之后,据我所知,在这个阶段所做的唯一一件事就是“呈现”(并保存响应的状态,但在这里并不重要),而所有应用程序代码都应该更早调用。这总是真的吗 例如,如果我的页面包含一个默认值为#{myBean.value

我在我的应用程序中添加了一个生命周期监听器,该监听器的灵感来自于的教程,并添加了时间戳来监控每个阶段所需的时间。我原以为“调用应用程序”阶段将花费最长的时间,但日志让我意识到它花费了827ms,而“呈现响应”阶段花费了2890ms,然后我想知道在“呈现响应”阶段花费了这么多时间是什么

在快速浏览之后,据我所知,在这个阶段所做的唯一一件事就是“呈现”(并保存响应的状态,但在这里并不重要),而所有应用程序代码都应该更早调用。这总是真的吗

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


在渲染响应阶段消耗大量时间的原因是什么

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

在调用应用程序时调用操作方法,只要在呈现响应期间调用getter(或者,如果应用程序设计良好,应该调用getter)

为了提供一个启动示例,只需检查以下代码:

注意,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

在这种情况下,getter方法在呈现响应期间调用,但也在恢复视图和应用请求值时调用。Jsf在调用应用程序期间访问action方法。

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

在调用应用程序时调用操作方法,只要在呈现响应期间调用getter(或者,如果应用程序设计良好,应该调用getter)

为了提供一个启动示例,只需检查以下代码:

注意,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

在这种情况下,getter方法在呈现响应期间调用,但也在恢复视图和应用请求值时调用。Jsf在调用应用程序期间访问action方法。

您是否阅读了您在问题中链接的BalusC的帖子?:)我不知怎么错过了有趣的部分。谢谢你指出;)“在呈现响应阶段,什么东西容易消耗大量时间?”1)getters中的业务逻辑。2) 不必要的大/复杂视图。3) 硬件不好。你读了你在问题中链接的巴卢斯克的帖子了吗?:)我不知怎么错过了有趣的部分。谢谢你指出;)“在呈现响应阶段,什么东西容易消耗大量时间?”1)getters中的业务逻辑。2) 不必要的大/复杂视图。3) 硬件差。
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