前言
servlet是web開發中的核心技術,作為一名合格的開發人員,就必須清楚servlet的工作原理。本章沒有對servlet技術本身進行詳細的說明,隻是針對開發過程中一次servlet的請求的處理過程進行分析的。servlet實際上就是一個java類,隻不過可以和浏覽器進行一些資料的交換。有servlet類就有管理servlet的容器,種類有很多,這裡主要針對tomcat對servlet的工作原理進行說明。為了說清楚servlet工作原理,需要知道servlet的工作過程大緻可以分為以下幾個階段:
1. 啟動tomcat容器
2. web應用初始化
3. 建立servlet執行個體
4. 初始化servlet
5. 執行servlet的service方法
tomcat的啟動過程
這部分可以用下圖進行簡化:
web應用初始化
下面分析web應用的初始化,初始化工作是由contextconfig類的configurestart方法完成的,該方法的主要任務是完成web.xml配置檔案的解析。下面解析的關鍵代碼:
代碼清單5-1:
在代碼已經清晰地說明了web應用的初始化過程,由于在tomcat7中增加了對注解(annotation)的支援,是以會對servlet中的注解進行解析。首先查找jar包中的web-fragment.xml,并對其進行解析,接下來将對/web-inf/classes目錄下的class進行注解的解析。之後,把web-fragment.xml檔案合并到web.xml中,被解析後的web.xml檔案的配置項将儲存到webxml對象中,然後把webxml對象中的屬性設定到context容器中,這個過程是由configurecontext方法來完成的。下面是其部分源碼——完成servlet的解析:
代碼清單5-2:
這段代碼說明了把servlet包裝成standardwrapper的過程,并把這個wrapper執行個體設定到context容器中。之是以要把servlet封裝成一個wrapper,主要為了解耦,因為wrapper是一個容器而servlet是一個具體的類。
到目前為止,已經完成了web應用的初始化,其中将web.xml進行了解析并完成了注解的解析,還把配置的servlet類封裝成了一個wrapper容器,接下來就是根據這個wrapper建立servlet執行個體了。
建立servlet執行個體
建立servlet執行個體要回到我們分析wrapper容器中提到的loadservlet方法了,這個方法是由wrapper容器的标準實作類standardwrapper完成的,通過loadservlet方法擷取servletclass,然後把這個servletclass交給執行個體管理器(instancemanager)完成servletclass.class的對象建立。
初始化servlet
初始化的工作是由standardwrapper的initservlet方法完成的,這個方法主要就是調用servlet的init方法,然後把包裝了standardwrapper的standardwrapperfacade交給servlet。下面是這個方法的源碼:
代碼清單5-3:
這樣就完成了servlet的初始化,下面就是執行servlet的service方法了。
執行service方法
在分析wrapper方法中提到,standardwrapper會調用allocate方法從執行個體池棧中彈出一個servlet處理請求,這個servlet執行個體在完成初始化後,并經過一系列過濾器的過濾後就到達servlet執行個體的service方法,這個過程就是過濾器執行的過程。這樣servlet執行個體就順利調用到了service方法,之後發生的過程就是我們熟悉的request擷取參數并用response進行響應的過程了。