ServletContext--HttpServletResponse--web項目執行流程

来源:http://www.cnblogs.com/huguangqin/archive/2017/07/23/7226556.html
-Advertisement-
Play Games

一.ServletContext 介面(javax.servlet)定義:public interface ServletContext原理: Tomcat啟動的時候,需要識別webapps下的各個WEB應用,識別各個WEB應用的同時為每個WEB應用創建對應的對象ServletContext,一個W... ...


一.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,線程


*_瀏覽器通過輸入流讀取服務端響應到客戶端的數據,對響應內容進行解析


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 引子在此前的一篇文章中,我介紹瞭如何在本地docker環境中運行ASP.NET Core跨平臺應用程式(http://www.cnblogs.com/chenxizhang/p/7148657.html),看起來非常不錯,不是嗎?那麼,如果我們希望真正在實際的生產環境去部署和運行這個應用程式,應該怎... ...
  • 在上一篇的EF之DB First中,存在以下的兩個問題: 1. 添加/編輯頁面顯示的是屬性名稱,而非自定義的名稱(如:姓名、專業...) 2. 添加/編輯時沒有加入驗證 3. 數據展示使用分頁 @Html.LabelFor(model => model.Name, htmlAttributes: n ...
  • yaml文件處理(http://pyyaml.org/wiki/PyYAMLDocumentation) 摘要: 本文講的是yaml在python上的使用教程詳解, YAML是一種容易人類閱讀、適合表示程式語言的數據結構、可用於不同程式間交換數據、支持泛型工具、支持串列處理、豐富的表達能力和可擴展性 ...
  • Numpy指南筆記 第2章:Numpy基礎 創建多維數組# coding:utf-8import numpy as npm=np.array([np.arange(2),np.arange(2)])print mprint m.shape 一維數組切片和索引# coding:utf-8import ...
  • 流 數據流 用於傳輸數據。IO流 Input/Output流。數據從外部流向程式 輸入流;數據從程式流向外部的時候--輸出流。讀取一個文件 數據從文件流向程式 輸入流;向一個文件中寫入數據 數據從程式流向文件 輸出流 根據數據流動的方向:輸入流/輸出流 根據數據傳輸的形式:位元組流/字元流 輸入流 輸 ...
  • 要求: Readme: 運行程式,輸入薪水,根據商品列表的序號選擇購買的商品,可以選擇多次購買,或者不購買 流程圖: 代碼: ...
  • #列印實心菱形,思路:分上下,i控制行,j控制列印的空格數,k控制列印的*數量row = int(input("please input a raw number: "))for i in range(row): #i控制行數 for j in range(row-1-i):#空格數和行數的關係 p ...
  • XML文件處理 XML文件處理,有好幾種方式,這裡介紹一下xml.etree.ElementTree as ET。 註意:xml.etree.ElementTree模塊在應對惡意結構數據時顯得並不安全。 每個element對象都具有以下屬性: 1. tag:string對象,表示數據代表的種類; 2 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...