2

我使用 JSF 的 Mojarra 实现(版本 2.2.1)。我在 ajax 请求期间的性能存在很大问题。

我的页面有很多组件,所以我明白为什么第一次渲染需要很多时间,但是 ajax 请求呢?

他们也需要很多时间,尽管他们几乎什么都不做。这是我的简化示例:

在下面的示例中,按下“性能测试”按钮需要几个毫秒:

<?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>

但是如果将 1000 个<h:inputText />元素添加到<h:form></h:form>同一个动作中需要超过 100 毫秒!

我检查了 RESTORE_VIEW 阶段消耗了 80% 的时间,RENDER_RESPONSE 阶段消耗了 20% 的时间,其余阶段不需要花费大量时间。

有没有可能修复它?

我还尝试禁用 javax.faces.PARTIAL_STATE_SAVING (在我的情况下内存消耗不是问题)但也没有任何成功。

编辑: 一千个<h:inputText>添加到 a<h:form>只是一个简化的例子。我只是想强调一个事实,即大量组件对 ajax 请求有重大影响(几乎什么都不做)——这在我的网站上是一个严重的问题。

当然,在现实中,我没有 1000 个输入。我显示包含大量数据的非常大的表格 - 如果任何单元格中的数据为空,则应该使用连字符代替。ui:fragment我为此使用了复合组件-我有多个render=true/false

今天我尝试使用我自己的组件而不是复合组件 - 响应时间和内存使用量减少了。

但我仍然不满意,因为我在该页面上的非常简单的 ajax 请求比在另一个更薄的页面(即组件数量更少)上使用的相同 ajax 请求花费的时间要多得多。这不是任何 JSF 架构问题吗?

4

1 回答 1

1

并非如此,JSF 总是在恢复视图阶段重建整个组件树。在这种情况下你会做得更好,<ui:repeat>但我意识到你的测试是人为的,真实的页面可能有很多独特的组件。

有很多方法可以减少组件的数量,如前所述<ui:repeat>。您也可以在 facelets 中使用纯 html。没有 JSF 标记的 html 块表示为单个UIInstructions组件。你仍然可以在那里使用 EL 表达式。如果没有更多问题场景的详细信息,很难推荐特定的东西。

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

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

于 2013-08-11T20:39:27.987 回答