一、學習請求
學習如何獲取請求行, 請求頭,請求體。
1. 獲取請求行
獲取請求方法
String method = request.getMethod();
System.out.println(method);
獲取請求資源
StringBuffer requestURL = request.getRequestURL();
String requestURI = request.getRequestURI();
System.out.println(requestURL);
System.out.println(requestURI);
獲取應用名稱
String contextPath = request.getContextPath();
System.out.println(contextPath);
獲取get查詢參數
String queryString = request.getQueryString();
System.out.println(queryString);
2. 獲取請求頭
獲取所有的請求頭名稱
// 獲取所有請求頭名稱
Enumeration<String> headerNames = request.getHeaderNames();
// 取出所有請求頭名稱 並打印
while(headerNames.hasMoreElements()) {
System.out.println(headerNames.nextElement());
}

獲取指定的頭信息
String header = request.getHeader("referer");
System.out.println(header);
打印所有的請求頭和請求頭內容
// 獲取所有請求頭名稱
Enumeration<String> headerNames = request.getHeaderNames();
// 取出所有請求頭名稱 並打印
while(headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String value = request.getHeader(name);
System.out.println(name +" : "+value);
}
referer
-
告訴服務器我是從哪個頁面鏈接過來的
-
注意事項
- 通過以下方式發送請求才會獲取referer
- 直接用<a href="">
- 用Submit或<input type="image">提交的表單(POST或GET)
- 用JAvaScript提交的表單(POST或GET)
- 通過以下方式不會有referer
- 從收藏夾鏈接
- 單擊主頁或自定義的地址
- 在瀏覽器中直接輸地址
- 通過以下方式發送請求才會獲取referer
3. 獲取請求體
1. 獲取一個值
String parameter = request.getParameter("名稱");
System.out.println(parameter);
2. 獲取多個值
返回的是一個數組
String[] parameterValues = request.getParameterValues("名稱");
System.out.println(Arrays.toString(parameterValues));
3. 獲取所有請求參數名稱
Enumeration<String> parameterNames = request.getParameterNames();
while(parameterNames.hasMoreElements()) {
System.out.println(parameterNames.nextElement());
}
4. 獲取所有請求參數
Map<String, String[]> parameterMap = request.getParameterMap();
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
System.out.println(entry.getKey());
System.out.println(Arrays.toString(entry.getValue()));
}
5. 把獲取的請求參數封裝成對象
需要將 commons-logging-1.1.1.jar 和 commons-beanutils-1.8.3.jar 導入到 lib 目錄下
request.setCharacterEncoding("UTF-8");
Map<String, String[]> parameterMap = request.getParameterMap();
User user = new User();
try {
BeanUtils.populate(user, parameterMap);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
System.out.println(user);
6. 解決中文亂碼問題
什么時候使用get方式與post方式
- 發送的參數不需要寫到數據庫當中使用get
- 發送的參數需要保存到數據庫當中使用post
- form一般提交數據的數據為post
造成亂碼的原因
發送請求時, 會對參數進行編碼,編碼使用的是ISO8859-1 不支持中文,所以亂碼
通用解決辦法:
- 獲取對應的參數
- 通過iso8859-1轉回二進制位,再以utf-8的形式轉成字符串
- 存在的問題,每一個參數都必須得要轉回二進制位,再轉為字符串
String parameter = request.getParameter("名稱");
System.out.println(parameter);
byte[] bytes = parameter.getBytes("ISO8859-1");
String string = new String(bytes,"UTF-8");
System.out.println(string);
request方法解決中文亂碼 只適用於post
request.setCharacterEncoding("UTF-8");
String parameter = request.getParameter("名稱");
System.out.println(parameter);
4. 請求轉發
重定向與請求轉發的區別
重定向
- 找servlet1,通過設置響應,告訴瀏覽器, 再讓瀏覽器發送請求到servlet2
- 發兩次請求
- 地址欄會發生變化
請求轉發
- 請求轉發只需要發送一次直接,找servlet1,在servlet1當中直接轉發給servlet2,不要再告訴瀏覽器
- 只發送一次請求
- 瀏覽器地址欄當中還是servlet1,不會發生變化
實現轉發
1. 通過請求對象獲取一個轉發器
RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2");
2. 通過轉發器進行轉發
調用轉發器的forward方法進行轉發
dispatcher.forward(request, response);
5. request域對象
- 在一次請求過程當中
- request是共享的。在一個servlet當中設置的參數,轉發到另外一個servlet,取出來的是同一個
- 生命周期
- 創建:發送一個請求時創建一個request對象
- 銷毀:請求結束,瀏覽器給出響應時,銷毀
- 作用范圍:一次請求當中
5. 客戶端地址與服務器端地址
客戶端地址
- 客戶端訪問服務器使用的地址
- 服務器外部地址
- 在寫的時候要寫上web應用的名稱 /應用名稱/資源
服務器地址
- 在服務內部當中使用的地址
- 不需要寫web應用名稱 /資源名稱
