【问题标题】:Play Framework 2.x: How to update a displayed view from server side?Play Framework 2.x:如何从服务器端更新显示的视图?
【发布时间】: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


【解决方案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);
            }
        };
    }

}

【讨论】:

  • 谢谢你,这对我有帮助。在您上面的帖子中……您曾写道,连接可能会意外关闭。我想,对于这样的问题,websockets 是一个很好的解决方案。不是吗?使用彗星或服务器端事件会更好吗?
猜你喜欢
  • 2013-09-23
  • 2012-05-24
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多