使用大量组件时JSF ajax性能问题

时间:2013-08-11 18:17:18

标签: jsf jsf-2

我使用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架构问题?

1 个答案:

答案 0 :(得分:1)

实际上,JSF总是在恢复视图阶段重建整个组件树。在这种情况下,您可以使用<ui:repeat>做得更好,但我发现您的测试是人为的,真实页面可能有很多独特的组件。

有很多方法可以减少组件数量,例如提到<ui:repeat>。您也可以在facelets中使用纯HTML。没有JSF标记的html块被表示为单个UIInstructions组件。你仍然可以在那里使用EL表达式。如果没有关于问题情景的更多细节,很难推荐一些特别的东西。

编辑: 组件树是从上到下恢复的,不知道是否可以以某种方式优化它并跳过请求不需要的部分。问题是您不知道在ajax标记中指定了具有特定id的组件树节点的哪个部分,您只能尝试一些优化。看起来作者并不认为这些并发症值得付出努力。

至于多个条件部分 - 我在JSF中找不到任何直接支持它的东西。专用的自定义组件听起来像这里最好的选择。我们做了类似的事情,我们自己的<ui:include>实现,它支持在src内工作的动态<ui:repeat>属性。