Servlet技術----Servlet入門

我是喬同學發表於2012-10-18

Servlet入門

目標:Servlet的應用

Servlet是一種獨立於平臺和協議的伺服器端的Java應用程式,可以生成動態的web頁面。它擔當Web瀏覽器或其他http客戶程式發出請求、與http伺服器上的資料庫或應用程式之間互動的中間層。

所謂動態網頁,就是在不同時刻或不同條件下訪問Web伺服器上的同一個頁面時,瀏覽器會獲得不同的內容。

主要內容:Web應用程式開發過程、Servlet的執行原理、Servlet的生命週期等。

Java Web應用程式的開發過程

開發Java Web應用程式的大致流程

設計目錄結構:根據具體業務需要,遵照規範的目錄結構設計好Web應用程式的目錄結構。

編寫Web應用程式程式碼:編寫業務邏輯所需的Java程式碼。

編寫部署描述檔案:把Servlet、初始化引數等定義到部署描述檔案web.xml中。

編譯程式碼:把編寫好的Java原始碼編譯成位元組碼。

將Web應用程式打包:把整個Web應用程式打成War包,以方便部署。

部署Web應用程式:把打好的War包部署到Web伺服器上。

執行Web應用程式:啟動Web伺服器,利用客戶端瀏覽器進行訪問測試。

注意:在具體的開發過程中,一般都會使用IDE工具,使用IDE工具進行Web應用程式開發時,只需要開發人員完成前三個步驟,其他步驟IDE工具可以自動完成。

 

Servlet是用Java編寫的Server端程式,它與協議和平臺無關。Servlet執行於Java伺服器中。

Java Servlet可以動態地擴充套件伺服器的能力,並採用請求-響應模式提供Web服務。

Servlet是使用Java Servlet應用程式設計介面及相關類和方法的Java程式。它在Web伺服器上或應用伺服器上執行並擴充套件了該伺服器的能力。Servlet裝入Web伺服器並在Web伺服器內執行。

Servlet是以Java技術為基礎的伺服器端應用程式元件,Servlet的客戶端可以提出請求並獲得該請求的響應,它可以是任何Java程式、瀏覽器或任何裝置。

Servlet執行原理

針對同一個Servlet,Servlet容器會在第一次收到http請求時建立一個Servlet例項,然後啟動一個執行緒。第二次收到http請求時,Servlet容器無須建立相同的Servlet例項,而是啟動第二個執行緒來服務客戶端請求。所以多執行緒方式不但可以提高Web應用程式的執行效率,也可以降低Web伺服器的系統負擔。

Servlet的優點

可移植性好:Servlet是用Java語言編寫的,具有完善的Servlet API標準,企業編寫的Servlet程式,可以輕鬆地移植到其他伺服器中。

執行效率高:Servlet請求到來的時候啟用Servlet,請求處理完,等待新的請求,新的請求將生成一個執行緒而不是程式。

使用方便:Servlet可以輕鬆地處理HTML表單資料,並讀取和設定HTTP頭,處理Cookie,跟蹤會話。

 

當Web伺服器接收到一個HTTP請求時,它會先判斷請求內容——如果是靜態網頁

資料,Web伺服器將會自行處理,然後產生響應資訊;如果牽涉到動態資料,Web伺服器會將請求轉交給Servlet容器。此時Servlet容器會找到對應的處理該請求的Servlet例項來處理,結果會送回Web伺服器,再由Web伺服器傳回使用者端。

Servlet的生命週期

在程式碼中,Servlet生命週期由介面javax.servlet.Servlet定義。所有的Servlet必須直接或間接地實現javax.servlet.Servlet介面,這樣才能在Servlet容器中執行。Servlet提供service方法、init方法和destroy方法等。在Servlet的生命週期中,執行javax.servlet.Servlet介面中定義的這些方法,方法會在特定時間按照一定的順序被呼叫

Servlet的執行過程

Servlet程式是由WEB伺服器呼叫,web伺服器收到客戶端的Servlet訪問請求後:

Web伺服器首先檢查是否已經裝載並建立了該Servlet的例項物件。如果是,則直接執行第④步,否則,執行第②步。

裝載並建立該Servlet的一個例項物件。

呼叫Servlet例項物件的init()方法。

建立一個用於封裝HTTP請求訊息的HttpServletRequest物件和一個代表HTTP響應訊息的HttpServletResponse物件,然後呼叫Servlet的service()方法並將請求和響應物件作為引數傳遞進去。

WEB應用程式被停止或重新啟動之前,Servlet引擎將解除安裝Servlet,並在解除安裝之前呼叫Servlet的destroy()方法。

Servlet如何被載入和例項化

Servlet容器負責例項化和載入Servlet,這個過程可以在Servlet容器載入時執行,可以在Servlet響應請求時執行,也可以在兩者之間的任何時候執行。

Servlet 容器載入完Servlet之後,首先必須初始化它。初始化時Servlet呼叫init()方法,該方法可以以一個ServletConfig型別的引用為引數,該引數可以讓Servlet從部署描述符檔案中讀取一些鍵值對形式的引數值,以初始化這些資料,ServletConfig物件的引用還可以讓Servlet接受ServletContext物件。

Servlet如何處理請求

Servlet被初始化以後,就處於能響應請求的就緒狀態。每個Servlet都有一個請求的Servlet Request物件和響應的Servlet Response物件。

Servlet還可以實現ServletRequest和ServletResponse介面。ServletRequest介面可以讓Servlet獲取客戶端請求中的引數,如request資訊、協議型別等。Servlet可以從ServletInputStream流中讀取request資料。ServletResponse介面允許Servlet設定response headers和status codes。實現這個介面可以使Servlet能訪問ServletOutputStream流,用來向客戶端返回資料。

