Servlet主流技術

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配置中的所有初始化參數的名字。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章