我使用JSF(版本2.2.1)的Mojarra实现。我有一个大问题 在ajax请求期间的性能。
我的页面有很多组件,所以我理解为什么首先渲染 很多时候,但是ajax要求是什么?
他们也花费了很多时间,尽管他们什么也没做。这是我的 简化示例:
在下面的示例中,按“性能测试”按钮需要几个ms:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:body>
Hello World
<h:form>
<h:commandButton value="performance test">
<f:ajax execute="@this" render="@none" />
</h:commandButton>
</h:form>
</h:body>
</html>
但是如果向<h:inputText />
添加1000个<h:form></h:form>
元素,则需要执行相同的操作
超过100毫秒!
我已经检查过,在RESTORE_VIEW阶段消耗了80%的时间,在RENDER_RESPONSE阶段消耗了20%的时间,其余阶段没有花费大量时间。
有没有可能修复它?
我还尝试禁用javax.faces.PARTIAL_STATE_SAVING(在我的情况下内存消耗不是问题)但也没有任何成功。
修改
添加到<h:inputText>
的{{1}}只有一千个简化示例。我只是想强调一个事实,即大量的组件对ajax请求有影响(几乎没有任何作用) - 这在我的网站上是一个严重的问题。
在现实中,当然,我没有1000个输入。我显示了一个包含大量数据的非常大的表 - 如果数据在任何单元格中都是空的,则应该使用连字符。我使用了复合组件 - 我有多个<h:form>
ui:fragment
今天我尝试使用自己的组件而不是复合组件 - 响应时间和内存使用量减少了。
但是我仍然不满意,因为我在该页面上的非常简单的ajax请求比在另一个更薄的页面上使用的相同ajax请求(即具有更少的组件数量)花费更多的时间。是不是任何JSF架构问题?
答案 0 :(得分:1)
实际上,JSF总是在恢复视图阶段重建整个组件树。在这种情况下,您可以使用<ui:repeat>
做得更好,但我发现您的测试是人为的,真实页面可能有很多独特的组件。
有很多方法可以减少组件数量,例如提到<ui:repeat>
。您也可以在facelets中使用纯HTML。没有JSF标记的html块被表示为单个UIInstructions
组件。你仍然可以在那里使用EL表达式。如果没有关于问题情景的更多细节,很难推荐一些特别的东西。
编辑: 组件树是从上到下恢复的,不知道是否可以以某种方式优化它并跳过请求不需要的部分。问题是您不知道在ajax标记中指定了具有特定id的组件树节点的哪个部分,您只能尝试一些优化。看起来作者并不认为这些并发症值得付出努力。
至于多个条件部分 - 我在JSF中找不到任何直接支持它的东西。专用的自定义组件听起来像这里最好的选择。我们做了类似的事情,我们自己的<ui:include>
实现,它支持在src
内工作的动态<ui:repeat>
属性。