Servlet的工作過程:
Servlet的主要功能在於交互式的瀏覽和修改數據,生成動態Web內容。這個基本工作過程如下:
(1) 客戶端發送請求至服務器端。
(2) 服務器上的Web容器裝入Servlet,併爲Servlet進程創建線程。請注意,Servlet是在出現第一個請求時裝入的,在服務器關閉之前不會卸載它。Servlet也可以配置爲Web應用程序啓動時自動裝載。
(3)Web容器將請求信息發送至Servlet。
(4)Servlet生成響應內容並將其返回給Web容器。響應內容動態生成,通常取決於客戶端的請求。
(5)Web容器將響應返回給客戶端。
(6)服務器關閉或者Servlet空閒時間超過一定限度時,調用destroy()方法退出。
Servlet的生命週期:
在每個Servlet實例的生命中有三種類型事件,這三種事件分別對應於由Servlet引擎所喚醒的三個方法。
(1) init()
當Servlet第一次被裝載時,Servlet引擎調用這個Servlet的init()方法,只調用一次。如果某個Servlet需要特殊的初始化需要,那麼Servlet編寫人員可以重寫該方法來執行初始化任務。這是個可選的方法。如果某個Servlet不需要初始化,那麼默認情況下將調用它的父類的init方法。系統保證,在init方法完成前,是不會調用Servlet去處理任何請求的。
(2)service()
這是Servlet最重要的方法,是真正處理請求的地方。對於每個請求,Servlet引擎將調用Servlet的service方法,並把Servlet請求對象和Servlet響應對象作爲參數傳遞給它。
(3)destroy()
這是相對於init的可選方法,當Servlet即將被卸載時由Servlet引擎來調用,這個方法用來清除並釋放在init方法中分配的資源。
Servlet的生命週期可以分以下幾步:
1 裝載Servlet,這一項操作一般是動態執行的。然而,Servlet通常會提供一個管理的選項,用於在Servlet啓動時強制轉載和初始化特定的Servlet。
2 服務器創建一個Servlet實例。
3 服務器調用Servlet的init方法。
4 一個客戶端請求到達服務器端。
5 服務器創建一個請求對象。
6 服務器創建一個響應對象。
7 服務器激活Servlet的service()方法,傳遞請求對象和響應對象作爲參數。
8 service()方法獲得關於請求對象的信息,處理請求,訪問其他資源,獲得需要的信息。
9 service()方法使用響應對象的方法。將響應傳回服務器,最終到達客戶端。service()方法可以激活其他方法以處理請求。如doGet(),doPost()或者程序員自己開發的其他方法。
10 對於更多的客戶端請求,服務器創建新的請求和響應對象,仍然激活此Servlet的service()方法,將這兩個對象作爲參數傳給它,如此重複以上的循環,但無需再次調用init()方法,Servlet一般只初始化一次。
11 當服務器不再需要Servlet時,比如當服務器要關閉時,服務器調用Servlet的destroy()方法。
Servlet的常用API :
Servlet的類和接口可以從以下幾個方面進行分類:
(1) Servlet 實現相關:定義了用於實現Servlet相關的類和接口。
(2) Servlet 配置相關:主要包括ServletConfig接口。
(3) Servlet 異常相關:Servlet API 定義了兩個異常,他們是ServletException和UnavailableException。
(4) 請求和響應相關: 接收客戶端請求,並且作出響應的類和接口。
(5) 會話跟蹤:用於跟蹤和客戶端的會話。
(6) Servlet上下文: 通過這個接口,可以在多個Web應用程序中共享數據。
(7) Servlet協作: 主要是RequestDispatcher接口,用於進行視圖派發。
(8) 其他類: Filter , Cookie 和HttpUtils類。
1 Servlet實現相關的類和接口:
- Servlet接口
聲明:public interface Servlet
這個接口是Servlet必須直接或者間接實現的接口。它定義了以下方法:
init(ServletConfig config): 用於初始化Servlet。
getServletInfo(): 獲取Servlet的信息。
getServletConfig(): 獲得Servlet配置相關信息。
service(ServletRequest request , ServletResponse response): 運行應用程序邏輯的入口點,它接受兩個參數,ServletRequest表示客戶端請求的信息,ServletResponse表示對客戶端的響應。
destory(): 銷燬Servlet。
- GenericServlet類
聲明:public abstract class GenericServlet
GenericServlet提供了對Servlet接口的基本實現。它是一個抽象類,它的service()方法是一個抽象方法,GenericServlet的派生類必須直接或間接實現該方法。
- HttpServlet類
聲明:public abstract class HttpServlet extends GenericServlet implements Serializable
HttpServlet 類是針對使用Http協議的Web服務器的Servlet類,HttpServlet類通過執行Servlet接口,能夠提供Http協議的功能。
HttpServlet子類必須實現下面方法中的某一個:
doGet(): 支持Http Get請求。
doPost(): 支持Http Post請求。
doPut(): 支持Http Put請求。
doDelete(): 支持Http Delete請求。
init()和distory(): 管理Servlet佔用的資源。
getServletInfo(): 獲得Servlet自身的信息。
2 Servlet配置相關:
javax.servlet.ServletConfig接口代表了Servlet的配置,Servlet配置包括Servlet的名字,初始化和上下文。
- ServletConfig接口
聲明:public interface ServletConfig
這個接口的主要方法有以下幾個:
getInitParameter(String name): 返回特定名字的初始化參數。
getInitParameterNames(): 返回所有的初始化參數的名字。
getServletContext(): 返回Servlet上下文對象的引用。
3 Servlet異常相關:
- ServletException類
聲明:public class ServletException extends Exception
它包含幾個構造方法和一個獲取異常原因的方法,這個方法如下:
getRootCause(): 返回造成這個ServletException的原因。
- UnavailableException類
聲明:public class UnavailableException extends ServletException
當Servlet或Filter暫時或者永久不能使用時,就會拋出這個異常。
4 請求和響應相關:
和請求響應相關的接口非常多,主要有以下幾種。
ServletRequest: 代表了Servlet的請求,它是一個高層的接口,HttpServletRequest是它的子接口。
ServletResponse: 代表了Servlet的響應,它是一個高層的接口,HttpServletResponse是它的子接口。
ServletInputStream: Servlet的輸入流。
ServletOutputStream: Servlet的輸出流。
ServletRequestWrapper: 它是ServletRequest的實現。
HttpServletRequest:代表了Http請求,繼承了ServletRequest。
HttpServletResponse: 代表了Http響應,繼承了ServletResponse。
HttpServletRequestWrapper: 它是HttpServletRequest的實現。
HttpServletResponseWrapper: 它是HttpServletResponse的實現。
下面我們着重介紹HttpServletRequest和HttpServletResponse兩個接口:
- HttpServletRequest接口
聲明:public interface HttpServletRequest extends ServletRequest
這個接口中最常用的方法是獲得請求中的參數,這個請求中的參數是客戶端表單中的數據,HttpServletRequest接口可以獲取客戶端正在使用的通信協議,還可以獲取產生請求並且接收請求的服務器遠程主機名和IP地址等一些這樣的信息。
HttpServletRequest接口提供獲取數據流的Servlet、ServletInputStream方法,這些數據是客戶端引用中使用Http Post 和 Put方法提交的。一個ServletRequest的子類可以讓Servlet獲得更多的協議特性數據。
JSP中的內建對象request是一個HttpServletRequest實例,我們來看下它的一些重要方法:
getCookies(): 獲得客戶端發送的Cookie。返回一個數組,該數組包含這個請求中當前的所以Cookie。如果這個請求中沒有Cookie,則返回一個空數組。
getSession(): 返回和客戶端關聯的Session。如果沒給客戶端分配Session,則返回null。
getSession(Boolean create): 和上一個方法類似,不同的是,如果沒有給客戶端分配Session,則創建一個新的Session並返回。
getParameter(String name): 獲取請求中名爲name的參數。如果請求中沒有這個參數,則返回null。
getParameterValues(String name): 返回請求中名爲name的參數值,這個值往往是checkbox或者select控件提交的,獲得的值是一個String數組。
- HttpServletResponse接口
聲明:public interface HttpServletResponse extends ServletResponse
它代表了對客戶端的Http響應。HttpServletResponse接口給出響應客戶端的Servlet方法。它允許Servlet設置內容長度和響應的MIME類型,並且提供輸出流ServletOutputStream。
常用的方法有以下幾種:
addCookie(Cookie cookie): 在響應中添加一個Cookie。
encodeRUL(String url): 使用URL和一個SessionId重寫這個URL。
sendRedirect(String location): 把響應發送給另一個頁面或Servlet進行處理。
setContent(String type): 設置響應的MIME類型。
setCharecterEncoding(String charset): 設置響應的字符編碼類型。
5 會話跟蹤
和會話跟蹤相關的類和接口如下。
- HttpSession接口
聲明:public interface HttpSession
這個接口被Servlet引擎用來實現Http客戶端和Http會話兩者之間的連接關係,這種關聯可能在多處連接和請求中持續一段給定的時間。Session用來在無狀態Http協議下越過多個請求頁面來維護狀態和識別用戶。
一個Session可以通過Cookie或重寫URL來維持。
它的常用方法有以下幾種:
getCreationTime(): 返回創建Session的時間。
getId(): 返回分配給這個Session的標識符。一個Http Session的標識符是一個由服務器來建立和維持的唯一的字符串。
getLastAccessTime(): 返回客戶端最後一次發出與這個Session有關的請求的時間。如果這個Session是新建的,則返回-1
getMaxInactiveInterval(): 返回一個秒數,這個秒數表示客戶端不發出請求時,Session被Servlet引擎維持的最長時間。在這個時間以後,Session可能被Servlet引擎終止。如果這個Session不會被終止,則這個方法返回-1.
getValue(String name): 返回一個給定的名字綁定到Session上的對象,如果不存在這樣的綁定則返回空值。
getValueNames(): 以一個數組返回綁定到Session上的所有數據的名稱。
invalidate(): 這個方法會終止這個Session。所有綁定到這個Session上的數據都會被清除。
inNew(): 返回一個布爾值以判斷這個Session是不是新的,如果一個Session已經被服務器創建但是還沒有收到相應的客戶端的請求,這個Session將會被認爲是新的。這意味着,這個客戶端還沒有加入會話或者被會話公認。
putValue(String name , Object value): 以給定的名字綁定到給定的對象到Session中。已存在的同名綁定會被重置,這時會調用HttpServletBindingListener接口的valueBound方法。
removeValue(String name): 取消給定名字的對象在Session上的綁定。如果未找到給定名字的綁定對象,這個方法什麼也不做。
setMaxInactiveInterval(int interval): 設置一個秒數,這個秒數表示客戶端在不發出請求時,Session被Servlet引擎維持的最長時間。
6 Servlet上下文
和Servlet上下文相關的接口有:
- ServletContext接口
聲明:public interface ServletContext
在服務器上使用Session對象維持與單個客戶相關的狀態,而當爲多個用戶的Web應用維持一個狀態時,則應該使用Servlet環境(Context)。
ServletContext表示一組Servlet共享的資源。在Servlet API的1.0和2.0的版本中,ServletContext對象僅僅提供了訪問有關Servlet環境信息的方法。例如:提供了訪問服務器名稱,MIME類型映射等方法,可以將信息寫入到服務器日誌文件的log()方法,大部分實現程序都會爲一臺主機中的所有的Servlet或每個虛擬機提供一個Servlet環境。
它的常用方法有以下幾種:
getAttribute(String name): 獲得ServletContext中名稱爲name的屬性。
getContext(String uripath): 返回給定的uripath的應用的Servlet上下文,如ServletContext test=getContext("/test")。
removeAttribute(String name): 刪除名稱爲name的屬性。
setAttribute(String name , Object object): 在ServletContext中設置一個值屬性,這個屬性的名稱爲name,值爲object對象。
7 Servlet協作
Servlet協作主要是RequestDispatcher接口,它可以把一個請求轉發到另一個Servlet。
- RequestDispatcher接口
聲明:public interface RequestDispatcher
它包含兩個方法,如下所示。
forword(ServletRequest request , ServletResponse response): 把請求發送到服務器上的另一個資源,這個資源可以是Servlet 、JSP頁面或者HTML文檔。
include(ServletRequest request , ServletResponse response): 引用其他Servlet、JSP頁面和位於當前輸出緩衝區的HTML文檔的內容。此被引用的資源可能沒有設置任何響應頭標。
8 Filter
在Web應用中實施過濾是我們常用的技術。通過過濾,可以對請求進行統一編碼、對請求進行認證等。每個Filter可能只承擔很少的任務,多個Filter可以相互合作,通過這種協作,可以完成一個複雜的功能。
- Filter接口
聲明:public interface Filter
它是Filter必須實現的接口,它包含以下方法。
init(FilterConfig filterConfig) : 這個方法初始化Filter。
doFilter(ServletRequest request , ServletResponse response , FilterChain chain): 一旦請求經由Filter鏈傳遞,則Servlet引擎就調用此方法。
destroy(): 釋放Filter佔用的資源。
- FilterChain接口
聲明:public interface FilterChain
它是代碼的過濾鏈,通過這個接口把過濾的任務在不同的Filter之間轉換。
它包含下面一個方法。
doFilter(ServletRequest request , ServletResponse response): 通過這個方法激活鏈中下一個Filter。如果沒有下一個Filter,那麼調用目標的資源。
- FilterConfig接口
聲明:public interface FilterConfig
它代表了Filter的配置,和Servlet一樣,Filter也有一些配置信息,比如Filter的名字和初始化參數等。
它包含了以下方法。
getFilterName(): 返回Filter的名字。
getInitParameter(String name): 獲取名字爲name的初始化參數的值,如果該參數不存在就返回null。
getServletContext(): 返回這個Filter所在的Servlet上下文對象。
getInitParameterNames(): 獲得Filter配置中的所有初始化參數的名字。