2012-05-07 54 views
1

我打算進行流式處理。我有.jsp文件,並在.jsp文件的最後,我包括使用我的異步的Servlet下面的代碼:Servlet 3.0中的AsyncContext無限瀏覽器加載

<jsp:include page = '/simple' flush = 'true' /> 

所以我想在整個頁面加載打開無限的異步請求,這將處理異步響應。

這裏是我的servlet代碼:

public class SimpleAsyncServlet extends HttpServlet { 
    public static AsyncContext ctx; 
    protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { 
     req.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true); 
     ctx = req.startAsync(); 
     ctx.setTimeout(0); 
    } 
} 

其他Java類我使用的是靜態SimpleAsyncServlet.ctx.getResponse.getWriter()給println一些JavaScript代碼到當前頁面。它沒有任何問題,但瀏覽器不斷顯示它正在加載。根據Async的理念頁面應該加載和這個異步請求應該保持活着在後臺和..這就是它,但沒有....瀏覽器不斷加載頁面直到永遠(超時是0,COS我想有無限的開放reqeust)

我在哪裏錯了,如何在沒有瀏覽器加載的情況下發出此永久請求?

P.S.我試圖直接從url(localhost .../simple)訪問我的servlet,然後我看不到任何內容打印在頁面上。它繼續加載直到永遠。

+0

我有corrent它。它是flush ='true'。我有: @ javax.servlet.annotation.WebServlet(// servlet名稱 名稱= 「簡單」, //的servlet URL模式 值= { 「/簡單」},// 異步支持所需 asyncSupported =真正); 我也試過req.startAsync(req,res); 沒有幫助。 –

回答

1

你正試圖實現不可能的事情。

該瀏覽器將顯示該頁面被加載,直到它知道它已通過以下方法中的一個接收到的完整的請求:

  • 它已經接收到數在Content-Length頭字節指出
  • 連接被關閉
  • 它使用分塊編碼

由於要一個「無限」響應,無三個選項以上是當接收到結束區塊永遠不會發生。

+0

那我該如何做流媒體呢?或者我如何實現「推送」到瀏覽器?據我瞭解,「推」只是無限的開放請求,或者我錯了? –

+0

而且如果我從.js發出Ajax請求,據我所知我沒有看到瀏覽器加載 –

+1

HTTP是一個請求/響應協議。你不能實現真正的推動。有很多方法可以使用HTTP破解看起來像是推送的東西。如果你想要一個真正的服務器推動,那麼你需要像WebSocket這樣的東西。您可以使用或不使用Servlet 3.0 Async來從Servlet流式傳輸內容。如果瀏覽器將結果顯示爲網頁,則它總是看起來像正在加載頁面。爲了避免這種情況,您需要嵌入在頁面中的東西(選擇您選擇的技術)來執行請求並處理響應,以便瀏覽器不會意識到發生了什麼。 –

相關問題