我有一个大树结构(几乎有 6000 个节点,并且还在不断增长),我在我的 web 应用程序中将其显示为 Richfaces rich:tree。
当选择一个节点时,backing-bean 中的处理程序函数会运行一些逻辑并发挥一些作用。
发生的一件事是,树中的每个选择都会通过 Ajax 调用重新呈现树。这意味着每次选择更改时都会将超过 2MB 的数据 POST 到服务器。
正如您可能猜到的,我的问题是速度非常慢。我想做的只是重新渲染所选的树节点,而不是整个树,因为这希望只是将几 KB 发布到服务器。
这是我在 JSF2.0 中使用 RichFaces 4.1.0 的第一个实际项目,因此我疯狂地用 google 搜索解决方案,并浏览了 RichFaces 站点上的文档,但尚未找到解决方案。
我的代码如下所示:
<h:form id="main">
<a4j:outputPanel ajaxRendered="true">
<rich:panel id="treePanel" header="Tree">
<rich:tree id="theTree" var="tree" value="#{treeBean.rootNodes}" selectionType="ajax" toggleType="client" selectionChangeListener="#{treeBean.selectionChanged}">
<rich:treeNode>
<h:outputText styleClass="#{tree.selected?'selectedNode':''}" value="#{tree.title}" />
</rich:treeNode>
</rich:tree>
</rich:panel>
</a4j:outputPanel>
</h:form>
JSF 应用程序不像传统的 Ajax 实现那样工作,因为它们有一个称为 ViewState 的东西,它基本上是所有必要的用户控制数据、页面状态数据以及在每次请求时来回传递到服务器的其他数据的集合,并且回复。原因是 HTTP 通信本质上是无状态的,因此根据请求提供给服务器的 ViewState 会告诉服务器模型的每次更改以及需要发生的触发的服务器事件。当服务器完成处理该请求时,它将其构建的响应以及修改后的 ViewState 发送回客户端。此 ViewState 现在包含有关哪些页面元素需要通过 JSF javascript 进行可视化更新和刷新的信息。
这个大的 2MB 可能主要由您的 ViewState 组成,因为默认情况下它仅存在于客户端上。将 ViewState 存储在服务器上是一种潜在的性能改进,可以减少带宽并减少请求/响应大小。您可以通过将以下内容添加到 web.xml 来打开此功能。
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
这应该会减少客户端上 ViewState 的大小,但是这 2MB 最终将存储在服务器内存中的服务器会话中。这会增加服务器上的内存使用量,因此请注意并为此做好准备。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)