servlets - 文本/事件流从头开始渲染(没有插件)

标签 servlets grails controller push

要使用push方法,我们使用著名的JS对象EventSource:

这是易于开发的客户端部分:

        var eventSource = new EventSource("controller/action");

        eventSource.onmessage = function(event) {

            document.getElementById('foo').innerHTML = event.data;

        };

但是,我很难在服务器部分(Grails)中配置push方法。

当我查看由Servlets开发的JEE应用程序时,我可以看到服务器部分如下:

http://viralpatel.net/blogs/html5-server-sent-events-java-servlets-example/
public class TestServlet extends HttpServlet {


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //content type must be set to text/event-stream
        response.setContentType("text/event-stream");  

        //encoding must be set to UTF-8
        response.setCharacterEncoding("UTF-8");

        PrintWriter writer = response.getWriter();

        for(int i=0; i<10; i++) {

            writer.write("data: "+ System.currentTimeMillis() +"\n\n");

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        writer.close();
    }
}

要将这个servlet转换为 Action Controller :
def push(){

        render(contentType:'text/event-stream',characterEncoding:'UTF-8'){
              [dt:"data: "+ System.currentTimeMillis() +"\n\n"]             
        }
}

在客户端部分:
 var eventSource = new EventSource(baseURL+"external/push");
 eventSource.onmessage=function(e){
     console.log(e.data.dt);
 }

不幸的是,我在console上没有任何结果。

最佳答案

我不确定render方法是否可以正确处理'text/event-stream',但是您可以直接在操作中访问response对象:

def push() {
  //content type must be set to text/event-stream
  response.setContentType("text/event-stream");  

  //encoding must be set to UTF-8
  response.setCharacterEncoding("UTF-8");

  for(int i=0; i<10; i++) {

    response.outputStream.write("data: "+ System.currentTimeMillis() +"\n\n");
    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
  response.outputStream.flush()
}

关于servlets - 文本/事件流从头开始渲染(没有插件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21402670/

相关文章:

php - 自定义 Shopware6 路由给出 "405 Method Not Allowed"

ruby-on-rails - 我认为不是PostsController#new中的SyntaxError语法错误

java - servlet 接收到的 OutputStream 为空

java - 如何创建 Java 自定义 Web 控件?

grails - 如何在服务中实例化 messageSource

grails - 是否可以在message.properties文件中写入表达式?

java - Spring Servlet 从 *.html 映射到 SO 类型映射

java - JSP 的 servlet session 失效问题

grails - 拦截器可以在认证和 Action 执行之间执行吗?

grails - 如何将日期放入 Grails 中的参数中