2012-02-10 71 views
3

我有一个很大的树结构(将近6000个节点和不断增长),我在我的webapp中显示为一个Richfaces rich:tree。JSF2 Richfaces 4.1.0树的Ajax部分渲染

当选择一个节点时,后台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> 
+0

你是否找出了树节点部分渲染的解决方案。 – 2014-07-08 15:15:15

回答

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

+0

感谢您的回复。我实际上已经有了新的ViewState,并将它存储在服务器上。这是我尝试的第一件事情之一:-)但是,每次POST时它仍然推送2MB到服务器。 – FighterHayabusa 2012-02-10 12:55:39

+0

@FighterHayabusa您是否考虑在您的Web服务器上启用GZIP压缩?每一个现代信誉良好的浏览器都会接受它,当我处理大页面时,我发现它的性能提升非常显着。 – 2012-02-10 13:21:03

+0

还没有尝试过。不过,我认为这不会对我的问题有所帮助,因为这里需要的时间是推向服务器,而不是收到答案。我同意这是一个很好的综合性能提示,但:-) – FighterHayabusa 2012-02-10 14:28:16

1

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