標籤:
一、什麼是Servlet
API上給了下面的解釋:
A servlet is a small Java program that runs within a Web server. Servlets receive and respond to requests from Web clients, usually across HTTP, the HyperText Transfer Protocol.
根據上面的解釋,我們可以這樣描述Servlet的工作流程:
1、用戶端向服務端發送請求;
2、服務端將請求資訊發送給Servlet;
3、Servlet處理請求資訊並產生響應,再傳給伺服器;
4、伺服器向用戶端發送響應。
二、Servlet是如何工作的
在下面,首先給出下面一張圖(圖1):
首先,請先不要吐槽這張圖難看。。。
圖中,需要特別注意的是這幾個類和介面,注意他們都繼承了誰,實現了誰:
介面:Servlet、ServletRequest(Response)、HttpServletRequest(Response);
類:HttpServlet
下面逐一介紹這幾個類和介面:
1、 Servlet介面
Servlet介面的主要方法有:
- void:destroy();
- ServletConfin:getServletConfig();
- java.lang.String:getServletInfo();
- void:init(ServletConfig);
- void:service(ServletRequest, ServletResponse);
一個Servlet類必須要實現這個介面(圖裡面GenericServlet實現了Servlet介面,基本實現了Servlet的方法,而GenericServlet的子類需要實現service方法),同時,觀察這個介面的方法,通過init(ServletConfig)、service(ServletRequest, ServletResponse)、destroy()這幾個主要方法,我們可以看到Servlet類的生命週期:
1、調用構造方法執行個體化Servlet類;
2、Servlet容器調用init方法,根據ServletConfig初始化Servlet執行個體;
3、Servlet容器調用service方法處理ServletRequest對象和ServletResponse對象;(這是Servlet執行個體的核心業務處理,至於ServletRequest對象和ServletResponse對象到底有什麼用,在後文繼續討論,這裡從對象的名字也可以猜出一二了,一個是Request,一個是Response)
4、Servlet容器調用destroy方法,銷毀Servlet執行個體。
2、ServletRequest和ServletResponse介面
對於這兩個介面,我主要是分析一下它們的方法,因此它們的介紹我決定直接把API中的介紹搬到這裡:
ServletRequest:Defines an object to provide client request information to a servlet. The servlet container creates a ServletRequest object and passes it as an argument to the servlet’s service method.
ServletResponse:Defines an object to assist a servlet in sending a response to the client. The servlet container creates a ServletResponse object and passes it as an argument to the servlet’s service method.
- ServletRequest:
對照ServletRequest的把請求資訊封裝的作用來看,ServletRequest介面的方法主要是用來擷取資訊的getter和is類型的方法。
- Attribute資訊:getAttribute、getAttributeNames、removeAttribute、setAttribute
- Character資訊:getCharacterEncoding、setCharacterEncoding
- Content資訊:getContentLength、getContentType
- Local資訊:getLocalAddr、getLocalPort、getLocalName
- Parameter資訊:getParameter、getParameterNames、getParameterValues
- Remote資訊:getRemoteHost、getRemotePort
- 其他資訊:getRequestDispatcher、getServerName、getServerPort
這裡主要注意的Attribute和Parameter的區別,請參看:《參數(parameter)和屬性(Attribute)的區別》
- ServletResponse:
如同上面描述一樣,ServletResponse是提供響應的,因此,它應該定義一系列和響應相關的方法,如: setCharacterEncoding、setContentLength、setContentType等;
(上面的幾個屬於協議無關的,只要繼承他們並實現Http協議,那麼就可以處理基於HTTP協議的請求和返迴響應結果了)
3、HttpServlet類
這個類繼承了GenericServlet類,因此這個類的service方法實現了對HTTP協議的支援,這個類的主要功能是接受從瀏覽器發送過來的HTTP請求,並返回HTTP響應。
它的service方法是這樣的:service(HttpServletRequest req, HttpServletResponse resp);
4、HttpServletRequest和HttpServletResponse介面
由於這兩個介面是繼承ServletRequest和HttpServletResponse介面
而來的,它們是基於HTTP協議來封裝請求和響應的,因此這個兩個介面定義的方法一定是根據HTTP協議裡的資訊來寫的,參照這篇文章:《Http詳解》然後對比一下這兩個介面定義的方法就能明了了。
最後:
Servlet的原理說起來真的很簡單,重要的是如何應用這些方法。我覺得一邊學HTTP協議一邊用這些方法是個不錯的選擇。
[總結]Servlet概述