首页 > 解决方案 > 长加载页面和视图状态

问题描述

一些背景知识

在某些情况下,由 JSF 生成的页面可能需要一些时间才能完全加载。假设网络很差(即移动网络),服务器很便宜,页面很大(今天越来越多的以javascript为重点的组件),最终用户设备已经过时并且无法处理所有这些javascript 尽可能快,或者任何其他原因。

此外,由于所有 jsf 库都要求(强制?)您使用 post 方法来使用花哨的功能,用户输入必须始终具有准备好使用的有效 jsf 视图状态,以便正确回答。

在这些情况下,对于最终用户而言,快速导航到应用程序的其他页面或使用已加载的功能而不让他在这样做之前加载整个页面不应该是一件痛苦的事。

默认情况下,在 mojarra 和 myfaces 实现中,视图状态是在渲染视图阶段结束时生成的,以便能够捕获渲染视图阶段可能发生的任何状态变化。

Mojarra 有一个上下文参数 ( com.sun.faces.writeStateAtFormEnd ) 来改变这种行为,但这并不能处理在渲染视图阶段状态可能会改变的事实,并且 myfaces 上没有类似的选项。

方法

我的第一个问题是处理这种情况的最佳方法是什么?

作为起点,我假设仅使用服务器端状态保存来限制使用的带宽。这应该涵盖了前面的大部分示例(“服务器便宜”除外)

然后,通过生成视图状态 id 尽快发送给客户端来改进 mojarra 的处理方式,并在表单完全编码后保存真实状态,以便保存最后的状态更改。

此处需要注意的是,如果服务器速度较慢或繁忙,则在状态完全写入之前可能会收到具有该视图状态 ID 的后续请求。而这种情况下应该必须等待才能开始自己的过程。

执行

我的第二个问题,假设上述方法有效,您将如何以完全可移植的方式实现这一目标?

我并没有真正考虑过,但看起来干预不同实现的视图状态写入可能会很棘手,并且可能导致严重的大脑超负荷以知道哪个实现做什么。所以也许只有使用jsf规范机制才能做到这一点。

标签: jsf

解决方案


推荐阅读