2013-08-26 54 views
2

請不要猶豫,編輯問題或詢問更多細節,如果我錯過了任何東西。雖然循環在JSP中執行javascript不工作?

我知道這是不好使用ScriptletsJSP

但我被分配去維護現有的JAVA project,它只能用JSPservlets(無框架)構建。

我的任務是使用Apache HTTP Server爲我的應用程序實現負載平衡。

該應用程序正常工作與出load balancing。當我使用Apache HTTP Server實現load balancing時,我遇到了JSP的問題。

我會舉一個場景。我的JSP有一個while循環,它運行javascript來更新內容。

我的JSP有,

<% 
    String jsPreAppend = "<script language=JavaScript >push('";  
    String jsPostAppend = "')</script> "; 
    String s=null; 
    int i = 0; 

     try { 
     while (true) { 
      System.out.println("count :"+i); 
      out.print(jsPreAppend + i + jsPostAppend);   
      out.flush(); 

      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       out.print(jsPreAppend + "InterruptedException: " + e + jsPostAppend); 
      } 

      i++; 

      } 
     } catch (Exception e) { 
      out.print(jsPreAppend + "Exception: " + e + jsPostAppend); 
     } 
%> 

我的JavaScript有,

function push(content) { 
     document.getElementById('update').innerHTML = content; 
} 

控制檯輸出將是,

count :1 
count :2 
count :3 
. 
. 
. 
count : n 
count :n+1 

但內容不會在JSP更新。我的JavaScript在while循環中失敗。

SYSOUT()作品,因爲更新的內容將在控制檯打印爲每

但是相同的應用程序的工作良好與出load balancing(只有一個tomcat)。

希望我們的堆棧用戶能幫助我。

+0

當代碼無法更新頁面時,瀏覽器中是否有任何javascript錯誤? –

+0

不,我沒有得到任何錯誤。 –

回答

3

當你的HTML被渲染時,JSP已經被執行了。所以你試圖做的事情不能通過該代碼來實現。

您需要編寫一個Java腳本方法,它在某個時間執行一次更新。 Check this thread使用Javascript編寫相同的邏輯

+2

但是OP表示這在單個節點上工作。他似乎正在從scriptlet循環構建js調用'push(i)'。這些調用可能意味着在頁面加載或類似情況下執行。你能詳細說明這可能與負載平衡有關嗎? –

+0

按照我的意見,它不應該在兩種情況下都起作用。我們無法控制JSP中某些JS函數的自動執行權嗎?如果'push(i)'是從JSP完成的,那麼這個延遲將是不可見的,並且每次頁面加載時,它都會根據打印的數字「推送(i)」調用。 – sanbhat

+0

正如我所看到的, 'push(i)'不會從JSP中執行。它們將在HTML響應中打印出來,當它看到'

0

考慮到while(true)循環將在服務器端執行。此時,響應文檔(HTML)正在構建,並且尚未被客戶解釋。此循環僅將JavaScript調用寫入響應在發送到客戶端之前存儲在其中的某種緩衝區。

舉個例子,什麼圈正在做的是寫廣告無休止的響應:

<script language=JavaScript >push('1')')</script> 
... 
<script language=JavaScript >push('n')')</script> 

,每行每秒寫入的事實是無關緊要的。您可以在正確的時間在標準輸出中看到這些痕跡,因爲這正是服務器上正在執行的內容。

這將使請求卡住在該無限循環,除非有某種例外。即使循環在某個時刻結束,並且請求完成了處理,當這些語句被客戶端執行時,它們也會被順序執行而不會有任何延遲。

您應該將這些調用移動到客戶端,並使用客戶端機制(如setTimeout())(如他的答案中提供的@sanbhat)安排其執行。