2012-07-05 70 views
6

如何将文本输出流式传输到浏览器中的页面以显示可能需要大约15-20秒的操作进度?我试过直接写入HttpServletResponse的输出流,但用户仍然看到完整输出整个过程完成。如何从Java Spring MVC 3.0 Web应用流文本响应

这是我到目前为止已经试过

@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

您是否在每次发送数据卡片后尝试刷新输出流? – Luciano 2012-07-05 14:49:31

+0

@Luciano我已经添加了我到现在为止所尝试的问题。当我从Chrome查看页面时,这不起作用 – Danish 2012-07-05 14:59:13

+0

我认为你最好的选择是一种不同的方法:在JavaScript中使用计时器,每隔1秒(或半秒)从/测试数据,使用ajax和/测试会返回到被调用点之前未发送的内容。 – Luciano 2012-07-05 15:04:02

回答

1

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

+2

感谢您的关注!基本上,我想为用户提供请求作业执行的能力,能够监视进度并在作业结束后更新其视图。我可以看到如何通过使作业执行器异步并维护'session'中的某个状态并从UI中进行轮询来完成这项工作。 *但是*如果我的问题有一个有效的答案,我可以看到这是在没有异步执行程序和状态管理的情况下完成的。 – Danish 2012-07-05 18:15:06

+0

我觉得你所要求的是服务器与客户联系,虽然不是不可能,但它会非常不规则。很明显,有一些路由可以将信息以大量的方式发送回客户端(如FTP),但不幸的是,我确实知道这是否适用于您想要做的事情,我也不知道Spring MVC是否可行。祝你好运! – thatidiotguy 2012-07-05 19:23:05

+0

谢谢!我可能会使用你和其他人现在提到的轮询方法,并暂时保持这个问题。我只是喜欢探索所有的可能性。干杯! – Danish 2012-07-05 19:42:49

-4
@Controller 
public class MyController{ 

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

如果您使用的春天控制器,你可以做上面的响应主体注解。

+1

这是如何解决部分进度输出问题的? – 2012-07-05 15:48:20

+0

@SeanPatrickFloyd哦,对,我没有看到/读过那一点。这有点难...不知道 – NimChimpsky 2012-07-05 15:49:19

1

尝试使用:

response.flushBuffer(); 

为JavaDoc的说:

部队在缓冲区中的任何内容写入到客户端。对此方法的调用会自动提交响应,这意味着状态代码和头文件将被写入。