2013-04-01 36 views
0

我在想如何讓AJAX利用servlet 3的異步響應。在請求 - 響應同步處理模型中,當響應返回時,XmlHttpRequest的回調可以得到響應文本;但是如何在另一個線程中處理響應並返回一些消息,請求結束時XHR會得到什麼?它還能得到響應體嗎?我試了一個簡單的代碼來測試它,似乎沒有得到答覆;如何整合AJAX和Java EE servlet 3的異步響應

我可以理解,當AJAX請求返回時,響應中沒有任何內容,它將在另一個服務器線程中被延遲,所以回調沒有任何結果。

但我不知道有什麼辦法讓AJAX得到正確的迴應嗎?

+0

看這裏http://stackoverflow.com/questions/2162783/asynchronous-servlets-vs-synchronous-servlets瞭解更多信息。 –

+0

我通過該線程閱讀,似乎與我的問題無關。我實際上想在客戶端使用AJAX,而在服務器端使用servlet 3異步處理。但是如何在處理完成後從服務器獲得響應?可能嗎? – user1484819

+0

該文章的確談論它。關鍵是持久的http連接。這裏有一個教程,討論它http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/async-servlet/async-servlets.html –

回答

0

恐怕以前我犯過一個錯誤,我忘了在異步處理完成後調用asycContext.complete()。完成()被調用後,ajax得到響應。然而,如果處理持續時間比超時設置更長的時間,就像下面,無一例外稱asynccontext會出現的非法狀態,並且客戶端得到什麼:

final AsyncContext ac = request.startAsync(); 


    ac.setTimeout(1000); 


    Executors.newSingleThreadExecutor().execute(new Runnable(){ 

     @Override 
     public void run() { 
      PrintWriter pw; 
      try { 
       Thread.sleep(2000); 
       pw = ac.getResponse().getWriter(); 
       pw.write("Hello, World!"); 
       ac.complete(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

    }); 

所以我想這裏的關鍵是:1。電話處理完成後完成; 2.設置適當的超時時間;