【发布时间】:2014-04-03 11:21:08
【问题描述】:
我对这出戏有一些问题!框架。 这个框架对我来说是新的,我第一次也是唯一一次使用它,是本教程here。
我有一个列出一些数据的视图。一个 Controller,它有一个显示 view 的方法和另一个可以使用 JSON 接收一些数据的方法。现在我想在收到新数据(JSON)时更新 view。
我发现,我可以使用 comet 套接字、websocket 或 服务器发送事件 来实现这一点。 (永久的 AJAX 轮询不是我的选择。)
最好的方法是什么?
我试图用 websockets 解决它,但它没有按我的意愿工作......
这是我的代码:
public class MyController extends Controller{
public static Result showMyView() {
return ok(views.html.showMyView.render(Data.all()));
}
@BodyParser.Of(play.mvc.BodyParser.Json.class)
public static Result jsonReceiver() {
JsonNode json = request().body().asJson();
String rcvData = json.findPath("someData").textValue();
if(rcvData != null) {
/*FLAG*/
//SEND SOME DATA OVER THE WEBSOCKET FROM HERE?! ..To update the view
//something like: out.write("Now from here!");
return ok();
} else {
return badRequest();
}
}
public static WebSocket<String> websocket() {
return new WebSocket<String>() {
public void onReady(WebSocket.In<String> in, WebSocket.Out<String> out) {
out.write("Hello!");
}
};
}
}
有什么方法可以从上面代码中的/*FLAG*/ 位置通过套接字发送消息或其他数据?
我的观点是这样的:
@(dataContent: List[Data])
@main(title = "MyViews Observation Page") {
@*
SOME HTML CODE ...
*@
<script type="text/javascript">
var socket = new WebSocket("ws://" + location.host + "/path/to/my/websocket")
socket.onmessage = function(event) {
alert("Received: " + event.data); // only for testing... will be replaced later
}
</script>
}
有人可以帮我吗?当收到新数据时,我不知道如何更新视图。
如果您能根据我上面的示例代码展示它,我将不胜感激。 如果以不同的方式(彗星或服务器发送的事件)更容易实现,我也非常感谢示例。
在我之前的调查中,我发现了一些彗星和服务器发送事件的例子,但它们只是在 scala 中,我还没有理解它们。
我正在使用带有 java 的 play framework 2.2.2。
【问题讨论】:
-
我使用 websockets,由于某些原因它很复杂(与代理的兼容性,连接意外关闭)。如果你有一个兼容的代理,你仍然可以这样做,如果你每 x 秒 ping 一次连接,如果失败则恢复。
-
好的。我以前从未使用过 websockets。你能为我的问题推荐一种解决方法吗?我这样做的方式非常灵活。最后,我主要需要一个在收到 JSON 数据后更新的“观察页面”。
标签: java playframework websocket playframework-2.0 server-sent-events