HTTP協議 Request請求對象
http協議
概述
協議:規定了被約束對象都需要去遵守的規則
http協議:是互聯網上運用最爲廣泛的一種瀏覽器和服務器之間的協議(合同)
這份合同規定了瀏覽器訪問服務器要遵循的內容以及服務器響應瀏覽器要遵循的內容
作用
強制規定了只要瀏覽器訪問服務器就要傳遞哪些內容以及這些內容傳遞時的格式
強制規定 了只要服務器響應瀏覽器要響應哪些內容以及這些內容響應時的格式
協議規定的內容(抓包工具)
請求內容:瀏覽器發送給服務器的數據(今天)
響應內容:服務器響應給瀏覽器的數據 (明天)
請求內容
請求內容:
請求行(第一行) 請求頭(key:value) 請求體(表單的的內容)
注意:對於請求內容
get提交沒有請求體 所有的表單的數據都在請求行中(地址欄中)
post提交有請求體 所有的表單數據都在請求體中(不在地址欄中)
面試題 get提交和post提交的區別?
get提交沒有請求體 所有的頁面數據都在請求行中 會在地址欄中暴露 不安全
post提交有請求體 所有的頁面數據都在請求體中 不會地址欄中暴露 安全
get提交有着大小的限制 post沒有大小的限制
什麼情況下訪問服務器是get提交? 什麼情況下訪問服務器時post提交?
瀏覽器只要和服務器交互 只有將表單的method設置成post才屬於post提交,其它的一律是get提交
http請求協議的組成內容
請求行 請求頭 請求體
請求行
請求方式 請求資源 協議版本 POST /day_02/sd1 HTTP/1.1
請求頭
數據的格式:鍵值對的數據
掌握的頭數據:Referer User-Agent
Referer:當前頁面的來源地址 防盜鏈
User-Agent:用戶的瀏覽器版本信息
請求體
只有post提交纔有 是頁面表單的數據要傳遞給服務器的內容
問:請求行 請求頭 請求體的數據最終都要傳遞給服務器 服務器如何獲取到這些數據?
請求行 請求頭 請求體會隨着請求封裝request對象中,所以我們在服務器端只要使用提供好的request對象調用api即可獲取到
request請求對象
概述
request對象代表瀏覽器端的請求,當瀏覽器端通過HTTP協議訪問服務器時,HTTP請求中的所有
信息都封裝在這個對象中,開發人員通過這個對象的api,可以獲得客戶通過瀏覽器傳遞過來的數據
作用
作用:用來封裝所有頁面數據(請求行 請求頭 請求體)
1.獲取請求行的數據
2.獲取請求頭的數據
3.獲取請求體的數據
1.獲取請求行數據的api概述(請求方式 訪問的資源 協議版本)
1.(瞭解)String getMethod() 獲取請求方式
2.(瞭解)String getRequestURI() 獲取請求行中的資源名部分
3.(掌握)StringBuffer getRequestURL() 獲取客戶端請求完整URL
4.(瞭解)String getProtocol() 獲取請求協議和版本
5.(瞭解)int getLocalPort() 獲取端口
6.(掌握)String getRemoteAddr() 獲取請求者的ip地址
Localhost:ipv6
127.0.0.1:ipv4
7.(掌握)String getContextPath() 例如:/day_02
2.獲取請求頭數據的api概述 (鍵值對key/value的數據)
1.getHeader(String key) 根據請求頭的key獲取value
例如:Referer可以獲取到來源地址(沒有來與爲null:直接訪問) 防盜鏈
例如:User-Agent可以獲取用戶的瀏覽器版本信息 下載
2.(瞭解)Enumeration getHeaderNames() 返回此請求包含的所有頭名稱
3.獲取請求體數據api概述(所有瀏覽器提交的表單數據)
1.String getParameter("name的屬性名")
2.String[] getParameterValues("name的屬性值")
3.Map<String,String[]> getParameterMap()
注意:key:對應的是表單中name屬性名
在提交表單的過程中,如果有中文 get提交沒問題 但是post提交會亂碼
解決方案:request.setCharacterEncoding("utf-8");
4.request請求對象的其它作用
作爲容器數據存取刪的方法:(request也被稱爲域對象)
1.void setAttribute(String name, Object o) 存儲數據
2.Object getAttribute(String name) 獲取數據
3.void removeAttribute(String name) 移除數據
注意:request這3個方法也可以做多個servlet之間的數據傳遞?
問題:當我們瀏覽器訪問2個不同的servlet的時候,發現並不能得到我們想要的獲取數據效果
原因:請求一次就創建一個request對象,響應就銷燬,要想用同一個request對象,得學習請求轉發
解決:使用請求轉發
請求轉發:可以在一個servlet中訪問另外一個servlet
request.getRequestDispatcher("/servlet的地址").forward(request,response);
BeanUtils工具包的使用
需求:在開發的過程中,我們經常性的會有需求將map的數據轉給對象屬性,如果自己來做轉化實現的話過於麻煩,我們可以藉助第三方的工具包來實現,操作簡單方便
BeanUtis工具包的使用
1 導包 commons-beanutils-1.8.3 commons-logging-1.1.1
2 調用api方法 BeanUtils.populate(對象,map);
注意:只有map(key)和對象(屬性)共同的內容 纔會封裝