JSP內置對象——Request

一、原理
在這裏插入圖片描述 1. request和response對象是由服務器創建的。我們來使用它們 (我們不創建,僅僅使用,做IDEA的搬運工)
2. request對象是來獲取請求消息,response對象是來設置響應消息
2. request對象繼承體系結構:
ServletRequest – 接口
繼承 |
HttpServletRequest – 接口
實現 |
rg.apache.catalina.connector.RequestFacade 類(tomcat)

二、方法及功能

方法名 作用
isUserInRole 判斷認證後的用戶是否屬於某一成員組
getAttribute 獲取指定屬性的值,如該屬性值不存在返回Null
getAttributeNames 獲取所有屬性名的集合
getCookies 獲取所有Cookie對象
getCharacterEncoding 獲取請求的字符編碼方式
getContentLength 返回請求正文的長度,如不確定返回-1
getHeader 獲取指定名字報頭值
getHeaders 獲取指定名字報頭的所有值,一個枚舉
getHeaderNames 獲取所有報頭的名字,一個枚舉
getInputStream 返回請求輸入流,獲取請求中的數據
getMethod 獲取客戶端向服務器端傳送數據的方法
getParameter 獲取指定名字參數值
getParameterNames 獲取所有參數的名字,一個枚舉
getParameterValues 獲取指定名字參數的所有值
getProtocol 獲取客戶端向服務器端傳送數據的協議名稱
getQueryString 獲取以get方法向服務器傳送的查詢字符串
getRequestURI 獲取發出請求字符串的客戶端地址
getRemoteAddr 獲取客戶端的IP地址
getRemoteHost 獲取客戶端的名字
getSession 獲取和請求相關的會話
getServerName 獲取服務器的名字
getServerPath 獲取客戶端請求文件的路徑
getServerPort 獲取服務器的端口號
removeAttribute 刪除請求中的一個屬性
setAttribute 設置指定名字參數值

1.獲取請求行數據

  • GET /Http_Demo_war_exploded/demo1?name=zhangsan HTTP/1.1
  • 方法:
    ①. 獲取請求方式 :GET
    * String getMethod()
    ② 獲取虛擬目錄:/Http_Demo_war_exploded
    * String getContextPath()
    ③. 獲取Servlet路徑: /demo1
    * String getServletPath()
    ④. 獲取get方式請求參數:name=zhangsan
    * String getQueryString()
    ⑤ (*)獲取請求URI:/day14/demo1
    * String getRequestURI(): /Http_Demo_war_exploded/demo1
    * StringBuffer getRequestURL() :http://localhost/day14/demo1
    * URL:統一資源定位符 : http://localhost/day14/demo1 中華人民共和國
    * URI:統一資源標識符 : /day14/demo1 共和國
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   System.out.println("doGet........");


   String method = req.getMethod();   //獲取請求方式 :GET
   System.out.println(method);


   String contextPath = req.getContextPath();    //(*)獲取虛擬目錄:/Http_Demo:war exploded
   System.out.println(contextPath);


   String servletPath = req.getServletPath();    //獲取Servlet路徑: /demo1
   System.out.println(servletPath);


   String queryString = req.getQueryString();    //獲取get方式請求參數:name=zhangsan
   System.out.println(queryString);


   String requestURI = req.getRequestURI();      //(*)獲取請求URI:/Http_Demo_war_exploded/demo1
   System.out.println(requestURI);


   StringBuffer requestURL = req.getRequestURL(); //(*)獲取請求URI:http://localhost/Http_Demo_war_exploded/demo1
   System.out.println(requestURL);


   String protocol = req.getProtocol();         //獲取協議及版本:HTTP/1.1
   System.out.println(protocol);


   String remoteAddr = req.getRemoteAddr();      //獲取客戶機的IP地址:0:0:0:0:0:0:0:1
   System.out.println(remoteAddr);
}

2.獲取請求頭數據

  • 方法:
    * String getHeader(String name):通過請求頭的名稱獲取請求頭的值
    * Enumeration getHeaderNames():獲取所有的請求頭名稱
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   System.out.println("doGet........");
   Enumeration<String> headerNames = req.getHeaderNames();    //獲取所有的請求頭名稱
   while(headerNames.hasMoreElements()){
      String name = headerNames.nextElement();
      String value = req.getHeader(name);
      System.out.println(name+"---"+value);
   }
}

