Servlet——Java EE應用中另一種常用的組件

1、Servlet是Java EE應用中另一種常用的組件,是繼JDBC後,Java EE技術的第二個重要發明。

2、JSP與Servlet的區別:

JSP是嵌入Java代碼的HTML頁面,JSP頁面是轉換爲Servlet來執行的。

Servlet是嵌入了HTML的Java類。

3、Servlet執行請求和響應的處理。

4、在Web應用程序中,<servlet>元素是用於描述Servlet的基本元素。<servlet>可以有下面的子元素:

·<icon>
·<servlet-name>:定義一個用戶友好的名稱,用於表示所用到的資源。
·<display-name>
·<description>
·< servlet -class>:定義Servlet類的完整路徑名。
·<jsp-file>:定義JSP文件類的完整路徑名。
·<init-paran>:定義Servlet的參數
·<load-on-startup>:用一個整數表明服務器啓動時應該調用的Servlet的相對次序:具有小值的Servlet排在具有大值的Servlet的前面,相同值得Servlet會按照任意順序調用。
·<run-as>
·<security-role-ref>

注意:必須要有的元素<servlet-name>以及< servlet -class>或者<jsp-file>之一。

5、<servlet-mapping>:用於一給定的Servlet名稱與相應請求URI之間的映射。

6、因爲Servlet容器只能調用Servlet類的無參的構造函數,同時當你的Servlet類沒提過任何一個構造函數是,Java會自動提過一個無參數的構造函數,所以不必爲Servlet類編寫任何構造函數。

7、Servlet的生命週期:

1)、載入和實例化:Servlet容器賭氣每個部署描述文件Web.xml文件,之後載入部署描述文件中指定的Servlet類。然後調用無參的構造函數來實例化每個Servlet類。

2)、初始化:Servlet容器調用Servlet類的init(ServletConfig)方法實現初始化。這個方法是用父類GenericServlet提供的。

·  init()方法的作用:讀取Servlet的初始化參數或配置數據、初始化外部資源(如數據庫連接),以及執行其他一次性的動作。

·  GenericServlet類的init()有一下兩種形式:

    publicvoid init() throws ServletException

    publicvoid init(ServletConfig) throws ServletException

·  第二個方法中ServletConfig對象來自:如上第4點提到的<Servlet>的子元素<init-paran>元素定義Servlet的參數,Servlet容器從Web.xml文件讀取這些參數,然後把它們按“名/值對”保存到ServletConfig對象中。

·  init(ServletConfig),首先保存ServletConfig引用,然後調用init()方法。init()方法可以訪問ServletConfig引用中的所有初始化參數。

·  如果在自定義的Servlet中實現init(ServletConfig),那麼一定要調用超類的init(ServletConfig)方法。如果實現init(ServletConfig)的時候沒調用super. 實現init(ServletConfig)方法,那麼ServletConfig引用不會被保存下來,而且Servlet或其父類不能在後續生命週期中訪問ServletConfig對象。

·  如果在init()的過程中遇到問題,應當拋出ServletException類或其子類UnavailableExcption。這會告訴容器在初始化過程中存在問題,並且不應該使用這個Servlet來處理請求。使用UnavailableExcption可以設定Servlet的無效時長,過了這個時長,容器將去重新調用init()。

·  UnavailableExcption有以下構造函數

    public UnavailableExcption(Stringmsg, int seconds)

    其中int參數是一個整數:負數和零值表示不能判斷該Servlet什麼時候可以再用。正      整數值則說明服務器應當在若干秒之後再去重新初始化這個Servlet。

3)、請求的處理:Servlet容器調用service()方法。跟init()方法方法一樣會拋出ServletException類或其子類UnavailableExcption異常,不同的是這裏創建的UnavailableExcption無指定的無效時長,所以一旦拋出異常Servlet容器必須終止Servlet的生命週期。

4)、聲明週期結束:Servlet容器調用destroy()方法。但是容器必須等到仍在運行的請求處理線程結束之後或服務器定義的超出時間結束時,才調用destroy()方法。這個方法也是GenericServlet父類實現的,如果你的Servlet實例不需要執行任何收尾工作,無需實現這個方法。在destroy()方法執行之後,容器釋放對該Servlet實例的引用。

注意:destroy()方法並不的銷燬Servlet或引發對它的垃圾收集。它只是在恰當的實際簡單地清除Servlet所使用和打開的資源。顯然,在調用這個方法之後,容器將不再給這個Servlet轉發任何請求。

8、如何使得Servlet的線程安全:

1)、用方法變量保存請求中的專有數據。

         數據保存在方法變量中,即局部變量。這時,進入這個方法的每個線程都有自己的一份方法變量拷貝。因此,任何線程都不會修改其他線程的數據成員。如果要在不同的請求之間保存一份數據,那麼應該用會話(session)來存儲這類數據。

2)、只用Servlet成員變量保存那麼不會改變的數據。

         這類數據保存查詢數據庫連接名稱、其他資源的路徑、其他Web組件的路徑等等。

3)、同步訪問你那些可能請求修改的成員變量。

4)、如果Servlet訪問外部資源,那麼需要同步訪問這些資源。

         例如文件訪問本身不是線程安全的,所以必須編寫同步訪問這個資源的代碼。

注意:

1)、實現SingleThreadModel接口並不能保證Servlet線程安全。

2)、不要通過同步doPost()、doGet()、或Service()達到Servlet線程安全。因爲隨着請求數量的不斷增加,原來越多的客戶端就會處於不停的等待狀態。

3)、儘量在最小的代碼塊範圍上進行同步,同步代碼越少,Servlet執行得才越好。

9、servlet響應過程:


發佈了62 篇原創文章 · 獲贊 29 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章