1. 程式人生 > >Servlet初始化及處理HTTP請求

Servlet初始化及處理HTTP請求

png cal 共享 servlet配置 用戶訪問 input 端口號 doget 本地

上一篇詳細介紹了與Servlet相關的幾個核心的接口和類,當我們自己寫Servlet類時,一般需要繼承HttpServlet類,實現init()、doGet()、doPost()等方法。當我們寫好Servlet類時,它在什麽時候被初始化(init())?什麽時候執行doGet()、doPost()等方法?本篇重點介紹這兩個問題。

1、Servlet初始化

之前的一篇《web.xml文件配置詳解》中已經說過,我們自己寫的Servlet類需要配置在<servlet-class>標簽之中,同時還要配置<servlet-name>、<load-on-startup>、<servlet-mapping>等幾個標簽。下圖說明了在web.xml文件中關於servlet配置的內容,<servlet-class>標簽中的MainServlet類就是我們自己寫的類。

技術分享圖片

當我們用Tomcat啟動整個web項目時,當配置了<load-on-startup>標簽並且裏面的數字>=0時,會加載MainServlet類,創建MainServlet類的實例,調用init()方法初始化。在init()方法裏面可以通過getServletConfig()方法獲取ServletConfig對象,然後通過此對象的getInitParameter()等方法獲取<init-param>標簽裏面的配置信息,並對配置文件進行解析,此初始化在整個servlet生命周期中只會進行一次;如果未配置<load-on-startup>標簽或數字<0時,Tomcat啟動時不會創建MainServlet類的實例,當然也就不會調用init()方法進行初始化,當用戶首次訪問時會加載類並初始化,所以此時第一次訪問時可能會加載很慢。我們在開發中,一般會配置<load-on-startup>標簽,如果有多個<servlet>,分別給他們的<load-on-startup>配置不同的值(一般是0、1、2……),Tomcat會按從小到大的順序依次加載Servlet類。

由於Tomcat容器采用“單實例多線程”的方式處理多個請求的,無論是Tomcat啟動時創建MainServlet類的實例,還是用戶首次訪問時創建MainServlet類的實例,在整個MainServlet類的生命周期中,它的實例都只會創建一次,只會執行一次init()方法初始化。此後當多個用戶訪問此Servlet的時候,它們共享這一個實例,每個用戶都有自己的一個線程,所以是“單實例多線程”。當然,這就可能引發線程安全的問題,以後我會單獨介紹Servlet的線程安全問題。

2、處理HTTP請求的過程

當我們用Tomcat成功啟動web項目後,就可以在瀏覽器中輸入本地地址,來打開頁面(如果配置了<weblcome-file- list>標簽會優先加載標簽裏面的頁面顯示

),如下圖所示。

技術分享圖片

可以看到,在瀏覽器中輸入的地址是“http://localhost:8080/yqzl/product_input.action”,其中“http”是協議名,“localhost”是本地地址,“8080”是server.xml中配置的端口號,“yqzl”是web項目的名字,“product_input.action”是指向的頁面。那麽瀏覽器是如何根據地址找到我們的MainServlet類並處理請求呢?下面結合web.xml文件裏面的配置說明。

技術分享圖片

首先根據地址末尾的“product_input.action”找到<url-pattern>(映射地址),即上圖中標(1)的行;然後根據這個<url-pattern>就能找到<servlet-name>(servlet名字),即上圖中標(2)的行;這個servlet名字(yqzl)與上面的名字相對應,進而找到圖中標(3)的行;最後就找到了下面<servlet-class>標簽的路徑,即上圖中標(4)的行,也就找到了我們自己寫的MainServlet類。

處理請求時,Tomcat容器會調用HttpServlet類的service(HttpServletRequest req, HttpServletResponse resp)方法,這個方法會判斷用戶發送的請求類型,是“POST”請求還是“GET”請求或是其他請求,然後根據請求類型執行MainServlet類的doPost()方法、doGet()方法或其他方法。Tomcat容器會將用戶請求的數據封裝到HttpServletRequest對象中,服務器處理完用戶請求之後,將結果信息返回到HttpServletResponse對象中,最終這兩個對象作為參數傳遞到doPost()、doGet()或其他方法中,將結果信息返回到頁面顯示。以上就是處理請求的大致流程。

轉載請註明出處 http://www.cnblogs.com/Y-oung/p/8428536.html

工作、學習、交流或有任何疑問,請聯系郵箱:[email protected] 微信:yy1340128046

Servlet初始化及處理HTTP請求