日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

后端学习 - JavaWeb

發布時間:2023/12/4 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 后端学习 - JavaWeb 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

技術體系

文章目錄

  • 一 HTML
    • 1 網頁的組成部分
    • 2 HTML 概述
    • 3 HTML 標簽
    • 4 常用標簽
    • 5 表單與表單的提交
  • 二 CSS
    • 1 語法格式
    • 2 使用方法
  • 三 JavaScript
    • 1 概述
    • 2 與 HTML 結合的兩種方式
    • 3 變量類型及特殊值
    • 4 關系、邏輯運算
    • 5 數組
    • 6 函數
    • 7 事件
    • 8 DOM (Document Object Model)
    • 9 DOM實例:驗證用戶名是否有效
  • 四 Tomcat
  • 五 Servlet
    • 1 舉例:向數據庫中添加表單信息
    • 2 Servlet 的繼承關系
    • 3 Servlet 的生命周期
    • 4 HTTP 協議與 Session會話跟蹤
    • 5 服務器端內部轉發、重定向
    • 6 Servlet 保存作用域
    • 7 Servlet 的 init 方法與初始化參數設置
    • 8 ServletContext
  • 六 Thymeleaf
    • 1 配置過程
    • 2 Servlet 優化 - 合并同類方法
    • 3 Servlet 優化 - dispatchedServlet
  • 七 MVC
    • 1 概念
    • 2 降低各層間的耦合 - IOC 與 DI
    • 3 IOC 與 DI 的實現過程
  • 八 Filter
    • 1 概述
    • 2 使用 Filter 實現事務的原子性
  • 九 Listener
  • 十 總結

一 HTML

1 網頁的組成部分

  • 內容(結構):在頁面中可以看到的數據。我們稱之為內容。一般使用 HTML 技術展示。
  • 表現:內容在頁面上的展示形式,比如布局,顏色,大小等等。一般使用CSS 技術實現。
  • 行為:頁面中元素與輸入設備交互的響應。一般使用 JavaScript 技術實現。

2 HTML 概述

  • Hyper Text Markup Language (超文本標記語言),網頁文件本身是一種文本文件,通過在文本文件中添加標記符,可以告訴瀏覽器如何顯示其中的內容。
  • HTML 文件不需要編譯,直接由瀏覽器進行解析執行。
  • 書寫規范:大致由 head 和 body 兩部分組成。
<html lang="en"> <!-- 頁面開始 --><head> <!-- HEAD --><meta charset="UTF-8"><title> 我的標題 </title></head><body> <!-- BODY -->hello!</body></html> <!-- 頁面結束 -->

3 HTML 標簽

  • 標簽名對大小寫不敏感。
  • 雙標簽的格式:<標簽名> 封裝的數據 </標簽名>
    單標簽的格式:<標簽名/>
  • 標簽擁有自己的屬性,分為基本屬性和事件屬性。屬性必須有值,屬性值必須加引號。
  • 雙標簽必須正確關閉,不能交叉嵌套。
  • 想顯示“轉義字符”的問題(比如想打印出左尖括號<),用實體名稱解決(對應的實體名稱是&lt;)。
<body onclick="alert('警告')"> <!-- 帶有事件屬性 -->點擊body部分會出現警告 <hr/> <!-- 單標簽 --><font color="blue"> 藍色的字體 </font> <!-- 雙標簽,帶有基本屬性 --></body>

4 常用標簽

重點是超鏈接、表格、表單

<!--標題標簽,最大是h1,最小是h6,對齊可以選擇 left/ center/ right--> <h1 align="center"> 標題 </h1><!--字體--> <font color="red" size="7"> 字體 </font><!--超鏈接,可選參數 target (_self 在當前頁面跳轉,_blank 在新頁面跳轉...)--> <a href="www.baidu.com" target="_blank"> 超鏈接 </a><!--無序列表(有序將ul改為ol)--> <ul><li> item1 </li><li> item2 </li> </ul><!--圖片img標簽是圖片標簽,用來顯示圖片src屬性可以設置圖片的路徑width屬性設置圖片的寬度height屬性設置圖片的高度border屬性設置圖片邊框大小alt屬性設置當指定路徑找不到圖片時,用來代替顯示的文本內容絕對路徑的正確格式是: http://ip:port/工程名/資源路徑 --> <img src="./imgs/1.jpg" width="100" height="200"/><!--表格table 標簽是表格標簽border 設置表格標簽width 設置表格寬度height 設置表格高度align 設置表格相對于頁面的對齊方式cellspacing 設置單元格間距tr 是行標簽th 是表頭標簽td 是單元格標簽align 設置單元格文本對齊方式b 是加粗標簽如果要實現跨行、跨列,改變 td 的 colspan、rowspan 屬性 --> <table align="center" border="1" width="300" height="300" cellspacing="0"><tr><th>1.1</th><th>1.2</th><th>1.3</th></tr><tr><td>2.1</td><td>2.2</td><td>2.3</td></tr><tr><td>3.1</td><td>3.2</td><td>3.3</td></tr> </table><!--iframe標簽,在原頁面之上顯示一個小的頁面其中的 name 屬性可以作為超鏈接的 target 屬性,點擊超鏈接后將在 iframe 中顯示--> <iframe src="1.html" width="500" height="400" name="abc"></iframe> <a href="2.html" target="abc"> 超鏈接 </a>

5 表單與表單的提交

表單類型單獨列出,可以使用 table 實現對齊。

<!-- 要順利提交表單,需要為所有項加上 value 或者 name 屬性 --><form action="http://localhost:8080" method="post">姓名:<input type="text" value="默認姓名"/></br>密碼:<input type="password" value="default"/></br><!-- name 屬性用于分組,同一組的選項互斥-->性別:<input type="radio" name="sex" checked="checked"/><input type="radio" name="sex"/></br>愛好:<input type="checkbox" checked="checked"/>跑步 <input type="checkbox"/>跳繩</br>國籍:<select><option>--請選擇--</option><option selected="selected">CHN</option><option>USA</option></select><br/>簡介:<textarea rows="10" cols="20">默認簡介</textarea><br/>附件:<input type="file"/></br><input type="reset" value="重置"><input type="submit" value="提交"></form>

  • form 標簽的 action 屬性設置提交的服務器地址,method 屬性設置提交的方式 GET(默認) 或 POST
  • GET 請求的特點是:
  • 瀏覽器地址欄中的地址是:服務器地址 + ? + 請求參數(請求參數的格式是 name=value&name=value)
  • 不安全
  • 有數據長度的限制
  • POST 請求的特點:
  • 瀏覽器地址欄中只有服務器地址(action的屬性值)
  • 相對于GET請求要安全
  • 理論上沒有數據長度的限制
  • 表單提交的時候,數據沒有發送給服務器的三種情況:
  • 表單項沒有name屬性值
  • 單選 radio 、復選 checkbox、下拉列表中的 option 標簽 都需要添加value屬性,以便發送給服務器
  • 表單項不在提交的form標簽中

二 CSS

1 語法格式

/* 標簽名選擇器,樣式綁定標簽 */ label_name { property1: val1;property2: val2; }/* id選擇器,樣式綁定具體的id,id是人為設定的,每個實例不相同*/ #id {property1: val1;property2: val2; }/* class選擇器,樣式綁定標簽分配的class,可以多個實例綁定一個class */ .class class_name {property1: val1;property2: val2; }/* 組合選擇器,選擇器間是并的關系 */ 選擇器1, 選擇器2 ... {property1: val1;property2: val2; }

2 使用方法

<head> <!-- HEAD --><meta charset="UTF-8"><title> my_title </title>/* 導入已經寫好的CSS文件(推薦) */<link rel="stylesheet" type="text/CSS" href="mycss.css">/* 或者把CSS寫到此處的 style 標簽中 */<style type="text/css">label_name { property1: val1;property2: val2;}</style></head>

三 JavaScript

1 概述

  • JS 運行在客戶端,需要運行瀏覽器來解析執行 JavaScript 代碼,和 Java 并無直接關系。
  • JS 是弱類型的語言,Java 是強類型的語言。強弱的差別在于定義變量后,變量的數據類型是否可變。
  • 特點是 交互性(信息的動態交互)、安全性(不允許直接訪問本地硬盤)、跨平臺性(只要是可以解釋 JS 的瀏覽器都可以執行,和平臺無關)。

2 與 HTML 結合的兩種方式

  • 在 HTML 文件中的 head 部分,用 script 標簽寫入;
  • 在 script 標簽中導入 JS 文件。

