JSF2 Richfaces 4.1.0 Ajax部分渲染树

时间:2012-02-10 10:33:40

标签: java ajax jsf tree richfaces

我有一个很大的树结构(几乎6000个节点并且正在增长),我在我的webapp中显示为Richfaces rich:tree。

当选择一个节点时,backing-bean中的处理函数会运行一些逻辑并运行一些魔法。

发生的一件事是树在树中的每个选择上都使用Ajax调用重新渲染。这意味着每次选择更改时,都会向服务器发送超过2MB的内容。

你可能会猜到我的问题是这个问题很慢。我想要做的只是选择重新渲染的树节点,而不是整个树,因为这有望将几个KB发送到服务器。

这是我在JSF2.0中使用RichFaces 4.1.0的第一个真正的项目,所以我用疯狂搜索解决方案并通过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>

2 个答案:

答案 0 :(得分:1)

JSF应用程序不像传统的Ajax实现那样工作,它们有一些叫做ViewState的东西,它基本上是所有必要的用户控制数据,页面状态数据和其他来回传递给服务器的数据的集合。每个请求和响应。这样做的原因是HTTP通信本质上是无状态的,因此根据请求提供给服务器的ViewState会告诉服务器模型的每个更改以及需要发生的触发服务器事件。当服务器完成处理此请求后,它会将其构建的响应与修改后的ViewState一起发送回客户端。此ViewState现在包含有关JSF javascripts需要更新和刷新哪些页面元素的信息。

这个大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最终将存储在服务器内存中的服务器会话上。这会在服务器上增加内存使用量,因此请注意并为此做好准备。

答案 1 :(得分:1)

大响应是因为您正在设置AjaxRendered =&#34; true&#34;在您的输出面板上。这基本上告诉richfaces在每个ajax请求上更新整个面板及其所有内容,无论是否与您的树相关。您可能想删除它。