<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Servlet的基本使用

      1、Servlet的基本介紹

      servlet(全稱:server applat)是運行在 Web 服務器或應用服務器上的程序,依賴于服務器才能運行。Servlet 類實際上就是一個接口,它沒有主方法,沒有main方法。

      servlet 可以由 tomcat 來執行,它定義了能被 tomcat 識別的規則。

       

      2、Servlet 的基本使用

      servlet 就是一個接口,通過一個類來 implements 實現這個接口,再在 web.xml 中配置該類,該類就可以依賴于服務器運行起來,無需主方法。

      一個簡單的類實現 servlet :需要導入javax.servlet等一些類。

      package cn.servletPackageTest;
      
      import javax.servlet.*;
      import java.io.IOException;
      
      public class ServletTest01 implements Servlet {
      
          @Override
          public void init(ServletConfig servletConfig) throws ServletException {
              
          }
      
          @Override
          public ServletConfig getServletConfig() {
              return null;
          }
      
          @Override
          public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
      
          }
      
          @Override
          public String getServletInfo() {
              return null;
          }
      
          @Override
          public void destroy() {
      
          }
      }

      在 java web 項目中的 web.xml 配置文件下配置該 servlet :

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
               version="4.0">
      
          <servlet>
              <servlet-name>test01</servlet-name>
              <servlet-class>cn.servletPackageTest.ServletTest01</servlet-class>
          </servlet>
          <servlet-mapping>
              <servlet-name>test01</servlet-name>
              <url-pattern>/test01</url-pattern>
          </servlet-mapping>
      </web-app>

      其中,servlet-class 是完整的類名,servlet-name 給你所配置的類名指定了一個名稱,下面的 servlet-mapping 里面的 servlet-name 跟上面的 servlet-name 相匹配,url-pattern 指定的是你今天訪問該 servlet 的路徑,配置完后你就可以通過 ' 資源路徑 + url-pattern ' 來訪問 servlet,比如:http://localhost:8080/test01 

       

      2.2、使用注解來配置(@WebServlet())

      在 servlet 3.0 及以上的版本當中,servlet 可以不用 web.xml 文件進行配置,而是使用注解配置:@WebServlet()。JDK6 及以上即可支持 servlet 3.0 及以上版本

      由此我們在創建一個 java ee 項目時就可以不用創建 web.xml 文件,直接在 servlet 上進行配置:

      @WebServlet(urlPatterns = "/demo01")
      //或者直接寫即可,無需寫urlPatterns,如下:
      //@WebServlet("/demo01")
      public class ServletDemo01 implements Servlet {
          
         .....
      
          @Override
          public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
              System.out.println("servlet 3.0 測試。。。");
          }
          
          .....  
      }

       

      @WebServlet() 里面的 urlpatterns 可以有多個寫法:

      //寫成數組,匹配多個路徑
      @WebServlet({"/demo01", "/demo02", "demo03"})
      
      //多層路徑
      @WebServlet({"/demo01/demo02"})
      
      //使用 * ,注意此時前面沒有 / 
      @WebServlet({"*.do")

       

      3、servlet 的生命周期(init()、service()、destroy())

      Servlet 生命周期可被定義為從創建直到毀滅的整個過程。以下是 Servlet 遵循的過程:

      • Servlet 通過調用 init () 方法進行初始化。
      • Servlet 調用 service() 方法來處理客戶端的請求。
      • Servlet 通過調用 destroy() 方法終止(結束)。

      3.1、init() 方法

      init() 方法只會被調用一次,默認情況下 init() 方法在 Servlet 創建時執行,而 Servlet 會在用戶第一次調用該 Servlet 時被創建,所以 init() 方法只會在第一次調用 servlet 時執行,在后續每次用戶請求調用時都不會被調用。

      你也可以通過 <load-on-startup> 標簽來指定 servlet 的 init() 方法在服務器第一次啟動時被加載執行。

      <servlet>
          <servlet-name>demo01</servlet-name>
          <servlet-class>cn.itcast.web.servlet.ServletDemo01</servlet-class>
          <!--指定servlet的創建時機
              值為負數時,在第一次被訪問時創建
              值為0或正數時,在服務器啟動時就創建-->
          <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
          <servlet-name>demo01</servlet-name>
          <url-pattern>/demo01</url-pattern>
      </servlet-mapping>

       

      3.2、sevice() 方法

      service() 方法是 servlet 用來處理客戶端請求的,它會被服務器自動調用,Servlet 容器(即 Web 服務器)調用 service() 方法來處理來自客戶端(瀏覽器)的請求,并把格式化的響應寫回給客戶端。service() 方法在每次客戶端請求 servlet 時都會被調用。

      每次服務器接收到一個 Servlet 請求時,服務器會產生一個新的線程并調用服務。service() 方法檢查 HTTP 請求類型(GET、POST、PUT、DELETE 等),并在適當的時候調用 doGet、doPost、doPut,doDelete 等方法。

       

      3.3、destroy() 方法

      destroy() 方法會在 servlet 正常關閉時執行,在執行完 destroy() 方法后,servlet 才會被關閉。只有在服務器被正常關閉時,destroy() 方法才會被執行。 

       

      4、servlet 是單例的

      servlet 的 init() 方法只會執行一次,說明一個 servlet 只會被創建一次,一個 servlet 在內存中只存在一個 servlet 實例對象。所以說,servlet 是單例的。

      由于 servlet 是單例的,所以在多個用戶同時訪問同一個 servlet 時,實際上訪問的都是同一個實例對象,此時就有可能會存在線程安全問題。比如說 servlet 有一個成員變量 num,當任何人都可以通過調用 servlet 的 service() 方法來獲取、輸出、改變 num,這就有可能會導致線程安全問題,數據錯亂。

      可以通過加鎖來解決線程安全問題,將方法改為同步方法,比如在張三處理完 service() 方法后,李四才能調用 service() 方法。但是這不適用于 servlet,因為對性能影響太大。

      解決方法:

      在一個對象當中,成員變量是被共享的,但是局部變量是不被共享的。所以我們建議盡量不要在 servlet 中定義成員變量,而是在 service() 方法內部定義局部變量。因為局部變量不被共享,所以彼此之間的函數調用不會產生影響。即使是在 servlet 中定義了成員變量,也不要在方法體內對其進行賦值。

       

      5、HttpServlet類

      HttpServlet 是一個抽象類,它繼承了 GenericSerevlet 類(該也是一個抽象類,它實現了 Serlvet 接口)。HttpServlet 是專門用來處理 http 請求的,通過繼承 HttpServlet 類可以獲取 http 請求數據和響應 http 請求。

      繼承 HttpServlet 類無需覆寫 service() 方法,只需覆寫 http 響應的方法,比如 doGet()、doPost()、doDelete() 等。HttpServelt 類的 service() 方法內部會判斷 servlet 所接收到的 http 請求方式,然后再來調用相應的 doGet、doPost等到方法。

      package sessiontest;
      
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      @WebServlet("/demo02")
      public class SessionTest01 extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              System.out.println("get請求");
          }
          @Override
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              String name = "myName";
              response.setCharacterEncoding("utf-8");
              request.setCharacterEncoding("utf-8");
              response.setContentType("application/json; charset=utf-8");
              //拼接json數據
              String jsonStr = "{\"name\":\""+name+"\",\"age\":\"20\"}";
              //將數據寫入流中
              response.getWriter().write(jsonStr);
          }
      }

       

      6、request 對象

      HttpServletRequest 接口繼承于 ServletRequest 接口,可以通過 HttpServletRequest 對象或者 ServletRequest 對象來獲取請求的信息。

       

      6.1、獲取請求行數據(方法名、URL、參數等等)

      請求報文的 “請求行” 只有三個內容,即:方法、請求URL、以及HTTP的版本。在 get 請求當中,我們可以通過 URL 來得到請求參數。

      request 對象可以通過一系列方法來獲取請求行的數據:

      • reqObj.getMethod():獲取請求的 HTTP 方法的名稱,該方法返回一個字符串,例如,GET、POST 或 PUT。
      • reqObj.getQueryString():獲取包含在URL后的請求參數,適用于GET請求
      • reqObj.getContextPath():獲取請求的虛擬目錄
      • reqObj.getRequestURI():獲取請求的URI

      示例:

      //假設請求為:
      http://localhost:8080/servlet_test01_war_exploded/demo03?username=wen&age=12
      
      @WebServlet("/demo03")
      public class ServletDemo03 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           //獲取請求方式,比如:GET
           String method = request.getMethod();
      
          //獲取包含在URL后的請求參數,適用于GET請求,比如獲取到的結果:username=wen&age=12
           String queryString = request.getQueryString();
      
           //獲取請求的虛擬目錄,比如:/servlet_test01_war_exploded
           String contextPath = request.getContextPath();
       
           //返回請求的URL:http://localhost:8080/servlet_test01_war_exploded/demo03
           StringBuffer requestURL = request.getRequestURL();
      
           //返回請求的URI:/servlet_test01_war_exploded/demo03
           String requestURI = request.getRequestURI();
        }
      }

       

      6.2、獲取請求頭數據(host、referer、user-agent等等)

      瀏覽器通過請求頭告訴服務器關于瀏覽器的一些信息,格式: 請求頭名稱:請求頭值。

      各重要請求頭信息如下:

       

      我們可以通過 HttpServletRequest 的 getHeaderNames() 方法獲取所有的請求頭名稱,該方法返回一個枚舉 Enumeration ,通過遍歷該枚舉可以獲取請求頭名稱,然后再通過 getHeader(nameStr) 方法可以根據請求頭名稱來獲取請求頭的值。

      //假設請求為:
      http://localhost:8080/servlet_test01_war_exploded/demo03?username=wen&age=12
      
      @WebServlet("/demo03")
      public class ServletDemo03 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          //獲取請求的所有請求頭的名稱,返回一個枚舉類型值
          Enumeration<String> headerNames = request.getHeaderNames();
         
          //遍歷枚舉類型的值
          while (headerNames.hasMoreElements()) {         
               String name = headerNames.nextElement();
               //根據請求頭名稱來獲取請求頭數據
               String value = request.getHeader(name);
               System.out.println(name + " --- " + value);
          }
      
          //比如直接根據請求頭名稱來獲取請求頭數據,名稱不區分大小寫
          String userAgent = request.getHeader(“user-agent”);
          System.out.println(userAgent );
      }

      上面獲取到的請求頭 -- 值可能為:

      host --- localhost:8080
      connection --- keep-alive
      cache-control --- max-age=0
      upgrade-insecure-requests --- 1
      user-agent --- Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
      accept --- text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
      sec-fetch-site --- none
      sec-fetch-mode --- navigate
      sec-fetch-user --- ?1
      sec-fetch-dest --- document
      accept-encoding --- gzip, deflate, br
      accept-language --- zh-CN,zh;q=0.9
      cookie --- JSESSIONID=3F30DF9F2CF0C9A253C5D5CAA8F94A10; Idea-2ee3f81a=20bc9b1a-fb07-4e10-b72e-be28df5a80fa

       

      6.3、獲取請求體數據(適用于post請求)

      只有 post 請求才有請求體,post 請求在請求體中封裝了請求參數。GET 請求沒有請求主體,它的請求參數放在請求 URL 中,比如:www.baidu.com?username=aaa。

      要想獲取請求體數據,應該先獲取流對象(字符流、字節流),然后再從流對象中拿數據。

      通過 BufferedReader brObj = reqObj.getReader() 可以獲取字符流對象,通過字符流對象獲取的只能是文本字符數據。

      通過 ServletInputStream inputObj = reqObj.getInputStream() 可以獲取字節流對象,通過字節流對象可以獲取所有類型的數據,比如圖像、文件等

       

      6.3.1、通過字符流獲取請求體數據(getReader() )

      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          //獲取字符流
          BufferedReader br = request.getReader();
      
          //讀取數據
          String line = null;
          while ((line = br.readLine()) != null) {
              System.out.print(line);    //獲取到的數據格式類似于:name=wen&age=12
          }
      }

      6.3.2、通過字節流獲取請求體數據

       

      6.4、通用的獲取請求參數的方法

      獲取請求參數通用方式,不論 get 還是 post 請求方式都可以使用下列方法來獲取請求參數

      • String str = reqObj.getParameter(name):根據參數名稱獲取參數值。
      • String[] strArr = reqObj.getParameterValues(name):根據參數名稱獲取參數值數組。適用于參數出現一次以上,例如復選框 fruit=apple&fruit=banana。
      • Enumeration<String> = reqObj.getParameterNames():獲取請求的所有參數名稱。該方法返回一個枚舉 Enumeration ,對該枚舉進行遍歷可以分別獲取參數名稱。Enumeration 可參考:https://www.runoob.com/java/java-enumeration-interface.html
      • Map<String, String[]> = reqObj.getParamterMap():獲取所有參數的map集合。對該map集合進行遍歷可以獲取參數鍵值對

      代碼示例:

      @WebServlet("/my02")
      public class MyServlet02 extends HttpServlet {
          @Override
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              //根據參數名稱獲取參數值
              String userName = request.getParameter("username");
              System.out.print(userName);
      
             //獲取請求的所有參數名稱
             Enumeration<String> parNames = request.getParameterNames();
             while (parNames.hasMoreElements()) {
                  String name = parNames.nextElement();
                  System.out.print("鍵:" + name);
                  String value = request.getParameter(name);
                  System.out.print("值:" + value);
             }
          }
      
          @Override
          protected void doGet(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
              doPost(request, resp);
          }
      }

       

      6.5、獲取請求中文參數亂碼問題

      服務器端在獲取到前端發過來的請求參數時,tomcat 默認會使用 ISO8859-1進行解碼操作,所以參數如果是中文的話就一定會有亂碼問題。

      (在 tomcat8 中 get 請求你可能不會出現中文亂碼問題,因為tomcat8內置幫我們解決了中文亂碼問題)

       

      6.5.1、解決get請求亂碼問題

      get 接口解決中文亂碼問題:

      String user=newString(request.getParameter("user").getBytes("ISO-8859-1"),"UTF-8");

      由此在獲取 user 參數時會使用 utf-8 編碼,就能解決亂碼問題。該方法同樣適用于 post 請求。

      注意,是使用 utf-8 還是其他編碼是由你頁面的編碼格式決定的,類似于下面的一行:

       

      或者是在瀏覽器發送前使用JS函數對要傳遞的中文進行兩次 encodeURIComponent(encodeURIComponent("中文參數")),服務端在接受時使用 java.net.Decoder.decode() 進行相應的解碼,便可以得到正確的中文參數。但是這種方式經過測試,如果將參數中的特殊符號,比如 | 等一同編碼兩次,會出現服務端接收不到參數的問題,原因是經過2次編碼之后的字符串與瀏覽器URL地址規則沖突。所以最好僅對參數中的中文部分進行編碼后再傳輸。

       

      6.5.2、解決post請求亂碼問題

      對于Post方式提交的數據,可以使用 request.setCharacterEncoding("utf-8") 來明確指定獲取請求參數時使用編碼即可。是使用 utf-8 還是其他編碼也是由你頁面的編碼格式決定的,

      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              System.out.println("post請求。。。");
      
              request.setCharacterEncoding("utf-8");
      
              String str = request.getParameter("name");   //獲取請求參數
              System.out.print(11 + str);
      }

      此種方式只對Post方式提交有效。這是因為 request.setCharacterEncoding("utf-8") 只設置請求實體的編碼,而GET提交的數據是存放在請求行中的[資源名?param1="張三"&param2=123],所以對GET請求的方式無效。

       

      7、請求轉發(getRequestDispatcher)

      請求轉發是一種在服務器內部的資源跳轉方式。我們可以使用 request 對象獲取轉發器對象 RequestDispatcher,然后通過該對象的 forward() 方法來進行轉發。

      如下,在訪問該接口的某個 get 請求時,又轉發至 test02 請求。

      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              req.getRequestDispatcher("/test02").forward(req, resp);  //請求轉發的路徑此時不需要寫上虛擬目錄,因為該資源是給服務器訪問的
      }

      請求轉發有以下特點:

      • 瀏覽器地址欄路徑不會發生變化
      • 只能轉發到當前服務器的內部資源
      • 雖然轉發了請求,但前端只有一次請求。即一次請求,所以我們可以使用 request 域對象來共享數據

       

      7.1、request域

      request 是表示一個請求,只要發出一個請求就會創建一個request,它的作用域僅在當前請求中有效。用處:常用于服務器間同一請求不同 servlet 之間的參數傳遞。

      通過請求轉發,我們可以通過下列一些方法,在一個請求不同 servlet 之間傳遞參數:

      request.setAttribute(String name, Object obj);   //存儲數據
      reuqest.getAttribute(String name);   //通過鍵獲取值
      request.removeAttribute(String name);  //通過鍵移除鍵值對

      示例:

      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              req.setAttribute("name", "wen");   //存儲數據,在轉發請求的下一個servlet就可以獲取該數據
              req.getRequestDispatcher("/test02").forward(req, resp);
      }

       

      8、response響應對象

      8.1、設置響應行

      • void setStatus(int sc):設置狀態碼

       

      8.1.1、重定向(sendRedirect)

      在 Java 中,可以通過設置狀態碼為 302,并且將 location 響應頭為 URL 地址,由此來設置重定向。

      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              resp.setStatus(302);
              resp.setHeader("location", "./test02.html");  //這里的location可以是絕對路徑或者相對路徑,瀏覽器將會根據該路徑來訪問資源。如果是相對路徑則是相對于瀏覽器當前訪問的資源的,即相對路徑是相對于重定向之前的資源。
      }

       

      Java 提供了一個簡單的方法來設置重定向:sendRedirect():

      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
             resp.sendRedirect("http://www.baidu.com");
      }

       

      重點向的特點:

      • 地址欄會自動發生變化,即瀏覽器會自動跳轉訪問重定向后的資源。(注意,當前端使用 ajax 請求后端數據時,后端返回重定向,前端是不會自動跳轉頁面的。如果需要跳轉,可以將響應頭的 location 數據作為 url 進行跳轉)
      • 重定向可以訪問其他服務器的資源
      • 重定向是兩次請求

       

      8.1.2、重定向和請求轉發中的路徑寫法

      只要不以/開頭,都是相對路徑。相對路徑是從當前資源出發,去尋找其他資源。只要路徑中以/開肉,就是全路徑。全路徑是從項目根目錄出發,去尋找其他資源。在開發中,寫文件路徑時,最好使用全路徑。

      重定向中的 / 表示服務器根目錄,而請求轉發中的/表示WebContent目錄即發布后的項目根目錄。所以重定向中如果要訪問本服務器資源,需要加上虛擬目錄名。因為轉發請求是在本服務器內的,所以并不需要加上虛擬目錄。

      比如:

      //假設需要訪問資源為:http://localhost:8080/javaweb_war/test.html
      
      //重定向:
      response.sendRedirect("/javaweb_war/test.html");  //正確寫法應該是用request.getContextPath()方法來動態獲取虛擬目錄
      
      //請求轉發:
      request.getRequestDispatcher("/test.html").forward(req, resp);

       

      8.2、設置響應頭

      • void setHeader(String name, String value):設置一個帶有給定的名稱和值的響應報頭。

       

      8.3、設置響應體

      先獲取輸出流(字符輸出流、字節輸出流),然后使用輸出流,將數據輸出到客戶端瀏覽器。

       

      8.3.1、字符輸出流(getWriter())

      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //獲取字符輸出流
              PrintWriter pw = resp.getWriter();
              //輸出數據
              pw.write("hello");
      }

      字符輸出亂碼問題:使用上面方法輸出中文時,在瀏覽器接收到的數據可能會出現亂碼。這是因為 tomcat 服務器默認使用 ISO8859-1 編碼,所以我們應該設置服務器響應數據的編碼:

      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //設置流的編碼(這一步可省略)
              resp.setCharacterEncoding("UTF-8");
      
              //告訴瀏覽器,服務器發送的消息體數據的編碼
              resp.setHeader("content-type", "text/html;charset=utf-8");  //或者可以直接使用 resp.setContentType("text/html;charset=utf-8"); 方法來設置
      
              resp.getWriter().write("你好啊 hello");
      }   

       

      8.3.2、字節輸出流(getOutputStream())

      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //獲取字節輸出流
              ServletOutputStream sos = resp.getOutputStream();
              //輸出數據
              sos.write("helloA".getBytes());
      }

      解決中文亂碼問題:

      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
             resp.setContentType("text/html;charset=utf-8");
        
              //獲取字節輸出流
              ServletOutputStream sos = resp.getOutputStream();
              //輸出數據
              sos.write("你好啊".getBytes("utf-8"));
      }

       

      posted @ 2020-03-25 15:39  wenxuehai  閱讀(722)  評論(0)    收藏  舉報
      //右下角添加目錄
      主站蜘蛛池模板: 欧美成人www免费全部网站| 美女爽到高潮嗷嗷嗷叫免费网站| 国产亚洲精品久久久久久大师| 国产熟女一区二区三区四区| 国产高清自产拍av在线| 免费国产高清在线精品一区| 亚洲av无码牛牛影视在线二区| 激情综合网激情激情五月天| 国产精品亚洲а∨天堂2021| 久久国产精品老女人| 一区二区三区四区自拍视频| 国产香蕉九九久久精品免费| 人妻中文字幕精品系列| 久久天堂无码av网站| 狠狠五月深爱婷婷网| 丰满熟妇人妻av无码区| 久青草国产综合视频在线| 国产精品视频不卡一区二区| 午夜福利影院不卡影院| 国产福利在线观看免费第一福利 | 日本中文字幕有码在线视频| 亚洲熟女乱综合一区二区| 国产视频一区二区在线看| 成熟熟女国产精品一区二区| 纯肉高h啪动漫| 日韩人妻无码一区二区三区 | 中国女人高潮hd| 日韩人妻无码一区二区三区久久 | 国产精品va在线观看无码不卡| 欧美老熟妇乱子伦牲交视频| 国产亚洲一区二区三区四区| 国产精品护士| 亚洲av片在线免费观看| 国产资源精品中文字幕| 无码伊人66久久大杳蕉网站谷歌| 色欲国产精品一区成人精品| 嘉定区| 蜜臀av黑人亚洲精品| 亚洲一区二区三区av激情| 久久香蕉欧美精品| 国产精品亚洲一区二区z|