一.基本java
Servlet(Server Applet),全稱Java Servlet,未有中文譯文。是用Java編寫的服務器端程序,經常是根據用戶輸入訪問數據庫的程序,其主要功能在於交互式地瀏覽和修改數據,生成動態Web內容。狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類,通常狀況下,人們將Servlet理解爲後者。Servlet運行於支持Java的應用服務器中。從實現上講,Servlet能夠響應任何類型的請求,但絕大多數狀況下Servlet只用來擴展基於HTTP協議的Web服務器。最先支持Servlet標準的是JavaSoft的Java Web Server。此後,一些其它的基於Java的Web服務器開始支持標準的Servlet。程序員
總結以下:Servlet是服務器小應用程序(http/ftp等),用來完成B/S架構下客戶端請求的響應處理,平臺獨立,性能優良,能以線程方式運行。Servlet API爲Servlet提供了統一的編程接口。Servlet通常在容器中運行,常見的Servlet容器:1) Tomcat (其下載、安裝和運行請參考視頻文件):2) Jetty / Resinweb
Servlet的主要功能在於交互式地瀏覽和修改數據,生成動態Web內容。這個過程爲:數據庫
客戶端發送請求至服務器端;編程
服務器將請求信息發送至Servlet;瀏覽器
Servlet生成響應內容並將其傳給服務器。響應內容動態生成,一般取決於客戶端的請求;緩存
服務器將響應返回給客戶端。服務器
二.生命週期
網絡
Servlet生命週期分爲三個階段:架構
1,初始化階段:調用init()方法
2,響應客戶請求階段:調用service()方法
3,終止階段:調用destroy()方法
加載和實例化Servlet。這項操做通常是動態執行的。然而,Server一般會提供一個管理的選項,用於在Server啓動時強制裝載和初始化特定的Servlet。
Server建立一個Servlet的實例
如:一個客戶端的請求到達Server
Server調用Servlet的init()方法(可配置爲Server建立servlet實例時調用)
Server建立一個請求對象,處理客戶端請求
Server建立一個響應對象,響應客戶端請求
Server激活Servlet的service()方法,傳遞請求和響應對象做爲參數
service()方法得到關於請求對象的信息,處理請求,訪問其餘資源,得到須要的信息
service()方法使用響應對象的方法,將響應傳回Server,最終到達客戶端。service()方法可能激活其它方法以處理請求,如doGet()或doPost()或程序員本身開發的新的方法。
對於更多的客戶端請求,Server建立新的請求和響應對象,仍然激活此Servlet的service()方法,將這兩個對象做爲參數傳遞給它。如此重複以上的循環,但無需再次調用init()方法。通常Servlet只初始化一次(只有一個對象),當Server再也不須要Servlet時(通常當Server關閉時),Server調用Servlet的Destroy()方法。
三.工做模式
1.客戶端發送請求至服務器;
2.服務器啓動並調用Servlet,Servlet根據客戶端請求生成響應內容並將其傳給服務器;
3.服務器將響應返回客戶端。
四.程序比較
與 Applet 的比較(表示小應用程序)
類似之處:
1.它們不是獨立的應用程序,沒有main()方法。
2. 它們不是由用戶或程序員調用,而是由另一個應用程序(容器:如Tomcat)調用。
3. 它們都有一個生存週期,包含init()和destroy()方法。
不一樣之處:
1.Applet具備很好的圖形界面(AWT),與瀏覽器一塊兒,在客戶端運行。
2. Servlet 則沒有圖形界面,運行在服務器端。
五.編程接口
HTTPServlet 使用一個 HTML 表單來發送和接收數據。要建立一個 HTTPServlet,請擴展 HttpServlet 類, 該類是用專門的方法來處理 HTML 表單的 GenericServlet 的一個子類。 HTML 表單是由 <FORM> 和 </FORM> 標記定義的。表單中典型地包含輸入字段(如文本輸入字段、複選框、單選按鈕和選擇列表)和用於提交數據的按鈕。當提交信息時,它們還指定服務器應執行哪個Servlet(或其它的程序)。 HttpServlet 類包含 init()、destroy()、service() 等方法。其中 init() 和 destroy() 方法是繼承的,是Servlet容器創建Servlet對象和銷燬Servlet對象時調用的,並且這兩個方法在Servlet的生命週期裏只調用一次。
(1) init() 方法
在 Servlet 的生命期中,僅執行一次 init() 方法。它是在服務器裝入 Servlet 時執行的, 能夠配置服務器以在啓動服務器或客戶機首次訪問 Servlet 時裝入 Servlet。 不管多少客戶機訪問 Servlet,都不會重複執行 init() 。
缺省的 init() 方法一般是符合要求的,但也能夠用定製 init() 方法來覆蓋它,典型的是管理服務器端資源。 例如,可能編寫一個定製 init() 來只用於一次裝入 GIF 圖像,改進 Servlet 返回 GIF 圖像和含有多個客戶機請求的性能。另外一個示例是初始化數據庫鏈接。缺省的 init() 方法設置了 Servlet 的初始化參數,並用它的 ServletConfig 對象參數來啓動配置, 所以全部覆蓋 init() 方法的 Servlet 應調用 super.init() 以確保仍然執行這些任務。在調用 service() 方法以前,應確保已完成了 init() 方法。
在Servlet接口中定義了兩個init()方法,分別爲init()和init(ServletConfig config),能夠經過該參數得到配置信息(web.xml文件中配置的內容)。
(2) service() 方法:用於處理客戶端的全部HTTP請求,doxxx()方法只能處理特定的HTTP請求
service() 方法是 Servlet 的核心。每當一個客戶請求一個HttpServlet 對象,該對象的service() 方法就要被調用,並且傳遞給這個方法一個"請求"(ServletRequest)對象和一個"響應"(ServletResponse)對象做爲參數。 在 HttpServlet 中已存在 service() 方法。缺省的服務功能是調用與 HTTP 請求的方法相應的 do 功能。例如, 若是 HTTP 請求方法爲 GET,則缺省狀況下就調用 doGet() 。Servlet 應該爲 Servlet 支持的 HTTP 方法覆蓋 do 功能。由於 HttpServlet.service() 方法會檢查請求方法是否調用了適當的處理方法,沒必要要覆蓋 service() 方法。只需覆蓋相應的 do 方法就能夠了。
Servlet的響應能夠是下列幾種類型:
1.一個輸出流,瀏覽器根據它的內容類型(如text/HTML)進行解釋。
2.一個HTTP錯誤響應, 重定向到另外一個URL、servlet、JSP。
(3)doGet()方法
當一個客戶經過HTML 表單發出一個HTTP GET請求或直接請求一個URL時,doGet()方法被調用。與GET請求相關的參數添加到URL的後面,並與這個請求一塊兒發送。當不會修改服務器端的數據時,應該使用doGet()方法。通常用於在Servlet對象被銷燬時釋放一些全局的資源,如數據庫鏈接、網絡資源等。
(4)doPost()方法
當一個客戶經過HTML 表單發出一個HTTP POST請求時,doPost()方法被調用。與POST請求相關的參數做爲一個單獨的HTTP 請求從瀏覽器發送到服務器。當須要修改服務器端的數據時,應該使用doPost()方法。
(5) destroy() 方法
destroy() 方法僅執行一次,即在服務器中止且卸裝Servlet 時執行該方法。典型的,將 Servlet 做爲服務器進程的一部分來關閉。缺省的 destroy() 方法一般是符合要求的,但也能夠覆蓋它,典型的是管理服務器端資源。例如,若是 Servlet 在運行時會累計統計數據,則能夠編寫一個 destroy() 方法,該方法用於在未裝入 Servlet 時將統計數字保存在文件中。另外一個示例是關閉數據庫鏈接。
當服務器卸裝 Servlet 時,將在全部 service() 方法調用完成後,或在指定的時間間隔事後調用 destroy() 方法。一個Servlet 在運行service() 方法時可能會產生其它的線程,所以請確認在調用 destroy() 方法時,這些線程已終止或完成。
(6) GetServletConfig()方法
GetServletConfig()方法返回一個 ServletConfig 對象,該對象用來返回初始化參數和ServletContext。ServletContext 接口提供有關servlet 的環境信息。
(7) GetServletInfo()方法
GetServletInfo()方法是一個可選的方法,它提供有關servlet 的信息,如做者、版
本、版權。
當服務器調用sevlet 的Service()、doGet()和doPost()這三個方法時,均須要 "請求"和"響應"對象做爲參數。"請求"對象提供有關請求的信息,而"響應"對象提供了一個將響應信息返回給瀏覽器的一個通訊途徑。
javax.servlet 軟件包中的相關類爲ServletResponse和ServletRequest,而javax.servlet.http 軟件包中的相關類爲HttpServletRequest 和 HttpServletResponse。Servlet 經過這些對象與服務器通訊並最終與客戶機通訊。Servlet 能經過調用"請求"對象的方法獲知客戶機環境,服務器環境的信息和全部由客戶機提供的信息。Servlet 能夠調用"響應"對象的方法發送響應,該響應是準備發回客戶機的。
(8) getLastModified()方法
根據該方法的返回值來控制瀏覽器是否使用被緩存的內容,即決定service方法是否執行doGet或doPost方法來更新頁面。
Http響應消息頭(服務器端)有一個Last-Modified字段,該字段表示服務器內容最新修改的時間。若是請求消息頭(瀏覽器)中包含If-Modified-Since字段,而且該字段的時間比Last-Modified字段的時間早,或者請求消息頭中沒有If-Modified-Since字段,service方法就會調用doGet方法從新獲取服務器端內容,但有個前提是getLastModified必須返回一個正數。
需在繼承HttpServlet的類中覆蓋getLastModified()方法,並返回當前的時間(以毫秒爲單位)。
service方法中只有doGet方法考慮了If-Modified-Since和Last-Modified字段,其他方法總會被調用。
總結:Servlet編程接口
1.GenericServlet是全部Servlet的鼻祖
2.用於HTTP的Servlet編程都經過繼承 javax.servlet.http.HttpServlet 實現
3.請求處理方法:(分別對應http協議的7種請求)
(1)doGet 響應Get請求,經常使用
(2)doPost 響應Post請求,經常使用
(3)doPut 用於http1.1協議
(4)doDelete 用於http1.1協議
(5)doHead 僅響應Get請求的頭部。
(6)doOptions 對webserver進行配置
(7)doTrace 用於http1.1協議進行跟蹤(調試用)
4.實例的個數: 在非分佈的狀況下,一般一個Servlet在服務器中有一個實例