JSF:操作调用被延迟

时间:2011-05-24 10:20:36

标签: java 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。那有什么解释吗?如果我点击其中一个commandLinks,我不希望重新呈现dataTable。所谓的方法都没有特别“慢”。

2 个答案:

答案 0 :(得分:1)

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

Getter方法只是返回一些预先填充的bean属性或者最高的延迟加载,而不是像连接数据库那样进行昂贵的业务逻辑,将1000行复制到Java的内存等等。在JSF请求期间,可以多次调用Getter方法,当在<h:dataTable>之类的迭代组件内进行调用或在rendered属性中使用时,该请求会以指数方式增长。 JSF / EL不会基于每个请求缓存getter方法的结果,因为正常的 getter调用特别便宜。

另见:

答案 1 :(得分:0)

我说你的浏览器很难与糟糕的&#34;糟糕的&#34; JSF生成的javascript。你用不同的浏览器衡量表演了吗?我建议看看铬是否更快。