可能的原因是我的行动电话被延迟了?它发生在我拥有的一个表单上的所有动作调用。单击任何将调用操作的内容(或者在表单加载时评估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。那有什么解释吗?如果我点击其中一个commandLinks,我不希望重新呈现dataTable。所谓的方法都没有特别“慢”。
答案 0 :(得分:1)
我能想到的唯一可行的解释是你在getter方法中而不是在bean的构造函数中执行昂贵的业务逻辑,或者在必要时只调用一次的任何其他事件方法。
Getter方法只是只返回一些预先填充的bean属性或者最高的延迟加载,而不是像连接数据库那样进行昂贵的业务逻辑,将1000行复制到Java的内存等等。在JSF请求期间,可以多次调用Getter方法,当在<h:dataTable>
之类的迭代组件内进行调用或在rendered
属性中使用时,该请求会以指数方式增长。 JSF / EL不会基于每个请求缓存getter方法的结果,因为正常的 getter调用特别便宜。
答案 1 :(得分:0)
我说你的浏览器很难与糟糕的&#34;糟糕的&#34; JSF生成的javascript。你用不同的浏览器衡量表演了吗?我建议看看铬是否更快。