Servlet基礎知識程序員
主題web
概念小程序
Servlet生命週期安全
Servlet線程安全服務器
JSP與Servlet 多線程
參考資料併發
概念性能
Servlet一般被稱爲服務端小程序,是運行在服務器端的程序,用於處理及響應客戶端的請求。spa
Servlet是個特殊的Java類,這個Java類必須繼承HttpServlet。每一個Servlet能夠響應客戶端的請求。Servlet提供不一樣的方法(doGet,doPost,doPut,doDelete)用於響應客戶端不一樣類型的請求。線程
自MVC規範出現後,Servlet的職責僅僅用於做爲控制器使用,再也不做爲視圖層角色使用。
Servlet生命週期
Servlet在容器中運行時,Servlet實例的建立及銷燬都不是由程序員決定的,而是由Web容器進行控制的,即Servlet的生命週期是由Web容器負責的。
當啓動Servlet容器時,容器首先去查找一個配置文件web.xml,這個文件中記錄了核心提供服務的Servlet。每一個Servlet被指定一個Servlet名,也就是這個Servlet實際對應的Java的完整class文件名。Servlet容器會爲每一個自動裝入選項的Servlet建立一個實例。因此,每一個Servlet類必須有一個公共的無參數的構造器。
建立Servlet實例有兩個時機:
客戶端第一次請求某個Servlet時,容器建立該Servlet的實例;
Web應用啓動時當即建立Servlet實例,即load-on-startup Servlet;
每一個Servlet的運行都遵循以下生命週期:
建立Servlet實例,由Web容器建立;
Web容器調用Servlet的init方法,對Servlet進行初始化,
Servlet容器初始化後,將一直存在於容器中,用於響應用戶請求。根據客戶端請求類型調用相應的方法,或者統一調用service方法。service方法是Servlet的核心。
Web容器決定銷燬Servlet時,調用Servlet的destroy方法,一般在關閉Web應用的時候銷燬Servlet。
Servlet線程安全
Servlet體系結構是創建在Java多線程機制之上的。
當Servlet被某個客戶端第一次請求時,Servlet容器將會實例化這個Servlet。當有新的客戶端請求該Servlet時,通常不會再實例化這個Servlet,也就是有多個線程在使用這個實例。
Servlet的線程安全問題只有在大量的併發訪問時纔會顯現出來,而且很難發現,所以在編寫Servlet程序時要特別注意。線程安全問題主要是由實例變量形成的,所以在Servlet中應避免使用實例變量。若是應用程序設計沒法避免使用實例變量,那麼使用同步來保護要使用的實例變量,但爲保證系統的最佳性能,應該同步可用性最小的代碼路徑。
JSP與Servlet
JSP的本質就是Servlet,開發者把編寫好的JSP頁面部署在Web容器中以後,Web容器會將JSP編譯成對應的Servlet。
Servlet和JSP的區別
Servlet沒有內置對象,JSP中的內置對象都必須由程序顯式建立,是由Web容器建立的,進行默認初始化。
對於靜態的HTML標籤,Servlet必須使用頁面輸出流(out對象表明一個JSP頁面輸出流,一般用於在頁面上輸出變量值及常量)逐行建立。
Servlet主要用於控制邏輯,JSP側重於視圖。在MVC模式中,Servlet僅做爲控制器使用,JSP則做爲表現層技術,Model一般由JavaBean充當。
參考資料
http://developer.51cto.com/art/200907/133827.htm
輕量級J2EE企業應用實戰