2020-10-1日報部落格-週四
阿新 • • 發佈:2020-12-15
1.學到的東西:
## Servlet: 1. 概念 2. 步驟 3. 執行原理 4. 生命週期 5. Servlet3.0 註解配置 6. Servlet的體系結構 Servlet -- 介面 | GenericServlet -- 抽象類 | HttpServlet -- 抽象類 * GenericServlet:將Servlet介面中其他的方法做了預設空實現,只將service()方法作為抽象 * 將來定義Servlet類時,可以繼承GenericServlet,實現service()方法即可 * HttpServlet:對http協議的一種封裝,簡化操作 1. 定義類繼承HttpServlet 2. 複寫doGet/doPost方法 7. Servlet相關配置 1. urlpartten:Servlet訪問路徑 1. 一個Servlet可以定義多個訪問路徑 : @WebServlet({"/d4","/dd4","/ddd4"}) 2. 路徑定義規則: 1. /xxx:路徑匹配 2. /xxx/xxx:多層路徑,目錄結構 3. *.do:副檔名匹配 ## HTTP: * 概念:Hyper Text Transfer Protocol 超文字傳輸協議 * 傳輸協議:定義了,客戶端和伺服器端通訊時,傳送資料的格式 * 特點: 1. 基於TCP/IP的高階協議 2. 預設埠號:80 3. 基於請求/響應模型的:一次請求對應一次響應 4. 無狀態的:每次請求之間相互獨立,不能互動資料 * 歷史版本: * 1.0:每一次請求響應都會建立新的連線 * 1.1:複用連線 * 請求訊息資料格式 1. 請求行 請求方式 請求url 請求協議/版本 GET /login.html HTTP/1.1 * 請求方式: * HTTP協議有7中請求方式,常用的有2種 * GET: 1. 請求引數在請求行中,在url後。 2. 請求的url長度有限制的 3. 不太安全 * POST: 1. 請求引數在請求體中 2. 請求的url長度沒有限制的 3. 相對安全 2. 請求頭:客戶端瀏覽器告訴伺服器一些資訊 請求頭名稱: 請求頭值 * 常見的請求頭: 1. User-Agent:瀏覽器告訴伺服器,我訪問你使用的瀏覽器版本資訊 * 可以在伺服器端獲取該頭的資訊,解決瀏覽器的相容性問題 2. Referer:http://localhost/login.html * 告訴伺服器,我(當前請求)從哪裡來? * 作用: 1. 防盜鏈: 2. 統計工作: 3. 請求空行 空行,就是用於分割POST請求的請求頭,和請求體的。 4. 請求體(正文): * 封裝POST請求訊息的請求引數的 * 字串格式: POST /login.html HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Referer: http://localhost/login.html Connection: keep-alive Upgrade-Insecure-Requests: 1 username=zhangsan * 響應訊息資料格式 ## Request: 1. request物件和response物件的原理 1. request和response物件是由伺服器建立的。我們來使用它們 2. request物件是來獲取請求訊息,response物件是來設定響應訊息 2. request物件繼承體系結構: ServletRequest -- 介面 | 繼承 HttpServletRequest -- 介面 | 實現 org.apache.catalina.connector.RequestFacade 類(tomcat) 3. request功能: 1. 獲取請求訊息資料 1. 獲取請求行資料 * GET /day14/demo1?name=zhangsan HTTP/1.1 * 方法: 1. 獲取請求方式 :GET * String getMethod() 2. (*)獲取虛擬目錄:/day14 * String getContextPath() 3. 獲取Servlet路徑: /demo1 * String getServletPath() 4. 獲取get方式請求引數:name=zhangsan * String getQueryString() 5. (*)獲取請求URI:/day14/demo1 * String getRequestURI(): /day14/demo1 * StringBuffer getRequestURL() :http://localhost/day14/demo1 * URL:統一資源定位符 : http://localhost/day14/demo1 中華人民共和國 * URI:統一資源識別符號 : /day14/demo1 共和國 6. 獲取協議及版本:HTTP/1.1 * String getProtocol() 7. 獲取客戶機的IP地址: * String getRemoteAddr() 2. 獲取請求頭資料 * 方法: * (*)String getHeader(String name):通過請求頭的名稱獲取請求頭的值 * Enumeration<String> getHeaderNames():獲取所有的請求頭名稱 3. 獲取請求體資料: * 請求體:只有POST請求方式,才有請求體,在請求體中封裝了POST請求的請求引數 * 步驟: 1. 獲取流物件 * BufferedReader getReader():獲取字元輸入流,只能操作字元資料 * ServletInputStream getInputStream():獲取位元組輸入流,可以操作所有型別資料 * 在檔案上傳知識點後講解 2. 再從流物件中拿資料 2. 其他功能: 1. 獲取請求引數通用方式:不論get還是post請求方式都可以使用下列方法來獲取請求引數 1. String getParameter(String name):根據引數名稱獲取引數值 username=zs&password=123 2. String[] getParameterValues(String name):根據引數名稱獲取引數值的陣列 hobby=xx&hobby=game 3. Enumeration<String> getParameterNames():獲取所有請求的引數名稱 4. Map<String,String[]> getParameterMap():獲取所有引數的map集合 * 中文亂碼問題: * get方式:tomcat 8 已經將get方式亂碼問題解決了 * post方式:會亂碼 * 解決:在獲取引數前,設定request的編碼request.setCharacterEncoding("utf-8"); 2. 請求轉發:一種在伺服器內部的資源跳轉方式 1. 步驟: 1. 通過request物件獲取請求轉發器物件:RequestDispatcher getRequestDispatcher(String path) 2. 使用RequestDispatcher物件來進行轉發:forward(ServletRequest request, ServletResponse response) 2. 特點: 1. 瀏覽器位址列路徑不發生變化 2. 只能轉發到當前伺服器內部資源中。 3. 轉發是一次請求 3. 共享資料: * 域物件:一個有作用範圍的物件,可以在範圍內共享資料 * request域:代表一次請求的範圍,一般用於請求轉發的多個資源中共享資料 * 方法: 1. void setAttribute(String name,Object obj):儲存資料 2. Object getAttitude(String name):通過鍵獲取值 3. void removeAttribute(String name):通過鍵移除鍵值對 4. 獲取ServletContext: * ServletContext getServletContext()