servlet的執行原理(轉)
阿新 • • 發佈:2019-02-17
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 的工作方式。
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檔案中加入的
01<servlet>
02<!--給servlet命名為FlowCardServlet -->
03 <servlet-name>FlowCardServlet</servlet-name>
04 <!--將FlowCardServlet對映到特定的類,類的實際路徑 -->
05 <servlet-class>com.andy.drp.flowcard.web.FlowCardServlet</servlet-class>
06</servlet>
07<servlet-mapping>
08 <servlet-name>FlowCardServlet</servlet-name>
09 <!--以“工程名/servlet/flowcard/FlowCardServlet”形式的 URL 對映我們的servlet-->
10 <url-pattern>/servlet/flowcard/FlowCardServlet</url-pattern>
11 <!-- 對映路徑,都是以servlet為虛擬路徑 -->
12</servlet-mapping>
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 的工作方式。
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檔案中加入的
01<servlet>
02<!--給servlet命名為FlowCardServlet -->
03 <servlet-name>FlowCardServlet</servlet-name>
04 <!--將FlowCardServlet對映到特定的類,類的實際路徑 -->
05 <servlet-class>com.andy.drp.flowcard.web.FlowCardServlet</servlet-class>
06</servlet>
07<servlet-mapping>
08 <servlet-name>FlowCardServlet</servlet-name>
09 <!--以“工程名/servlet/flowcard/FlowCardServlet”形式的 URL 對映我們的servlet-->
10 <url-pattern>/servlet/flowcard/FlowCardServlet</url-pattern>
11 <!-- 對映路徑,都是以servlet為虛擬路徑 -->
12</servlet-mapping>