request (請求對象)


一、學習請求

學習如何獲取請求行, 請求頭,請求體。

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
      • 從收藏夾鏈接
      • 單擊主頁或自定義的地址
      • 在瀏覽器中直接輸地址

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方式
  1. 發送的參數不需要寫到數據庫當中使用get
  2. 發送的參數需要保存到數據庫當中使用post
  3. 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應用名稱 /資源名稱


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM