Servlet技術----Servlet入門
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。
相關文章
- Servlet入門Servlet
- Servlet-01-入門Servlet
- Java中Servlet技術JavaServlet
- Servlet技術12_HttpServletRequest類ServletHTTP
- Servlet入門二:Tomcat安裝與執行ServletTomcat
- Servlet 規範和 Servlet 容器Servlet
- Servlet系列:(一)servlet原理剖析Servlet
- tomcat伺服器啟動的方式Servlet入門Tomcat伺服器Servlet
- 96.Servlet Servlet生命週期Servlet
- Servlet第二篇【Servlet呼叫圖、Servlet細節、ServletConfig、ServletContext】ServletContext
- 走進JavaWeb技術世界4:Servlet 工作原理詳解JavaWebServlet
- JavaWEB - ServletJavaWebServlet
- JavaWeb——ServletJavaWebServlet
- Servlet概述Servlet
- 基於servlet+原生dbc的登入案例(含servlet知識點梳理)Servlet
- 第2,8章 servlet 開發技術(12課時)Servlet
- Java Servlet session實現登入退出JavaServletSession
- 初學ServletServlet
- Servlet 規範Servlet
- Servlet 新手教程Servlet
- Java之ServletJavaServlet
- Servlet-HelloWorldServlet
- Servlet筆記Servlet筆記
- Servlet_6Servlet
- Servlet 如何工作Servlet
- Servlet操作OracleServletOracle
- Servlet3.0新特性-非同步處理Servlet、FilterServlet非同步Filter
- SpringMVC(1)- 入門案例、基本配置、請求、響應、Servlet相關介面SpringMVCServlet
- jsp+servlet登入註冊頁面JSServlet
- Day91.Servlet基本內容① -Servlet、jsp和表示式ServletJS
- Servlet的實現Servlet
- 3.Servlet物件Servlet物件
- Servlet 3.0 新特性Servlet
- Servlet&HTTP&RequestServletHTTP
- Servlet呼叫過程Servlet
- 【Java基礎】ServletJavaServlet
- SpringMVC 回顧servletSpringMVCServlet
- Servlet連線OracleServletOracle
- servlet再次總結Servlet