上述兩種方法不能寫在一個標簽里。

<head><meta charset="UTF-8"><title>Title</title><script type="text/javascript">alert('JS嵌入方式1');</script><script src="myjs.js"></script> <!-- 文件內容: alert('JS嵌入方式2'); --> </head>

3 變量類型及特殊值

關鍵字 對應類型
number數值類型
string字符串類型
object對象類型
bool布爾類型
function函數類型



特殊值 含義
undefined未定義,所有 JS 變量未賦于初始值的時候,默認值都是 undefined
null
NaN非數字非數值

4 關系、邏輯運算

  • ==比較兩個變量的值是否相等(比如,“123”==123是成立的), ===比較兩個變量的類型和值是否相等;
  • JS 中所有變量都可以作為布爾值使用,0、null、undefined、空串 都認為是 false;
  • ||(或) &&(與) 具有短路特性,返回值為第一個導致結果的變量。

5 數組

  • 數組不會出現越界的問題。在超過原來長度的位置賦值時,會進行自動擴容(讀操作不會擴容)。
// 數組定義 var arr = [1, "abc"];// 數組遍歷 for (var i = 0; i < arr.length; i++) {alert(arr[i]) }// 自動擴容,下標2、3、4的元素均為undefined arr[5] = 2;

6 函數

  • JS 不允許函數重載。一個函數名只能對應一個具體實現。
function noParam() {alert('無參函數調用');}noParam();function withParam(a, b) {alert("有參函數調用" + a + b);}withParam(1, 2);function withReturn(a, b) {alert("有參有返回值函數調用");return a + b;}alert(withReturn(10, 5));
  • 隱形參數 arguments 將所有實參組織為一個數組,通過下標可以訪問所有參數。
function testInvisibleParams() {var res = 0;for (var i = 0; i < arguments.length; i++) {res += arguments[i];}return res;}alert(testInvisibleParams(1, 2, 3, 4));

7 事件

  • 常用事件
事件操作
onload(加載完成)常用做頁面 JS 代碼初始化操作
onclick(單擊)按鈕的點擊響應操作
onblur(失去焦點)輸入框失去焦點后驗證其輸入內容是否合法
onchange(內容發生改變)下拉列表和輸入框內容發生改變后操作
onsubmit(表單提交)表單提交前,驗證所有表單項是否合法
  • 事件需要進行注冊才能使用:
    • 靜態注冊:通過 HTML 標簽的事件屬性,直接賦于事件響應后的代碼;
    • 動態注冊:先通過 JS 代碼得到標簽的 dom 對象,然后再通過 dom 對象.事件名 = function(){} 這種形式賦于事件響應后的代碼。


  • onload 事件
<html lang="en"> <head><meta charset="UTF-8"><title>Title</title><script type="text/javascript">function onloadEvent() {alert("靜態注冊onload事件,需要在body標簽下添加 οnlοad='onloadEvent' ")}window.onload = function () {alert("動態注冊onload事件")}</script> </head> <body></body> </html>
  • onclick 事件
<html lang="en"> <head><meta charset="UTF-8"><title>Title</title><script type="text/javascript">function onclickEvent() {alert("靜態注冊onclick事件")}window.onload = function () {<!-- document對象表示整個頁面,通過id獲取button對象 -->var btn2_obj = document.getElementById("btn2");<!-- 綁定行為 -->btn2_obj.onclick = function () {alert("動態注冊onclick事件")}}</script> </head> <body><button onclick="onclickEvent()">靜態注冊的按鈕</button><button id="btn2">動態注冊的按鈕</button> </body> </html>
  • onblur 事件(同上)
<html lang="en"> <head><meta charset="UTF-8"><title>Title</title><script type="text/javascript">function onblurEvent() {console.log("靜態失去焦點");}window.onload = function () {var pw = document.getElementById("p");pw.onblur = function () {console.log("動態失去焦點");}}</script> </head> <body>賬戶:<input type="text" onblur="onblurEvent()"/>密碼:<input type="password" id="p"/> </body> </html>
  • onchange 事件,綁定的是 select 而非 option 標簽
<html lang="en"> <head><meta charset="UTF-8"><title>Title</title><script type="text/javascript">function onchangeEvent() {alert("靜態注冊onchange");}window.onload = function () {var select2 = document.getElementById("s");select2.onchange = function () {alert("動態注冊onchange")}}</script> </head> <body>選擇1:<select onchange="onchangeEvent()"><option>選項11</option><option>選項12</option></select>選擇2:<select id="s"><option>選項21</option><option>選項22</option></select> </body> </html>
  • onsubmit 事件,綁定的是表格而非按鈕,返回 false 則不會提交表單
<html lang="en"> <head><meta charset="UTF-8"><title>Title</title><script type="text/javascript">function onsubmitEvent() {alert("靜態注冊onsubmit");<!--如果發現不合法,返回false,阻止提交-->return false;}window.onload = function () {var form2 = document.getElementById("f");form2.onsubmit = function () {alert("動態注冊onsubmit");<!--如果發現不合法,返回false,阻止提交-->return false;}}</script> </head> <body><form action="http://localhost:8080" onsubmit="return onsubmitEvent()"> <!--靜態注冊 return 不能少--><input type="submit" value="靜態注冊提交"></form><form action="http://localhost:8080" id="f"><input type="submit" value="動態注冊提交"></form> </body> </html>

8 DOM (Document Object Model)

  • 簡單來說,將整個 HTML 文件視為一個 document 對象,并把其中所有的標簽對象化,形成了樹型結構。
  • document 實例提供查詢方法,使用優先級從高到低:getElementByID(返回一個實例),getElementByName(可以數組形式返回多個實例),getElementByTagName(以數組形式返回指定標簽的對象)。注意:頁面加載完之后才能進行查詢!不僅限于放在 onload 事件中。
  • document 實例提供創建方法:createElement
<html lang="en"> <head><meta charset="UTF-8"><title>Title</title><script type="text/javascript">window.onload = function () {var new_div = document.createElement("div");new_div.innerHTML = "你好";document.body.appendChild(new_div); <!-- 在加載完后執行 -->}</script> </head> <body></body> </html>

9 DOM實例:驗證用戶名是否有效

限制用戶名由數字和字母組成,長度區間為 [5, 12]

<html lang="en"> <head><meta charset="UTF-8"><title>Title</title><script>window.onload = function () {var tip = document.getElementById("tip");var btn = document.getElementById("btn");var text = document.getElementById("text");btn.onclick = function () {var input = text.value;var pattern = /^\w{5,12}$/;if (pattern.test(input)) { <!-- 匹配正則表達式 -->tip.innerHTML = "通過"; <!-- innerHTML 返回的是開始和結束標簽之間的值,可讀寫-->} else {tip.innerHTML = "不通過";}}}</script> </head> <body> <input type="text" id="text"> <span id="tip" style="color: brown"></span> <button id="btn">檢查</button> </body> </html>

四 Tomcat

  • 簡單來說,Tomcat 就是一個運行JAVA的網絡服務器。
  • HTML 文件通過本地訪問,使用的協議是 file,執行的操作是直接獲取并解析;
  • IDEA 2021.3.1 創建JavaWeb工程的方法
  • 通過WEB服務器訪問,使用的協議是 http,經過了客戶端請求與服務器響應的過程,執行操作如下圖:

五 Servlet

