**伺服器的請求與轉發_Servlet&HTTP&Request [web基礎day14] *
阿新 • • 發佈:2019-01-02
Servlet
* 概念 * 步驟 * 執行原理 * 生命週期 * Servlet 3.0 註解配置 * Servlet的體系結構 Servlet -- 介面 | GenericServlet--抽象類 | HttpServlet--抽象類 * GenericServlet:將Servlet介面中其他的方法做了預設空實現,只將service()方法作為抽象 * 將來定義Servlet類時,可以繼承GenericServlet,實現service()方法即可 * HttpServlet:對http協議的一種封裝,簡化操作 * 定義類繼承HttpServlet * 複寫doGet/doPost方法 後期jar包(lib)要放在WEB-INF下面。該包內只放jar包和class位元組碼檔案。 * 注意:web專案要把jar包放在web資料夾下WEB-INF的lib目錄下。 * servlet相關配置 1.urlpartten:Servlet訪問路徑 * 一個Servlet可以定義多個訪問路徑:@WebServlet({"/d4","/dd4","/ddd4"}) 2.路徑定義規則 * WebServlet("/*") (*號是一個萬用字元,什麼都可以寫,這裡表示無論寫什麼都可以訪問到資源路徑) * WebServlet("/xx/xx") (多級資源路徑,訪問的時候需要都輸入) * WebServlet("*.do") (不加斜槓 :副檔名匹配)
HTTP
* 概念:Hyper Text Transfer Protocol 超文字傳輸協議 * 傳輸協議:定義了客戶端和伺服器端通訊時傳送資料的格式。 * 客戶端傳送給伺服器端-->請求 (攜帶著請求訊息資料) * 伺服器給客戶端說話 -->響應 (響應訊息) * 傳送訊息,接收訊息,響應訊息,解析訊息,伺服器端和客戶端都需要一個規範的語法來解析訊息,所以就有了HTTP協議。 * 特點: 1.基於TCP/IP的高階協議 2.預設埠號:80 (80埠的地址可以不用輸入埠號。比如平時輸入網址只是域名,沒有輸入埠號。) 3.基於請求/響應模型的一次請求對應一次響應。 4.無狀態的:每次請求之間相互獨立,不能互動資料。 * 歷史版本: -->所有的圖片,css,都是單獨的請求。 * 1.0:每一次請求響應都會建立新的連線(這裡的建立連線是建立TCP連線) * 1.1:複用連線(對快取的支援也比較好,等等) 區別: * TCP:經歷三次握手,則可以直接傳輸資料 * HTTP:經歷三次握手,每次傳輸資料還需要請求和響應,那麼傳輸的資料在這些請求和響應的內容中。 * 請求訊息資料格式 1.請求行 * 格式: 請求方式 請求url 請求協議/版本 * GET /login.html HTTP/1.1 * 請求方式: * HTTP協議有7種請求方式,常用的有兩種 1. GET: * 請求方式在請求行中 * 請求的url長度有限制的 * 不太安全(指在請求行中容易被看到) 2. POST:請求方式在請求體中 * 請求引數在請求體中 * 請求的url長度是沒有限制的(一般下載檔案都用POST) * 相對安全 2.請求頭 * 一堆鍵值對: * 請求頭名稱:請求頭值 * 常見的請求頭:(客戶端瀏覽器告訴伺服器一些資訊) 1.User-Agent:瀏覽器告訴伺服器,我訪問你使用的瀏覽器版本資訊 * 可以在伺服器端獲取該頭的資訊,解決瀏覽器的相容性問題。 2.Accept:接收(表示瀏覽器接收哪些資料) 3.Accept-Language:(接收的語言) 4.Accept-Encoding: (接收的嚴肅哦) 4.Referer:告訴伺服器,我從哪裡來 * 作用: 1.放盜鏈 2.統計工作 5.Connection:keep-alive -->表示連線一直活著 6.Upgrade-Insecure-Requests:1: 表示升級資訊 3.請求空行:用於分隔POST請求的請求頭和請求體的 * 空行 4.請求體(正文):封裝POST請求訊息的請求引數 * GET方式是沒有請求體的 * POST有請求體,格式: * username=zhangsan * 響應訊息資料格式
Request
1.request物件和response物件的原理: (請求訊息) 1. tomcat伺服器會根據請求url的資源路徑,建立對應的ServletDemo1的物件 2. tomcat伺服器,會建立request和response物件,request物件中封裝請求訊息資料。 3. tomcat將request和response兩個物件傳遞給service方法,並且呼叫service方法。 4. 程式設計師(我們),可以通過request物件獲取請求訊息資料,通過response物件設定響應訊息資料。 (響應訊息) 5. 伺服器在給瀏覽器做出響應之前,會從response物件中拿程式設計師設定的響應訊息資料。 * 必須明白的是: * request和response物件是由伺服器建立的。我們來使用它們 * request物件是來獲取請求訊息,response物件是來響應訊息。 2.request的繼承體系: ServletRequest --介面 | HttpServletRequest --介面 | RequestFacade -- 類 * 只需要知道,RequestFacade類中的一些方法來源於上面兩個介面中。 3.request功能: 1.獲取請求訊息資料: * 獲取請求行資料 * GET /day14/demo?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 6.獲取協議及版本:HTTP/1.1 * String getProtocol() 7.獲取客戶機的IP地址: * String getRemteAddr() * URL:統一資源定位符:http://localhost/day14/demo1 * URI:統一資源識別符號:/day14/demo1 * URL相當於中華人民共和國,只代表一個國家,URI相當於共和國,可能代表多個國家,所以URI>URL; * 注意:重點掌握打星號的,其中獲取內容的是僅限於get請求的,所以後面學通用的獲取方法。 * 獲取請求頭資料 * 獲取請求體資料 2.獲取請求頭資料: * 方法: (重點) * String getHeader(String name):(這裡引數不區分大小寫) * request.getHeader("referer"):如果本地瀏覽器直接訪問,則返回null。如果通過超連結等方式訪問,則返回從什麼地方過來的地址。可以由此進行防盜鏈或者統計資料操作。 * request.getHeader("user-agent"):可以通過此方法獲取瀏覽器的型號和版本,並由此可以做出不同的返回操作,可以解決瀏覽器的相容問題。 * Enumeration<String> getHeaderNames():獲取所有的請求頭名稱 3.獲取請求體資料 * 請求體: 只有POST請求方式,才有請求體,在請求體中封裝了POST請求的請求引數 * 步驟: 1.獲取流物件: * BufferedReader getReader():獲取字元輸入流,只能操作輸入資料 * ServletInputStream getInputStream():獲取位元組輸入流,可以操作所有型別資料 * 第二個方法在檔案上傳後講解。 2.其他功能:(重點,常用的方法) 1.獲取請求引數通用方式:無論get還是post請求方式都可以使用下列方法來獲得請求引數。 * String getParameter(String name):根據引數名稱獲取引數值 * String[] getParameterValues(String name):根據引數名稱獲取引數值的陣列 hobby=xx&hobby=game * Enumeration<String> getParameterNames():獲取所有請求引數的名稱 * Map<String ,String[]> getParameterMap():獲取所有引數的map集合。 * 中文亂碼問題 * get方式:tomcat8 已經將get方式亂碼問題解決了 * post方式:會亂碼 * 解決:在獲取引數前,設定request的編碼:request.setCharacterEncoding("utf-8"); 2.請求轉發:一種在伺服器內部的資源跳轉方式 1.步驟: 1. 通過request物件獲取請求轉發器物件:RequestDispatcher getRequestDispatcher(String path) 2. 使用RequestDispatcher物件來進行轉發:forward(ServletRequest request,ServletResponse response) 2.特點: * 瀏覽器位址列路徑不發生變化 * 只能轉發到當前伺服器內部資源中 * 轉發是一次請求(是伺服器內部的請求,不是客戶端多增加一次請求。) * 為什麼需要轉發?一次請求不能處理,需要用到轉發進行協同處理。 3.共享資料 * 域物件:一個有作用範圍的物件,可以在範圍內共享資料 * request域:代表一次請求的範圍,一般用於請求轉發的多個資源中共享資料 * 方法: 1.setAttribute(String name,Object ): 2.Object getAttribute(String name):通過鍵獲取值 3.remove Attribute(String name)通過鍵移除值 * request和response在兩個Servlet中是同一個引數,因為請求和返回值只有一次。 4.獲取ServletContext: * servletCon * dao包就是進行資料庫的增刪改查的。 * login.html中form表單的action路徑的寫法 * BeanUtils工具類,簡化資料封裝 * 用於封裝JavaBean的 1.JavaBean:標準的Java類 1.能使用JavaBean必須滿足(要求:): * 類必須被public修飾 * 必須提供空參的構造器 * 成員變數必須使用private修飾 * 提供公共setter和getter方法 * JavaBean物件就是描述生活中的事物,如人,手機,貓,草,太陽等。 2.功能:封裝資料 2.概念: 成員變數: 屬性:setter和getter方法擷取後的產物 例如:getUsername()-->Username-->username 3.方法: 1.setProperty(Object bean,String name,Object value):給JavaBean物件設定屬性值 2.getProperty(Object bean,String name):獲取JavaBean物件中指定屬性的值,返回指定的屬性的值。 3.populate(Object obj,Map map):使用該方法可以將獲取所有元素的返回的map集合封裝成指定的物件。(將map集合的鍵值對封裝到map集合中); * map鍵是bean物件的屬性名,map值是bean物件的屬性值。 * 使用JavaBean需要匯入包。
BeanUtils的基本使用
GET獲取請求行中的資料的程式碼演示
HTTP1.0與1.1的區別的圖解演示
獲取瀏覽器版本所匹配的返回值的程式碼演示
獲取請求頭資料referer的程式碼演示
獲取請求元素的通用方法的程式碼演示(重點)
轉發資源的程式碼演示
獲取所有引數名稱的程式碼演示
給個關注吧!^^