目錄
一、Request 對象請求原理
request 和 response 對象是由服務器創建的,由開發人員來使用;request 對象是來獲取消息請求,response 對象是來設置響應消息的
- Tomcat 服務器會根據請求 URL 中的資源路徑,創建對應的 oneStar 對象
- Tomcat 服務器會創建 request 和 response 對象,request 對象中封裝請求消息數據;response 對象中封裝響應消息數據
- Tomcat 將 request 和 response 兩個對象傳遞給 service 方法,並調用 service 方法
- 開發人員可以通過 request 對象獲取請求消息數據,通過 response 對象設置響應消息數據
- 服務器在給瀏覽器做出響應之前,會從 response 對象中拿開發人員設置的響應消息數據
二、Request 對象繼承體系結構
- ServletRequest:是一個接口
- HttpServletRequest:是一個接口
- org.apache.catalina.connector.RequestFacade:是 Tomcat 的一個類
RequestFacade 類實現了 HttpServletRequest 接口,HttpServletRequest 接口繼承了 ServletRequest 接口
三、Request 功能
1、獲取請求消息數據
【1】獲取請求行數據
GET /oneStar?name=qq HTTP/1.1
常用方法:
- Sring getMethod():獲取請求方法:GET
- String getContextPath():獲取虛擬目錄:/
- String getServletPath():獲取 servlet 路徑:/oneStar
- Sring getQuervletPath():獲取 get 方式請求參數:name=qq
- String getRequestURI():獲取請求URI:/oneStar
- StringBuffer getRequestURL():獲取請求URL:http://localhost/onestar/
- String getProtocol():獲取協議版本:HTTP/1.1
- String getRemoteAddr():獲取客戶機的IP地址
URL:統一資源定位符
URI:統一資源標識符(範圍更大)
//請求行數據
public static void requestHang(HttpServletRequest req){
//1.獲取請求方法:GET
String method = req.getMethod();
System.out.println(method);
//2.獲取虛擬目錄
String Cpath = req.getContextPath();
System.out.println(Cpath);
//3.獲取 Servlet 路徑
String Spath = req.getServletPath();
System.out.println(Spath);
//4.獲取get方式請求參數
String Qpath = req.getQueryString();
System.out.println(Qpath);
//5.獲取請求URI
String URI = req.getRequestURI();
System.out.println(URI);
//6.獲取請求URL
StringBuffer URL = req.getRequestURL();
System.out.println(URL);
//7.獲取協議版本
String pro = req.getProtocol();
System.out.println(pro);
//8.獲取客戶機IP地址
String add = req.getRemoteAddr();
System.out.println(add);
}
【2】獲取請求頭數據
常用方法:
- String getHeader(String nem):通過請求頭的名稱獲取請求頭的值
- Enumeration<String> getHeaderNames():獲取所有的請求頭名稱
//請求頭數據
public static void requestHead(HttpServletRequest req){
//獲取所有請求頭名稱
Enumeration<String> headernames = req.getHeaderNames();
//遍歷
while (headernames.hasMoreElements()){
String name = headernames.nextElement();
//根據名稱來獲取請求頭的值
String value = req.getHeader(name);
System.out.println(name + "--" + value);
}
}
【3】獲取請求體數據
請求體只有POST請求方式纔有的,在請求體中封裝了POST請求參數
步驟:
- 獲取流對象
- BuferedReader getReader():獲取字符輸入流
- ServletInputStream getInputStream():獲取字節輸入流
- 從流對象中獲取數據
- readLine():逐行獲取
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//請求消息體數據
//1.獲取流對象
BufferedReader br = request.getReader();
//2.讀取數據
String line = null;
while ((line = br.readLine()) != null){
System.out.println(line);
}
}
2、其他常用獲取功能
【1】獲取請求參數通用方法(get和post都能用)
- String getParameter(String name):根據參數名稱獲取參數值
- String[ ] getParameterValues(String name):根據參數名稱獲取參數值的數組(多用於複選框)
- Enumeration<String> getParameterNames():獲取所有請求的參數名稱
- Map<String,String[]> getParameterMap():獲取所有參數的map集合
public class regServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//request.setCharacterEncoding("UTF-8");
//post獲取請求參數
//1.根據參數名稱獲取參數值
String name = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("post:" +name + password);
//2.根據參數名稱獲取參數值的數組
String[] hobbys = request.getParameterValues("hobby");
for(String hobby : hobbys){
System.out.println(hobby);
}
//3.獲取所有請求的參數名稱
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()){
String name1 = parameterNames.nextElement();
String value = request.getParameter(name1);
System.out.println(name1 + "--" + value);
System.out.println("*********");
}
//4.獲取所有參數的map集合
Map<String,String[]> parameterMap = request.getParameterMap();
Set<String> keySets = parameterMap.keySet();
for(String key : keySets){
String[] values = parameterMap.get(key);
for(String value : values){
System.out.println(value);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//get獲取請求參數
this.doPost(request,response);
}
}
【2】請求轉發
請求轉發即一種在服務器內部的資源跳轉方式
- 步驟
- 通過request對象獲取請求轉發器對象:RequestDispatcher getRequestDispatcher(String path)
- 使用 RequestDispatcher 對象來進行轉發:forward(ServletRequest request,ServletResponse response)
- 特點
- 瀏覽器地址欄路徑不發生變化
- 只能轉發到當前服務器內部資源中
- 轉發是一次請求
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("訪問regSrevlet");
request.getRequestDispatcher("/oneStar").forward(request,response);
}
【3】共享數據
域對象:首先要了解一下域對象,域對象即一個有作用範圍的對象,可以在範圍內共享數據
request 域:代表一次請求的範圍,一般用於請求轉發的多個資源中共享數據,而請求轉發就是一次請求,因此可以通過request 域來實現共享數據
常用方法:
- void setAttribute(String name,Object obj):存儲數據
- Object getAttitude(String name):通過鍵獲取值
- void removeAttribute(String name):通過鍵移除鍵值對
//存儲數據到request域中
request.setAttribute("sag","Hello");
request.getRequestDispatcher("/oneStar").forward(request,response);
//從域中獲取數據
Object mesage = req.getAttribute("sag");
System.out.println(mesage);
【4】獲取 ServletContext 對象
- ServletContext getServletContext();
ServletContext context = request.getServletContext();
System.out.println(context);