1. 程式人生 > >**伺服器的請求與轉發_Servlet&HTTP&Request [web基礎day14] *

**伺服器的請求與轉發_Servlet&HTTP&Request [web基礎day14] *

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的程式碼演示

獲取請求元素的通用方法的程式碼演示(重點)

轉發資源的程式碼演示

獲取所有引數名稱的程式碼演示

給個關注吧!^^