Play Framework 2.x:如何从服务器端更新显示的视图?

时间:2014-04-03 11:21:09

标签: java playframework websocket playframework-2.0 server-sent-events

我在剧中遇到了一些问题!框架。 这个框架对我而言是新的,我的第一个也是唯一的练习是本教程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。

1 个答案:

答案 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);
            }
        };
    }

}