Request(HTTP请求对象)的笔记和底层原理
Request筆記以及底層原理
- 1.HTTP協(xié)議
- 2.學(xué)會識別請求
- 3.Request請求對象
- 4.Request是域?qū)ο?/li>
- 5.使用域?qū)ο筮M行數(shù)據(jù)傳遞(請求轉(zhuǎn)發(fā))
- 6.Request底層原理圖
1.HTTP協(xié)議
請求:客戶端發(fā)送給服務(wù)端的數(shù)據(jù)
響應(yīng):服務(wù)端發(fā)送給客戶端的數(shù)據(jù)
注意:先有請求后有響應(yīng),沒有請求就沒有響應(yīng)
2.學(xué)會識別請求
2.1 請求行
- 本次請求的基本信息
- 格式:請求方式 請求資源 協(xié)議版本
- 例如POST /day29/demo01 HTTP/1.1
2.2 請求頭
- 本次請求的附加信息
- 格式:一行一個鍵值對,一個鍵值對是一個請求頭,一次請求可以有多個請求頭
- 例如:Referer:http://localhost:8080/day29/_01http.html
2.3 請求體
- 本次請求的正文數(shù)據(jù),是提交的表單參數(shù)
- 格式:表單數(shù)據(jù)的提交格式 name=value&name=value&…
- 例如:username=lisi
- 注意:只有是POST提交,必須有帶name屬性的表單項,這時候請求體里才有數(shù)據(jù);否則沒有請求體
3.Request請求對象
3.1 獲取請求行的數(shù)據(jù)
獲取請求方式數(shù)據(jù)
- 語法:Request對象.getMethod():
- 方法返回對應(yīng)的請求方式字符串 (常見的請求方式 get/post)
- 一般默認(rèn)請求方式都是get,只有指定了post才會有post請求。
獲取請求行中項目路徑
- 語法:Request對象.getContextPath();
- 方法返回對應(yīng)的項目路徑字符串
獲取客戶端IP
- 語法:Request對象.getRemoteAddr();
- 方法返回訪問客戶的IP地址
3.2 獲取請求頭的數(shù)據(jù)
獲取指定請求頭的值
- 語法:Request.getHeader(鍵)
- 在請求頭中,數(shù)據(jù)以鍵值對的方式進行存儲,傳入鍵,獲取值
獲取所有請求頭的值
- 語法:Request.getHeaderNames()
- 以枚舉對象的形式,返回所有請求頭的值.
- 循環(huán)遍歷
獲取請求體的數(shù)據(jù)
-
獲取單值參數(shù):String value = request.getParameter(標(biāo)簽體的name屬性)
-
獲取多值參數(shù):String[] values = request.getParametreValues(標(biāo)簽體的name屬性)
-
獲取所有參數(shù):Map<String, String[]> map = request.getParameterMap()
獲取表單數(shù)據(jù)出現(xiàn)亂碼問題
1.Get方式不會出現(xiàn)亂碼,因為Tomcat 8版本以上的為我們解決了。
2.Post方式則會出現(xiàn)亂碼問題:
一切亂碼原因都是因為解碼和編碼方式不同 -
request默認(rèn)采用iso-8859字符集解碼,而我們的頁面是utf-8字符集編碼
-
解決方法:修改解碼方式,語法:Request.setCharacterEncoding(“utf-8”)
-
注意:必須在接收參數(shù)之前執(zhí)行
4.Request是域?qū)ο?/h2>
- 由Servlet規(guī)范提供的,能夠存取數(shù)據(jù)的對象,在其作用范圍里可以共享數(shù)據(jù)。
- 不同域?qū)ο蟮膮^(qū)別:作用范圍不同
- 域?qū)ο蟠嫒?shù)據(jù)的方法:
- 存數(shù)據(jù):setAttribute(String name, Object value)
- 取數(shù)據(jù):getAttribute(String name)
- 刪數(shù)據(jù):removeAttribute(String name)
- 存數(shù)據(jù):setAttribute(String name, Object value)
- 取數(shù)據(jù):getAttribute(String name)
- 刪數(shù)據(jù):removeAttribute(String name)
request域?qū)ο蟮淖饔梅秶?#xff1a;
- 何時創(chuàng)建:一次請求開始
- 何時銷毀:一次請求結(jié)束
- 作用范圍:一次請求期間
5.使用域?qū)ο筮M行數(shù)據(jù)傳遞(請求轉(zhuǎn)發(fā))
原理圖:
servletContext域?qū)ο笠部梢源娣艛?shù)據(jù),但是會一直存在內(nèi)存中,消耗內(nèi)存,而Request結(jié)束時就會銷毀。
5.1 請求跳轉(zhuǎn)的使用
//獲取請求轉(zhuǎn)發(fā)器 RequestDispatcher rd = request.getRequestDispatcher(String path); //執(zhí)行請求轉(zhuǎn)發(fā)跳轉(zhuǎn) rd.forward(request, response);注意:
- 重定向跳轉(zhuǎn)時,跳轉(zhuǎn)的路徑前要加:項目路徑。因為重定向是瀏覽器跳轉(zhuǎn),是應(yīng)用外跳轉(zhuǎn)
- 請求轉(zhuǎn)發(fā)跳轉(zhuǎn)時,跳轉(zhuǎn)的路徑前不要加項目路徑。因為請求轉(zhuǎn)發(fā)是服務(wù)器跳轉(zhuǎn),是應(yīng)用內(nèi)跳轉(zhuǎn)
5.2 重定向和請求轉(zhuǎn)發(fā)的區(qū)別【面試題】
- 重定向跳轉(zhuǎn):有兩次請求;請求轉(zhuǎn)發(fā):有1次請求
- 重定向跳轉(zhuǎn):瀏覽器地址欄會變;請求轉(zhuǎn)發(fā):地址欄不變
- 重定向跳轉(zhuǎn):是客戶端(瀏覽器)跳轉(zhuǎn);請求轉(zhuǎn)發(fā):是服務(wù)端跳轉(zhuǎn)
5.3 請求轉(zhuǎn)發(fā)和重定向的應(yīng)用場景
- 跳轉(zhuǎn)時,如果有數(shù)據(jù)要傳遞給下一個資源,要使用請求轉(zhuǎn)發(fā)跳轉(zhuǎn):
- 把數(shù)據(jù)放到request對象里
- 請求轉(zhuǎn)到下一個資源,把request對象傳遞過去
- 跳轉(zhuǎn)時,如果沒有數(shù)據(jù)要傳遞給下一個資源,可以使用重定向跳轉(zhuǎn)
6.Request底層原理圖
總結(jié)
以上是生活随笔為你收集整理的Request(HTTP请求对象)的笔记和底层原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于javaweb的美发店理发店会员管理
- 下一篇: 运行资源优化配置