Servlet學習補充
Servlet學習補充
============================================================================= Servlet是sun公司提供的一門用於開發動態web資源的技術。 Sun公司在其API中提供了一個servlet介面,使用者若想開發一個動態web資源(即開發一個Java程式向瀏覽器輸出資料), 需要完成以下2個步驟: 1. 編寫一個Java類,實現servlet介面。 2. 把開發好的Java類部署到web伺服器中。 提示:按照一種約定俗成的稱呼習慣,通常我們也把實現了servlet介面的java程式,稱之為Servlet。 ----------------------------------------------------------------------------- Servlet的執行過程 Servlet程式是由WEB伺服器呼叫,web伺服器收到客戶端的Servlet訪問請求後: 1. Web伺服器首先檢查是否已經裝載並建立了該Servlet的例項物件。如果是,則直接執行第4步,否則,執行第2步。 2. 裝載並建立該Servlet的一個例項物件。 3. 呼叫Servlet例項物件的init()方法。 4. 建立一個用於封裝HTTP請求訊息的HttpServletRequest物件和一個用於封裝HTTP響應訊息的HttpServletResponse物件, 然後呼叫Servlet的service()方法並將請求和響應物件作為引數傳遞進去。 5. WEB應用程式被停止或重新啟動之前,Servlet引擎將解除安裝Servlet,並在解除安裝之前呼叫Servlet的destroy()方法。 ----------------------------------------------------------------------------- Servlet的生命週期(1) 1. Servlet是一個供其他Java程式(Servlet引擎)呼叫的Java類,它不能獨立執行,它的執行完全由Servlet引擎來控制和排程。 2. 針對客戶端的多次Servlet請求,通常情況下,伺服器只會建立一個Servlet例項物件(單例項), 也就是說Servlet例項物件一旦建立,它就會駐留在記憶體中,為後續的其它請求服務,直至web容器退出,servlet例項物件才會銷燬。 3. 在Servlet的整個生命週期內,Servlet的init方法只被呼叫一次。 而對一個Servlet的每次訪問請求都導致Servlet引擎呼叫一次servlet的service方法。 對於每次訪問請求,Servlet引擎都會建立一個新的HttpServletRequest請求物件和一個新的HttpServletResponse響應物件, 然後將這兩個物件作為引數傳遞給它呼叫的Servlet的service()方法,service方法再根據請求方式分別呼叫doXxx方法。 Servlet的生命週期(2) 如果在<servlet>元素中配置了一個<load-on-startup>元素,那麼WEB應用程式在啟動時,就會裝載並建立Servlet的例項物件、以及呼叫Servlet例項物件的init()方法。 舉例:
<servlet> <servlet-name>servletDemo1</servlet-name> <servlet-class>com.itheima.servlet.ServletDemo1</servlet-class> <!-- 設定啟動時就載入,數值越小越先啟動 (但不建議寫0) --> <load-on-startup>2</load-on-startup> </servlet>
用途:為web應用寫一個InitServlet,這個servlet配置為啟動時裝載,為整個web應用建立必要的資料庫表和資料。 從提高Servlet容器執行效能的角度出發,Servlet規範為Servlet規定了不同的初始化情形。 如果有些Servlet專門負責在web應用啟動階段為web應用完成一些初始化操作,則可以讓它們在web應用啟動時就被初始化。 對於大多數Servlet,只需當客戶端首次請求訪問時才被初始化。 假設所有的Servlet都在web應用啟動時被初始化,那麼會大大增加Servlet容器啟動web應用的負擔, 而且Servlet容器有可能載入一些永遠不會被客戶訪問的Servlet,白白浪費容器的資源。 ----------------------------------------------------------------------------- Servlet介面實現類 Servlet介面SUN公司定義了兩個預設實現類,分別為:GenericServlet、HttpServlet。 HttpServlet指能夠處理HTTP請求的servlet,它在原有Servlet介面上新增了一些與HTTP協議處理方法,它比Servlet介面的功能更為強大。 因此開發人員在編寫Servlet時,通常應繼承這個類,而避免直接去實現Servlet介面。 HttpServlet在實現Servlet介面時,重寫了service方法,該方法體內的程式碼會自動判斷使用者的請求方式, 如為GET請求,則呼叫HttpServlet的doGet方法,如為Post請求,則呼叫HttpServlet的doPost方法。 因此,開發人員在編寫Servlet時,通常只需要覆寫doGet或doPost方法,而不要去覆寫service方法。 注:doGet和doPost方法裡面的形參分別是HttpServletRequest、HttpServletResponse。 ----------------------------------------------------------------------------- Servlet的執行緒安全 當多個客戶端併發訪問同一個Servlet時,web伺服器會為每一個客戶端的訪問請求建立一個執行緒, 並在這個執行緒上呼叫Servlet的service方法,因此service方法內如果訪問了同一個資源的話,就有可能引發執行緒安全問題。 如果某個Servlet實現了SingleThreadModel介面,那麼Servlet引擎將以單執行緒模式來呼叫其service方法。 SingleThreadModel介面中沒有定義任何方法,只要在Servlet類的定義中增加實現SingleThreadModel介面的宣告即可。 對於實現了SingleThreadModel介面的Servlet,Servlet引擎仍然支援對該Servlet的多執行緒併發訪問, 其採用的方式是產生多個Servlet例項物件(資源浪費大),併發的每個執行緒分別呼叫一個獨立的Servlet例項物件。 實現SingleThreadModel介面並不能真正解決Servlet的執行緒安全問題,因為Servlet引擎會建立多個Servlet例項物件, 而真正意義上解決多執行緒安全問題是指:一個Servlet例項物件被多個執行緒同時呼叫的問題。 事實上,在Servlet API 2.4中,已經將SingleThreadModel標記為Deprecated(過時的)。 ----------------------------------------------------------------------------- 資原始檔通常有兩種方式: 對於簡單的資原始檔,即包含key=value的形式,我們一般採用properties,這些檔案的副檔名一般為*.properties。 對於較複雜的資原始檔,採用XML格式。 通常資原始檔放在src目錄或者WEB-INF目錄下。 在web工程中,要獲得某個檔案的路徑,我們一般都採取相對於web工程"/"的相對路徑。 在src下放置的db.properites配置檔案, 法一:利用Servletcontext.getResourceAsStream("/WEB-INF/classes/db.properties"); 來獲取。 法二:利用ServeltContext.getRealPath("/WEB-INF/classes/db.properties"); 來獲取。
web project工程目錄結構圖:
=============================================================================
我的GitHub地址:https://github.com/heizemingjun
我的部落格園地址:http://www.cnblogs.com/chenmingjun
我的螞蟻筆記部落格地址:http://blog.leanote.com/chenmingjun
Copyright ©2018 黑澤明軍
【轉載文章務必保留出處和署名,謝謝!】
相關文章
- java 註解學習補充Java
- C#學習筆記(補充)——擴充套件方法、事件C#筆記套件事件
- 博弈補充練習
- odoo學習-4 許可權(待補充)Odoo
- 初學java進位制轉換方面補充學習Java
- Servlet學習筆記Servlet筆記
- Tomcat&Servlet學習TomcatServlet
- Python學習之路8.2-對Python類的補充Python
- Elasticsearch 學習總結 - 相關配置補充說明Elasticsearch
- 2023 go崗位-跳槽-學習規劃(求補充)Go
- 從零開始的Python學習 知識補充sortedPython
- 設計模式學習(一)單例模式補充——指令重排設計模式單例
- (資料科學學習手札134)pyjanitor:為pandas補充更多功能資料科學
- java基礎學習:JavaWeb之ServletJavaWebServlet
- 非同步Servlet學習筆記(一)非同步Servlet筆記
- JavaWeb學習筆記~01.ServletJavaWeb筆記Servlet
- 資源|機器學習必知的15大框架,歡迎補充!機器學習框架
- 設計模式學習(一)單例模式補充——單例模式析構設計模式單例
- JVM補充篇JVM
- linux命令補充Linux
- 聯通性補充
- 初學ServletServlet
- 用子圖網路補充原始網路特徵 | 圖學習論文快訊特徵
- 凸優化學習補充知識(一)——矩陣的1/2次方優化矩陣
- css雜項補充CSS
- lambda(持續補充)
- while迴圈補充While
- 負載均衡補充負載
- explian type extra補充
- step1 補充
- redis筆記補充Redis筆記
- ReadFile 和 補充CreateFile
- ping(未完待補充)
- JavaScript學習筆記(八)—— 補JavaScript筆記
- 學習 PixiJS — 補間動畫JS動畫
- Android 補間動畫學習Android動畫
- Java多執行緒學習(五)執行緒間通訊知識點補充Java執行緒
- Windows原理深入學習系列-訪問控制列表-關於安全描述符的補充Windows