Servlet學習補充

黑澤明軍發表於2018-05-03

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公司定義了兩個預設實現類,分別為:GenericServletHttpServlet。
    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 黑澤明軍
【轉載文章務必保留出處和署名,謝謝!】

相關文章