<强> UPDATE II: OK,我设法将它缩小了一点。

我有一个数据表中的页面排序和过滤功能,在DB都正在发生。换句话说,我不利用丰富的嵌入式功能:数据表我用,而是让DB做的工作

我的请求范围的豆工作。唯一的会话范围豆包含排序和我的接口的滤波。

滤波为每列被绑定到特定会话bean字段。因此,它实际上是更新期间更新模型值相。

排序所需的一些逻辑从我的一部分,所以我调用某个方法以正确的值设置为会话bean。这是在调用应用程序阶段进行。

因此,任何变化期间呈现响应阶段,其中,所述页面实际上呈现到位。

的问题是,在JSF的数据表和datascroller在我的网页呼叫的backingBean.getDataModel(),取指从DB和dataModel.getRowCount()(我已经实现调用运行一个单独的查询的方法)中的数据的期间的应用请求值相。这两个查询期间也发生取呈现响应阶段,这是其中的变化都在代替的单相,并且该查询将正常运行。

这意味着显示网页后我执行筛选或排序,查询的双号发生。

我想执行排序和过滤仅执行所需的查询并没有更多。

任何建议?

有帮助吗?

解决方案

应用请求值阶段期间吸气剂呼叫是强制性的,因为JSF需要知道哪个输入值最初示出,以便它可以最终做任何验证和/或适用时调用任何valuechangelisteners中的下一阶段。这也是必须找出哪个按钮/按下链接/点击中的任何行,以便它知道在调用操作阶段调用哪个bean行动。

但是,如果你没有它们将成为任何输入字段验证/ valuechange核对,也没有任何按钮,/在任何行的链接,那么我可以想像,在应用请求值阶段的查询是在你的眼睛完全多余的。

不幸的是,你不能完全禁用它。技术上,只能求助于即把数据bean在会话范围和做昂贵的SQL查询(和数据模型的刷新)仅在bean的构造函数,并在bean的操作方法,使其只能得到在bean的调用建设(为第一视图)和bean的操作方法中(新的排序/过滤/不管请求期间)。不过它的缺点是,在数据模型的任何变化都反映在所有窗口/标签终端用户在同一会话开放,这可能会导致“跆拳道?”经验为终端用户。

现在,战斧是具有在用于preserveDataModel,这基本上使数据模型中的特定于请求的组件树的<t:dataTable>属性的风味很好的解决方法对于此第一(其又已经存储在会话范围或在客户端侧上的隐藏的输入字段,这取决于你如何配置的视图状态的中面,配置在商店位置)。 RichFaces的没有这样一个直接的解决方案,但<a4j:keepAlive>确实基本上是相同的。它只会影响“整体”豆,因此,如果您的数据bean包含超过仅数据模型,你可能会考虑到重构它。你应该牢记设计豆就好像它是一个会话范围的bean。

如果数据模型变大,然后我可以想像,这会影响服务器的内存,但是这实在不应该伤害那么多,如果你只存储的查看的内存数据模型的一部分(因而不是整个数据模型,包括所有的其他页)。看它是否远远超过了一个HTTP请求中烧双的SQL查询的成本。

希望这有助于。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top