从后端重新渲染wicket组件

时间:2016-07-29 21:39:23

标签: ajax wicket

我正在使用wicket页面,我需要允许后端进程指示页面上的组件进行刷新。我不想刷新整个页面,只是一个组件,所以我猜我在Ajax领域。

我找到了一些不同的Ajax定时器,如AjaxSelfUpdatingTimerBehaviour,但我真的想要实际推动,因为变化应该是相当即时的,我需要一些高频定时器。

有谁知道实现这个目标的好方法?

编辑1

我一直在关注Wicket Websocket实现。我可以看到WebSocket行为看起来很有希望,但我能找到的唯一服务器推送方法是这样的:

IWebSocketConnectionRegistry registry = new SimpleWebSocketConnectionRegistry();
  Application application = Application.get(applicationName);
  IWebSocketConnection wsConnection = registry.getConnection(application, sessionId, pageId);

  if (wsConnection != null && wsConnection.isOpen()) {
    wsConnection.send("Asynchronous message");
  }

但我没有看到任何方式以类似于Ajax行为(如target.add(component))的类型安全方式更新组件。 有人可以详细说明或指出我正确的方向吗?谷歌不是我的朋友。

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

我正在使用WebSocketPushBroadcaster推送对象。

IWebSocketSettings webSocketSettings = IWebSocketSettings.Holder.get(this);
WebSocketPushBroadcaster broadcaster = new WebSocketPushBroadcaster(webSocketSettings.getConnectionRegistry());
Application application = Application.get(applicationName);
broadcaster.broadcastAll(application, myObj);

检查您需要该对象的页面上的事件:

@Override
public void onEvent(IEvent<?> event)
{
  if (event.getPayload() instanceof WebSocketPushPayload)
  {
     WebSocketPushPayload wsEvent = (WebSocketPushPayload) event.getPayload();
     if (wsEvent.getMessage() instanceof MyObj)
     {
        MyObj myObj = wsEvent.getMessage();
        // do stuff
        wsEvent.getHandler().add(myComponent);
     }
  }
}

我正在使用这些依赖:

    <dependency>
        <groupId>org.apache.wicket</groupId>
        <artifactId>wicket-native-websocket-core</artifactId>
        <version>6.21.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.wicket</groupId>
        <artifactId>wicket-native-websocket-jetty</artifactId>
        <version>6.21.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.wicket</groupId>
        <artifactId>wicket-native-websocket-tomcat</artifactId>
        <version>6.21.0</version>
    </dependency>