1 舉例:向數據庫中添加表單信息

  • 客戶端請求表單頁面 add.html(表單指定 action=“add”(可以自定義) method=“post”),服務器返回。
  • 客戶端填寫表單,使用 HttpRequest 實例提交給服務器。
  • 服務器的具有一個類 ,繼承自 HttpServlet 類,其中的 doPost() 方法定義了 post 請求的處理與返回過程,調用 DAO 將表單信息寫入數據庫。
  • //@WebServlet("/add") public class AddServlet extends HttpServlet {@Overridepublic void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// method=post 設置編碼方式防止亂碼,且在獲取參數的操作之前(放在首行)request.setCharacterEncoding("UTF-8");String name = request.getParameter("name");System.out.println(name);// 調用DAO// ...} }
  • 如何指定 action=“add” 與自定義類 AddServlet 的綁定?
    一種方式是使用 web.xml 配置(另一種是通過在 AddServlet 注釋 @WebServlet("/add") ):
  • <!--指定servlet信息--><servlet><servlet-name>AddServlet</servlet-name><servlet-class>com.atguigu.servlets.AddServlet</servlet-class></servlet><!--設定servlet映射--><servlet-mapping><servlet-name>AddServlet</servlet-name><url-pattern>/add</url-pattern> <!--action="add"--></servlet-mapping>

    2 Servlet 的繼承關系

    • 繼承關系: HttpServlet 具體實現類 -> GenericServlet 抽象類 -> Servlet 接口
    • Servlet中的核心方法:service()
    • 當收到請求,service 方法會自動響應(tomcat 容器調用),在 HttpServlet 中分析請求的方式:到底是get、post、head 等等,然后再決定調用具體的 doXX 的方法。
    • 在 HttpServlet 中,doXX 方法默認都是405(報錯信息是找不到方法實現),除非子類去實現對應的 doXX 方法,否則默認會報405錯誤。

    3 Servlet 的生命周期

    • 三個重要的方法:init、service、destory
    • 默認情況下, 第一次接收請求時,Servlet 會進行實例化(調用構造方法)、初始化(調用init())、然后服務(調用service());從第二次請求開始,每一次都是服務(調用service());當容器關閉時,其中的所有的 Servlet 實例會被銷毀(調用destroy())。
    • 如果需要提高響應速度,應該設置 Servlet 的初始化時機,在第一次請求之前執行實例化和初始化。具體做法是,在 web.xml 中的 <servlet> 中添加 <load-on-startup> 標簽。
    • Servlet 是單例的、線程不安全的。單例是指,對于一個確定的 Servlet 類型,所有的請求都是同一個 Servlet 實例去響應;由于 Servlet 線程不安全,所以盡量避免在其中設置成員變量,如果設置盡量不要讀寫。

    4 HTTP 協議與 Session會話跟蹤

    • HTTP 協議是無狀態的,需要通過會話跟蹤技術保存用戶的歷史信息。
    • HTTP 請求與響應報文的格式略。
    • 常用的API:
      request.getSession() -> 獲取當前的會話,沒有則創建一個新的會話
      request.getSession(true) -> 效果和不帶參數相同
      request.getSession(false) -> 獲取當前會話,沒有則返回null,不會創建新的
      session.getId() -> 獲取sessionID
      session.isNew() -> 判斷當前session是否是新的
      session.getMaxInactiveInterval() -> session的非激活間隔時長,默認1800秒
      session.setMaxInactiveInterval()
      session.invalidate() -> 強制讓會話立即失效

    5 服務器端內部轉發、重定向

    • 服務器端內部轉發對客戶端是不可見的,執行方法:request.getRequestDispatcher("...").forward(request, response)

    • 重定向對客戶端可見,并且會顯示地更改 URL,執行方法:response.sendRedirect("...")

    6 Servlet 保存作用域

  • request:一次請求響應內有效。
  • session:一次會話內有效。
  • application:一次應用內有效,除非關閉服務器。
  • public class Demo extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// request 級別req.setAttribute("property1", 1);// session 級別HttpSession session = req.getSession();session.setAttribute("property2", 2);// application 級別ServletContext servletContext = req.getServletContext();servletContext.setAttribute("property3", 3);} }

    7 Servlet 的 init 方法與初始化參數設置

    • 兩種 init 方法:
      如果需要進行一些初始化操作,重寫無參的 init 方法
    // Servlet中的初始化方法有兩個:init() , init(config)// 其中帶參數的方法代碼如下:public void init(ServletConfig config) throws ServletException {this.config = config ;init(); // *調用無參的init*}// 另外一個無參的init方法如下:public void init() throws ServletException{}
    • 初始化參數設置
    1. 通過 web.xml 配置<servlet><servlet-name>Demo01Servlet</servlet-name><servlet-class>com.atguigu.servlet.Demo01Servlet</servlet-class><!--設置參數--><init-param><param-name>hello</param-name><param-value>world</param-value></init-param></servlet>2. 通過注解 @Webservlet(urlPatterns = {"/demo01"} ,initParams = {@WebInitParam(name="hello",value="world")})
    • 讀取初始化參數:
    ServletConfig config = getServletConfig(); // 獲取config對象 config.getInitParameter("hello"); // 讀取初始化的值

    8 ServletContext

    • ServletContext是一個全局的儲存信息的空間,服務器開始就存在,服務器關閉才釋放(application級別)
    • 類似 session,可以想象成一個 map
    • 多個Servlet可以通過ServletContext對象來實現數據間的共享,如果是涉及到不同用戶共享數據,而這些數據量不大,同時又不希望寫入數據庫中,我們就可以考慮使用 ServletContext 實現
    • 初始化 ServletContext 時,不能寫在具體的某個 servlet 標簽中,因為它是全局的
    <!--寫在servlet之外--> <context-param><param-name>name</param-name><param-value>gavin</param-value> </context-param><servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.gavin.servlet.MyServlet</servlet-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </servlet>

    六 Thymeleaf

    1 配置過程

  • 添加依賴, maven 中添加:
  • <dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf</artifactId><version>3.0.14.RELEASE</version></dependency>
  • 新建一個類 ViewBaseServlet 繼承 HttpServlet
  • public class ViewBaseServlet extends HttpServlet {private TemplateEngine templateEngine;@Overridepublic void init() throws ServletException {// 1.獲取ServletContext對象ServletContext servletContext = this.getServletContext();// 2.創建Thymeleaf解析器對象ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext);// 3.給解析器對象設置參數// ①HTML是默認模式,明確設置是為了代碼更容易理解templateResolver.setTemplateMode(TemplateMode.HTML);// ②設置前綴String viewPrefix = servletContext.getInitParameter("view-prefix");templateResolver.setPrefix(viewPrefix);// ③設置后綴String viewSuffix = servletContext.getInitParameter("view-suffix");templateResolver.setSuffix(viewSuffix);// ④設置緩存過期時間(毫秒)templateResolver.setCacheTTLMs(60000L);// ⑤設置是否緩存templateResolver.setCacheable(true);// ⑥設置服務器端編碼方式templateResolver.setCharacterEncoding("utf-8");// 4.創建模板引擎對象templateEngine = new TemplateEngine();// 5.給模板引擎對象設置模板解析器templateEngine.setTemplateResolver(templateResolver);}protected void processTemplate(String templateName, HttpServletRequest req, HttpServletResponse resp) throws IOException {// 1.設置響應體內容類型和字符集resp.setContentType("text/html;charset=UTF-8");// 2.創建WebContext對象WebContext webContext = new WebContext(req, resp, getServletContext());// 3.處理模板數據templateEngine.process(templateName, webContext, resp.getWriter());} }
  • 在 web.xml 配置前綴和后綴,根據邏輯視圖名稱得到物理視圖名稱。
    邏輯視圖名稱 : index
    物理視圖名稱 : view-prefix + 邏輯視圖名稱 + view-suffix
    真實的視圖名稱: / index .html
  • <context-param><param-name>view-prefix</param-name><param-value>/</param-value></context-param><context-param><param-name>view-suffix</param-name><param-value>.html</param-value></context-param>
  • 創建自定義的 Servlet 類,繼承 ViewBaseServlet,調用super.processTemplate("index",request,response); 定位到指定 HTML 頁面。
  • 對于跳轉到的 HTML 頁面,需要顯示查詢內容。設置 <html lang="en" xmlns:th="http://www.thymeleaf.org">,使用 thymeleaf 的標簽完成操作。

  • 2 Servlet 優化 - 合并同類方法

    • 之前的一個 Servlet 只提供一種方法,此處的改進是將同類的多種方法合并到一個 Servlet 中
    • 使用反射代替 switch-case
    @WebServlet("/fruit.do") public class FruitServlet extends ViewBaseServlet {private final FruitDAO fruitDAO = new FruitDAOImpl();/*** 設置一個Fruit 的 meta servlet*/@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {req.setCharacterEncoding("UTF-8");String operation = (String) req.getAttribute("operation");// 簡化了switch-caseMethod[] methods = this.getClass().getDeclaredMethods();for (Method method: methods) {method.setAccessible(true);if (operation.equals(method.getName())) {try {method.invoke(this, req, resp);return ;} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}}throw new IOException("輸入操作錯誤"); // 對應default}private void insertFruit(HttpServletRequest request, HttpServletResponse response) {// ...}private void selectFruit(HttpServletRequest request, HttpServletResponse response) {// ...} }

    3 Servlet 優化 - dispatchedServlet

    • 相當于一個 meta 的 Servlet,稱為 DispatchedServlet,繼承自 ViewBaseServlet。合并所有種類的 Servlet,并將原來的 Servlet 轉為 Controller,剝奪其注釋 @WebServlet
    • 在 src 目錄下創建 applicationContext.xml,利用 bean 標簽,為參數名和 Controller 建立映射
    • DispatchedServlet 的 init 方法根據 xml 配置 Map<String,Object> beanMap
    <?xml version="1.0" encoding="utf-8"?><beans><!-- 這個bean標簽的作用是 將來servletpath中涉及的名字對應的是fruit,那么就要FruitController這個類來處理 --><bean id="fruit" class="com.atguigu.fruit.controllers.FruitController"/> </beans>
    • 使用時,向 DispatchedServlet 傳遞參數,由其 service 方法負責解析,并根據 beanMap 調用指定的 Controller,具體步驟:
      • 獲取參數:獲取即將要調用的方法的參數簽名信息
      • 執行方法:Object returnObj = method.invoke(controllerBean , parameterValues);
      • 視圖處理:根據返回值調用重定向等 String returnStr = (String)returnObj; if(returnStr.startWith("redirect:")){ .... } else if.....

    七 MVC

    1 概念

    • MVC(Model–View–Controller)模式是軟件工程中的一種軟件架構模式,它把軟件系統分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller)。
    • Controller 作為 Model 和 View 部分的“膠水”,本身不適合包含太多的邏輯。

    2 降低各層間的耦合 - IOC 與 DI

    • DI(Dependency Injection,依賴注入)是 IOC(Inversion of Control,控制反轉)最常用的方法。
    • IOC 是一種設計思想,核心是,將設計好的對象交給容器控制,而不是傳統的在對象內部直接控制。 把創建和查找依賴對象的控制權交給了容器,由容器進行注入組合對象,所以對象與對象之間是松散的耦合。
    • Spring 所倡導的開發方式就是如此,所有的類都會在 spring 容器中登記,告訴 spring 你是個什么東西,你需要什么東西,然后 spring 會在系統運行到適當的時候,把你要的東西主動給你,同時也把你交給其他需要你的東西。所有的類的創建、銷毀都由 spring 容器來控制,也就是說控制對象生存周期的不再是引用它的對象,而是 spring。對于某個具體的對象而言,以前是它控制其他對象,現在是所有對象都被 spring 控制,所以這叫控制反轉。
    • IOC 容器實際上就是 map(key,value),里面存的是各種對象(在 xml 里配置的 bean 節點、service、controller、component),在項目啟動的時候會讀取配置文件里面的 bean 節點,根據全限定類名使用反射創建對象并放到 map 里。


    通過 IOC 容器,上述過程轉為:

    • IoC的一個重點是在系統運行中,動態的向某個對象提供它所需要的其他對象。這一點是通過 DI 來實現的。在類中需要使用到的對象,全部通過反射從第三方容器注入而不是自己創建。
    • 比如對象A需要操作數據庫,以前我們總是要在A中自己編寫代碼來獲得一個 Connection 對象,有了 spring 只需要告訴 spring ,A中需要一個 Connection,至于這個 Connection 怎么構造,何時構造,A不需要知道。在系統運行時,spring 會在適當的時候制造一個 Connection,然后像打針一樣,注射到A當中,這樣就完成了對各個對象之間關系的控制。A需要依賴 Connection 才能正常運行,而這個 Connection 是由 spring 注入到A中的,依賴注入的名字就這么來的。

    3 IOC 與 DI 的實現過程

  • 對于 Servlet - Controller - Service - DAO 的結構,首先將用到的類,及其依賴關系,注冊到 applicationContext.xml 中。
  • <?xml version="1.0" encoding="utf-8"?><beans><!-- FruitDAO不依賴于其它組件 --><bean id="fruitDAO" class="com.atguigu.fruit.dao.impl.FruitDAOImpl"/><!-- FruitService依賴于FruitDAO(FruitService類包含FruitDAO屬性) --><bean id="fruitService" class="com.atguigu.fruit.service.impl.FruitServiceImpl"><!-- property標簽用來表示屬性;name表示屬性名;ref表示引用其他bean的id值--><property name="fruitDAO" ref="fruitDAO"/></bean><!-- FruitController依賴于FruitService(FruitController類包含FruitService屬性) --><bean id="fruit" class="com.atguigu.fruit.controllers.FruitController"><property name="fruitService" ref="fruitService"/></bean><!-- FruitServlet中具有 包含所有對象的 map,以BeanFactory作為 map 的包裝 --> </beans>
  • 使用 BeanFactory 讀取 xml 配置,填充 map,并設置依賴關系(比如 A 以 B 作為屬性,執行此過程前將屬性值設置為 null,在此過程將 A 的對應屬性設置為 B 的實例,完成依賴注入)
  • BeanFactory 實現:

    public class ClassPathXmlApplicationContext implements BeanFactory {private Map<String,Object> beanMap = new HashMap<>();public ClassPathXmlApplicationContext(){try {InputStream inputStream = getClass().getClassLoader().getResourceAsStream("applicationContext.xml");//1.創建DocumentBuilderFactoryDocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();//2.創建DocumentBuilder對象DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder() ;//3.創建Document對象Document document = documentBuilder.parse(inputStream);//4.獲取所有的bean節點NodeList beanNodeList = document.getElementsByTagName("bean");for(int i = 0 ; i<beanNodeList.getLength() ; i++){Node beanNode = beanNodeList.item(i);if(beanNode.getNodeType() == Node.ELEMENT_NODE){Element beanElement = (Element)beanNode ;String beanId = beanElement.getAttribute("id");String className = beanElement.getAttribute("class");Class beanClass = Class.forName(className);//創建bean實例Object beanObj = beanClass.newInstance() ;//將bean實例對象保存到map容器中beanMap.put(beanId , beanObj) ;//到目前為止,此處需要注意的是,bean和bean之間的依賴關系還沒有設置}}//5.組裝bean之間的依賴關系for(int i = 0 ; i<beanNodeList.getLength() ; i++){Node beanNode = beanNodeList.item(i);if(beanNode.getNodeType() == Node.ELEMENT_NODE) {Element beanElement = (Element) beanNode;String beanId = beanElement.getAttribute("id");NodeList beanChildNodeList = beanElement.getChildNodes();for (int j = 0; j < beanChildNodeList.getLength() ; j++) {Node beanChildNode = beanChildNodeList.item(j);if(beanChildNode.getNodeType()==Node.ELEMENT_NODE && "property".equals(beanChildNode.getNodeName())){Element propertyElement = (Element) beanChildNode;String propertyName = propertyElement.getAttribute("name");String propertyRef = propertyElement.getAttribute("ref");//1) 找到propertyRef對應的實例Object refObj = beanMap.get(propertyRef);//2) 將refObj設置到當前bean對應的實例的property屬性上去Object beanObj = beanMap.get(beanId);Class beanClazz = beanObj.getClass();Field propertyField = beanClazz.getDeclaredField(propertyName);propertyField.setAccessible(true);propertyField.set(beanObj,refObj);}}}}} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();}}@Overridepublic Object getBean(String id) {return beanMap.get(id);} }
  • 重寫 Servlet 的 無參 init 方法和 service 方法。其中 init 方法負責獲取 BeanMap,service 方法負責解析方法調用,執行方法調用,處理返回值。
  • @WebServlet("*.do") public class DispatcherServlet extends ViewBaseServlet{private BeanFactory beanFactory ;public DispatcherServlet(){}public void init() throws ServletException {super.init();beanFactory = new ClassPathXmlApplicationContext();}@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//設置編碼request.setCharacterEncoding("UTF-8");//假設url是: http://localhost:8080/pro15/hello.do//那么servletPath是: /hello.do// 我的思路是:// 第1步: /hello.do -> hello 或者 /fruit.do -> fruit// 第2步: hello -> HelloController 或者 fruit -> FruitControllerString servletPath = request.getServletPath();servletPath = servletPath.substring(1);int lastDotIndex = servletPath.lastIndexOf(".do") ;servletPath = servletPath.substring(0,lastDotIndex);Object controllerBeanObj = beanFactory.getBean(servletPath);String operate = request.getParameter("operate");if(StringUtil.isEmpty(operate)){operate = "index" ;}try {Method[] methods = controllerBeanObj.getClass().getDeclaredMethods();for(Method method : methods){if(operate.equals(method.getName())){//1.統一獲取請求參數//1-1.獲取當前方法的參數,返回參數數組Parameter[] parameters = method.getParameters();//1-2.parameterValues 用來承載參數的值Object[] parameterValues = new Object[parameters.length];for (int i = 0; i < parameters.length; i++) {Parameter parameter = parameters[i];String parameterName = parameter.getName() ;//如果參數名是request,response,session 那么就不是通過請求中獲取參數的方式了if("request".equals(parameterName)){parameterValues[i] = request ;}else if("response".equals(parameterName)){parameterValues[i] = response ;}else if("session".equals(parameterName)){parameterValues[i] = request.getSession() ;}else{//從請求中獲取參數值String parameterValue = request.getParameter(parameterName);String typeName = parameter.getType().getName();Object parameterObj = parameterValue ;if(parameterObj!=null) {if ("java.lang.Integer".equals(typeName)) {parameterObj = Integer.parseInt(parameterValue);}}parameterValues[i] = parameterObj ;}}//2.controller組件中的方法調用method.setAccessible(true);Object returnObj = method.invoke(controllerBeanObj,parameterValues);//3.視圖處理String methodReturnStr = (String)returnObj ;if(methodReturnStr.startsWith("redirect:")){ //比如: redirect:fruit.doString redirectStr = methodReturnStr.substring("redirect:".length());response.sendRedirect(redirectStr);}else{super.processTemplate(methodReturnStr,request,response); // 比如: "edit"}}}} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}} }

    八 Filter

    1 概述

    • 繼承自 Filter 類,具有 init, doFilter, destory 方法
    • 可以使用注解的形式 @WebFilter("fruit.do"),也可以在 web.xml 中配置
    • 使用注解形式,當具有多個 Filter 時,按照類名的字典序組織過濾順序
    @WebFilter("*.do") public class Demo01Filter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("before");//放行filterChain.doFilter(servletRequest,servletResponse);System.out.println("after");}@Overridepublic void destroy() {} }

    2 使用 Filter 實現事務的原子性

    • 利用 Filter 的機制,在放行之前撤銷 conn 的自動提交,在返回時手動執行提交,并在捕獲到異常時執行回滾
    • 要求事務執行的過程中,遇到的異常要層層向外拋出,直到被 Filter 捕獲,而不是就地解決
    • 將 conn 綁定 ThreadLocal 實例,再進一步保存到 ThreadLocalMap 中,保證了多個 DAO 共用同一個數據庫連接,不會因為連接的關閉而自動提交,破壞事務的原子性

    九 Listener

    • 監聽某個組件的某種行為,當這種行為被監聽到時,調用指定的方法
    • 可以用于完成初始化的創建,以及結束時的銷毀操作
    • 一個應用實例:IOC 容器的 beanMap,當監聽到 ServletContext 對象創建時,在監聽器內進行初始化,而非在 Servlet 的 init 方法中完成
    // 監聽上下文啟動,在上下文啟動的時候去創建IOC容器,然后將其保存到 application 作用域 // 后面DispatchedServlet 再從 application 作用域中去獲取IOC容器@WebListener public class ContextLoaderListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {//1.獲取ServletContext對象ServletContext application = servletContextEvent.getServletContext();//2.獲取上下文的初始化參數(bean類型以及依賴關系)String path = application.getInitParameter("contextConfigLocation");//3.創建IOC容器BeanFactory beanFactory = new ClassPathXmlApplicationContext(path);//4.將IOC容器保存到application作用域application.setAttribute("beanFactory", beanFactory);}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {// ...} }

    十 總結

    總結

    以上是生活随笔為你收集整理的后端学习 - JavaWeb的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    国产精品 亚洲精品 | 久久综合射 | 久久久久激情电影 | 人人看黄色 | 99精品久久精品一区二区 | 日韩免费三区 | 日韩视频免费观看高清完整版在线 | 亚州黄色一级 | 精品久久99 | 久久久999精品视频 国产美女免费观看 | 国产精品成人一区二区 | 国产精彩视频一区二区 | 日本在线视频网址 | 日韩国产精品一区 | 看黄色.com | 欧美做受69| 国语麻豆 | 黄色日批网站 | 91pony九色丨交换 | 麻豆av电影 | 中文在线8新资源库 | www久久九| 97人人模人人爽人人少妇 | 91大神精品视频在线观看 | 91高清完整版在线观看 | 天天操人人要 | 人人插人人插 | av在线免费播放网站 | 国产一区久久久 | 在线看一区 | 欧美在线观看禁18 | 国产日韩欧美在线 | 欧美日韩在线看 | 在线观看的av | 91欧美在线 | 欧美精品国产综合久久 | 黄色毛片观看 | 六月婷婷久香在线视频 | 婷婷色网视频在线播放 | 国产成人精品aaa | v片在线看 | 五月天最新网址 | 国产麻豆成人传媒免费观看 | 欧美日韩aa | a级国产乱理论片在线观看 伊人宗合网 | 国产精品久久久久久爽爽爽 | 亚洲在线视频观看 | 国产精品日韩精品 | 亚洲午夜精品一区二区三区电影院 | 国产美女主播精品一区二区三区 | 日韩欧美高清一区二区 | 日本不卡123| 黄色免费大片 | 国产不卡一二三区 | 波多野结衣网址 | 欧美精品乱码久久久久久 | va视频在线观看 | 成年人黄色免费网站 | 国产97免费 | 99久久精品国产一区二区成人 | 国产一级电影 | 毛片1000部免费看 | 91成人精品 | 日韩精品久久一区二区 | 视频一区视频二区在线观看 | 字幕网资源站中文字幕 | 在线观看视频一区二区三区 | 色综合久久综合中文综合网 | 在线欧美a| 美女视频国产 | 亚洲一区二区三区毛片 | 欧美日韩一区二区久久 | 成人免费大片黄在线播放 | 一级精品视频在线观看宜春院 | 国产裸体bbb视频 | 黄色片网站| 91在线操 | 99麻豆久久久国产精品免费 | 五月婷婷视频在线观看 | 国产精品久久久久久久久岛 | 久久久91精品国产一区二区精品 | 国产xxxx性hd极品 | 五月激情综合婷婷 | 13日本xxxxxⅹxxx20 | 欧美性受极品xxxx喷水 | 黄色大片免费网站 | 国产精品视频内 | 国产精品成人一区二区 | 国产一性一爱一乱一交 | 亚洲综合导航 | 深爱激情站 | 又黄又爽又无遮挡的视频 | 免费网站污| 亚州天堂| 99久久精品免费看国产 | 国产在线精品播放 | 五月婷在线播放 | 亚洲香蕉视频 | 久久久黄色免费网站 | 国产成人综合精品 | 国产自在线观看 | 国产96av| 欧美在线视频a | 欧美一区三区四区 | 精品96久久久久久中文字幕无 | 黄色三几片 | 欧美影片| 久久精品综合网 | 成人一区二区三区在线 | 久久久久亚洲精品 | 99视频 | 日韩激情中文字幕 | 色综合久久久久综合体桃花网 | 欧美九九视频 | 成人av在线影视 | 成人免费观看a | 久久久精品99 | 中文字幕在线播放视频 | 国产在线播放一区 | 中文字幕影片免费在线观看 | 国产精品免费视频一区二区 | 国色天香av | 97天天综合网| 日韩在线无 | 五月天六月婷 | 中文字幕91在线 | 玖玖玖精品 | 精品国产精品久久一区免费式 | 精品视频999 | 国产精品国产三级国产aⅴ9色 | 青青河边草免费观看 | 黄色三级免费片 | 91三级在线观看 | 亚洲国产精品久久久久久 | 色免费在线 | 国外成人在线视频网站 | 中文字幕免费观看 | 18pao国产成视频永久免费 | 日韩免费电影一区二区三区 | 欧美一二三区在线观看 | 毛片a级片 | 国产在线毛片 | 欧美a级在线播放 | 日本一区二区三区视频在线播放 | 91丝袜美腿 | 在线91色| 欧美粗又大 | 99久久精品久久亚洲精品 | 99久热精品 | 综合色综合色 | 99精品国产高清在线观看 | 国产一区二区久久久久 | 91久久久久久久一区二区 | 日本天天操 | 久久久国产一区二区三区 | 伊在线视频| 91成人网在线 | 青春草免费在线视频 | 国产精品永久在线观看 | 狠狠狠狠狠狠狠狠干 | 一区二区丝袜 | 日本精a在线观看 | 97超碰在线久草超碰在线观看 | 亚洲综合激情小说 | 久久新| 国产精品麻豆99久久久久久 | 色婷婷激情电影 | 国产美女在线观看 | 人九九精品 | 97中文字幕 | 在线 精品 国产 | 欧美精品久久久久久久久老牛影院 | 成人黄大片视频在线观看 | 亚洲黄网站 | 91正在播放 | 日韩精品欧美视频 | 国产视频精品视频 | 国产97av| 天天操天天摸天天射 | 国产精品中文字幕av | 免费日韩一区 | 中文字幕成人 | 国产永久网站 | 一区二区三区四区五区在线 | 国产精品理论在线观看 | 久久久久久久久久亚洲精品 | 91插插视频 | av综合 日韩 | 激情 婷婷 | 日本在线视频一区二区三区 | 五月天com| 国产在线观看国语版免费 | 午夜精品福利在线 | 国产一区视频导航 | 2021国产精品视频 | 精品久久久免费 | 欧美电影黄色 | 在线观看免费成人av | 国产精品久久久久一区二区 | 91污在线观看 | 久久国产一区二区 | 久草精品国产 | 亚洲国产中文字幕在线视频综合 | 激情综合色播五月 | 久草网在线 | 国内99视频 | 亚洲欧洲久久久 | 久草在线视频精品 | 久久免费视频这里只有精品 | 中文字幕免费国产精品 | 97色婷婷成人综合在线观看 | 欧美性生交大片免网 | 精品一区二区av | 久久精品亚洲一区二区三区观看模式 | www.五月激情.com | 91看片淫黄大片在线播放 | 精品国产三级 | 免费观看完整版无人区 | 国产精品wwwwww | 91视频免费视频 | 国产在线视频一区二区 | 日韩一区二区三区免费视频 | 久久久国际精品 | 在线看一区 | 久久久久国产精品厨房 | 一区二区三区电影大全 | 久久一区国产 | 日本精品视频免费 | 亚洲三级网 | 国产免费亚洲高清 | 成人久久久久久久久久 | 啪啪免费视频网站 | 在线观看视频一区二区三区 | 久久官网| av短片在线| 视频一区二区视频 | 国产一区二区不卡视频 | www.福利视频 | 九九视频精品免费 | 婷婷激情五月 | 国产直播av | 久久成人高清视频 | 国产尤物视频在线 | 欧美日韩一级在线 | 最近免费中文字幕mv在线视频3 | 国产一区在线观看视频 | 天天操操操操操操 | 国产日韩欧美综合在线 | 美女福利视频网 | 青青视频一区 | 久久r精品 | 亚洲aⅴ乱码精品成人区 | 亚洲黄色在线免费观看 | 九九九在线 | 成人av动漫在线 | 日日爱夜夜爱 | 99久久99久久精品免费 | 久久久久国产成人精品亚洲午夜 | 一级黄色片在线 | 色七七亚洲影院 | 西西4444www大胆艺术 | 成人av资源网 | 2022久久国产露脸精品国产 | 天天操狠狠干 | 日韩色视频在线观看 | 国产成人久久av977小说 | 91色吧| 日韩有码在线观看视频 | 国产精品久久久久一区二区国产 | 91网免费观看 | 日韩av中文字幕在线 | 国产黄 | 日韩三级视频 | 欧美日韩1区2区 | 精品久久一 | 91在线文字幕 | 黄色成人小视频 | 日韩欧美网址 | 在线 国产 亚洲 欧美 | 免费在线观看污网站 | 亚洲自拍自偷 | 国产成人精品亚洲 | 中文字幕第 | 久久天堂网站 | 国产精品久久久久婷婷二区次 | 亚洲国产中文字幕在线 | 成人影片在线播放 | 久久永久免费 | 国产精品麻豆免费版 | 午夜 久久 tv | av中文资源在线 | 免费在线播放av电影 | 天天干天天操天天拍 | 国产传媒中文字幕 | 色视频网站在线观看一=区 a视频免费在线观看 | 99久久精品免费看国产 | 一区二区三区中文字幕在线观看 | 久久首页 | 色婷婷激情四射 | 日韩高清成人在线 | 色姑娘综合天天 | 毛片无卡免费无播放器 | 国产日韩欧美综合在线 | 97国产在线观看 | 日韩一区二区三区在线看 | 日本三级香港三级人妇99 | 91九色视频在线 | 亚洲激情综合 | 91成人精品一区在线播放 | 日韩欧美电影在线观看 | 亚洲高清在线精品 | 色黄www小说| 少妇超碰在线 | 最新一区二区三区 | 久久精品国产免费看久久精品 | 97人人模人人爽人人喊中文字 | 免费在线观看av网址 | 手机av片 | 精品久久久久久久久久久院品网 | 视频在线亚洲 | 中文字幕在线看片 | 国产九九在线 | 欧美日本一区 | 欧美专区国产专区 | 国产美女免费观看 | 久草精品网 | 黄网站色视频免费观看 | 久久99亚洲热视 | 碰超在线| 国产乱码精品一区二区三区介绍 | av电影在线播放 | 91麻豆看国产在线紧急地址 | 日韩av影视在线观看 | 色视频网址| 久久精品免费电影 | 亚洲精品男人的天堂 | 免费观看一区二区三区视频 | 色久网| 欧洲精品视频一区二区 | 国产91区 | 成年人精品 | 久久久久久不卡 | 中文字幕在线免费看线人 | 色婷婷在线播放 | av电影不卡| 日韩av伦理片 | 在线性视频日韩欧美 | 久久乐九色婷婷综合色狠狠182 | 九九免费在线视频 | 国产在线视频一区 | 四虎影视成人精品 | 996久久国产精品线观看 | 免费网站看v片在线a | 在线免费观看视频一区 | 成人免费看片98欧美 | 91在线91拍拍在线91 | japanesefreesexvideo高潮 | 国产中文自拍 | 日韩高清免费在线观看 | 国产麻豆传媒 | 69av国产 | 久久不色| 国产成人三级在线观看 | 精品1区二区 | 在线观看视频色 | 亚洲一区久久久 | 午夜精品久久久久久久爽 | 91看片网址| 久久久精品国产免费观看一区二区 | 午夜精品福利一区二区 | 69av视频在线观看 | 国产色网站 | 久久黄色小说视频 | 国产一区高清在线观看 | 亚洲涩涩网站 | 欧美成年黄网站色视频 | av成人在线播放 | 手机看片99 | 午夜三级理论 | av黄在线播放| 91成人看片 | 婷婷.com| 久热色超碰 | 视频在线观看99 | 在线91网 | 人人爽人人澡人人添人人人人 | 国产四虎影院 | 国产精品视频免费看 | 日b黄色片 | 精品国产乱码久久久久久久 | 激情丁香综合五月 | 精品一区中文字幕 | 日本韩国精品在线 | 天天操天天透 | 涩涩网站在线观看 | 夜夜操天天操 | 日本中文字幕在线 | 久久国产精品免费观看 | 久草a在线 | 亚洲成aⅴ人片久久青草影院 | 欧美激情一区不卡 | 香蕉视频啪啪 | 中文字幕在线视频一区二区三区 | 在线看片成人 | 天天射色综合 | 大片网站久久 | 日日草天天干 | 亚洲精品一区二区精华 | 免费看黄电影 | 久久伊人操 | 久久不见久久见免费影院 | 亚洲资源在线观看 | 最新国产精品久久精品 | 美女免费视频网站 | av无限看 | 久久视频这里有久久精品视频11 | 少妇搡bbbb搡bbb搡aa | 成人国产精品一区二区 | 久久久久久久久免费 | 亚洲欧美成人网 | 久热这里有精品 | 日日夜夜精品网站 | 在线日本看片免费人成视久网 | 国产一区免费在线观看 | 超碰公开在线观看 | 久久久久激情视频 | 国产精品网红福利 | 国产中文字幕三区 | 国产精品理论视频 | 在线免费黄 | 亚a在线 | 天天爱天天操 | 欧美三级在线播放 | 一区在线观看 | 国产亚洲精品久久久久秋 | 天天插天天干天天操 | 91麻豆精品国产91久久久更新时间 | 91免费观看国产 | 五月激情久久久 | 五月天婷婷在线播放 | 婷婷六月丁香激情 | 久久精品一区二区 | 五月天久久精品 | 国产精品1区2区3区在线观看 | 日韩在线观看电影 | 成年人看片 | 免费观看性生交大片3 | 精品9999 | 91在线操 | av.com在线 | 欧美日韩久久不卡 | 欧美一区二区日韩一区二区 | 九九热精品视频在线观看 | 黄色一区二区在线观看 | 成人国产亚洲 | 欧美资源在线观看 | 久久99精品国产91久久来源 | 九色91视频| 国产手机在线观看 | 国产成人在线播放 | 国产精品6| 最近免费中文字幕mv在线视频3 | 黄色网址a | 中文成人字幕 | 亚洲国产成人在线观看 | 国产精品麻豆91 | 欧美性生活大片 | 国产欧美三级 | 青青啪 | 免费欧美高清视频 | 中文字幕在线观看完整 | 国产一级二级视频 | 日本精品一区二区 | 天天综合狠狠精品 | 国产伦精品一区二区三区四区视频 | 西西www4444大胆在线 | 国产精品色婷婷 | 丁五月婷婷| 国产精品2018 | 国产黄色高清 | 91网页版免费观看 | 天天天天色射综合 | 久久久国产网站 | 黄色美女免费网站 | www.色就是色| 欧美不卡视频在线 | 婷婷精品国产欧美精品亚洲人人爽 | 久久久久在线观看 | 色99中文字幕 | 久久av免费观看 | h文在线观看免费 | 激情综合狠狠 | 久久久久综合精品福利啪啪 | 97色免费视频 | 国产精品毛片一区二区三区 | 天天干天天拍天天操天天拍 | 久久久官网| 成人免费 在线播放 | 免费av试看 | 91精品在线视频 | 午夜久久电影网 | 欧美日韩久久 | 五月天激情综合网 | 久久久久久久久久久久亚洲 | 黄色av成人在线 | 中文国产字幕 | 久久桃花网 | 在线观看韩日电影免费 | 国产看片免费 | 在线观看视频免费大全 | 亚洲精品午夜视频 | 成人久久综合 | 天天干天天射天天爽 | www.av在线.com | 五月激情久久 | 欧美日韩国产一区二区三区 | 国内小视频 | 亚洲精欧美一区二区精品 | 99久久精品国产免费看不卡 | 久久精品视频观看 | 天天操夜夜操夜夜操 | 成人资源在线播放 | 三级av网| 久久精彩免费视频 | 91av视频在线观看免费 | 日韩精品久久久久久久电影竹菊 | 日韩免费在线观看视频 | 99久久这里只有精品 | 免费观看不卡av | 国产精品美女久久久久久免费 | 欧美日韩一区二区三区免费视频 | 男女全黄一级一级高潮免费看 | 久久久久久久久久久久久国产精品 | 国产免费资源 | 中文字幕在线观看国产 | 美女网站在线看 | 五月天亚洲激情 | 超碰成人网 | 久久国产品 | 91精品国产乱码久久桃 | 日韩久久激情 | 久久老司机精品视频 | 久久精品一二区 | 日韩欧美精品免费 | 97精品伊人| 国产一区二区三精品久久久无广告 | 久久精品99国产精品亚洲最刺激 | 日韩欧美在线不卡 | 国产一区二区三区黄 | 亚洲国产精品久久久 | 日韩亚洲在线视频 | 日韩精品久久久免费观看夜色 | 91av大全| 狠狠色伊人亚洲综合网站色 | 亚洲精品福利在线观看 | 国产不卡在线视频 | 又黄又爽又无遮挡免费的网站 | 五月在线视频 | 久久免费黄色大片 | 亚洲高清免费在线 | 在线看片一区 | 久操伊人| 日本最大色倩网站www | 狠狠88综合久久久久综合网 | 超碰人人在线观看 | 91av99| 亚洲japanese制服美女 | 在线播放第一页 | 狠狠色噜噜狠狠狠狠2021天天 | 成人久久久久久久久久 | 国产午夜一区 | 日韩大片免费在线观看 | 在线91av| 欧美在线你懂的 | 国产精品96久久久久久吹潮 | 中文字幕丝袜美腿 | 男女拍拍免费视频 | 久草视频在线免费播放 | 97人人超碰在线 | 九九热只有这里有精品 | www婷婷 | 精品国产伦一区二区三区观看说明 | 色精品视频 | 视频一区视频二区在线观看 | 在线观看完整版免费 | 亚洲视频 中文字幕 | 国产午夜亚洲精品 | 亚洲亚洲精品在线观看 | 亚洲女人av | 国产免费观看久久黄 | 操操操日日 | 欧美一级片免费播放 | 中文字幕乱码一区二区 | 激情久久综合网 | 天天草天天干天天射 | 手机av电影在线观看 | 日韩免费福利 | 91视频成人免费 | 999久久a精品合区久久久 | 婷婷视频在线观看 | 亚洲精品欧美视频 | 91av社区| 99精品国自产在线 | 亚洲欧美一区二区三区孕妇写真 | 亚洲人成网站精品片在线观看 | 精品产品国产在线不卡 | aⅴ精品av导航 | 黄色软件视频网站 | 久久精品国产一区 | 精品国产一二三四区 | 探花视频在线观看 | 91亚洲国产成人 | 99看视频在线观看 | av免费看电影 | 国产精品video爽爽爽爽 | aav在线 | 亚洲精品中文字幕在线观看 | 国产专区精品视频 | 99视频+国产日韩欧美 | 国产喷水在线 | 国产精品精 | 成人免费在线视频 | 久久国产精品二国产精品中国洋人 | 在线 国产一区 | 国内毛片毛片 | 国产精品久久久久久一区二区三区 | 色噜噜日韩精品一区二区三区视频 | 日日操日日插 | 国内丰满少妇猛烈精品播放 | 国产第一二区 | www.色五月.com | 久久久国产精品亚洲一区 | 91av网址 | 欧美激情视频在线观看免费 | 国产精品成人自产拍在线观看 | 91高清视频在线 | 91九色九色 | 国产网站色| 97超碰人人澡人人爱 | 四川bbb搡bbb爽爽视频 | 综合网av| 最新高清无码专区 | 久久免费毛片 | 日本一区二区免费在线观看 | 国产破处精品 | 四虎www com| 国产1级视频 | 久草视频观看 | 中文字幕在线观看免费高清电影 | 欧美日韩在线精品一区二区 | 黄视频色网站 | 伊人中文字幕在线 | 天天干天天操天天爱 | 国产中的精品av小宝探花 | 日本mv大片欧洲mv大片 | 国产伦精品一区二区三区在线 | 一级a性色生活片久久毛片波多野 | 日b视频国产 | 中文字幕免费高 | 国产精品理论片在线播放 | 玖玖视频网 | 免费在线看成人av | 中文字幕成人在线观看 | 一级片在线 | 中文字幕视频在线播放 | 欧美国产三区 | 国产福利免费在线观看 | 久久久精品福利视频 | 国产精品美女免费视频 | 81国产精品久久久久久久久久 | 99久久精品久久久久久清纯 | 色五月成人 | 婷婷5月激情5月 | 久草在线一免费新视频 | 激情视频一区二区三区 | 国产精品婷婷午夜在线观看 | 伊人久久影视 | 亚洲少妇天堂 | 玖玖在线免费视频 | 日日干干夜夜 | 美女一区网站 | 日韩三级中文字幕 | 夜夜躁狠狠躁日日躁 | 国产第一福利网 | 午夜精品久久一牛影视 | 波多野结衣动态图 | 人人网人人爽 | 久久视频在线观看免费 | 欧美一级片在线播放 | 国内精品久久久久久久久久久久 | av亚洲产国偷v产偷v自拍小说 | 毛片网站在线观看 | 五月的婷婷 | 国语精品久久 | 欧美性成人 | 五月婷婷av在线 | 91在线小视频 | 亚洲 成人 一区 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 久久99久久久久久 | 黄色a一级视频 | 久久在线视频精品 | 亚洲h视频在线 | 中文 一区二区 | 1000部18岁以下禁看视频 | 精品99久久 | 娇妻呻吟一区二区三区 | 久久这里只有精品视频99 | 成人欧美一区二区三区在线观看 | 久久一及片 | 日韩av成人在线观看 | 国产日韩精品一区二区在线观看播放 | 国产最新视频在线 | 欧美一区在线观看视频 | avcom在线| 亚洲精品www| 久久九精品 | jizz欧美性9 国产一区高清在线观看 | 精品一区二区精品 | 欧美一区二区三区四区夜夜大片 | 在线免费看黄网站 | 五月婷婷开心中文字幕 | 国产手机在线观看 | 99热国产在线中文 | 久草剧场 | 久久久久久中文字幕 | 在线一区观看 | 成av人电影| 天天爽天天搞 | 日韩色在线 | 国产精品18久久久久久vr | 视频精品一区二区三区 | 国内精品久久久久久久久 | 久草免费资源 | a黄色一级| 国产裸体视频bbbbb | 91成人精品观看 | 亚洲国产一二三 | bbb搡bbb爽爽爽 | 丁香午夜 | 国产精品一区免费观看 | 高清久久久久久 | 人人看人人做人人澡 | 日本黄色免费播放 | 在线观看视频你懂的 | 99热精品免费观看 | 天天躁日日躁狠狠 | 欧美日韩另类在线观看 | 麻豆视频在线免费观看 | 国产精品v欧美精品v日韩 | 国产免费久久精品 | av线上看 | 日日爱影视 | 久久成人资源 | 国产精品久久久久久久久久直播 | 国产理论免费 | 狠狠狠色丁香婷婷综合久久88 | 国产一区在线免费观看 | 免费日韩 | 激情电影在线观看 | 精品国产_亚洲人成在线 | 欧美与欧洲交xxxx免费观看 | 日韩中文字幕在线看 | 天天干亚洲 | 久久久影片| 国产精品久久久影视 | 成人av一区二区兰花在线播放 | 久章草在线观看 | 超级碰视频| 男女啪啪网站 | 99久久er热在这里只有精品66 | 成年人免费观看在线视频 | 菠萝菠萝在线精品视频 | 99视频在线免费看 | 国产 色 | 中文字幕在线中文 | 欧美精品免费视频 | 久久久久久久久久网 | 四虎免费av| 毛片www | 免费观看黄色av | 亚洲人xxx | 日韩精品专区在线影院重磅 | 亚洲五月 | 欧洲激情综合 | 成人免费视频网址 | 日韩电影在线观看一区 | 欧美日韩超碰 | 免费观看全黄做爰大片国产 | 亚洲国产成人久久 | 99精品热视频只有精品10 | 久久免费视频这里只有精品 | 香蕉在线影院 | 国产又粗又硬又长又爽的视频 | 久草新在线 | 亚洲国产午夜 | 午夜国产在线观看 | 欧美日韩视频 | av中文字幕免费在线观看 | 免费观看久久 | 国产精品久久网 | 久久免费成人精品视频 | a久久久久久 | 欧美狠狠色 | 成人aⅴ视频 | 久久艹欧美 | 人人爽人人爽人人爽 | 久草在线视频新 | 看全黄大色黄大片 | 国产精品午夜在线观看 | 五月天婷亚洲天综合网鲁鲁鲁 | 五月婷婷国产 | 91桃花视频 | 久久久免费看视频 | 国产一级大片免费看 | 日韩美女av在线 | 亚洲jizzjizz日本少妇 | 日韩欧美视频一区 | 在线不卡视频 | 亚州中文av | 亚洲精品久久久蜜桃直播 | 久草在线高清视频 | 天天天天色综合 | 亚洲一区二区三区91 | 99精品欧美一区二区 | 免费看黄在线观看 | 欧美久久久久久久久中文字幕 | 中文字幕日韩免费视频 | 香蕉视频啪啪 | 国产成人av电影在线观看 | a天堂最新版中文在线地址 久久99久久精品国产 | av在线播放国产 | 在线观看aa| 美女网站在线免费观看 | 在线观看完整版免费 | 亚洲 欧美 国产 va在线影院 | 国产不卡视频在线播放 | 久久er99热精品一区二区三区 | 欧美日韩国产精品一区二区三区 | 国产这里只有精品 | 999色视频| 成人免费观看大片 | 8090yy亚洲精品久久 | 亚洲电影成人 | 国产成人一区二区啪在线观看 | 黄在线| 久久精品成人欧美大片古装 | 波多野结衣久久资源 | 又黄又爽又湿又无遮挡的在线视频 | 色综合久久88色综合天天 | 国产精品国产三级国产aⅴ入口 | 国外av在线 | 国产一区二区在线免费播放 | 久久欧美精品 | 激情婷婷av | 亚洲国产精品电影 | 国产人成在线观看 | 91日韩精品一区 | 中文字幕一区二区三区在线视频 | 亚洲成熟女人毛片在线 | 一区二区三区电影在线播 | 国产成人av网址 | 精品久久久久免费极品大片 | 欧美日韩中文国产一区发布 | 亚洲91中文字幕无线码三区 | 天天干,天天射,天天操,天天摸 | 国产精品久久久999 国产91九色视频 | 在线观看一区视频 | 特黄色大片 | 免费v片| 特级西西www44高清大胆图片 | 四虎永久视频 | 久草电影免费在线观看 | 日韩在线视| 国产精品久久久久久久免费大片 | 日韩成人免费在线电影 | 97香蕉久久超级碰碰高清版 | 一二三区视频在线 | 中文字幕免费在线 | 91中文字幕在线观看 | 久久刺激视频 | 黄av在线 | 天天爱天天爽 | 五月婷婷久久丁香 | 日韩精品一卡 | 国产九九热 | 毛片精品免费在线观看 | 狠狠狠色丁香婷婷综合激情 | 久久久18 | 天天综合久久综合 | 国产亚洲视频中文字幕视频 | www91在线| 欧美高清成人 | 天天操天天射天天插 | 国产精品女教师 | 国产小视频在线免费观看 | 中文成人字幕 | 亚洲一二三区精品 | 日本三级中文字幕在线观看 | 五月婷婷激情六月 | 91中文字幕在线播放 | 国产手机av | 日韩免费观看一区二区 | 国产精品久久久777 成人手机在线视频 | 深爱五月激情网 | 一区二区精品国产 | 久久久久久久久久久久亚洲 | 九七视频在线 | 久久综合狠狠综合久久激情 | 国产精品久久久久影院 | 国产a级免费 | 免费福利影院 | 日本黄色a级大片 | 最近中文字幕国语免费高清6 | 96国产精品 | 毛片在线网 | 欧美日韩精品国产 | 日韩动漫免费观看高清完整版在线观看 | 99 视频 高清| 美女网站视频久久 | 国产九色在线播放九色 | 精品免费99久久 | 97视频网站| 天天操天天操天天操 | 全久久久久久久久久久电影 | 国产成人一二三 | 免费a v在线 | 91麻豆精品国产91久久久久 | 免费看一级特黄a大片 | 日批网站在线观看 | 久久午夜精品视频 | 人人干人人艹 | 日韩中文在线电影 | 日韩大片免费观看 | 国产精品成人国产乱一区 | 中文字幕日韩免费视频 | 久久人人干 | 久久夜av | 91传媒在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 日韩电影在线视频 | 亚洲精品国产高清 | 欧美日韩久久久 | 91精品天码美女少妇 | 国产日韩中文字幕 | 视频一区久久 | 一本一道久久a久久综合蜜桃 | 亚洲日韩中文字幕 | 精品麻豆 | 国模精品在线 | 超碰国产人人 | 人人插人人插 | 国产在线免费 | 中文字幕免费高清在线观看 | 免费成人黄色片 | 亚洲国产午夜视频 | 九九精品无码 | 成年人看片网站 | 国产精品一区二区在线播放 | 欧美乱淫视频 | 精品在线观看一区二区三区 | 国产成人精品在线播放 | 人人爽爽人人 | 在线免费观看麻豆 | 日本激情视频中文字幕 | 欧美巨大荫蒂茸毛毛人妖 | 国产一区二区视频在线 | 国产女教师精品久久av | 在线看成人片 | 亚洲精品乱码久久久一二三 | 国产精品久久久久久久久久妇女 | 91大神电影 | 最近日韩免费视频 | 久热久草 | 天天爱天天射天天干天天 | 午夜视频在线观看网站 | 日韩中文字幕a | 999在线视频 | 97精品国自产拍在线观看 | 一区二区三区在线影院 | 九热在线 | 欧美视频www| 国产日韩在线播放 | 久久亚洲影院 | 久久视屏网 | 久久成人精品电影 | 91综合视频在线观看 | 天天射天天干天天插 | 日本性高潮视频 | 婷婷99| 久久www免费人成看片高清 | 最近高清中文在线字幕在线观看 | 99视频在线观看一区三区 | 九九热久久免费视频 | 欧美日韩高清不卡 | av蜜桃在线 | 久久人人艹 | 国产999|