ServletContext--HttpServletResponse--web項目執行流程
一.ServletContext 接口(javax.servlet)
定義:public interface ServletContext
原理:
Tomcat啟動的時候,需要識別webapps下的各個WEB應用,識別各個WEB應用的同時為每個WEB應用創建對應的對象ServletContext,一個WEB應用對應一個ServletContext.ServletContext內置了2種至少MAP結構的數據,一種用於存放整個web應用中配置的鍵值對的參數信息,另外一種用於存放程序運行過程中產生的鍵值對的參數信息
ServletContext生命周期:與項目共存亡.
介紹:
定義一組方法,servlet 使用這些方法與其 servlet 容器進行通信,例如,獲取文件的 MIME 類型、分發請求或寫入日誌文件。
每個 Java 虛擬機的每個“Web應用程序”都有一個上下文,(“Web 應用程序”是 servlet 和內容的 Collection,這些 servlet 和內容安裝在服務器的 URL 名稱空間(比如 / catalog)的特定子集下,並且可能通過.war文件安裝。)如果 Web 應用程序在其部署描述符中標記為"distributed",那麽每個虛擬機都將有一個上下文實例。在這種情況下,不能將上下文用作共享全局信息的位置(因為該信息不 會是真正全局共享的)。請使用外部資源(如數據庫)替代。
ServletContext 對象包含在 ServletConfig 對象中,ServletConfig 對象在初始化 servlet 時由 Web 服務器提供給 servlet。
常用方法:
public Object getAttribute(String name){}:返回具有給定名稱的servlet容器屬性,如果不具有該名稱的屬性,則返回 null。屬性允許 servlet
容器將此接口還沒有提供的額外信息提供給servlet。可使用getAttributeNames 獲取支持的屬性的列表。
public Enumeration<E> getAttributeNames(){}:返回包含此 servlet 上下文中可用屬性的名稱的 Enumeration。使用帶有一個屬性名稱的 #getAttribute 方法獲取屬性值.
public String getMimeType(String file){}:返回指定文件的 MIME 類型,如果 MIME 類型未知,則返回 null。MIME 類型由 servlet 容器的配置確定,可以在 Web 應用程序部署描述符中指定。常見
MIME類型是 "text/html" 和 "image/gif".
public String getRealPath(String path){}:為給定虛擬路徑返回包含實際路徑的 String。
public InputStream getResourceAsStream(String path){}:以 InputStream 對象的形式返回位於指定路徑上的資源.InputStream 中的數據可以是任意類型或長度。該路徑必須根據 getResource
中給出的規則指定。如果指定路徑上沒有資源,則此方法返回 null。使用此方法時,可通過 getResource 方法獲得的元信息(比如內容長度和內容類型)將丟失。servlet 容器必須實現訪問資源所需的 URL處理程序和 URLConnection 對象。此方法不同於 java.lang.Class.getResourceAsStream,後者使用類加載器。此方法允許 servlet 容器使某一資源可用於來自任意位置的 servlet,而不必使用類加載器。
public void removeAttribute(String name){}:從 servlet 上下文中移除具有給定名稱的屬性。完成移除操作後,為獲取屬性值而對 #getAttribute 進行的後續調用將返回 null。
如果在 ServletContext 上配置了偵聽器,則容器將相應地通知它們。
public void setAttribute(String name, Object object){}:將對象綁定到此 servlet 上下文中的給定屬性名稱。如果已將指定名稱用於某個屬性,則此方法將使用新屬性替換具有該名稱的屬性。
如果在 ServletContext 上配置了偵聽器,則容器將相應地通知它們。如果傳遞了 null 值,則效果將與調用 removeAttribute() 相同。
二.HttpServletResponse 接口(javax.servlet.http)
定義:public interface HttpServletResponse extends ServletResponse
作用:既然HttpServletResponse代表從服務端到客戶端響應這個過程,那麽結合協議我們知道HttpServletResponse可以控制HTTP協議響應的三大塊內容,分別是響應行,響應頭,響應體.
生命周期:每次服務端獲取到來自客戶端的請求之後,解析HTTP請求部分,將HTTP請求部分封裝在HttpServletRequest對象中,同時創建HttpServletResponse對象, 之後在服務端完成本次響應
之後,服務端就回收了剛才創建好的Request,Response對象. 下次請求到達服務端,會分配新的HttpServletRequest/HttpServletResponse對象.即只存活在一次請求/響應中;
三.Web項目執行流程
*_實現項目,發布到服務器下
發布項目的本質:
1_將源碼位置中WebContent下的所有內容復制到tomcat下對應的項目中
2_將源碼下build下的class目錄復制到tomcat下對應項目下的WEB-INF下
*_啟動WEB服務器Tomcat
1_運行tomcat內部的main函數,
2_創建一個線程池(相當於之前的連接池),方便為客戶端分配各個線程
3_啟動ServerSocket對象,監聽服務端的8080端口號,等待來自客戶端的請求
*_用戶在瀏覽器地址欄輸入 http://localhost:8080/day34/hello ,向服務端發起請求
1_瀏覽器底層建立一個和服務端對應的socket
瀏覽器底層通過socket可以獲取到2種管道:輸出,輸入,
通過輸出流向服務端發送數據,通過輸入流接收來自服務端的數據
2_通過輸出流將HTTP協議的請求部分發送到服務端
get /day34/hello http/1.1
Host:"localhost:8080"
User-Agent:"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0"
Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
Accept-Language:"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3"
Accept-Encoding:"gzip, deflate"
Connection:"keep-alive"
空行
*_服務端監聽到一個和客戶端對應的socket對象,通過socket可以獲取到2種流對象
輸入流:讀取客戶端瀏覽器發送到服務端數據
輸出流:向客戶端瀏覽器輸出數據
1_服務端為當前的客戶端分配一條線程
2_服務端通過讀取輸入流來獲取客戶端的HTTP請求部分後,將內容拆分,重新封裝在
一個HttpServletRequest的實例對象中,同時創建一個HttpServletResponse的實例化對象,可以向HttpServletResponse對象賦予部分屬性(響應時間,服務器類型),
3_服務端分析請求行部分,獲取到本次請求的項目,以及項目下的資源
GET /day34/demo.html HTTP/1.1
http://localhost:8080/day34/demo.html
*_如果請求的是靜態文件資源
通過輸入流將靜態的文件讀入到內存,結合輸出流和HTTP協議響應完成本次響應
GET /day34/hello HTTP/1.1
http://localhost:8080/day34/hello
*_如果請求的是動態路徑
1_TOMCAT在當前的項目下day34下的web.xml中通過動態的路徑”/hello”,尋找到
“/hello”對應的類的全路徑cn.itcast.test00.HelloServlet ;(Tomcat啟動時即加載web.xml配置)
2_tomcat可以通過反射,調用HelloServlet.class字節碼上無參數的構造函數,
創建HelloServlet對應的對象,執行對象上的init方法(僅執行一次);
3_調用對象下的service方法,當前對象中,尋找不到,去父類中尋找,
在service方法中判斷本次請求是GET方式還是POST方式,調用對象下的doget/dopost
方法(將創建好的request,reponse傳遞進去)
*_Tomcat結合http協議響應部分和輸出流向客戶端進行響應,
服務端回收request,response,線程
*_瀏覽器通過輸入流讀取服務端響應到客戶端的數據,對響應內容進行解析
ServletContext--HttpServletResponse--web項目執行流程