6

如何将文本输出流式传输到浏览器上的页面以显示可能需要大约 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

4 回答 4

2

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

于 2012-07-05T17:01:12.467 回答
1

尝试使用:

response.flushBuffer();

正如 JavaDoc 所说:

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

于 2012-08-29T09:12:57.860 回答
0

在使用 Chrome 进行测试时,这对我有用

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

... write content ...
于 2018-09-06T13:02:16.100 回答
-5
@Controller
public class MyController{

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

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

于 2012-07-05T15:19:56.287 回答