我在玩游戏时遇到了一些问题!框架。 该框架对我来说是新的,我第一次也是唯一一次使用它进行练习,就是本教程 here .
我有一个列出了一些数据的 View 。一个 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>
}
有人可以帮我吗?当收到新数据时,我不知道如何更新 View 。
如果您能根据我上面的示例代码来展示它,我将非常感激。 如果以不同的方式(comet 或服务器发送事件)更容易实现,我也非常感谢您提供示例。
在我之前的调查中,我发现了一些 cometd 和服务器发送事件的示例,但它们仅在 scala 中,我还没有理解它们。
我正在使用带有 java 的 play 框架 2.2.2。
最佳答案
每个客户端都会在您的服务器上生成一个 WebSocket.Out
。
将它们存储在List中,然后调用WebSocket.Out.write(objectNode)
public class MyController extends Controller{
//1. you store your client channels here
private static ArrayList<WebSocket.Out> channels=new ArrayList<>();
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) {
//3. you can write in your channels :)
for(WebSocket.Out channel : channels){
channel.write("blah");
}
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) {
//2. each time a client connects, you save a reference to its channel
channels.add(out);
}
};
}
}
关于java - Play Framework 2.x : How to update a displayed view from server side?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22836029/