JSF:操作调用被延迟



我的操作调用延迟的可能原因是什么?它发生在我拥有的一个表单上的所有动作调用中。在我点击任何将调用操作的东西之后(或者在表单加载时应该评估dataTable的值时),调用该操作大约需要10秒。(我通过设置断点,然后点击按钮来检查它。)

有什么想法吗?

这似乎是造成麻烦的部分:

<h:panelGroup id="someGroup">
<h:dataTable value="#{someHandler.keys}" binding="#{someHandler.dataTable}" var="key">
    <h:column>
        <f:facet name="header">
            <h:outputText value="Key" />
        </f:facet>
        <h:outputText value="#{key}" />
    </h:column>
    <h:column>
        <f:facet name="header">
            <h:outputText value="Value" />
        </f:facet>
        <h:commandLink value="[No value]" rendered="#{empty someHandler.getValue(key)}">
            <f:ajax listener="#{someHandler.loadProperty}" render="someForm:key someForm:value" />
        </h:commandLink>
        <h:commandLink value="#{someHandler.getValue(key)}" rendered="#{not empty someHandler.getValue(key)}">
            <f:ajax listener="#{someHandler.loadProperty}" render="someForm:key someForm:value" />
        </h:commandLink>
    </h:column>
</h:dataTable>
</h:panelGroup>

在调试过程中,我注意到当我单击commandLink时,它总是首先调用someHandler.keys。对此有什么解释吗?如果我点击其中一个命令链接,我不想重新绘制dataTable。调用的方法都不是特别"慢"。

我能想到的唯一可行的解释是,您在getter方法中执行昂贵的业务逻辑,而不是在bean的构造函数或任何其他事件方法中执行,这些方法在必要时只调用一次

Getter方法的目的是只返回一些预先填充的bean属性,或者最多进行延迟加载,而不是进行昂贵的业务逻辑,如连接DB、将1000行复制到Java内存中等等。在JSF请求期间可以多次调用Getter方法,当在<h:dataTable>等迭代组件内部进行调用或在rendered属性中使用调用时,JSF请求会呈指数级增长。JSF/EL不会在每个请求的基础上缓存getter方法的结果,因为正常的getter调用实际上非常便宜。

另请参阅:

  • JSF为何多次调用getter

我认为您的浏览器很难使用JSF生成的"糟糕"的javascript。你衡量过不同浏览器的性能吗?例如,我建议看看铬是否会更快。

相关内容

  • 没有找到相关文章

最新更新