首先我們來分析一下整個過程:
- tomcat服務器會根據請求中的url中的資源路徑,創建對應的Servlet對象
- tomcat服務器,會場見request和response對象,request對象中封裝請求消息數據
- tomcat將request和response兩個對象傳遞給service方法,並且調用service方法
- 軟件工程師可以在通過service方法獲取請求數據格式,通過response對象設置響應消息數據
- 服務器再給瀏覽器做出響應之前,會從response對象中拿程序員設置的響應消息數據
request對象和response對象原理
- request和response對象都是由服務器創建的,我們使用
- request對象使用來獲取請求消息,response對象可以用來設置響應消息
request功能
基本功能(獲取請求消息數據):
-
獲取請求行數據:
獲取請求方式:String getMetthod( )
獲取虛擬目錄:String getContextPath()
獲取Servlet路徑: String getServletPath()
獲取get方式請求參數:String getQueryString()
獲取請求URI: String getRequestURI( )
( URI: 統一資源標識符 URL:統一資源定位符)
獲取請求URL: String getRequestURL( )
獲取協議及版本號: String getProtocol( )
獲取客戶機的IP地址: String getRemoteAddr( )
-
獲取請求頭數據:
String getHeader(String name) 通過請求頭的名稱獲取請求頭的值
Enumeration< String > getHeaderNames( ) 獲取所有的請求頭名稱
-
獲取請求體數據:
只有POST請求方式,纔有請求體,在請求體中封裝了POST請求的請求參數
步驟:
-
獲取流對象
BufferedReader getReader( ) 獲取字符輸入流,只能操作字符數據
ServletInputStream getInputStream( ) 獲取字節輸入流,可以操作所有類型數據
-
再從流對象中 得到數據
-
其他功能:
-
獲取請求參數通用方式(不論是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”);
-
請求轉發: 一種在服務器內部的資源跳轉方式
-
通過request對象獲取請求轉發器對象:RequestDispatcher getRequestDispatcher(String path)
-
使用RequestDispatcher對象來進行轉發:forward(ServletRequest request, ServletResponse response)
特點:瀏覽器地址欄路徑不發生變化,只能轉發到當前服務器內部資源中,請求轉發過程中是一次請求。
-
-
共享數據
域對象:一個有作用範圍的對象,可以在範圍內共享數據
request域:代表依次請求的範圍,一般用於請求轉發的多個資源中共享數據
方法:
1. void setAttribute(String name, Object obj) 存儲數據 2. Object getAttribute(String name ) 通過鍵獲取值 3. void removeAttribute(String name) 通過鍵移除鍵值對
-
獲取ServletContext
Response功能
設置響應消息,能設置響應行,響應頭,響應體
-
設置響應行:
格式:HTTP/1.1 200 ok
設置狀態碼:setStatus(int sc)
-
設置響應頭:setHeader(String name, String value)
-
設置響應體
使用流的方式
-
獲取輸出流
字符輸出流:PrintWriter getWriter( )
字節輸出流:ServletOutputStream getOutputStream( )
-
使用輸出流,將數據輸出到客戶端瀏覽器
-
重定向
重定向也是一種資源跳轉方式,狀態碼是:302,特點是:redirect
- 地址欄可以發生變化
- 重定向可以訪問其他站點(服務器)的資源
- 重定向是兩次請求,不能使用request對象來共享數據
與轉發對比:
- 轉發地址欄路徑不發生變化
- 轉發只能訪問當前服務器下的資源
- 轉發是一次請求,可以使用request對象來共享數據
步驟:
- 設置狀態碼爲302 response.setStatus()
- 設置響應頭location response.setHeader(“location”, “/addr”)
簡單重定向方法:response.sendRedirect()
路徑的寫法:
相對路徑:通過相對路徑不可以確定唯一資源
不以/開頭,以 . 開頭
規則:找到當前資源和目標資源之間的相對位置關係**./ 與 …/**
絕對路徑:通過絕對路徑可以確定唯一資源
以/開頭的路徑
規則:給客戶端瀏覽器用(請求從客戶端發出),加虛擬目錄。給服務器用,不需要加虛擬目錄
這裏就會用到之前提到的動態獲取虛擬目錄的方法。
String contextPath = request.getContextPath()
推薦以後使用這種方法。
最後,面試中常常會問,forword和redirect的區別,所以該問題要掌握。
有什麼問題歡迎大家在下方評論或者私信或者聯繫郵箱[email protected]