2010-02-26 57 views
3

UPDATE II: 好的,我设法缩小了一点。请求范围的bean和数据模型初始化?

我有一个带有排序和筛选功能的数据表的页面,这两个页面都发生在数据库中。换句话说,我不使用rich:datatable的嵌入式功能,而是让数据库完成这项工作。

我与请求范围豆一起工作。唯一的会话范围的bean包含我的界面的排序和过滤。

每个列的过滤都绑定到特定的会话bean字段。因此,它实际上在更新模型值阶段更新。

排序需要我的部分逻辑,所以我调用一个特定的方法来设置会话bean的正确值。这是在调用应用程序阶段执行的。

因此,在页面实际呈现的渲染响应阶段,所有更改都已到位。

的问题是,在我的页面中的JSF DataTable,并datascroller调用获取从数据库中的数据和dataModel.getRowCount()(我已经实现调用运行一个单独的查询方法)的期间backingBean.getDataModel()应用请求值阶段。这两个查询也将在渲染响应阶段进行,这是更改全部到位的唯一阶段,查询将正常运行。

这意味着要在执行过滤或排序后显示页面,会发生双重查询。

我想执行排序和筛选只执行所需的查询,没有更多。

有什么建议吗?

+2

我看不到排序/过滤失败,因为你懒洋洋地加载数据。我也没有看到如何将它移动到渲染响应中来解决它(顺便说一下,在getter中使用基于'FacesContext#getRenderResponse()'的延迟加载,而不是整个'Phaselistener')更容易解决这个问题。你能否详细说明实际问题? – BalusC 2010-02-26 17:45:06

+0

感谢您的评论。请参阅上面的更新! – 2010-03-01 08:55:41

+0

目前仍不清楚为什么排序/过滤失败,“因为你懒洋洋地加载了数据”。至于你的抱怨,“getRenderResponse()似乎不起作用”,你确定它不是因为super.getDataModel()不为空而引起的吗?你为什么要检查它? – BalusC 2010-03-01 13:20:37

回答

1

应用请求值阶段的getter调用是强制性的,因为JSF需要知道最初显示哪些输入值,以便它最终可以在适用的下一阶段执行任何验证和/或调用任何valuechangelistener。还必须找出在任何行中按下/单击哪个按钮/链接,以便知道在调用操作阶段调用哪个bean操作。

但是,如果您没有任何要验证的输入字段/ valuechange-checked,也没有任何行中的任何按钮/链接,那么我可以想象,应用请求值阶段中的查询在您的眼睛中完全多余。

不幸的是,你不能完全禁用它。从技术上讲,唯一的办法是将数据bean放入会话范围内,并且只在bean的构造函数和bean操作方法中执行昂贵的SQL查询(并刷新datamodel),以便它只在bean的调用期间被调用构建(用于第一视图)和bean的操作方法(在新的排序/过滤/任何请求期间)。然而,缺点是数据模型中的任何更改都反映在最终用户在同一个会话中打开的所有窗口/选项卡中,这可能会导致“wtf?”最终用户的体验。现在

,战斧是其在preserveDataModel属性为<t:dataTable>,基本上把数据模型的请求特定的组件树的味道了这个一个不错的解决办法第一(这反过来已经存储在会话范围或在客户端的隐藏输入字段中,具体取决于如何在faces-config中配置视图状态的存储位置)。 RichFaces没有这样的直接解决方案,但<a4j:keepAlive>的确基本相同。它只会影响“整个”bean,因此如果你的数据bean包含的不仅仅是数据模型,你可能会考虑重构它。您应该记住将bean设计为会话作用域bean。

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

希望这会有所帮助。

+0

由于我使用RichFaces,我考虑过a4j:keepalive。除了数据需要在会话中写入的事实之外,我还读到它可能是内存泄漏的责任。在Apply Value Changes阶段之前是否有其他方法可以使用更改后的数据? f:param,f:setPropertyChangeListener都在更新模型值中调用setter?将更改的数据设置为请求参数怎么样?或者获取参数?这是否可行? – 2010-03-03 20:33:33

+1

Wrt内存泄漏:这将是标签中的一个bug,需要由JBoss人员报告并修复。 Wrt请求参数:它不仅关于更新的数据模型,而且还包括** initial **数据模型,即客户端在执行操作时向客户端显示的数据模型。该信息不能通过请求参数获得。请求参数只有更新的信息可用。我也默默地咆哮着JSF的这种“本质”,但是我用Tomahawk't:saveState'完全满意,它用于完整的bean包括。数据模型和分页/排序属性。 – BalusC 2010-03-03 21:57:22

+2

(我只能在评论中输入600个字符,所以这里还有一个)如果你有兴趣,你可以在我的一个博客中找到一个例子:http://balusc.blogspot.com/2008/10/effective- datatable-paging-and-sorting.html真的,你会错过RichFaces的look'n'feel,但是好的,首先看看它是否有助于在删除datascroller之前抓住'a4j:keepAlive',并且生成一堆按钮和逻辑如前面提到的博客所述。祝你好运。 – BalusC 2010-03-03 21:58:56