从后端重新渲染 wicket 组件
Re-render wicket component from backend
我正在使用检票口页面,我需要允许后端进程指示页面上的组件进行刷新。我不想刷新整个页面,只刷新一个组件,所以我猜我在 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)。
有人可以详细说明或指出我正确的方向吗? Google 不是我的朋友。
你应该看看 websockets:
https://ci.apache.org/projects/wicket/guide/7.x/guide/nativewebsockets.html
我正在使用 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>
我正在使用检票口页面,我需要允许后端进程指示页面上的组件进行刷新。我不想刷新整个页面,只刷新一个组件,所以我猜我在 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)。 有人可以详细说明或指出我正确的方向吗? Google 不是我的朋友。
你应该看看 websockets:
https://ci.apache.org/projects/wicket/guide/7.x/guide/nativewebsockets.html
我正在使用 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>