2014-01-13 26 views
2

我遇到了以下問題:我有一個web應用程序,它有一個使用ajax從servlet請求更新列表的html頁面(想法是我希望一個用戶能夠看到其他修改用戶在名單上做)。爲什麼Servlet,.html文件在服務器重啓後沒有更新?

問題是,即使在重新啓動服務器之後,我對servlet代碼和.html文件所做的更新也沒有考慮到。我試圖用各種方式解決這個問題,從清理項目到創建另一臺服務器,大約兩個小時後我找到的解決方案是刪除臨時互聯網文件和網站文件。不過,我仍然需要每做一次修改代碼。

然後我發現了一個新問題(實際上是第一個問題的後果)。從我的.html文件中,我使用javascript setInterval(...)方法在servlet上執行ajax請求,但只有第一個請求被執行,然後,直到我再次清理臨時文件,它看起來像只是保持初始化響應,即使列表已更新。我知道我的代碼沒有錯,因爲我在servlet上打印了屏幕,並且我可以看到doGet(...)只被調用一次。如果我在程序執行期間刪除臨時互聯網文件,再次調用doGet(...),.html被正確更新並且一切正常。

那麼爲什麼會發生這種情況,是否有解決問題的方法?我相信eclipse/tomcat以某種方式緩存信息,但可以禁用它(我使用eclipse juno 4.2.1,apache-tomcat-7.0.47,並且我直接從eclipse部署項目)。此外,這個問題並沒有發生從開始,它曾經工作正常,我不知道我改變了什麼導致它停止工作。

回答

1

Servlet容器可以由默認靜態內容或瀏覽器themselfes發送緩存頭將緩存似乎靜態的(例如在.html.gif等結束),並有沒有緩存頭的內容。這就是爲什麼你需要清理瀏覽器緩存。因此,一些解決方案(可能有其他解決方案):

  • 讓servlet過濾器攔截請求並在所有標頭中添加適當的短暫緩存或無緩存。 (關於如何做到這一點,大量的資源)
  • 爲GET請求添加緩存中斷請求參數,例如,而不是請求

    http://host/app/index.html 
    

    問:

    http://host/app/index.html?q=12345678 
    

    ,其中12345678是一個隨機numbe或者,當前時間戳(jQuery不會這樣說,如果你指定cache: false

+0

確實,我總是發送相同的GET請求,問題現在已解決。感謝您指出。 –

1

有沒有辦法解決它?

您只需要服務器利用更新的文件,而不是從緩存中取出。有多種方法可以做到這一點。對於Tomcat 8.0.21,在web.xml中保存更改似乎確實會導致服務器使用文件而不是緩存。

我發現這樣做的最快捷方式是添加一個空間,保存,刪除空間,再次保存。另外,我在一個重要的領域內完成了這個工作,例如在url-pattern標籤中。

+0

剛剛遇到此問題,並能夠通過web.xml文件的「接觸」來獲取Tomcat重建。 – Ken

相關問題