JSF是一种有用的技术,但是您当然可以将其迷住了。
听起来好像是在扩大视图状态的大小(通过在组件上设置较大的值),或者是将对组件的引用泄漏到其他会话状态中(这很不好)。另一个潜在的罪魁祸首是过大的视图(我已经看到人们可以很容易地构建UI树,从而导致到处都有数据表的非常大的控制图)。我知道IBM提供了丰富的文本和电子表格控件-
我无法评论使用它们会对状态大小产生什么影响。
低调的工作是检查在 faces-config.xml中 为会话范围配置的托管bean 。
JSF在请求之间保存两件事:
- 视图(页面上的所有控件)
- 视图状态(控件的状态)
之所以将它们分开是因为某些控件(例如数据表的子级)可以具有多个状态(每行一个)。状态可以保存到表单上的隐藏字段(如果未加密,则可能会带来很大的安全隐患)或会话中。为了容纳共享同一会话的多个浏览器窗口(在某些实现中,后退按钮支持),存储了多个视图。
- 应该有一个配置选项来设置应用程序在任何给定时间在给定用户的会话中保留的视图状态数。
- 您可以通过提供一个StateManager来衡量视图状态的大小,该StateManager可以衡量保存的视图/状态的大小(使用带有StateManager的公共构造函数在faces-config.xml中配置一个StateManager- 有关更多详细信息,请参见JSF规范 PDF;请参见JSF spec PDF。状态是可序列化的,您可以通过将其转储到流中来检查其大小)。
大多数由IDE构建的JSF应用程序都有支持bean。通过会话bean范围,保持状态的时间可能比您想要的长,这可能会给会话造成压力。由于通常每页只有一个支持bean,因此您拥有的页面越多,问题就越大。检查您的
faces-config.xml ,看看这是否是潜在的问题根源。
您可能要做的其他事情是在 web.xml中
配置HttpSessionAttributeListener。您可以获取堆栈跟踪,以帮助识别应用程序中的问题区域。
__



