如何将文本输出流式传输到浏览器上的页面以显示可能需要大约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();
}
答案 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";
}
}
如果您使用的是弹簧控制器,则可以使用响应正文注释执行上述操作。