前段時間學習spring框架的時候很想研究一下servlet的工做原理,可是一直沒有時間,這幾天有點時間了,因此趕忙的看了一下相關資料以及servlet的源碼粗略的分析了一下咱們servlet的工做實現: java
首先要從tomcat開始提及,tomcat是一個web應用服務器,當咱們把咱們的servlet應用部署進咱們的tomcat時,咱們的tomcat就至關於一個servlet/jsp容器,當咱們的Tomcat容器也就是咱們的servlet容器啓動的時候,他就會自動的讀取咱們的web.xml裏面的配置信息,初始化咱們的servlet的某些配置,下面我說一下當咱們的一個請求來的時候,咱們的servlet容器是怎麼處理他的: web
1:web client發送一個request請求。 spring
2:Servlet容器接收咱們這個請求,把web client的請求的信息封裝成一個HttpServletRequest對象,以及HttpServletResponse對象。 tomcat
3:Servlet容器把咱們的HttpServletRequest對象,以及HttpServletResponse對象封裝成一個參數傳遞給咱們的httpservlet的service()方法。 服務器
4:在service()裏面咱們經過讀取咱們的httpServletRequst裏面的信息進行一些操做,而後寫入一些信息進入咱們的HttpServletResponse對象中。 框架
5:咱們的servlet容器把咱們的HttpServletResponse返回給咱們的webclint。 jsp
工做原理以下: 函數
以上是我理解的Servlet的工做原理,可是當咱們的請求到達了咱們的HttpServlet的時候,HttpServlet是怎麼處理WebClient請求的? 學習
首先看一下咱們web應用最重要的一個包 javax.servlet裏面的Servlet接口,以及他的子類 ,在咱們的java web應用中,有兩個子類直接繼承了它:JspPage,GenericServlet。HttpServlet就是繼承自GenericServlet。 spa
以上是Servlet接口的源代碼,當咱們的Servlet容器實例化了一個Servlet的時候首先會調用init()方法,以後再調用service()。。。。。。
這裏面有幾個基本的方法:
Init():初始化servlet時調用它
getServletConfig():獲取servlet的配置信息
Service(Request,Response):對咱們的請求進行操做的方法
getServletinfo();獲取咱們servlet的信息
Destroy:銷燬咱們的servlet
重點說下GenericServlet,GenericServlet是一個抽象方法,必須經過類的實現才能引用他,GenericServlet它提供了咱們的Servlet的基本接口的實現,而且實現了一些基本的方法,要知道咱們的請求可不僅有咱們的Http請求,還有FTP等等之類的請求,若是之後咱們要寫ftp類型的服務的話咱們就能夠繼承這個方法寫個FtpServlet也何嘗不可。
service(ServletRequest req, ServletResponse res):
當咱們實例化servlet時,servlet容器會調用這個service方法,這方法的做用主要是ServletRequest ,以及ServletResponse 封裝成咱們的HttpServletRequest 參數傳遞給
service(HttpServletRequest req, HttpServletResponse resp)方法處理。固然有必要咱們也能夠重寫這個方法
service(HttpServletRequest req, HttpServletResponse resp):
在這個service()方法裏面經過req.getMethod()方法得到Http請求的method,而後經過他的請求方式來判斷他因該由那個函數處理,若是獲取的Http method在這個方法裏面沒有對應的函數處理它,那麼就會經過: resp.sendError(501, errMsg1)這個方法返回給客戶端501(服務器端不支持此請求)錯誤。
當Servlet裏沒有重寫doGet()方法的時候,一個get請求到達服務器端時就會執行默認的doget()
這裏經過req.getProtocol()來獲取客戶端向服務器端傳送數據所依據的協議名稱,若是是Http1.1的話返回405錯誤(方法不被容許),不然返回400錯誤(錯誤的請求)給咱們的客戶端。