2

我有一个 Wicket 6.10.0 Web 应用程序。我想实现一个计时器来显示当前用户会话中的剩余时间。链接这个:http: //jsfiddle.net/justinobney/uZMGD/

Label我的页面页脚中有一个检票口。此标签使用 JavaScript 将时间从例如 5 分钟倒计时到 0 分 0 秒。每次请求都应刷新此倒计时(标签)。

现在的问题是如何做到这一点?

init()我添加的方法中,AbstractRequestCycleListener它会通知我每个结束请求,如下所示:

  getRequestCycleListeners().add(new AbstractRequestCycleListener() {

     @Override
     public void onEndRequest(RequestCycle cycle) {
        super.onEndRequest(cycle);
        System.out.println("End Request - here i would like to refresh somehow the label");

     }

  });

但我不知道如何将此消息发送到标签以刷新自身。有任何想法吗?

*编辑:* 我有一个SPA:

<body>
lots of AJAX components here
<div wicket:id="footer">Footer always stays here. <br />
Session timeout in: <span wicket:id="sessionTimeoutLabel">countdown here</span>
</div>
</body>

倒计时有点像这样:http: //jsfiddle.net/justinobney/uZMGD/

现在,在每个 AJAX 请求上,我都需要sessionTimeoutLabel重新渲染标签以开始从 600 秒到 0 的计数。

4

1 回答 1

3

不要过分关注“请求结束”。这大约是渲染阶段之后的 10µs。另请注意,会话超时在每次请求后都会重置,因此无需使用新值更新标签,只需将其重置为会话超时参数。

您应该在某处有一个参数来指示您配置的会话超时,并使用它来显示标签,如果它是特定于应用程序的,您可以在 Application 类中创建一个 getter:

public MyApplication extends WebApplication {
    public static final int SESSION_TIMEOUT = 30; // minutes

    public int getSessionTimeout() {
        return SESSION_TIMEOUT;
    }
}

在您的页脚中,您可以添加一个标签:

add(new Label("timeout", PropertyModel.of(this, "application.sessionTimeout")));

或者,如果它是您会话的属性,您可以将 getter 添加到您的自定义会话中:

public MySession extends WebSession {
    public static final int SESSION_TIMEOUT = 30; // minutes

    public int getSessionTimeout() {
        return SESSION_TIMEOUT;
    }
}

并在您的标签中检索它:

add(new Label("timeout", PropertyModel.of(this, "session.sessionTimeout")));

属性模型的表达式利用了 Component 有一个用于 Application的 getter和一个用于 Session的 getter 的事实。

于 2013-10-07T10:16:53.370 回答