一、Request 對象和 Response 對象原理
request和response對象是由服務器創建的,供我們使用的。
request對象是來獲取請求消息,response對象是來設置響應消息。
原理示意圖:
二、Request 對象繼承體系結構
三、HttpServletRequest 接口
每次只要有請求進入 Tomcat 服務器,Tomcat 服務器就會把請求過來的 HTTP 協議信息解析好到 Request 對象中,每次請求都創建一個 Request 對象,請求完成后該對象就銷毀了。
然后傳遞到 service 方法(doGet 和 doPost)中供我們使用,通過 HttpServletRequest 對象,課獲取到所有請求信息。
三、HttpServletRequest 功能
1、獲取請求消息數據
(1)獲取請求行數據
常用方法:
(1)String getMethod() : 獲取請求方式
(2)String getContextPath(): 獲取虛擬目錄[重要]
(3)String getServletPath(): 獲取 servlet 路徑
(4)String getQueryString(): 獲取get方式請求參數
(5)String getRequestURI(): 獲取請求URI[重要]
(6)StringBuffer getRequestURL():獲取請求的URL
(7)String getProtocol(): 獲取協議及版本
(8)String getRemoteAddr(): 獲取客戶端的IP地址
(9)String getRemoteHost(): 獲取客戶端的主機名
注意:
URI:統一資源標識符;URL:統一資源定位符;兩者區別:URI 與 URL
Demo:
1 請求行數據 GET /servletDemo/demo1?name=zhangsan HTTP/1.1
2 String getMethod(): 獲取到 GET 3 String getContextPath(): 獲取到 /servletDemo 4 String getServletPath(): 獲取到 /demo1 5 String getQueryString(): 獲取到 name=zhangsan 6 String getRequestURI(): 獲取到 /servletDemo/demo1 7 StringBuffer getRequestURL():獲取到 http://localhost/servletDemo/demo1 8 String getProtocol(): 獲取到 HTTP/1.1 9 String getRemoteAddr(): 獲取到 請求機器的IP地址
(2)獲取請求頭數據
常用方法:
String getHeader(String name): 通過請求頭的名稱獲取請求頭的值[重要]
Enumeration<String> getHeaderNames():獲取所有的請求頭名稱
(3)獲取請求體數據
請求體:只有POST請求方式,才有請求體,在請求體重封裝了POST請求的請求參數
步驟:
① 獲取流對象
BufferedReader getReader(): 獲取字符輸入流,只能操作字符數據
ServletInputStream getInputStream():獲取字節輸入流,可以操作所有類型數據
② 從流對象中拿數據
Demo:
1 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 //1.獲取字符流
3 BufferedReader br = request.getReader(); 4
5 //2.讀取數據
6 String line = null; 7 while((line = br.readLine()) != null) { 8 System.out.println(line); // 請求參數username=zs&password=abc
9 } 10 }
2、獲取請求參數
獲取請求參數通用方式:無論是 get 方式還是 post 請求方式都可以使用下列方法來獲取請求參數
常用方法:
(1)String getParameter(String name): 根據參數名稱獲取參數值 username=zs&password=abc
(2)String[] getParameterValues(String name): 根據參數名稱獲取參數值的數組 hobby=java&hobby=python
(3)Enumeration<String> getParameterNames(): 獲取所有請求的參數名稱(相當於Iterator)
(4)Map<String,String[]> getParameterMap(): 獲取所有參數的map集合,可以根據鍵(參數名)獲取值(參數值)
注意:
① get方式:Tomcat 8 已經將 get 方式亂碼問題解決了
② post 方式:獲取中文會產生亂碼
解決方式:在獲取參數前,設置 request 的編碼與頁面編碼一致即可
request.setCharacterEncoding("utf-8");
3、作為域對象存取數據
域對象:一個有作用范圍的對象,可以在范圍內共享數據;
Request 域:代表一次請求的范圍,一般用於請求轉發的多個資源中共享數據;
常用方法:
void setAttribute(String name,Object obj):存儲數據到request中
Object getAttitude(String name):通過鍵獲取值
void removeAttribute(String name):通過鍵移除鍵值對
4、獲取請求轉發對象
請求的轉發:指的是服務器收到請求后,從一次資源跳轉到另一個資源的操作叫請求轉發。
注意:這是一種在服務器內部的資源跳轉方式,無法跳轉到外部的資源。
實現步驟:
① 通過 request 對象獲取請求轉發器對象;
RequestDispatcher getRequestDispatcher(String path): 獲取請求轉發器對象,path為轉發到的路徑
② 使用 RequestDispatcher 對象來進行轉發
forward(ServletRequest request, ServletResponse response):轉發方法
特點:
① 瀏覽器地址欄路徑不會發生變化;
② 只能轉發到自己工程的內部資源;
③ 轉發是一次請求,可以共享 Request 域中的數據;
④ 可以轉發到 WEB-INF 目錄下
注意:
① 從外部(瀏覽器)無法直接訪問 WEB-INF 目錄下的資源,但是可以通過請求轉發訪問到;
② 執行完跳轉的 servlet 的業務后,然后再回來繼續執行原來的 servlet 的業務。
原理圖:
5、獲取 ServletContext 對象
通過 getServletContext() 方法獲取 ServletContext 對象:
ServletContext servletContext = request.getServletContext();通過request 對象獲取 servletcontext 對象