2012-07-05 37 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的說:

部隊在緩衝區中的任何內容寫入到客戶端。對此方法的調用會自動提交響應,這意味着狀態代碼和頭文件將被寫入。