1、客戶發出請求—>Web 服務器轉發到Web容器Tomcat;
2、Tomcat主線程對轉發來用戶的請求做出響應創建兩個對象:HttpServletRequest和HttpServletResponse;
3、從請求中的URL中找到正確Servlet,Tomcat為其創建或者分配一個線程,同時把2創建的兩個對象傳遞給該線程;
4、Tomcat調用Servlet的service()方法,根據請求參數的不同調用doGet()或者doPost()方法;
5、假設是HTTP GET請求,doGet()方法生成靜態頁面,並組合到響應對象里;
6、Servlet線程結束,Tomcat將響應對象轉換為HTTP響應發回給客戶,同時刪除請求和響應對象。
創建Servlet對象的時機
1、Servlet容器啟動時:讀取web.xml配置文件中的信息,構造指定的Servlet對象,創建ServletConfig對象,同時將ServletConfig對象作為參數來調用Servlet對象的init方法。
2、在Servlet容器啟動后:客戶首次向Servlet發出請求,Servlet容器會判斷內存中是否存在指定的Servlet對象,如果沒有則創建它,然后根據客戶的請求創建HttpRequest、HttpResponse對象,從而調用Servlet對象的service方法。
3、Servlet的類文件被更新后,重新創建Servlet: Servlet容器在啟動時自動創建Servlet,這是由在web.xml文件中為Servlet設置的屬性決定的。從中我們也能看到同一個類型的Servlet對象在Servlet容器中以單例的形式存在。
也就是說,對於每個servlet,在一個服務器里只構造一次,然后調用init()函數一次,之后這個對象就被用來處理后面的請求。在服務器里每個servlet僅有一個對象,然后在不同的線程里調用service()函數,處理請求。(注:那么是不是service()方法里或者doGet/doPost方法里要注意並發訪問呢?),一般不要在servlet里面放置成員變量。
