JAVAEE——HttpServletRequest(已經重新整理 詳見Request)

HttpServletRequest概述

我們在創建Servlet時會覆蓋service()方法,或doGet()/doPost(),這些方法都有兩個參數,一個為代表請求的request和代表響應response。
service方法中的request的類型是ServletRequest,而doGet/doPost方法的request的類型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加強大,今天我們學習HttpServletRequest。

request的運行流程

image.png

通過抓包工具抓取Http請求

image.png

通過request獲得請求行

獲得客戶端的請求方式:

String getMethod()

獲得請求的資源:

String getRequestURI() 
StringBuffer getRequestURL() 
String getContextPath() ---web應用的名稱
String getQueryString() ---- get提交url地址后的參數字符串
username=zhangsan&password=123

注意:request獲得客戶機(客戶端)的一些信息
request.getRemoteAddr() --- 獲得訪問的客戶端IP地址

通過request獲得請求頭

long getDateHeader(String name)
String getHeader(String name)
Enumeration getHeaderNames()
Enumeration getHeaders(String name)
int getIntHeader(String name)

referer頭的作用:執行該此訪問的的來源
做防盜鏈

通過request獲得請求體

請求體中的內容是通過post提交的請求參數,格式是:

username=zhangsan&password=123&hobby=football&hobby=basketball
key ---------------------- value
username [zhangsan]
password [123]
hobby [football,basketball]

以上面參數為例,通過一下方法獲得請求參數:
String getParameter(String name)
String[] getParameterValues(String name)
Enumeration getParameterNames()
Map<String,String[]> getParameterMap()

注意:get請求方式的請求參數 上述的方法一樣可以獲得

  • 解決post提交方式的亂碼:
request.setCharacterEncoding("UTF-8");
  • 解決get提交的方式的亂碼:
parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");

request的其他功能

(1) request是一個域對象
request對象也是一個存儲數據的區域對象,所以也具有如下方法:

setAttribute(String name, Object o)
getAttribute(String name)
removeAttribute(String name)

注意:request域的作用范圍:一次請求中
(2) request完成請求轉發
獲得請求轉發器----path是轉發的地址

RequestDispatcher getRequestDispatcher(String path)

通過轉發器對象轉發

requestDispathcer.forward(ServletRequest request, ServletResponse response)

注意:ServletContext域與Request域的生命周期比較?
ServletContext:
創建:服務器啟動
銷毀:服務器關閉
域的作用范圍:整個web應用
request:
創建:訪問時創建request
銷毀:響應結束request銷毀
域的作用范圍:一次請求中

注意:轉發與重定向的區別?
1)重定向兩次請求,轉發一次請求
2)重定向地址欄的地址變化,轉發地址不變
3)重新定向可以訪問外部網站 轉發只能訪問內部資源
4)轉發的性能要優于重定向

注意:客戶端地址與服務器端地址的寫法?
客戶端地址:
是客戶端去訪問服務器的地址,服務器外部的地址,特點:客戶端地址訪問服務器地址時寫上web應用名稱
客戶端地址有哪些?
直接輸入的地址
重定向的地址
location.ref
服務器端地址:
服務器內部資源的跳轉的地址,特點:服務器訪問服務器內部資源不需要寫web應用的名稱
請求轉發是服務器內部地址

轉發和重定向.png
轉發.png

總結下:
request獲得行的內容:

    request.getMethod()
    request.getRequestURI()
    request.getRequestURL() 獲取資源路徑
    request.getContextPath() 獲取web應用名稱
    request.getRemoteAddr() 獲得客戶機信息(ip地址)

request獲得頭的內容

    request.getHeader(name) 獲取指定字段的頭內容

request獲得體(請求參數)

    String request.getParameter(name) 獲取請求參數
    Map<String,String[]> request.getParameterMap(); 獲取請求map形式的參數,可以同一個字段的多個值
    String[] request.getParameterValues(name); 獲取參數的值數組

注意:客戶端發送的參數 到服務器端都是字符串

獲得中文亂碼的解決:

post:request.setCharacterEncoding(“UTF-8”);
get:parameter = new String(parameter.getBytes(“iso8859-1”),”UTF-8”);

request轉發和域

    request.getRequestDispatcher(轉發的地址).forward(req,resp);
    request.setAttribute(name,value)
    request.getAttribute(name)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。