引言
在httpServlet類中,我們只需要調用doGet和doPost方法即可以實現對應的功能。對應這兩個方法,有兩個穿進去的參數對象,一個是response,一個是request。
通過對request和response的操作,實現對每次請求的處理。今天主要就是學習request的功能實現。
Request對請求行數據的操作
最重要的信息是:請求方式,請求url,請求協議
-
獲取請求方式 :GET
- String getMethod()
-
獲取虛擬目錄:即是項目部署的根目錄
- String getContextPath()
-
獲取Servlet路徑: 就是當前對象相對於根目錄的路徑
- String getServletPath()
-
獲取get方式請求參數:即get方式傳遞的信息參數
- String getQueryString()
-
獲取請求URI:就是當前對象的絕對路徑(加上了根目錄)
- String getRequestURI():
- StringBuffer getRequestURL()
注:URI和URL的區別:URL是URI的子集,URL強調是利用地址來唯一標識資源。
-
獲取協議及版本:HTTP/1.1
- String getProtocol()
-
獲取客戶機的IP地址:
- String getRemoteAddr()
Request對請求頭數據的操作
請求頭最重要信息:瀏覽器客戶端,訪問來源。
-
獲取請求頭數據
- 方法:
- (*)String getHeader(String name):通過請求頭的名稱獲取請求頭的值
- Enumeration getHeaderNames():獲取所有的請求頭名稱
其中最重要的兩個name是User-Agent和Refere,分佈是瀏覽器客戶端,訪問來源。通過String getHeader(String name):通過請求頭的名稱獲取對應的值。
- 方法:
Request對請求頭數據的操作
-
獲取請求體數據:
- 請求體:只有POST請求方式,纔有請求體,在請求體中封裝了POST請求的請求參數
- 步驟:
- 獲取流對象
- BufferedReader getReader():獲取字符輸入流,只能操作字符數據
- ServletInputStream getInputStream():獲取字節輸入流,可以操作所有類型數據
- 在文件上傳知識點後講解
- 再從流對象中拿數據
- 獲取流對象
通用方式
如果我們用上面的方法請求參數的話,可能需要根據post和get方法寫不同的代碼,java提供了通用的方式,使得我們只需要在get裏面寫這樣一行:
this.doPost(request,response);
-
String getParameter(String name):根據參數名稱獲取參數值
-
String[] getParameterValues(String name):根據參數名稱獲取參數值的數組
-
Enumeration getParameterNames():獲取所有請求的參數名稱
這裏的Enumeration應當視爲一種迭代器,使用迭代器的方式進行操作。如:
Enumeration<String> parameterNames = request.getParameterNames(); while (parameterNames.hasMoreElements()) { String s = parameterNames.nextElement(); String parameterValues = request.getParameter(s); request.setAttribute(s,parameterValues); System.out.println(s+":"+parameterValues); }
4. Map<String,String[]> getParameterMap():獲取所有參數的map集合
中文亂碼問題
get方式:換用tomcat8及以上。
post方式:在獲取參數前,設置request的編碼
request.setCharacterEncoding("utf-8");
請求轉發
定義:服務器內部的資源跳轉
用處:一個項目有多個servlet,可能需要多個servlet完成一個任務,數據可能再多個servlet多次跳轉。
相關函數:
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/demoq");
requestDispatcher.forward(request,response);
第一行是聲明一個轉發對象,該轉發對象有一個forward方法,可以繼續調用另外一個servlet,不過在瀏覽器的地址欄是不會改變的。