Servlet工做原理以及源碼解析

   前段時間學習spring框架的時候很想研究一下servlet的工做原理,可是一直沒有時間,這幾天有點時間了,因此趕忙的看了一下相關資料以及servlet的源碼粗略的分析了一下咱們servlet的工做實現: java

首先要從tomcat開始提及,tomcat是一個web應用服務器,當咱們把咱們的servlet應用部署進咱們的tomcat時,咱們的tomcat就至關於一個servlet/jsp容器,當咱們的Tomcat容器也就是咱們的servlet容器啓動的時候,他就會自動的讀取咱們的web.xml裏面的配置信息,初始化咱們的servlet的某些配置,下面我說一下當咱們的一個請求來的時候,咱們的servlet容器是怎麼處理他的: web

1web client發送一個request請求。 spring

2Servlet容器接收咱們這個請求,把web client的請求的信息封裝成一個HttpServletRequest對象,以及HttpServletResponse對象。 tomcat

3Servlet容器把咱們的HttpServletRequest對象,以及HttpServletResponse對象封裝成一個參數傳遞給咱們的httpservletservice()方法。 服務器

4:在service()裏面咱們經過讀取咱們的httpServletRequst裏面的信息進行一些操做,而後寫入一些信息進入咱們的HttpServletResponse對象中。 框架

5:咱們的servlet容器把咱們的HttpServletResponse返回給咱們的webclint jsp

工做原理以下: 函數

以上是我理解的Servlet的工做原理,可是當咱們的請求到達了咱們的HttpServlet的時候,HttpServlet是怎麼處理WebClient請求的? 學習

首先看一下咱們web應用最重要的一個包 javax.servlet裏面的Servlet接口,以及他的子類 ,在咱們的java web應用中,有兩個子類直接繼承了它:JspPageGenericServlet。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也何嘗不可。


    HttpServlet是 GenericServlet 的子類,可是 HttpServlet 擴展了 GenericServlet 而且提供了 servlet 接口基於 http 的實現,源碼太多就不貼出來了,這隻分析HttpServlet中幾個重要的方法

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錯誤(錯誤的請求)給咱們的客戶端。

相關文章
相關標籤/搜索