JavaWeb學習——Request

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

2.request的運行流程
request的運行流程

3.通過抓包工具抓取Http請求
Http請求
  因爲request代表請求,所以我們可以通過該對象分別獲得Http請求的請求行,請求頭和請求體。

4.通過request獲得請求行
  獲得客戶端的請求方式:String getMethod()
  獲得請求的資源:

 String getRequestURI()   ----通常代指所有的地址,報錯本地磁盤路徑和網絡地址等
 StringBuffer getRequestURL()   ----通常代指網絡地址
 String getContextPath() ---web應用的名稱
 String getQueryString() ---- get提交url地址後的參數字符串 username=zhangsan&password=123

  注意:request獲得客戶機(客戶端)的一些信息
  request.getRemoteAddr() — 獲得訪問的客戶端IP地址

//各個方法對應輸出示例:
Method=GET
URI=/Test_Servlet/login
URL=http://localhost:8080/Test_Servlet/login
Path=/Test_Servlet
get的參數=username=&password=

5.通過request獲得請求頭

long getDateHeader(String name)
String getHeader(String name)
Enumeration getHeaderNames()
Enumeration getHeaders(String name)
int getIntHeader(String name)

例如通過getHeader()和getHeaderNames()方法來獲得請求頭信息

Enumeration<String> headerNames = request.getHeaderNames(); //Enumeration是枚舉類型
while (headerNames.hasMoreElements()) {
    String headerName = (String) headerNames.nextElement();
    String headerValue =  request.getHeader(headerName) ;
    System.out.println(headerName+":"+headerValue);
}

輸出結果:
host:localhost:8080
connection:keep-alive
upgrade-insecure-requests:1
user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8
referer:http://localhost:8080/Test_Servlet/
accept-encoding:gzip, deflate, br
accept-language:zh-CN,zh;q=0.9
cookie:JSESSIONID=2DB82255BD2B4EACCBC7C72B6CE88D33
 
 其中,referer頭的作用:執行該此訪問的的來源 , 用於做防盜鏈

6.通過request獲得請求體
  請求體中的內容是通過post提交的請求參數,格式是:
  username=zhangsan&password=123&hobby=football&hobby=basketball

  以上面參數爲例,通過一下方法獲得請求參數:

String getParameter(String name) 
String[] getParameterValues(String name)
Enumeration getParameterNames()
Map<String,String[]> getParameterMap()

request.getParameter(username) --------zhangsan
request.getParameterMap()---------
                            key ---------------------- value
                            username                [zhangsan]
                            password                [123]
                            hobby                   [football,basketball]

  注意:get請求方式的請求參數 上述的方法一樣可以獲得
  解決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域的作用範圍:一次請求中(因此當重定向之後request域對象裏面的數據會消失)
  
  2)request完成請求轉發
  請求轉發
  獲得請求轉發器—-path是轉發的地址

RequestDispatcher getRequestDispatcher(String path)

  通過轉發器對象轉發

requestDispathcer.forward(ServletRequest request, ServletResponse response)

  實例:

/**
*   Servlet名:TestForwardServlet1
*   @WebServlet("/forward")
*   監聽/forward請求,並且將該請求轉發到/forward2請求,轉發前先對request添加數據,此數據在該次請求中會一直存在,因此TestForwardServlet2中會收到
/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().append("Served at: ").append(request.getContextPath());

        //對域對象request添加數據
        request.setAttribute("name", "zhangchi");

        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/forward2");
        requestDispatcher.forward(request, response);
    }
/**
*   Servlet名:TestForwardServlet2
*   @WebServlet("/forward2")
*   收到TestForwardServlet1轉發的請求,並且同時接收到request發送的數據,使用getAttribute()方法將數據提出來
/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //取出域對象的數據值
        response.getWriter().append("Served at: ").append(request.getContextPath()).append("------name="+request.getAttribute("name"));
    }

  3)請求轉發和重定向
請求轉發和重定向
  注意:轉發與重定向的區別?
    1)重定向兩次請求,轉發一次請求
    2)重定向地址欄的地址變化,轉發地址不變
    3)重新定向可以訪問外部網站 轉發只能訪問內部資源
    4)轉發的性能要優於重定向

  4)ServletContext域與Request域的生命週期比較?
   ServletContext:
    創建:服務器啓動
    銷燬:服務器關閉
    域的作用範圍:整個web應用
   request:
    創建:訪問時創建request
    銷燬:響應結束request銷燬
    域的作用範圍:一次請求中

  5)客戶端地址與服務器端地址的寫法?
   客戶端地址:
    是客戶端去訪問服務器的地址,服務器外部的地址,特點:寫上web應用名稱
     直接輸入地址:
     重定向
   服務器端地址:
    服務器內部資源的跳轉的地址,特點:不需要寫web應用的名稱
     請求轉發

8.案例——註冊功能

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章