gpt4 book ai didi

java - Play Framework 2.x : How to update a displayed view from server side?

转载 作者:行者123 更新时间:2023-12-01 13:11:23 25 4
gpt4 key购买 nike

我在玩游戏时遇到了一些问题!框架。该框架对我来说是新的,我第一次也是唯一一次使用它进行练习,就是本教程 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com