2010-01-13 21 views
3

我寫了幾個servlet程序,但我不認爲我完全理解servlet如何運行。所以這裏是夫妻問題,我有:servlet如何工作?

我寫的關於Servlet的所有代碼只能在Netbeans上運行,後面運行apache tomcat。當我運行向servlet發出請求的html文件時,它通常會提示錯誤,指出找不到該servlet,於是我不得不重新部署該servlet,然後一切運行良好。看起來像一段時間後我的servlet超時。

servlet是否一直運行? Servlet有init()和destroy(),所以我猜它不會一直運行。那麼它什麼時候開始,什麼時候結束?它是在客戶發出請求時開始,並在超時時結束?我如何解決我的問題,我必須不斷重新部署servlet。非常感謝你。

回答

4

在正常情況下,一個servlet只在關閉時(即應用程序容器,如Tomcat關閉時)銷燬。否則,它在應用程序的持續時間內保留在內存中。我無法說明Netbeans設置發生了什麼,但嘗試將WAR文件部署到獨立的Tomcat安裝中,並查看問題是否消失。

應用程序容器在servlet上調用destroy的另一次是內存耗盡,但這種情況遠不常見。

關於您關於請求的問題,servlet旨在處理許多請求。據說servlet是應用程序範圍的,而請求有其自己的範圍。

+0

當你說要將WAR文件部署到獨立的Tomcat時,它只是指Apache Tomcat文件夾中的webapps文件夾中的WAR文件。我對麼?您是否需要做其他事情才能真正部署它,否則Tomcat會自動爲您部署WAR文件 – 2010-01-14 17:55:08

+1

不,Tomcat會自動擴展WAR文件。當你在'webapps'下看到一個與WAR文件同名的目錄時(例如,如果你部署了'myapp.war',你會看到一個目錄'$ CATALINA_HOME/webapps/myapp/)。根據您使用的Tomcat版本,您可能需要重新啓動Tomcat,否則可能會自動發生。 – danben 2010-01-14 18:24:11

0

你需要研究的servlet的生命週期 - 這就是在init()和destroy方法有用於

正常的init()被調用一次,當的serlvet首次調用(除非你不喜歡的東西集它在Tomcat中自動運行)

和destroy()被調用時,容器關閉

的doPost()或的doGet()(如果它是一個HTTP servlet的)被稱爲用於每個請求

1

一個servlet「只有在被調用時才運行「。服務器將等待來自客戶端的連接,讀取頭文件,根據web.xml中的映射找到適當的servlet,然後調用該servlet的service()方法。 servlet對象將保留在內存中,直到容器決定處置它(它可能在任何時候它不處理請求)。如果服務器決定丟棄一個特定的servlet實例,它會在下一次請求進入servlet時創建一個新實例。

這意味着你不應該得到一個錯誤,說服務器找不到你的servlet。假設應用程序已經部署,並且有正確的servlet映射,容器將能夠處理請求。如果您編輯了您的請求並粘貼了確切的錯誤消息,則有人可能會告訴您爲什麼不會發生這種情況。

+0

謝謝。你的回答對我很有幫助。我的servlet並不經常關閉。當它會,我會嘗試發佈確切的錯誤。現在,我將嘗試像其他建議一樣將WAR文件部署到獨立的TOMCAT中。 – 2010-01-14 17:59:11

2

你顯然正處在使用servlet進行開發的階段。您需要確保該網絡應用程序是完全每當您對web.xml或任何Servlet類進行更改時發佈。否則,您可能會冒險找不到資源。

簡而言之,「資源未找到」錯誤基本上與「找不到404頁」錯誤完全相同。該servlet容器似乎無法找到與URL或url-pattern匹配的資源。就這樣。

至於Servlet生命週期,它只會web應用啓動(發佈,創建上下文),該init()方法將被調用,該實例將被保存在服務器的內存中排序期間創建一次Map<Url-Pattern, Servlet>。如果您已覆蓋init()方法Servlet,那麼它將被調用。對於在web.xml(或根據Java EE 6,用@WebServlet註釋)中聲明的所有servlet,servlet容器將執行相同的操作。

每當請求的URL與Servleturl-pattern匹配時,將調用(繼承的)service()方法。然後,正常的HttpServlet實現將根據HttpServletRequest#getMethod()確定要執行的方法。如果您確實覆蓋了您的Servlet中的任何方法(doGet()doPost()等),則會相應調用它。

最後,當webapp即將關閉(取消發佈,破壞上下文)時,將調用destroy()以保存在服務器內存中的任何Servlet實例。如果您已覆蓋中的destroy()方法Servlet,那麼它將被調用。

+0

當你說「確保webapp完全發佈」時,它是否意味着將更新的WAR文件複製到Tomcat的webapp文件夾中? – 2010-01-14 22:54:29

+0

我不做Netbeans,但在Eclipse中,您會在服務器控制檯中看到「同步」狀態。看看Netbeans中是否存在類似的東西。 – BalusC 2010-01-14 23:20:58