我在剧中遇到了一些问题!框架。 这个框架对我而言是新的,我的第一个也是唯一的练习是本教程here。
我有一个视图,它列出了一些数据。一个 Controller ,它有一个方法来显示视图,另一个方法可以用 JSON 接收一些数据。现在我想在收到新数据( JSON )时更新视图。
我发现,我可以使用 comet socket , websocket 或服务器发送的事件来实现这一点。 (永久的AJAX-polling对我来说不是一个选择。)
这样做的最佳方式是什么?
我尝试使用 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。
答案 0 :(得分:1)
每个客户端都会在您的服务器上生成WebSocket.Out
。
将它们存储在列表中,然后调用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);
}
};
}
}