我有一个大树结构(将近 6000 个节点,并且还在不断增加),我在我的 Web 应用程序中显示为 Richfaces rich:tree。
当一个节点被选中时,backing-bean 中的处理函数会运行一些逻辑并产生一些魔法。
发生的一件事是,树中的每个选择都会通过 Ajax 调用重新呈现树。这意味着每次选择更改时,都会有超过 2MB 的数据被发送到服务器。
您可能猜到我的问题是速度非常慢。我想做的是只重新渲染被选中的树节点,而不是整个树,因为这有望向服务器发送几 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 最终会存储在服务器内存中的服务器 session 中。这会增加服务器的内存使用量,因此请注意并为此做好准备。
关于java - JSF2 Richfaces 4.1.0 Ajax 局部渲染树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9226357/