我理解使用add(Component)
的{{1}}方法重新绘制wicket组件的概念 - 但我只能在客户端触发某个ajax事件时使用此方法。
但我必须重新绘制一个组件而不涉及任何用户交互,所以我不能使用它。下一步是发现AjaxRequestTarget
及其相关方法WebSocketBehavior
- 此消息再次获取类型为onMessage()
的参数(将WebSocketRequestHandler
扩展为),我可以将其添加到 - 待重新绘制组件。但是,当客户端向服务器发送websocket消息时,似乎只会调用此方法。
最后,我发现我可以通过打开AjaxRequestTarget
从服务器端触发异步消息。 Wicketinaction在此博客文章(http://wicketinaction.com/2012/07/wicket-6-native-websockets/)中建议使用以下代码行:
IWebSocketConnection
wsApplication,wsSessionId和wsPageId是在WebSocketBehavior的IWebSocketConnectionRegistry registry = new SimpleWebSocketConnectionRegistry();
Application application = Application.get(wsApplicationName);
IWebSocketConnection wsConnection = registry.getConnection(application, wsSessionId, wsPageId);
if (wsConnection != null && wsConnection.isOpen()) {
try {
wsConnection.sendMessage("test");
} catch (IOException e) {}
}
方法中获得的。
一般来说,这种方法有效 - 我可以将测试消息发送给客户端,它会收到这个文本。但我找不到如何使用此方法触发组件重绘的方法。对此有任何建议将不胜感激 - 或者我到底完全错了?
答案 0 :(得分:2)
答案 1 :(得分:1)
看一下https://github.com/papegaaij/wicket-atmosphere-quickstart/,这是一个通过大气层(图书馆使用WebSockets或后备)将当前时间作为Wicket Component
反复推送的示例。
它基于wicket-atmosphere,这反过来使Wicket中的Atmosphere可用。该模块被认为是实验性的,因此位于Wicket的存储库中。尽管如此,它看起来非常可靠,绝对值得一试。
以下片段取自上述示例,但请务必阅读Atmosphere的文档和wicket-atmosphere代码以了解其API。基本上,您可以创建一个中央事件调度程序并使用注释标记方法,根据需要格式化事件并通过提供的AjaxRequestTarget
发送。
从后台作业向中央事件调度程序创建事件:eventBus.post(new Date());
转换事件并发送为Component
:
@Subscribe
public void updateTime(AjaxRequestTarget target, Date event) {
timeLabel.setDefaultModelObject(event.toString());
target.add(timeLabel);
}