JAVA WEB 學習手記 (二) Request &Response


首先我們來分析一下整個過程:

  1. tomcat服務器會根據請求中的url中的資源路徑,創建對應的Servlet對象
  2. tomcat服務器,會場見request和response對象,request對象中封裝請求消息數據
  3. tomcat將request和response兩個對象傳遞給service方法,並且調用service方法
  4. 軟件工程師可以在通過service方法獲取請求數據格式,通過response對象設置響應消息數據
  5. 服務器再給瀏覽器做出響應之前,會從response對象中拿程序員設置的響應消息數據

request對象和response對象原理

  1. request和response對象都是由服務器創建的,我們使用
  2. request對象使用來獲取請求消息,response對象可以用來設置響應消息

request功能

基本功能(獲取請求消息數據):

  1. 獲取請求行數據:

    獲取請求方式:String getMetthod( )

    獲取虛擬目錄:String getContextPath()

    獲取Servlet路徑: String getServletPath()

    獲取get方式請求參數:String getQueryString()

    獲取請求URI: String getRequestURI( )

    ( URI: 統一資源標識符 URL:統一資源定位符)

    獲取請求URL: String getRequestURL( )

    獲取協議及版本號: String getProtocol( )

    獲取客戶機的IP地址: String getRemoteAddr( )

  2. 獲取請求頭數據:

    String getHeader(String name) 通過請求頭的名稱獲取請求頭的值

    Enumeration< String > getHeaderNames( ) 獲取所有的請求頭名稱

  3. 獲取請求體數據:

    只有POST請求方式,纔有請求體,在請求體中封裝了POST請求的請求參數

    步驟:

    • 獲取流對象

      BufferedReader getReader( ) 獲取字符輸入流,只能操作字符數據

      ServletInputStream getInputStream( ) 獲取字節輸入流,可以操作所有類型數據

    • 再從流對象中 得到數據

其他功能:

  1. 獲取請求參數通用方式(不論是get和post裏面都可以使用)

    String getParameter(String name): 根據參數名稱獲取參數值(一個鍵對應一個值)

    String[] getParameterValues(String name) 根據參數名稱獲取參數值的數組(一個鍵對應多個值)

    Enumeration< String > getParameterNames( ) 獲取所有請求的參數名稱

    Map<String, String[]> getParameterMap( ) 獲取所有參數的map集合

    中文亂碼問題:

    tomcat8 已經將 get方式的中文亂碼問題解決了

    post亂碼問題解決:在獲取參數前設置流的編碼爲utf-8

    代碼:request.serCharacterEncoding(“utf-8”);

  2. 請求轉發: 一種在服務器內部的資源跳轉方式

    1. 通過request對象獲取請求轉發器對象:RequestDispatcher getRequestDispatcher(String path)

    2. 使用RequestDispatcher對象來進行轉發:forward(ServletRequest request, ServletResponse response)

    特點:瀏覽器地址欄路徑不發生變化,只能轉發到當前服務器內部資源中,請求轉發過程中是一次請求。

  3. 共享數據

    域對象:一個有作用範圍的對象,可以在範圍內共享數據

    request域:代表依次請求的範圍,一般用於請求轉發的多個資源中共享數據

    方法:

     	1. void setAttribute(String name, Object obj)        存儲數據
     	2. Object getAttribute(String name )                       通過鍵獲取值
     	3. void removeAttribute(String name)                     通過鍵移除鍵值對
    
  4. 獲取ServletContext

Response功能

設置響應消息,能設置響應行響應頭響應體

  1. 設置響應行:

    格式:HTTP/1.1 200 ok

    設置狀態碼:setStatus(int sc)

  2. 設置響應頭:setHeader(String name, String value)

  3. 設置響應體

    使用流的方式

    1. 獲取輸出流

      字符輸出流:PrintWriter getWriter( )

      字節輸出流:ServletOutputStream getOutputStream( )

    2. 使用輸出流,將數據輸出到客戶端瀏覽器

重定向

重定向也是一種資源跳轉方式,狀態碼是:302,特點是:redirect

  1. 地址欄可以發生變化
  2. 重定向可以訪問其他站點(服務器)的資源
  3. 重定向是兩次請求,不能使用request對象來共享數據

與轉發對比:

  1. 轉發地址欄路徑不發生變化
  2. 轉發只能訪問當前服務器下的資源
  3. 轉發是一次請求,可以使用request對象來共享數據

步驟:

  1. 設置狀態碼爲302 response.setStatus()
  2. 設置響應頭location response.setHeader(“location”, “/addr”)

簡單重定向方法:response.sendRedirect()

路徑的寫法:

相對路徑:通過相對路徑不可以確定唯一資源
​ 不以/開頭,以 . 開頭
​ 規則:找到當前資源和目標資源之間的相對位置關係**./ 與 …/**

絕對路徑:通過絕對路徑可以確定唯一資源
​ 以/開頭的路徑
​ 規則:給客戶端瀏覽器用(請求從客戶端發出),加虛擬目錄。給服務器用,不需要加虛擬目錄

這裏就會用到之前提到的動態獲取虛擬目錄的方法
String contextPath = request.getContextPath()
推薦以後使用這種方法。

最後,面試中常常會問,forword和redirect的區別,所以該問題要掌握。


有什麼問題歡迎大家在下方評論或者私信或者聯繫郵箱[email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章