1. 程式人生 > >Servlet執行原理(Tomcat為例)

Servlet執行原理(Tomcat為例)

Servlet

一、首先servlet是一個java應用程式,執行在伺服器端,用來處理客戶端請求(http請求)並作出響應的程式。

二、http定義了與伺服器互動的幾種方式最基本常用的有:GET、POST、PUT、DELETE。使用頻率最高的就是GET、還有POST

1.GET:從指定資源請求資料,該請求方式是通過Url直接請求資料的,資料資訊可以直接在URL中看到,因為此種請求引數暴露在URL中,所以安全性較低。GET請求的特點:

  • GET請求能夠被快取
  • GET請求會儲存在瀏覽器的瀏覽記錄中
  • 以GET請求的URL能夠儲存為瀏覽器書籤
  • GET請求有長度限制
  • GET請求主要用以獲取資料

2.POST:向指定的資源提交要被處理的資料,該種請求的方式的引數放在請求體中,使用該方式時查詢字串(名稱/值對)是在 POST 請求的 HTTP 訊息主體中傳送的。

  • POST 請求不會被快取
  • POST 請求不會保留在瀏覽器歷史記錄中
  • POST 不能被收藏為書籤
  • POST 請求對資料長度沒有要求

二者的對比:

GET POST
後退按鈕/重新整理 無害 資料會被重新提交(瀏覽器應該告知使用者資料會被重新提交)。
書籤 可收藏為書籤 不可收藏為書籤
快取 能被快取 不能快取
編碼型別 application/x-www-form-urlencoded application/x-www-form-urlencoded 或 multipart/form-data。為二進位制資料使用多重編碼。
歷史 引數保留在瀏覽器歷史中。 引數不會儲存在瀏覽器歷史中。
對資料長度的限制 是的。當傳送資料時,GET 方法向 URL 新增資料;URL 的長度是受限制的(URL 的最大長度是 2048 個字元)。 無限制。
對資料型別的限制 只允許 ASCII 字元。 沒有限制。也允許二進位制資料。
安全性

與 POST 相比,GET 的安全性較差,因為所傳送的資料是 URL 的一部分。

在傳送密碼或其他敏感資訊時絕不要使用 GET !

POST 比 GET 更安全,因為引數不會被儲存在瀏覽器歷史或 web 伺服器日誌中。
可見性 資料在 URL 中對所有人都是可見的。 資料不會顯示在 URL 中。

三、servlet是一個多執行緒其建立在java的多執行緒機制之上的,它的生命週期由Web容器負責的。會根據Web.xml來例項化這個類。

1.生命週期階段:Servlet 載入—>例項化—>服務—>銷燬。

init():

在Servlet的生命週期中,僅執行一次init()方法。它是在伺服器裝入Servlet時執行的,負責初始化Servlet物件。可以配置伺服器,以在啟動伺服器或客戶機首次訪問Servlet時裝入Servlet。無論有多少客戶機訪問Servlet,都不會重複執行init()。

service():

它是Servlet的核心,負責響應客戶的請求。每當一個客戶請求一個HttpServlet物件,該物件的Service()方法就要呼叫,而且傳遞給這個方法一個“請求”(ServletRequest)物件和一個“響應”(ServletResponse)物件作為引數。在HttpServlet中已存在Service()方法。預設的服務功能是呼叫與HTTP請求的方法相應的do功能。

destroy():

僅執行一次,在伺服器端停止且解除安裝Servlet時執行該方法。當Servlet物件退出生命週期時,負責釋放佔用的資源。一個Servlet在執行service()方法時可能會產生其他的執行緒,因此需要確認在呼叫destroy()方法時,這些執行緒已經終止或完成。

2.Servlet的工作過程

步驟:

  1. Web Client 向Servlet容器(Tomcat)發出Http請求
  2. Servlet容器接收Web Client的請求
  3. Servlet容器建立一個HttpRequest物件,將Web Client請求的資訊封裝到這個物件中。
  4. Servlet容器建立一個HttpResponse物件
  5. Servlet容器呼叫HttpServlet物件的doservice方法,把HttpRequest物件與HttpResponse物件作為引數傳給HttpServlet 物件。
  6. HttpServlet呼叫HttpRequest物件的有關方法,獲取Http請求資訊。
  7. HttpServlet呼叫HttpResponse物件的有關方法,生成響應資料。
  8. Servlet容器把HttpServlet的響應結果傳給Web Client。

四、servlet預設監控80埠,使用者從瀏覽器法宗一個請求一般包括 :http://hostname:port/contextpath/servletpath。hostname和具體的port用來與伺服器建立TCP連線,後面的URL才決定選擇在伺服器中的哪個子容器服務使用者的請求。

關於SpingMVC中的請求

一、SpringMVC的流程:

1  使用者傳送請求至前端控制器DispatcherServlet

2  DispatcherServlet收到請求呼叫HandlerMapping處理器對映器。

3  處理器對映器找到具體的處理器(可以根據xml配置、註解進行查詢),生成處理器物件及處理器攔截器(如果有則生成)一併返回給DispatcherServlet

4  DispatcherServlet呼叫HandlerAdapter處理器介面卡。

5  HandlerAdapter經過適配呼叫具體的處理器(Controller,也叫後端控制器)

6  Controller執行完成返回ModelAndView

7  HandlerAdaptercontroller執行結果ModelAndView返回給DispatcherServlet

8  DispatcherServletModelAndView傳給ViewReslover檢視解析器。

9  ViewReslover解析後返回具體View

10DispatcherServlet根據View進行渲染檢視(即將模型資料填充至檢視中)。

11 DispatcherServlet響應使用者。 

二、元件的相關說明

DispatcherServlet:作為前端控制器,整個流程控制的中心,控制其它元件執行,統一排程,降低元件之間的耦合性,提高每個元件的擴充套件性。

HandlerMapping:通過擴充套件處理器對映器實現不同的對映方式,例如:配置檔案方式,實現介面方式,註解方式等。 

HandlAdapter:通過擴充套件處理器介面卡,支援更多型別的處理器。

ViewResolver:通過擴充套件檢視解析器,支援更多型別的檢視解析,例如:jspfreemarkerpdfexcel等。

三、SpringMVC工作流程圖