Servlet如何被釋放

Servlet 容器可以隨時使用或釋放Servlet。當Servlet 容器判斷一個Servlet應當被釋放時(例如容器準備釋放或需要回收資源),容器必須讓Servlet 能釋放其正在使用的任何資源,並儲存持續性的狀態資訊。

在Servlet 容器釋放一個Servlet之前,必須讓其完成當前例項的service方法或是等到時間超時。當容器釋放一個Servlet以後,容器必須徹底釋放該Servlet並將其標明為可回收的,此時容器將不能再將請求轉發給它。

Servlet介面實現類

 

HttpServlet指能夠處理HTTP請求的servlet,它在原有Servlet介面上新增了一些與HTTP協議處理方法,它比Servlet介面的功能更為強大。因此開發人員在編寫Servlet時,通常應繼承這個類,而避免直接去實現Servlet介面。

 

HttpServlet在實現Servlet介面時,覆寫了service方法,該方法體內的程式碼會自動判斷使用者的請求方式,如為GET請求,則呼叫HttpServlet的doGet方法,如為Post請求,則呼叫doPost方法。因此,開發人員在編寫Servlet時,通常只需要覆寫doGet或doPost方法,而不要去覆寫service方法。

 

Servlet的一些細節(1)

由於客戶端是通過URL地址訪問web伺服器中的資源,所以Servlet程式若想被外界訪問,必須把servlet程式對映到一個URL地址上,這個工作在web.xml檔案中使用<servlet>元素和<servlet-mapping>元素完成。

<servlet>元素用於註冊Servlet,它包含有兩個主要的子元素:<servlet-name>和<servlet-class>,分別用於設定Servlet的註冊名稱和Servlet的完整類名。

一個<servlet-mapping>元素用於對映一個已註冊的Servlet的一個對外訪問路徑,它包含有兩個子元素:<servlet-name>和<url-pattern>,分別用於指定Servlet的註冊名稱和Servlet的對外訪問路徑。例如:

Servlet的一些細節(2)

同一個Servlet可以被對映到多個URL上,即多個<servlet-mapping>元素的<servlet-name>子元素的設定值可以是同一個Servlet的註冊名。

在Servlet對映到的URL中也可以使用*萬用字元,但是隻能有兩種固定的格式:一種格式是“*.副檔名”,另一種格式是以正斜槓(/)開頭並以“/*”結尾。

Servlet的一些細節(3)

對於如下的一些對映關係:

Servlet1 對映到 /abc/*

Servlet2 對映到 /*

Servlet3 對映到 /abc

Servlet4 對映到 *.do

問題:

當請求URL為“/abc/a.html”,“/abc/*”和“/*”都匹配,哪個servlet響應

       Servlet引擎將呼叫Servlet1。

當請求URL為“/abc”時,“/abc/*”和“/abc”都匹配,哪個servlet響應

       Servlet引擎將呼叫Servlet3。

當請求URL為“/abc/a.do”時,“/abc/*”和“*.do”都匹配,哪個servlet響應

       Servlet引擎將呼叫Servlet1。

當請求URL為“/a.do”時,“/*”和“*.do”都匹配,哪個servlet響應

       Servlet引擎將呼叫Servlet2。

當請求URL為“/xxx/yyy/a.do”時,“/*”和“*.do”都匹配,哪個servlet響應

       Servlet引擎將呼叫Servlet2。

Servlet的一些細節(4)

Servlet是一個供其他Java程式(Servlet引擎)呼叫的Java類,它不能獨立執行,它的執行完全由Servlet引擎來控制和排程。

 

針對客戶端的多次Servlet請求,通常情況下,伺服器只會建立一個Servlet例項物件,也就是說Servlet例項物件一旦建立,它就會駐留在記憶體中,為後續的其它請求服務,直至web容器退出,servlet例項物件才會銷燬。

 

在Servlet的整個生命週期內,Servlet的init方法只被呼叫一次。而對一個Servlet的每次訪問請求都導致Servlet引擎呼叫一次servlet的service方法。對於每次訪問請求,Servlet引擎都會建立一個新的HttpServletRequest請求物件和一個新的HttpServletResponse響應物件,然後將這兩個物件作為引數傳遞給它呼叫的Servlet的service()方法,service方法再根據請求方式分別呼叫doXXX方法。

Servlet的一些細節(5)

如果在<servlet>元素中配置了一個<load-on-startup>元素,那麼WEB應用程式在啟動時,就會裝載並建立Servlet的例項物件、以及呼叫Servlet例項物件的init()方法。

       舉例:

       <servlet>

              <servlet-name>invoker</servlet-name>

              <servlet-class>

                     org.apache.catalina.servlets.InvokerServlet

              </servlet-class>

              <load-on-startup>2</load-on-startup>

       </servlet>

 

用途:為web應用寫一個InitServlet,這個servlet配置為啟動時裝載,為整個web應用建立必要的資料庫表和資料。

Servlet的一些細節(6)

如果某個Servlet的對映路徑僅僅為一個正斜槓(/),那麼這個Servlet就成為當前Web應用程式的預設Servlet。

凡是在web.xml檔案中找不到匹配的<servlet-mapping>元素的URL,它們的訪問請求都將交給預設Servlet處理,也就是說,預設Servlet用於處理所有其他Servlet都不處理的訪問請求。

在<tomcat的安裝目錄>\conf\web.xml檔案中,註冊了一個名稱為org.apache.catalina.servlets.DefaultServlet的Servlet,並將這個Servlet設定為了預設Servlet。

當訪問Tomcat伺服器中的某個靜態HTML檔案和圖片時,實際上是在訪問這個預設Servlet。

 

相關文章