如何从Java Spring MVC 3.0 Webapp流式传输文本响应

时间:2012-07-05 14:47:41

标签: java servlets spring-mvc

如何将文本输出流式传输到浏览器上的页面以显示可能需要大约15-20秒的操作进度?我已经尝试直接写入HttpServletResponse的输出流,但是在整个过程完成后,用户仍然可以看到完整的输出

这是我到目前为止所尝试的

 @RequestMapping(value = "/test")
 public void test(HttpServletResponse response)
            throws IOException, InterruptedException {
    response.getOutputStream().println("Hello");
    response.getOutputStream().flush();
    Thread.sleep(2000);
    response.getOutputStream().println("How");
    response.getOutputStream().flush();
    Thread.sleep(2000);
    response.getOutputStream().println("are");
    response.getOutputStream().flush();
    Thread.sleep(2000);
    response.getOutputStream().println("you");
    response.getOutputStream().flush();
}

4 个答案:

答案 0 :(得分:2)

我不是Spring MVC专家,但我认为你会做一些像发送202“响应”的响应代码,这表示服务器已收到请求并将进行一些异步处理。通常,服务器提供URL以允许客户端发出有关操作状态的请求。您尝试做的事情违反了服务器/客户关系的常用方式。客户端调用服务器,服务器响应,然后关闭连接。您在什么情况下尝试这样做以及出于什么原因?也许我可以提供更多的见解或想到另一种方法来做到这一点?

答案 1 :(得分:1)

尝试使用:

response.flushBuffer();

正如JavaDoc所说:

  

强制将缓冲区中的任何内容写入客户端。对此方法的调用会自动提交响应,这意味着将写入状态代码和标题。

答案 2 :(得分:0)

这在使用Chrome测试时对我有用

response.setBufferSize(0);
response.setContentType("text/event-stream");

... write content ...

答案 3 :(得分:-5)

@Controller
public class MyController{

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public @ResponseBody String getTest() {
      return "hello how are you";
    }
}

如果您使用的是弹簧控制器,则可以使用响应正文注释执行上述操作。