運行結果:
在這裏插入圖片描述獲取瀏覽器型號:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   System.out.println("doGet........");
   String agent = req.getHeader("user-agent");
   if(agent.contains("Firefox")){
      System.out.println("火狐來了");
   }else if(agent.contains("Chrome")){
      System.out.println("谷歌來了");
   }
}

假設我做了一個電影網站,我花了300W打廣告,某度,某浪,和某狐各100W,但是我想知道哪裏來的訪問量最多,這個時候我們就可以通過referer來統計各個網站來的訪客數量。
而作爲優酷,我爲了防止被盜取資源,所以要判斷你是從哪個網站來的?如果不是從優酷首頁進來的,我就不給你播放。
在這裏插入圖片描述
防盜鏈方法:防止其他網站盜取資源

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   System.out.println("doGet........");
   String referer = req.getHeader("referer");
   if(referer.contains("/demo4")){
      System.out.println("正常播放");
   }else{
      System.out.println("想看嗎?來優酷啊");
   }
}

3.獲取請求體數據

  • 請求體:只有POST請求方式,纔有請求體,在請求體中封裝了POST請求的請求參數
  • 步驟:
    ①. 獲取流對象
    * BufferedReader getReader():獲取字符輸入流,只能操作字符數據(高效)
    * ServletInputStream getInputStream():獲取字節輸入流,可以操作所有類型數據
    * 在文件上傳知識點後講解
    ②. 再從流對象中拿數據
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   System.out.println("doPost.......");
   BufferedReader reader = req.getReader();   //1.獲取字符流
   String line = null;
   while((line = reader.readLine()) != null){    //2.讀取數據
      System.out.println(line);
   }
}

4.其他功能
①. 獲取請求參數通用方式:不論get還是post請求方式都可以使用下列方法來獲取請求參數

  • String getParameter(String name):根據參數名稱獲取參數值 username=zs&- password=123
  • String[] getParameterValues(String name):根據參數名稱獲取參數值的數組 hobby=xx&hobby=game
  • Enumeration getParameterNames():獲取所有請求的參數名稱
  • Map<String,String[]> getParameterMap():獲取所有參數的map集合

②請求轉發:一種在服務器內部的資源跳轉方式
瀏覽器訪問AServlet,A發現沒有瀏覽器找的資源,但是知道B那裏有,所以轉發給B
在這裏插入圖片描述步驟:

  • 通過request對象獲取請求轉發器對象:RequestDispatcher getRequestDispatcher(String path)
  • 使用RequestDispatcher對象來進行轉發:forward(ServletRequest request, ServletResponse response)

特點:

  • 瀏覽器地址欄路徑不發生變化
  • 只能轉發到當前服務器內部資源中。
  • 轉發是一次請求
@WebServlet("/demo8")
public class http_demo8 extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

      System.out.println("Demo8被訪問了");

/*    RequestDispatcher requestDispatcher = req.getRequestDispatcher("/demo9");
      requestDispatcher.forward(req,resp);*/

        //轉發
      req.getRequestDispatcher("/demo9").forward(req,resp);

   }
}

③共享數據:A完成後需要告知B已經完成到哪了

  • 域對象:一個有作用範圍的對象,可以在範圍內共享數據
  • request域:代表一次請求的範圍,一般用於請求轉發的多個資源中共享數據
  • 方法:
  • void setAttribute(String name,Object obj):存儲數據
  • Object getAttitude(String name):通過鍵獲取值
  • void removeAttribute(String name):通過鍵移除鍵值對
@WebServlet("/demo8")
public class http_demo8 extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


      System.out.println("Demo8被訪問了");


      //存儲數據到request中
      req.setAttribute("msg","hello");

      req.getRequestDispatcher("/demo9").forward(req,resp);
   }
}
@WebServlet("/demo9")
public class http_demo9 extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //設置流的字符編碼
      System.out.println("Demo9被訪問了");


      //獲取demo8的傳送數據
      Object msg = req.getAttribute("msg");
      System.out.println(msg);
   }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章