我的操作调用延迟的可能原因是什么?它发生在我拥有的一个表单上的所有动作调用中。在我点击任何将调用操作的东西之后(或者在表单加载时应该评估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。你衡量过不同浏览器的性能吗?例如,我建议看看铬是否会更快。