如何在页面上显示JSF阶段计时

如何在页面上显示JSF阶段计时,jsf,timing,jsf-2.2,phaselistener,Jsf,Timing,Jsf 2.2,Phaselistener,我创建了一个类,它实现了PhaseListener,并将每个阶段的计时打印到日志中。现在我想把它打印到JSF页面上,这样我就可以看到页面呈现时每个阶段花费了多长时间 我不知道这是否可能;也许是鸡和蛋的问题 代码 正如LaurentG告诉我的,要实现我所期待的目标是不可能的。但是,如果有人在寻找时间阶段的代码,这里有一种方法: import javax.faces.event.PhaseEvent; import javax.faces.event.PhaseId; import javax.fa

我创建了一个类,它实现了
PhaseListener
,并将每个阶段的计时打印到日志中。现在我想把它打印到JSF页面上,这样我就可以看到页面呈现时每个阶段花费了多长时间

我不知道这是否可能;也许是鸡和蛋的问题

代码

正如LaurentG告诉我的,要实现我所期待的目标是不可能的。但是,如果有人在寻找时间阶段的代码,这里有一种方法:

import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

public class LogPhaseListener implements PhaseListener {

    private long startTimeP1;
    private long startTimeP2;
    private long startTimeP3;
    private long startTimeP4;
    private long startTimeP5;
    private long startTimeP6;
    private long timeP1;
    private long timeP2;
    private long timeP3;
    private long timeP4;
    private long timeP5;
    private long timeP6;
    private long timeAll;

    @Override
    public void afterPhase(PhaseEvent event) {

        if (event.getPhaseId() == PhaseId.RESTORE_VIEW) {
            timeP1 = (long) ((System.nanoTime() - startTimeP1) * 0.000001);
            System.err.println("|     Phase 1 Execution time -- RESTORE_VIEW -- " + timeP1 + "ms");
        }
        if (event.getPhaseId() == PhaseId.APPLY_REQUEST_VALUES) {
            timeP2 = (long) ((System.nanoTime() - startTimeP2) * 0.000001);
            System.err.println("|     Phase 2 Execution time -- APPLY_REQUEST_VALUES -- " + timeP2 + "ms");
        }
        if (event.getPhaseId() == PhaseId.PROCESS_VALIDATIONS) {
            timeP3 = (long) ((System.nanoTime() - startTimeP3) * 0.000001);
            System.err.println("|     Phase 3 Execution time -- PROCESS_VALIDATIONS -- " + timeP3 + "ms");
        }
        if (event.getPhaseId() == PhaseId.UPDATE_MODEL_VALUES) {
            timeP4 = (long) ((System.nanoTime() - startTimeP4) * 0.000001);
            System.err.println("|     Phase 4 Execution time -- UPDATE_MODEL_VALUES -- " + timeP4 + "ms");
        }
        if (event.getPhaseId() == PhaseId.INVOKE_APPLICATION) {
            timeP5 = (long) ((System.nanoTime() - startTimeP5) * 0.000001);
            System.err.println("|     Phase 5 Execution time -- INVOKE_APPLICATION -- " + timeP5 + "ms");
        }
        if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) {
            timeP6 = (long) ((System.nanoTime() - startTimeP6) * 0.000001);
            timeAll = (long) ((System.nanoTime() - startTimeP1) * 0.000001);

            System.err.println("|     Phase 6 Execution time -- RENDER_RESPONSE -- " + timeP6 + "ms");
            System.err.println("|     Phase X Execution time -- ALL_PHASES -- " + timeAll + "ms");
        }
    }

    @Override
    public void beforePhase(PhaseEvent event) {

        if (event.getPhaseId() == PhaseId.RESTORE_VIEW) {
            startTimeP1 = System.nanoTime();
        }
        if (event.getPhaseId() == PhaseId.APPLY_REQUEST_VALUES) {
            startTimeP2 = System.nanoTime();
        }
        if (event.getPhaseId() == PhaseId.PROCESS_VALIDATIONS) {
            startTimeP3 = System.nanoTime();
        }
        if (event.getPhaseId() == PhaseId.UPDATE_MODEL_VALUES) {
            startTimeP4 = System.nanoTime();
        }
        if (event.getPhaseId() == PhaseId.INVOKE_APPLICATION) {
            startTimeP5 = System.nanoTime();
        }
        if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) {
            startTimeP6 = System.nanoTime();
        }
    }

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.ANY_PHASE;
    }

}
并将以下内容添加到
faces config.xml

<lifecycle>
  <phase-listener>package.name.LogPhaseListener</phase-listener>
</lifecycle>

package.name.LogPhaseListener

Andy Gibson网站上找到的原始代码:

显然,您无法在想要获取渲染时间的页面中打印
渲染响应的时间。但是您可以将计时保存在视图或会话范围[1]bean中,稍后在页面中调用它(例如使用Ajax)

备选方案:将进程时间存储在bean中,并使用它呈现一个特殊的调试页面,您可以在其中监视所有呈现页面的所有计时。通过这种方式,您也不会在一个高效页面中混合调试信息

顺便说一下,我觉得你的想法很奇怪。我通常只查看服务器日志中的日志。我还始终配置一个自定义的
PhaseListener
,它记录每个阶段的处理时间,并将其配置为在特殊日志中记录时间(例如
perf.log

链接:

  • [1]

你可以用它来可视化页面上每个生命周期阶段的持续时间。

快速而肮脏:通过Web服务提供日志,你可以在客户端使用javascript进行轮询。没错,我也看不出这在逻辑上是如何起作用的,尽管经常有一些事情我想不出来,而其他更有知识的人会这么做,这就是我的问题。我的目标是在开发过程中自动在页面上显示这些信息;这并不重要,但我想知道是否有办法做到这一点。谢谢你花时间回答我的问题。