Servlet原理解析

jopen 12年前發布 | 77K 次閱讀 Servlet Java開發

         1.什么是servlet?

         Servlet是一種服務器端的Java應用程序,Server + Applet =Servlet 意為服務器端的小程序,具有獨立于平臺和協議的特性,可以生成動態的Web頁面。 它擔當客戶請求(Web瀏覽器或其他HTTP客戶程序)與服務器響應(HTTP服務器上的數據庫或應用程序)的中間層。 Servlet是位于Web 服務器內部的服務器端的Java應用程序,與傳統的從命令行啟動的Java應用程序不同,Servlet由Web服務器進行加載,該Web服務器必須包含支持Servlet的Java虛擬機。

         2.servlet有什么作用?

         Servlet主要是駐留在 Web 服務器上,處理用戶的請求和輸出的響應,處理web頁面和業務邏輯層的數據交流。當使用交互式 Web 站點時,您所看到的所有內容都是在瀏覽器中顯示的。當用戶訪問頁面時,產生一個請求發送到web服務器,

         在這些場景背后,有一個 Web 服務器接收會話 中來自于您的請求,可能要切換到其他代碼(可能位于其他服務器上)來處理該請求和訪問數據,并生成在瀏覽器中顯示的結果。servlet 就是用于該過程的網守(gatekeeper)。

         當用戶通過 URL 發出一個請求時,這些 Java servlet 類就將之轉換成一個 HttpServletRequest,并發送給 URL 所指向的目標。當服務器端完成其工作時,Java 運行時環境(Java Runtime Environment)就將結果包裝在一個 HttpServletResponse 中,然后將原 HTTP 響應送回給發出該請求的客戶機。在與 Web 應用程序進行交互時,通常會發出多個請求并獲得多個響應。所有這些都是在一個會話語境中,Java 語言將之包裝在一個 HttpSession 對象中。在處理響應時,您可以訪問該對象,并在創建響應時向其添加事件。

         3.servlet容器

         負責處理客戶請求、把請求傳送給Servlet并把結果返回給客戶。不同程序的容器實際實現可能有所變化,但容器與Servlet之間的接口是由 Servlet API定義好的,這個接口定義了Servlet容器在Servlet上要調用的方法及傳遞給Servlet的對象類。

         Tomcat 的容器模型中,Context 容器是直接管理 Servlet 在容器中的包裝類 Wrapper,所以 Context 容器如何運行將直接影響 Servlet 的工作方式。

Servlet原理解析

Tomcat啟動之后,初始化“load on startup”的 Servlet

         4.web應用的初始化工作

         應用的初始化主要是要解析 web.xml 文件,這個文件描述了一個 Web 應用的關鍵信息,也是一個 Web 應用的入口。接下去將會將 WebXml 對象中的屬性設置到 Context 容器中,這里包括創建 Servlet 對象、filter、listener 等等。

         之后就是Servlet 包裝成 Context 容器中的 StandardWrapper,為什么要將 Servlet 包裝成 StandardWrapper 而不直接是 Servlet 對象。這里 StandardWrapper 是 Tomcat 容器中的一部分,它具有容器的特征,而 Servlet 為了一個獨立的 web 開發標準,不應該強耦合在 Tomcat 中。

         所有 web.xml 屬性都被解析到 Context 中,所以說 Context 容器才是真正運行 Servlet 的 Servlet 容器。一個 Web 應用對應一個 Context 容器,容器的配置屬性由應用的 web.xml 決定。

         5.servlet生命周期

         1.完成了 Servlet 的解析工作,并且被包裝成 StandardWrapper 添加在 Context 容器中,但是它仍然不能為我們工作,它還沒有被實例化。下面我們將介紹 Servlet 對象是如何創建的,以及如何被初始化的。如果 Servlet 的 load-on-startup 配置項大于 0,那么在 Context 容器啟動的時候就會被實例化

         2.(1).用戶在瀏覽器中輸入一個 URL。Web 服務器配置文件確定該 URL 是否指向一個由運行于服務器上的 servlet 容器所管理的 servlet。

         (2).如果還沒有創建該 servlet 的一個實例(一個應用程序只有一個 servlet 實例),那么該容器就加載該類,并將之實例化。

該容器調用 servlet 上的 init()。

         (3).該容器調用 servlet 上的 service(),并在包裝的 HttpServletRequest 和 HttpServletResponse 中進行傳遞。

         (4).該 servlet 通常訪問請求中的元素,代表其他服務器端類來執行所請求的服務并訪問諸如數據庫之類的資源,然后使用該信息填充響應。

         (5).如果有必要,在 servlet 的有用生命結束時,該容器會調用 servlet 上的 destroy() 來清除它。

         6.配置Servlet

         配置servlet一般是在web.xml文件中加入的

        <servlet>
        <!--給servlet命名為FlowCardServlet  -->
        <servlet-name>FlowCardServlet</servlet-name>
        <!--將FlowCardServlet映射到特定的類,類的實際路徑 -->
        <servlet-class>com.andy.drp.flowcard.web.FlowCardServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>FlowCardServlet</servlet-name>
        <!--以“工程名/servlet/flowcard/FlowCardServlet”形式的 URL 映射我們的servlet-->
        <url-pattern>/servlet/flowcard/FlowCardServlet</url-pattern> 
        <!-- 映射路徑,都是以servlet為虛擬路徑 -->
    </servlet-mapping>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!