JavaWEB開發09——Request

1.HttpServletRequest概述

在建立Servlet時會覆蓋service()方法,或doGet()/doPost(),這些方法都有兩個參數,一個爲表明請求的request和表明響應response。
service方法中的request的類型是ServletRequest,而doGet/doPost方法的request的類型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更增強大。

2.request的運行流程

3.經過抓包工具抓取Http請求

由於request表明請求,因此咱們能夠經過該對象分別得到Http請求的請求行,請求頭和請求體。

request

  • 請求行:請求資源-http協議版本:1.1/1.0
  • 請求頭html

    • 格式:鍵值對key:value
    • 請求頭是瀏覽器自動封裝的,這些是瀏覽器要告知服務器的一些信息
  • 請求體java

    • 請求參數(post提交的請求參數)
    • get提交:請求參數在url地址後面?
    • post提交:請求參數在http請求體重封裝

4.經過request得到請求行

得到客戶端的請求方式:String getMethod()

得到請求的資源:
String getRequestURI()
StringBuffer getRequestURL()
String getContextPath() ---web應用的名稱
String getQueryString() ---- get提交url地址後的參數字符串
username=zhangsan&password=123
request.getRemoteAddr() --- 得到訪問的客戶端IP地址web

//1.得到請求方式
String method = request.getMethod();
System.out.println("method:" + method);

//2.得到請求的資源相關的內容
String requestURI = request.getRequestURI();
System.out.println("requestURI:" + requestURI);

StringBuffer requestURL = request.getRequestURL();
System.out.println("requestURL:" + requestURL);

//3.得到web應用的名稱
String contextPath = request.getContextPath();
System.out.println("web應用:" + contextPath);

//4.地址後的參數的字符串
String queryString = request.getQueryString();
System.out.println("queryString:" + queryString);

//5.得到客戶端的IP地址
String remoteAddr = request.getRemoteAddr();
System.out.println("remoteAddr:" + remoteAddr);
<form action="/request/line" method="post">
    <input type="text" name="username"><br>
    <input type="password" name="password"><br>
    <input type="submit" name="提交"><br>
</form>

5.經過request得到請求頭

long getDateHeader(String name)
String getHeader(String name)
Enumeration getHeaderNames()
Enumeration getHeaders(String name)
int getIntHeader(String name)
//1.得到指定的頭
String header = request.getHeader("User-Agent");
System.out.println(header);

//2.得到全部頭的名字
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()){
    String headerName = headerNames.nextElement();
    String headerValue = request.getHeader(headerName);
    System.out.println(headerName + ":" + headerValue);
}

referer頭的做用:執行該此訪問的的來源, 作防盜鏈瀏覽器

//對該新聞的來源進行判斷
String header = request.getHeader("referer");
if (header!=null&&header.startsWith("http://localhost")) {
//是從我本身的網站跳轉過去的,能夠看新聞
    response.setContentType("text/html;charset=UTF-8");
    response.getWriter().write("英雄聯盟IG戰隊奪冠...");

}else{
    response.getWriter().write("請不要盜鏈!");
}

6.經過request得到請求體

請求體中的內容是經過post提交的請求參數,格式是:
username=zhangsan&password=123&hobby=football&hobby=basketball
key                        value
username                [zhangsan]
password                [123]
hobby                    [football,basketball]
以上面參數爲例,經過一下方法得到請求參數:
String getParameter(String name)
String(#getParameterValues(java.lang.String))(String name)
Enumeration getParameterNames()
Map<String,String[]> getParameterMap()
注意:get請求方式的請求參數 上述的方法同樣能夠得到
request.setCharacterEncoding("utf-8");
//1.得到單個表單值
String username = request.getParameter("username");
System.out.println(username);
String password = request.getParameter("password");
System.out.println(password);

//2.得到多個表單的值
String[] hobbys = request.getParameterValues("hobby");
for (String hobby:hobbys){
    System.out.println(hobby);
}

//3.得到全部的請求參數的名稱
Enumeration<String> parameterNames = request.getParameterNames();
while(parameterNames.hasMoreElements()){
    System.out.println(parameterNames.nextElement());
}
System.out.println("----------------------");

//4.得到全部的參數,封裝到一個Map<String,String[]>
Map<String, String[]> parameterMap = request.getParameterMap();
for (Map.Entry<String, String[]> entry:parameterMap.entrySet()){
    System.out.println(entry.getKey());
    for (String str:entry.getValue()){
        System.out.println(str);
    }
    System.out.println("----------------------");
}
post提交亂碼:request.setCharacterEncoding("UTF-8");
get提交亂碼:parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");

7.request的其餘功能

(1) request是一個域對象
request對象也是一個存儲數據的區域對象,因此也具備以下方法:
setAttribute(String name, Object o)
getAttribute(String name)
removeAttribute(String name)
注意:request域的做用範圍:一次請求中
(2) request完成請求轉發
得到請求轉發器----path是轉發的地址
RequestDispatcher getRequestDispatcher(String path)

經過轉發器對象轉發
requestDispathcer.forward(ServletRequest request, ServletResponse response)服務器

(3)注意
  • ServletContext域與Request域的生命週期比較?工具

    • Servlet Context:post

      • 建立:服務器啓動
      • 銷燬:服務器關閉
      • 域的做用範圍:整個web應用
    • request:性能

      • 建立:訪問時建立request
      • 銷燬:響應結束request銷燬
      • 域的做用範圍:一次請求中
  • 轉發與重定向的區別?網站

    • 1)重定向兩次請求,轉發一次請求
    • 2)重定向地址欄的地址變化,轉發地址不變
    • 3)從新定向能夠訪問外部網站 轉發只能訪問內部資源
    • 4)轉發的性能要優於重定向
  • 客戶端地址與服務器端地址的寫法?url

    • 客戶端地址:

      • 是客戶端去訪問服務器的地址,服務器外部的地址,
      • 特色:寫上web應用名稱
      • 直接輸入地址:
      • 重定向
    • 服務器端地址:

      • 服務器內部資源的跳轉的地址,
      • 特色:不須要寫web應用的名稱
      • 轉發

8. 總結

  • request得到行的內容

    • request.getMethod()
    • request.getRequestURI()
    • request.getRequestURL()
    • request.getContextPath()
    • request.getRemoteAddr()
  • request得到頭的內容

    • request.getHeader(name)
  • request得到體(請求參數)

    • String request.getParameter(name)
    • Map<String,String[]> request.getParameterMap();
    • String[] request.getParameterValues(name);
    • 注意:客戶端發送的參數 到服務器端都是字符串
  • 得到中文亂碼的解決:

    • post:request.setCharacterEncoding(「UTF-8」);
    • get:parameter = new String(parameter.getBytes(「iso8859-1」),」UTF-8」);
  • request轉發和域

    • request.getRequestDispatcher(轉發的地址).forward(req,resp);
    • request.setAttribute(name,value)
    • request.getAttribute(name)
相關文章
相關標籤/搜索