Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSF2 Richfaces 4.1.0 Ajax树的部分呈现_Java_Ajax_Jsf_Tree_Richfaces - Fatal编程技术网

Java JSF2 Richfaces 4.1.0 Ajax树的部分呈现

Java JSF2 Richfaces 4.1.0 Ajax树的部分呈现,java,ajax,jsf,tree,richfaces,Java,Ajax,Jsf,Tree,Richfaces,我有一个巨大的树结构(几乎6000个节点,并且还在增长),我在我的webapp中显示为Richfaces-rich:tree 当一个节点被选中时,支持bean中的处理函数运行一些逻辑并发挥一些魔力 发生的一件事是,对树中的每个选择都使用Ajax调用重新呈现树。这意味着每次选择更改时都会向服务器发送超过2MB的内容 你可能会猜到,我的问题是速度太慢了。我想做的是只重新呈现所选的树节点,而不是整个树,因为这样可能只会向服务器发送几个KB 这是我在JSF2.0中使用RichFaces 4.1.0的第一

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

当一个节点被选中时,支持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>

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

这个大2MB可能主要由ViewState组成,因为默认情况下它只存在于客户端上。一个潜在的性能改进将减少带宽并减少请求/响应大小,这就是在服务器上存储ViewState。您可以通过将以下内容添加到web.xml来启用此功能

<context-param>
  <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
  <param-value>server</param-value>
</context-param>

javax.faces.STATE_保存方法
服务器

这将减少客户端上ViewState的大小,但是2MB最终将存储在服务器会话的服务器内存中。这会增加服务器上的内存使用量,因此请注意并为此做好准备。

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

谢谢您的回复。事实上,我已经对ViewState有了新的了解,并将其按原样存储在服务器上。这是我试过的第一件事:-但是它仍然把2MB推到服务器上,每一个帖子。@你是否认为在你的Web服务器上启用GZIP压缩?每个现代知名的浏览器都接受它,我发现当我处理大页面时,它的性能有了相当大的提高。我还没有尝试过。然而,我认为这对解决我的问题没有帮助,因为在这里花时间的是推送到服务器,而不是收到答案。我同意这是一个很好的通用性能提示:-)@FighterHayabusa不幸的是,如果您的selectionChangeListener被触发,服务器回发需要发生,而且页面上似乎只有很多数据。这个更改侦听器到底在做什么?这种行为是否可能在客户端完成?也许在真正需要服务器事件之前一直填充隐藏的输入字段?我希望你们有更多的声誉,这样我们就可以在聊天中讨论这个问题。你们找到了一个解决方案来部分渲染树节点吗。