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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

后端学习 - SpringMVC

發(fā)布時(shí)間:2023/12/4 javascript 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 后端学习 - SpringMVC 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一 SpringMVC 簡(jiǎn)介
    • 1 MVC
    • 2 SpringMVC
    • 3 創(chuàng)建第一個(gè) SpringMVC 項(xiàng)目
  • 二 @RequestMapping
    • 1 注解類與方法的區(qū)別
    • 2 value 屬性
    • 3 method 屬性
    • 4 params 屬性
    • 5 headers 屬性
    • 6 SpringMVC 支持路徑中的占位符
  • 三 獲取 Request 的一系列參數(shù)
    • 1 通過(guò)控制器方法的形參
    • 2 控制器方法形參 映射 Request 參數(shù) - @RequestParam
    • 3 控制器方法形參 映射 Request 請(qǐng)求頭 - @RequestHeader
    • 4 控制器方法形參 映射 cookie數(shù)據(jù) - @CookieValue
    • 5 通過(guò) POJO 獲取 Request 參數(shù)
    • 6 解決獲取參數(shù)的亂碼問(wèn)題
  • 四 域?qū)ο蠊蚕頂?shù)據(jù)
    • 1 使用 ServletAPI 向 request 域?qū)ο蠊蚕頂?shù)據(jù)(不建議)
    • 2 使用 ModelAndView 向 request 域?qū)ο蠊蚕頂?shù)據(jù)
    • 3 使用 Model 向 request 域?qū)ο蠊蚕頂?shù)據(jù)
    • 4 使用 Map 向 request 域?qū)ο蠊蚕頂?shù)據(jù)
    • 5 使用 ModelMap 向 request 域?qū)ο蠊蚕頂?shù)據(jù)
    • 6 使用 ServletAPI 向 Session 域?qū)ο蠊蚕頂?shù)據(jù)
    • 7 使用 ServletAPI 向 Application 域?qū)ο蠊蚕頂?shù)據(jù)
  • 五 SpringMVC 視圖
    • 1 Thymeleaf 視圖
    • 2 轉(zhuǎn)發(fā)視圖
    • 3 重定向視圖
    • 4 使用 view-controller 代替 控制器方法
  • 六 RESTful
  • 七 HttpMessageConverter
    • 1 @RequestBody
    • 2 RequestEntity
    • 3 @ResponseBody
    • 4 ResponseEntity
    • 5 RestController
  • 八 攔截器
    • 1 配置方法
    • 2 HandlerInterceptor 接口的三個(gè)方法
    • 3 多個(gè)攔截器的執(zhí)行順序
  • 九 異常處理器
    • 1 基于配置
    • 2 基于注解
  • 十 使用注解配置 SpringMVC
    • 1 初始化類:代替 web.xml
    • 2 SpringConfig 類:代替 Spring 配置文件(略)
    • 3 WebConfig 類:代替 SpringMVC 配置文件
  • 十一 SpringMVC 執(zhí)行流程
    • 1 常用組件
    • 2 流程總結(jié)


一 SpringMVC 簡(jiǎn)介

1 MVC

  • Model 模型層:工程中的 JavaBean,包含實(shí)體 Bean(Customer、Student…) 和 業(yè)務(wù)處理 Bean(Service、DAO)
  • View 視圖層:指工程中的 html 或 jsp 等頁(yè)面,與用戶進(jìn)行交互,展示數(shù)據(jù)
  • Controller 控制層:指工程中的 servlet,作用是接收請(qǐng)求和響應(yīng)瀏覽器
  • MVC 的工作流程 View <—> Controller <—> Model :用戶通過(guò)視圖層發(fā)送請(qǐng)求到服務(wù)器,在服務(wù)器中請(qǐng)求被Controller接收,Controller 調(diào)用相應(yīng)的 Model 層處理請(qǐng)求,處理完畢將結(jié)果返回到 Controller,Controller 再根據(jù)請(qǐng)求處理的結(jié)果找到相應(yīng)的 View 視圖,渲染數(shù)據(jù)后最終響應(yīng)給瀏覽器

2 SpringMVC

  • 是 Spring 的子項(xiàng)目
  • 主要作用是在 Spring 項(xiàng)目中進(jìn)行表述層開(kāi)發(fā)(是三層架構(gòu)中的概念,三層架構(gòu):表述層(或表示層)、業(yè)務(wù)邏輯層、數(shù)據(jù)訪問(wèn)層,表述層表示前臺(tái)頁(yè)面和后臺(tái) servlet)

3 創(chuàng)建第一個(gè) SpringMVC 項(xiàng)目

目錄結(jié)構(gòu)如下

  • 配置 maven 依賴,這里遇到了一個(gè)奇怪的版本問(wèn)題
  • <dependencies><!-- SpringMVC --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.9</version></dependency><!-- 日志 --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency><!-- ServletAPI --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!-- Spring5和Thymeleaf整合包 --><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId><version>3.0.11.RELEASE</version></dependency></dependencies>
  • 配置 web.xml 的 Servlet 及 mapping
  • <!--注冊(cè)springMVC的前端控制器,對(duì)瀏覽器所發(fā)送的請(qǐng)求統(tǒng)一進(jìn)行處理在此配置下,springMVC的配置文件具有默認(rèn)的位置和名稱默認(rèn)的位置:WEB-INF默認(rèn)的名稱:<servlet-name>-servlet.xml若要為springMVC的配置文件設(shè)置自定義的位置和名稱(推薦)需要在servlet標(biāo)簽中添加init-param<init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springMVC.xml</param-value></init-param>--><servlet><servlet-name>springMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name> <!--設(shè)置配置文件的目錄--><param-value>classpath:springMVC.xml</param-value> <!--對(duì)應(yīng)resources目錄下的文件--></init-param><load-on-startup>1</load-on-startup> <!--服務(wù)器啟動(dòng)時(shí)初始化DispatcherServlet--></servlet><servlet-mapping><servlet-name>springMVC</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
  • 在 resources 目錄下,配置 SpringMVC 的 xml:開(kāi)啟組件掃描、加入 thymeleaf 的名稱空間并配置視圖解析器(Thymeleaf 是服務(wù)器端的模板引擎,在服務(wù)器端獲取模板和數(shù)據(jù),生成結(jié)果輸出給瀏覽器呈現(xiàn)結(jié)果)
  • <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!--開(kāi)啟組件掃描--><context:component-scan base-package="com.atguigu.mvc.controller"></context:component-scan><!-- 配置Thymeleaf視圖解析器 --><bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><property name="order" value="1"/><property name="characterEncoding" value="UTF-8"/><property name="templateEngine"><bean class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver"><bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><!-- 視圖前綴 --><property name="prefix" value="/WEB-INF/templates/"/><!-- 視圖后綴 --><property name="suffix" value=".html"/><property name="templateMode" value="HTML5"/><property name="characterEncoding" value="UTF-8" /></bean></property></bean></property></bean> </beans>
  • 定義 Controller 類,并用注解標(biāo)注類和方法;在 templates 中定義 index.html, target.html
  • @Controller public class HelloController {/* 通過(guò)@RequestMapping注解,可以通過(guò)請(qǐng)求路徑匹配要處理的具體的請(qǐng)求/表示的當(dāng)前工程的上下文路徑 http://localhost:8080/project_context/返回字符串即可,thymeleaf自動(dòng)為返回值配置前后綴方法名可以隨意,根據(jù)注解進(jìn)行解析*/@RequestMapping("/")public String index(){return "index";}@RequestMapping("/target")public String toTarget(){return "target";} }

    總結(jié):

    • 瀏覽器發(fā)送請(qǐng)求,若請(qǐng)求地址符合前端控制器的url-pattern,該請(qǐng)求就會(huì)被前端控制器 DispatcherServlet 處理
    • 前端控制器會(huì)讀取 SpringMVC 的核心配置文件,通過(guò)掃描組件找到控制器,將請(qǐng)求地址和控制器中@RequestMapping 注解的 value 屬性值進(jìn)行匹配(要求每個(gè)方法的 value 值唯一)
    • 若匹配成功,該注解所標(biāo)識(shí)的控制器方法就是處理請(qǐng)求的方法,處理請(qǐng)求的方法需要返回一個(gè)字符串類型的視圖名稱
    • 該視圖名稱會(huì)被視圖解析器解析,加上前綴和后綴組成視圖的路徑,通過(guò) Thymeleaf 對(duì)視圖進(jìn)行渲染,最終轉(zhuǎn)發(fā)到視圖所對(duì)應(yīng)頁(yè)面

    二 @RequestMapping

    作用是關(guān)聯(lián) 請(qǐng)求 和 處理請(qǐng)求的控制器方法。SpringMVC 接收到指定的請(qǐng)求,就會(huì)來(lái)找到在映射關(guān)系中對(duì)應(yīng)的控制器方法來(lái)處理這個(gè)請(qǐng)求。

    1 注解類與方法的區(qū)別

    • @RequestMapping標(biāo)識(shí)一個(gè)類:設(shè)置映射請(qǐng)求的請(qǐng)求路徑的初始信息
    • @RequestMapping標(biāo)識(shí)一個(gè)方法:設(shè)置映射請(qǐng)求請(qǐng)求路徑的具體信息
    @Controller @RequestMapping("/test") public class RequestMappingController {//此時(shí)請(qǐng)求映射所映射的請(qǐng)求的請(qǐng)求路徑為:/test/testRequestMapping@RequestMapping("/testRequestMapping")public String testRequestMapping(){return "success";} }

    2 value 屬性

    • 通過(guò)請(qǐng)求的請(qǐng)求地址匹配請(qǐng)求映射
    • 是一個(gè)字符串類型的數(shù)組,和其中任意字符串匹配則選擇該方法,滿足其中一個(gè)即可
    • @RequestMapping 必須設(shè)置的屬性
    <!--以下均能匹配 testRequestMapping()--> <a th:href="@{/testRequestMapping}"> value1 </a> <a th:href="@{/test}"> value2 </a>@RequestMapping( value = {"/testRequestMapping", "/test"} ) public String testRequestMapping(){return "success"; }

    3 method 屬性

    • 根據(jù)請(qǐng)求方法 GET / POST / PUT / DELETE匹配請(qǐng)求映射
    • 默認(rèn)任意請(qǐng)求方式均可匹配
    • 是RequestMethod 枚舉類型的數(shù)組,表示該請(qǐng)求映射能夠匹配多種請(qǐng)求方式的請(qǐng)求,滿足其中一個(gè)即可
    • @RequestMapping(value="/idx", method={RequestMethod.GET}) 等于 @GetMapping(value="/idx"),其它方式同理
    • 如果 value 匹配而 method 不匹配,出現(xiàn)405錯(cuò)誤

    4 params 屬性

    • 根據(jù)請(qǐng)求攜帶的的參數(shù)匹配請(qǐng)求映射
    • 是一個(gè)字符串類型的數(shù)組,需要同時(shí)滿足所有條件,可以通過(guò)四種表達(dá)式設(shè)置請(qǐng)求參數(shù)和請(qǐng)求映射的匹配關(guān)系:
      “param”:要求請(qǐng)求映射所匹配的請(qǐng)求必須攜帶 param 請(qǐng)求參數(shù)
      “!param”:要求請(qǐng)求映射所匹配的請(qǐng)求必須不能攜帶 param 請(qǐng)求參數(shù)
      “param=value”:要求請(qǐng)求映射所匹配的請(qǐng)求必須攜帶 param 請(qǐng)求參數(shù)且 param=value
      “param!=value”:要求請(qǐng)求映射所匹配的請(qǐng)求必須攜帶 param 請(qǐng)求參數(shù)但 param!=value
    <a th:href="@{/test(username='admin',password=123456)">測(cè)試</a>@RequestMapping(value = {"/testRequestMapping", "/test"},method = {RequestMethod.GET, RequestMethod.POST},params = {"username","password!=123456"} ) public String testRequestMapping(){return "success"; }

    5 headers 屬性

    • 根據(jù)請(qǐng)求的請(qǐng)求頭信息匹配請(qǐng)求映射
    • 類似 params 屬性,是一個(gè)字符串類型的數(shù)組,需要同時(shí)滿足所有條件,可以通過(guò)四種表達(dá)式設(shè)置請(qǐng)求參數(shù)和請(qǐng)求映射的匹配關(guān)系:
      “header”:要求請(qǐng)求映射所匹配的請(qǐng)求必須攜帶 header 請(qǐng)求頭信息
      “!header”:要求請(qǐng)求映射所匹配的請(qǐng)求必須不能攜帶 header 請(qǐng)求頭信息
      “header=value”:要求請(qǐng)求映射所匹配的請(qǐng)求必須攜帶 header 請(qǐng)求頭信息且 header=value
      “header!=value”:要求請(qǐng)求映射所匹配的請(qǐng)求必須攜帶 header 請(qǐng)求頭信息且 header!=value

    6 SpringMVC 支持路徑中的占位符

    • 將請(qǐng)求攜帶的參數(shù)以請(qǐng)求路徑的形式,向服務(wù)器傳遞參數(shù)
    • 如果 @RequestMapping 的 value 屬性中有路徑的占位符,則請(qǐng)求時(shí)必須有占位符對(duì)應(yīng)的參數(shù),否則出現(xiàn)404
    <a th:href="@{/goods/123}">訪問(wèn)goods,參數(shù)123</a>@Controller public class MyController {@RequestMapping("/goods/{id}")public String goodsPage(@PathVariable("id") int param_id) {System.out.println(param_id);return "goods";} }

    三 獲取 Request 的一系列參數(shù)

    1 通過(guò)控制器方法的形參

    • 將形參名和 Request 參數(shù)名對(duì)應(yīng)即可(如果不同名,則需要使用 @RequestParam),如此只能獲取 Request 參數(shù),而不能獲得請(qǐng)求頭信息等
    • 如果有多個(gè)同名的參數(shù),則將形參類型設(shè)置為字符串?dāng)?shù)組
    <a th:href="@{/testParam(username='admin',password=123456)}">測(cè)試</a>@RequestMapping("/testParam") public String testParam(String username, String password){System.out.println("username:"+username+",password:"+password);return "success"; }

    2 控制器方法形參 映射 Request 參數(shù) - @RequestParam

    • value:Request 中的參數(shù)的 name 屬性
    • required:標(biāo)明該參數(shù)是否必須,如果是必須且未設(shè)置 defaultValue,則必須由 Request 傳入
    • defaultValue:默認(rèn)值
    @Controller public class MyController {@RequestMapping("/goods/diff")// request 傳遞參數(shù)為 name, passwdpublic String diff(@RequestParam(value = "name") String n,@RequestParam(value = "passwd", required = false) String pwd) {System.out.println(n + pwd);return "goods";} }

    3 控制器方法形參 映射 Request 請(qǐng)求頭 - @RequestHeader

    • 同樣具有 value, required, defaultValue,用法相同

    4 控制器方法形參 映射 cookie數(shù)據(jù) - @CookieValue

    • 同樣具有 value, required, defaultValue,用法相同

    5 通過(guò) POJO 獲取 Request 參數(shù)

    將控制器方法形參設(shè)置為實(shí)體類類型,此時(shí)若瀏覽器傳輸?shù)恼?qǐng)求參數(shù)的參數(shù)名,和實(shí)體類中的屬性名一致,那么請(qǐng)求參數(shù)就會(huì)為此屬性賦值

    <form th:action="@{/testpojo}" method="post">用戶名:<input type="text" name="username"><br>密碼:<input type="password" name="password"><br>性別:<input type="radio" name="sex" value=""><input type="radio"name="sex" value=""><br>年齡:<input type="text" name="age"><br>郵箱:<input type="text" name="email"><br><input type="submit"> </form> @RequestMapping("/testpojo") public String testPOJO(User user){ // 根據(jù)request參數(shù)創(chuàng)建對(duì)象,前提是屬性名和請(qǐng)求參數(shù)名相同System.out.println(user); return "success"; }

    6 解決獲取參數(shù)的亂碼問(wèn)題

    • GET 請(qǐng)求的亂碼問(wèn)題可以通過(guò)更改 Tomcat 的配置文件 server.xml 解決
    • POST 請(qǐng)求的亂碼問(wèn)題必須在請(qǐng)求參數(shù)獲取之前設(shè)置編碼,要比 Servlet 啟動(dòng)更早
    • 服務(wù)器啟動(dòng)時(shí),初始化順序是 Listener -> Filter -> Servlet,可以使用 Filter 設(shè)置編碼格式(不使用 Listener 是因?yàn)楸O(jiān)聽(tīng)器只執(zhí)行一次,負(fù)責(zé)初始化 / 銷毀的動(dòng)作,而 Filter 可以過(guò)濾所有符合路徑請(qǐng)求),在 web.xml 中配置,并設(shè)置為首個(gè) Filter
    <!--配置springMVC的編碼過(guò)濾器--> <filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceResponseEncoding</param-name><param-value>true</param-value></init-param> </filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern> </filter-mapping>

    四 域?qū)ο蠊蚕頂?shù)據(jù)

    域?qū)ο蟀捶秶鷱男〉酱蠓譃?#xff1a;Request、Session、Application(ServletContext)

    1 使用 ServletAPI 向 request 域?qū)ο蠊蚕頂?shù)據(jù)(不建議)

    @Controller public class TestController {@RequestMapping("/servlet")public String m1(HttpServletRequest httpServletRequest) {httpServletRequest.setAttribute("k", "v");return "index";} } index.html: <p th:text="${k}"></p>

    2 使用 ModelAndView 向 request 域?qū)ο蠊蚕頂?shù)據(jù)

    • 向 request 域?qū)ο蠊蚕頂?shù)據(jù)的所有方式,本質(zhì)是對(duì)使用 ModelAndView 進(jìn)行共享的一種封裝
    • 方法的返回值必須是 ModelAndView 類型
    @Controller public class TestController {@RequestMapping("/modelandview")public ModelAndView m2() {ModelAndView modelAndView = new ModelAndView();// 設(shè)置鍵值對(duì)modelAndView.addObject("k", "v");// 設(shè)置視圖名稱modelAndView.setViewName("index");return modelAndView;} }

    3 使用 Model 向 request 域?qū)ο蠊蚕頂?shù)據(jù)

    • 類似于 ServletAPI
    @Controller public class TestController {@RequestMapping("/model")public String m3(Model model) {model.addAttribute("k", "v");return "index";} }

    4 使用 Map 向 request 域?qū)ο蠊蚕頂?shù)據(jù)

    @Controller public class TestController {@RequestMapping("/map")public String m4(Map<String, Object> map) {map.put("k", "v");return "index";} }

    5 使用 ModelMap 向 request 域?qū)ο蠊蚕頂?shù)據(jù)

    • 類似于 ServletAPI
    @Controller public class TestController {@RequestMapping("/modelmap")public String m5(ModelMap modelMap) {modelMap.addAttribute("k", "v");return "index";} }

    6 使用 ServletAPI 向 Session 域?qū)ο蠊蚕頂?shù)據(jù)

    @RequestMapping("/testSession") public String testSession(HttpSession session){session.setAttribute("testSessionScope", "hello,session");return "index"; }

    7 使用 ServletAPI 向 Application 域?qū)ο蠊蚕頂?shù)據(jù)

    @RequestMapping("/testApplication") public String testApplication(HttpSession session){ServletContext application = session.getServletContext();application.setAttribute("testApplicationScope", "hello,application");return "index"; }

    五 SpringMVC 視圖

    • 默認(rèn)的有:轉(zhuǎn)發(fā)視圖、重定向視圖

    1 Thymeleaf 視圖

    • 實(shí)現(xiàn)了轉(zhuǎn)發(fā)視圖的功能
    • 當(dāng)控制器方法中所設(shè)置的視圖名稱沒(méi)有任何前綴時(shí),此時(shí)的視圖名稱會(huì)被 SpringMVC 配置文件中所配置的視圖解析器解析,視圖名稱拼接視圖前綴和視圖后綴所得到的最終路徑,會(huì)通過(guò)轉(zhuǎn)發(fā)的方式實(shí)現(xiàn)跳轉(zhuǎn)
    @RequestMapping("/testHello") public String testHello(){return "hello"; // 沒(méi)有任何前綴 }

    Spring 配置文件中的視圖解析器:

    <!-- 配置Thymeleaf視圖解析器 --><bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><property name="order" value="1"/><property name="characterEncoding" value="UTF-8"/><property name="templateEngine"><bean class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver"><bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><property name="prefix" value="/templates/"/><property name="suffix" value=".html"/><property name="templateMode" value="HTML5"/><property name="characterEncoding" value="UTF-8" /></bean></property></bean></property></bean>

    2 轉(zhuǎn)發(fā)視圖

    • SpringMVC中默認(rèn)的轉(zhuǎn)發(fā)視圖是 InternalResourceView
    • 當(dāng)控制器方法中所設(shè)置的視圖名稱以"forward:"為前綴時(shí),創(chuàng)建 InternalResourceView 視圖,此時(shí)的視圖名稱不會(huì)被 SpringMVC 配置文件中所配置的視圖解析器解析,而是會(huì)將前綴"forward:"去掉,剩余部分作為最終路徑通過(guò)轉(zhuǎn)發(fā)的方式實(shí)現(xiàn)跳轉(zhuǎn)
    @RequestMapping("/testForward") public String testForward(){return "forward:/testHello"; // 先創(chuàng)建 InternalResourceView 再創(chuàng)建 Thymeleaf View }

    3 重定向視圖

    • SpringMVC 中默認(rèn)的重定向視圖是 RedirectView
    • 當(dāng)控制器方法中所設(shè)置的視圖名稱以"redirect:"為前綴時(shí),創(chuàng)建 RedirectView 視圖,此時(shí)的視圖名稱不會(huì)被 SpringMVC 配置文件中所配置的視圖解析器解析,而是會(huì)將前綴"redirect:"去掉,剩余部分作為最終路徑通過(guò)重定向的方式實(shí)現(xiàn)跳轉(zhuǎn)
    • 重定向視圖在解析時(shí),會(huì)先將 redirect: 前綴去掉,然后會(huì)判斷剩余部分是否以 / 開(kāi)頭,若是,則自動(dòng)拼接上下文路徑
    @RequestMapping("/testRedirect") public String testRedirect(){return "redirect:/testHello"; }

    4 使用 view-controller 代替 控制器方法

    • 當(dāng)控制器方法中,僅僅用來(lái)實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn),即只需要設(shè)置視圖名稱時(shí),可以將處理器方法用 view-controller 標(biāo)簽表示
    • 當(dāng)SpringMVC 中設(shè)置任何一個(gè) view-controller 時(shí),其他控制器中的請(qǐng)求映射將全部失效,可以使用標(biāo)簽<mvc:annotation-driven />開(kāi)啟
    <mvc:view-controller path="/testView" view-name="success"></mvc:view-controller>

    六 RESTful

    • Representational State Transfer,表現(xiàn)層資源狀態(tài)轉(zhuǎn)移
    • REST 風(fēng)格提倡 URL 地址使用統(tǒng)一的風(fēng)格設(shè)計(jì),從前到后各個(gè)單詞使用斜杠分開(kāi),不使用問(wèn)號(hào)鍵值對(duì)方式攜帶請(qǐng)求參數(shù),而是將要發(fā)送給服務(wù)器的數(shù)據(jù)作為 URL 地址的一部分,以保證整體風(fēng)格的一致性
    • 對(duì)于 HTTP 的四種請(qǐng)求:
    操作
    HTTP 請(qǐng)求RESTful
    插入POST/user(請(qǐng)求為 POST)
    刪除DELETE/user/id(請(qǐng)求為 DELETE)
    更新PUT/user(請(qǐng)求為 PUT)
    查詢GET/user/id(請(qǐng)求為 GET)
    • SpringMVC 中提供了兩個(gè)過(guò)濾器:CharacterEncodingFilter 和 HiddenHttpMethodFilter
    • 使用 HiddenHttpMethodFilter 模擬 DELETE 和 PUT
    • 在 web.xml 中注冊(cè)時(shí),必須先注冊(cè) CharacterEncodingFilter,再注冊(cè) HiddenHttpMethodFilter,因?yàn)镃haracterEncodingFilter要求前面不能有任何獲取請(qǐng)求參數(shù)的操作,而 CharacterEncodingFilter 獲取了 request 參數(shù)

    七 HttpMessageConverter

    • 報(bào)文信息轉(zhuǎn)換器,將 請(qǐng)求報(bào)文 轉(zhuǎn)換為Java對(duì)象,或?qū)ava對(duì)象轉(zhuǎn)換為 響應(yīng)報(bào)文
    • HttpMessageConverter提供了兩個(gè)注解和兩個(gè)類型:@RequestBody,@ResponseBody,RequestEntity,ResponseEntity

    1 @RequestBody

    • @RequestBody 可以獲取請(qǐng)求體(僅僅是請(qǐng)求體而非整個(gè) HTTP 報(bào)文,POST 具有請(qǐng)求體,而 GET 不具有)
    • 需要在控制器方法設(shè)置一個(gè)形參,使用 @RequestBody 進(jìn)行標(biāo)識(shí),當(dāng)前請(qǐng)求的請(qǐng)求體就會(huì)為當(dāng)前注解所標(biāo)識(shí)的形參賦值
    • 可以將前端傳來(lái)的 json 轉(zhuǎn)為對(duì)象
    @RequestMapping("/testRequestBody") public String testRequestBody(@RequestBody String requestBody){System.out.println(requestBody);return "success"; }// 輸出 requestBody:username=admin&password=123456 @Override @PostMapping("/add") public CmsPageResult add(@RequestBody CmsPage cmsPage) { // @RequestBody將json轉(zhuǎn)為對(duì)象return this.pageService.add(cmsPage); }

    2 RequestEntity

    • RequestEntity 封裝 HTTP 請(qǐng)求報(bào)文,需要在控制器方法的形參中的 泛型位置 設(shè)置要將報(bào)文轉(zhuǎn)換的目標(biāo)類型,當(dāng)前請(qǐng)求的請(qǐng)求報(bào)文就會(huì)賦值給該形參
    • 通過(guò) getHeaders() 獲取請(qǐng)求頭信息,通過(guò) getBody() 獲取請(qǐng)求體信息
    @RequestMapping("/request_entity") public String requestEntityTest(RequestEntity<String> entity) {System.out.println(entity.getHeaders());System.out.println(entity.getBody());return "success"; }

    3 @ResponseBody

    • @ResponseBody 用于標(biāo)識(shí)一個(gè) 控制器方法,可以將該方法的 返回值 直接作為響應(yīng)報(bào)文的 響應(yīng)體 響應(yīng)到瀏覽器
    @RequestMapping("/response_body") @ResponseBody public String responseBodyTest() {return "TIGER YEAR"; }
    • 如果需要以 json 格式,打印 Java對(duì)象的響應(yīng)體,需要導(dǎo)入 jackson 依賴并開(kāi)啟 mvc 注解驅(qū)動(dòng)
    pom.xml:<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.1</version></dependency>mvc核心配置文件: <mvc:annotation-driven /> @RequestMapping("/response_body_json") @ResponseBody public User responseBodyJsonTest() {return new User("my_name", "my_passwd"); }

    4 ResponseEntity

    • 用于控制器方法的返回值類型,該控制器方法的返回值就是響應(yīng)到瀏覽器的響應(yīng)報(bào)文
    • 可以實(shí)現(xiàn)文件下載的功能

    5 RestController

    • 復(fù)合注解,標(biāo)識(shí)控制器類,就相當(dāng)于為類添加了 @Controller 注解,并且為其中的每個(gè)方法添加了 @ResponseBody 注解

    八 攔截器

    • 攔截的是控制器方法執(zhí)行
    • 和過(guò)濾器 filter 的主要區(qū)別是,filter 作用于瀏覽器到 Servlet 的過(guò)程中,而攔截器作用于 Controller 執(zhí)行前(Servlet 到 Controller 的過(guò)程中),以及 Controller 返回后 的過(guò)程中

    1 配置方法

    在 SpringMVC 配置文件中:

    <!-- 前兩種對(duì)DispatcherServlet所處理的*所有的請(qǐng)求*進(jìn)行攔截 --><mvc:interceptors><!--方式一:--><bean class="interceptor.MyInterceptor"></bean><!--方式二:--><ref bean="myInterceptor"></ref><!--方式三:可以自定義攔截路徑--><!--可以通過(guò)ref或bean標(biāo)簽設(shè)置攔截器,通過(guò)mvc:mapping設(shè)置需要攔截的請(qǐng)求,通過(guò)mvc:exclude-mapping設(shè)置需要排除的請(qǐng)求,即不需要攔截的請(qǐng)求--><mvc:interceptor><mvc:mapping path="/**"/><mvc:exclude-mapping path="/testRequestEntity"/><ref bean="myInterceptor"></ref></mvc:interceptor></mvc:interceptors>

    攔截器類:

    @Component public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("pre");return true; // 返回 true 放行}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("post");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("after");} }

    2 HandlerInterceptor 接口的三個(gè)方法

    • preHandle:返回值為 bool 類型,返回 true 放行,false 攔截
    • postHandle:控制器方法執(zhí)行之后執(zhí)行
    • afterComplation:渲染視圖完畢之后執(zhí)行

    3 多個(gè)攔截器的執(zhí)行順序

    • 如果所有攔截器的 preHandle() 都返回 true,則 preHandle() 按照配置的順序執(zhí)行,postHandle() 和 afterComplation() 按照配置的反序執(zhí)行
    • 如果某個(gè)攔截器的 preHandle() 返回 false,preHandle() 返回 false 的攔截器和它之前的攔截器的 preHandle() 都會(huì)執(zhí)行,postHandle() 都不執(zhí)行,返回 false 的攔截器之前的攔截器的 afterComplation() 會(huì)倒序執(zhí)行
    • 下圖是所有攔截器的 preHandle() 都返回 true 的情況,如果攔截器3返回 false,則方法的執(zhí)行順序是: 1.prehandle->2.prehandle->3.prehandle->2.afterCompletion->1.afterCompletion

    九 異常處理器

    1 基于配置

    在 SpringMVC 的核心配置文件中:

  • 設(shè)置異常類型與視圖名稱的映射
  • 保存異常信息到 request 域(可選)
  • <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"> <!--properties類型,鍵值對(duì)的結(jié)構(gòu)--><props><!--1. key表示處理器方法執(zhí)行過(guò)程中出現(xiàn)的異常,全類名value(寫在雙標(biāo)簽之內(nèi))表示若出現(xiàn)指定異常時(shí),設(shè)置一個(gè)新的視圖名稱,跳轉(zhuǎn)到指定頁(yè)面--><prop key="java.lang.ArithmeticException">error</prop></props></property><!--2. exceptionAttribute:將出現(xiàn)的異常信息在請(qǐng)求域中進(jìn)行共享,value屬性是信息的key--><property name="exceptionAttribute" value="info_key"></property> </bean>

    出現(xiàn)異常后,跳轉(zhuǎn)到 error.html 訪問(wèn)異常信息:

    <body><p th:text="${info_key}"></p> </body>

    2 基于注解

    • 使用 @ControllerAdvice 注解異常處理類
    • 使用 @ExceptionHandler(異常類的class對(duì)象) 注解異常處理方法
    // 標(biāo)識(shí)為異常處理組件 @ControllerAdvice public class AnnotationExceptionController {// 處理的異常類型,處理多種異常時(shí) @ExceptionHandler(value = {...})@ExceptionHandler(ArithmeticException.class)public String divide0(Exception exception, Model model) {// 向 request 域中寫入鍵值對(duì)model.addAttribute("info_key", exception);// 交由 thymeleaf 解析return "fail";} }

    十 使用注解配置 SpringMVC

    • 目的是使用配置類和注解代替 web.xml 和 SpringMVC 配置文件的功能

    1 初始化類:代替 web.xml

    • 繼承自 AbstractAnnotationConfigDispatcherServletInitializer
    /* * 需要完成的功能: * 1.servlet * 2.servlet-mapping * 3.過(guò)濾器 * 4.Spring配置類 * 5.SpringMVC配置類*/ public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {// 指定 Spring 配置類@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{MySpringConfig.class}; // 創(chuàng)建長(zhǎng)度為1的Class數(shù)組,放入MySpringConfig.class}// 指定SpringMVC的配置類@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{MyWebConfig.class}; // 同上}// 指定DispatcherServlet的映射規(guī)則,即url-pattern@Overrideprotected String[] getServletMappings() {return new String[]{"/"}; // 設(shè)置servlet-mapping}// 過(guò)濾器@Overrideprotected Filter[] getServletFilters() {// 過(guò)濾器1CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();encodingFilter.setEncoding("UTF-8");encodingFilter.setForceRequestEncoding(true);// 過(guò)濾器2HiddenHttpMethodFilter hiddenHttpMethodFilter = newHiddenHttpMethodFilter();return new Filter[]{encodingFilter, hiddenHttpMethodFilter};} }

    2 SpringConfig 類:代替 Spring 配置文件(略)

    @Configuration public class MySpringConfig {// ... }

    3 WebConfig 類:代替 SpringMVC 配置文件

    • @Bean 的作用是,將方法返回值(Java 對(duì)象)交給 IOC 容器
    /* * 需要完成的功能: * 1.組件掃描 * 2.thymeleaf視圖解析器 * 3.視圖控制器 * 4.mvc注解驅(qū)動(dòng) * 5.攔截器 * 6.異常處理器 * 7.default-servlet-handler * 8.文件上傳解析器*/@Configuration // 標(biāo)注當(dāng)前類為配置類 @ComponentScan(value = {"config", "controller", "interceptor"}) // 開(kāi)啟組件掃描 @EnableWebMvc // 開(kāi)啟注解驅(qū)動(dòng) public class MyWebConfig implements WebMvcConfigurer {/*************************** 重寫WebMvcConfigurer類的方法 ***************************/// 使用默認(rèn)的servlet處理靜態(tài)資源@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();}// 攔截器@Overridepublic void addInterceptors(InterceptorRegistry registry) {MyInterceptor myInterceptor = new MyInterceptor();registry.addInterceptor(myInterceptor).addPathPatterns("/**");}// 視圖控制器@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/").setViewName("index");}// 異常處理器,一種實(shí)現(xiàn)方式,也可以配置為 @bean@Overridepublic void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {// 寫法參考之前的 SpringMVC 配置文件Properties properties = new Properties();properties.setProperty("java.lang.ArithmeticException", "fail"); // (異常全類名,跳轉(zhuǎn)視圖名稱)SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver();simpleMappingExceptionResolver.setExceptionMappings(properties); // 設(shè)置異常映射simpleMappingExceptionResolver.setExceptionAttribute("info_key"); // 設(shè)置異常信息的keyresolvers.add(simpleMappingExceptionResolver);}/************************* 配置 thymeleaf 視圖解析器 *******************************/// 1.配置生成模板解析器@Bean // @Bean的返回值放入IOC容器public ITemplateResolver templateResolver() {WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();// ServletContextTemplateResolver需要一個(gè)ServletContext作為構(gòu)造參數(shù),可通過(guò)WebApplicationContext 的方法獲得ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(webApplicationContext.getServletContext());templateResolver.setPrefix("/templates/");templateResolver.setSuffix(".html");templateResolver.setCharacterEncoding("UTF-8");templateResolver.setTemplateMode(TemplateMode.HTML);return templateResolver;}// 2.生成模板引擎并為其注入模板解析器@Beanpublic SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) { // !!!參數(shù)進(jìn)行了自動(dòng)裝配SpringTemplateEngine templateEngine = new SpringTemplateEngine();templateEngine.setTemplateResolver(templateResolver);return templateEngine;}// 3.生成視圖解析器并為其注入模板引擎@Beanpublic ViewResolver viewResolver(SpringTemplateEngine templateEngine) {ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();viewResolver.setCharacterEncoding("UTF-8");viewResolver.setTemplateEngine(templateEngine);return viewResolver;}/************************* 其它插件 *******************************/// 配置文件上傳解析器 // @Bean // public CommonsMultipartResolver multipartResolver(){ // return new CommonsMultipartResolver(); // }}

    十一 SpringMVC 執(zhí)行流程

    1 常用組件

    • DispatcherServlet:前端控制器,不需要工程師開(kāi)發(fā),由框架提供
      作用:統(tǒng)一處理請(qǐng)求和響應(yīng),整個(gè)流程控制的中心,由它調(diào)用其它組件處理用戶的請(qǐng)求

    • HandlerMapping:處理器映射器,不需要工程師開(kāi)發(fā),由框架提供
      作用:根據(jù)請(qǐng)求的url、method等信息查找Handler,即控制器方法

    • Handler:處理器
      作用:在DispatcherServlet的控制下Handler對(duì)具體的用戶請(qǐng)求進(jìn)行處理

    • HandlerAdapter:處理器適配器,不需要工程師開(kāi)發(fā),由框架提供
      作用:通過(guò)HandlerAdapter對(duì)處理器(控制器方法)進(jìn)行執(zhí)行

    • ViewResolver:視圖解析器,不需要工程師開(kāi)發(fā),由框架提供
      作用:進(jìn)行視圖解析,得到相應(yīng)的視圖,例如:ThymeleafView、InternalResourceView、RedirectView

    • View:視圖
      作用:將模型數(shù)據(jù)通過(guò)頁(yè)面展示給用戶

    2 流程總結(jié)

  • 用戶向服務(wù)器發(fā)送請(qǐng)求,被 SpringMVC 前端控制器 DispatcherServlet 捕獲
  • DispatcherServlet 解析 URL(統(tǒng)一資源定位器),得到URI(請(qǐng)求資源標(biāo)識(shí)符),并與配置的 servlet-mapping 進(jìn)行匹配,判斷請(qǐng)求 URI 對(duì)應(yīng)的映射:
    (1) 可以匹配,則交給具體的 Servlet,前往步驟3
    (2) 不能匹配,如果配置了 mvc:default-servlet-handler ,訪問(wèn)目標(biāo)資源(一般為靜態(tài)資源,如:JS, CSS, HTML),找不到展示404錯(cuò)誤
    (3) 不能匹配,沒(méi)有配置 mvc:default-servlet-handler,展示404錯(cuò)誤
  • 根據(jù) URI,調(diào)用 HandlerMapping 獲得該 Handler 配置的所有相關(guān)的對(duì)象(包括 Handler 對(duì)象以及Handler 對(duì)象對(duì)應(yīng)的攔截器),最后以 HandlerExecutionChain 執(zhí)行鏈對(duì)象的形式返回
  • DispatcherServlet 根據(jù)獲得的 Handler,選擇一個(gè)合適的 HandlerAdapter(Handler 執(zhí)行需要依賴HandlerAdapter)
  • 如果成功獲得 HandlerAdapter,此時(shí)將開(kāi)始執(zhí)行攔截器的 preHandler() 方法
  • 向控制器方法傳遞客戶端請(qǐng)求 Request 攜帶的參數(shù),執(zhí)行控制器方法,此處可以配置一些額外操作:
    (1) HttpMessageConveter: 將請(qǐng)求消息(如Json、xml等數(shù)據(jù))轉(zhuǎn)換成一個(gè)對(duì)象,將對(duì)象轉(zhuǎn)換為指定的響應(yīng)信息
    (2) 數(shù)據(jù)格式化、數(shù)據(jù)驗(yàn)證…
  • 控制器方法執(zhí)行完成后,向 DispatcherServlet 返回一個(gè) ModelAndView 對(duì)象
  • 執(zhí)行攔截器的 postHandle() 方法
  • DispatcherServlet 根據(jù)返回的 ModelAndView(首先判斷是否存在異常:如果存在異常,則執(zhí)行HandlerExceptionResolver 進(jìn)行異常處理)選擇一個(gè)適合的 ViewResolver 進(jìn)行視圖解析,根據(jù) Model 和 View,渲染視圖
  • 執(zhí)行攔截器的 afterCompletion() 方法
  • 將渲染結(jié)果返回給客戶端
  • 總結(jié)

    以上是生活随笔為你收集整理的后端学习 - SpringMVC的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    欧美性生活免费看 | 久久国产电影院 | 久久99国产综合精品免费 | 欧美一区日韩一区 | 国产在线精品福利 | 成人久久综合 | 在线免费观看av网站 | 日本精油按摩3 | 久久dvd | 日韩av成人在线观看 | 国产精品久久久一区二区三区网站 | 99一级片 | 国产精品色在线 | 成人小视频在线观看免费 | 91av手机在线| 五月婷久 | 综合色狠狠 | 丁香综合网| 欧美激情第一区 | 久久久综合 | 懂色av懂色av粉嫩av分享吧 | 国产精品免费一区二区三区 | 久久草草热国产精品直播 | 成人三级网站在线观看 | 国产成人精品日本亚洲999 | 成人午夜剧场在线观看 | 超碰免费成人 | 国产精品成人av在线 | 色综合天天综合 | 视频91| 欧美一区,二区 | 亚洲精品在线视频观看 | 国产露脸91国语对白 | 1000部国产精品成人观看 | 久久精品这里都是精品 | 天天操天天操天天操天天 | 91看片淫黄大片91 | 国产午夜激情视频 | 国产精品久久久久毛片大屁完整版 | 91麻豆文化传媒在线观看 | 特级大胆西西4444www | 久久激情婷婷 | 日本精品视频一区 | av一区二区三区在线播放 | 亚洲成人黄色在线观看 | 国产破处在线视频 | 国产精品久久久久久99 | 国产精品久久久久久久久费观看 | 午夜精品久久 | 色午夜影院 | 天天综合网 天天综合色 | 看片一区二区三区 | 美女一区网站 | 久久超碰免费 | 91丨精品丨蝌蚪丨白丝jk | 亚洲精品视频在线观看网站 | 国产精品美女久久久久aⅴ 干干夜夜 | 蜜臀av麻豆 | 99久久精品无免国产免费 | 日韩高清网站 | 国产剧情一区在线 | 欧美激情精品久久久久久变态 | 99草在线视频 | 五月视频| 99精品在线免费在线观看 | 国产免费三级在线观看 | 最新国产在线 | 涩涩在线 | 午夜av免费观看 | 亚洲高清激情 | 日日夜夜网站 | 亚洲人人爱 | 91传媒91久久久 | 国产精品成久久久久三级 | 国产伦理久久精品久久久久_ | 91香蕉国产在线观看软件 | 免费网站看v片在线a | 久久精品视频在线看 | 不卡av免费在线观看 | 美女视频黄的免费的 | 色久网 | 成人a免费看 | 很污的网站 | 久久九九九九 | 亚洲国产午夜精品 | 在线看国产一区 | 国产日韩欧美视频在线观看 | 人人玩人人爽 | 一区二区三区av在线 | 国产国产人免费人成免费视频 | 精品国产自在精品国产精野外直播 | 日韩美精品视频 | 91久久久久久久一区二区 | 在线观看一区视频 | 欧美精品v国产精品v日韩精品 | 99久久久久久国产精品 | 国产人成一区二区三区影院 | 国产高清视频免费观看 | 99在线热播精品免费 | 中文国产成人精品久久一 | 亚洲国产欧洲综合997久久, | 亚洲国产日韩av | 久久伊人热 | 日韩在线观看第一页 | 色网站在线免费观看 | 成人 国产 在线 | 毛片一区二区 | 麻豆免费观看视频 | 蜜桃av人人夜夜澡人人爽 | 超碰在线中文字幕 | 91福利国产在线观看 | 黄色tv视频 | 成人av影院在线观看 | 欧美精品在线观看免费 | 天天射天天操天天 | 欧美日韩视频免费看 | 久久久久久久久影视 | 一区二区欧美在线观看 | 久久福利综合 | 手机在线视频福利 | 国产精品久久久久久久久久免费看 | 欧美在一区 | 精品乱码一区二区三四区 | 99精品国产亚洲 | 99久久99热这里只有精品 | 五月天最新网址 | 在线免费观看欧美日韩 | 国产精品999久久久 久产久精国产品 | 久久国产精品一区二区 | 国产一区精品在线观看 | 中文字幕日韩高清 | 中文字幕日本在线观看 | 欧美性色xo影院 | 美女视频久久黄 | 麻豆成人精品 | 亚洲国产精品资源 | 日本性生活免费看 | 一区二区三区手机在线观看 | 国产日韩精品在线观看 | 亚洲国产成人在线观看 | 日本九九视频 | 在线观看免费一级片 | 美女视频一区 | 免费在线看v | 91免费黄视频 | 91探花国产综合在线精品 | 精品免费观看视频 | 午夜美女视频 | 亚洲成人精品在线观看 | 91丨九色丨蝌蚪丨对白 | 在线看一区 | 久久视频这里只有精品 | 江苏妇搡bbbb搡bbbb | 婷婷福利影院 | 久久久精品国产免费观看一区二区 | 国产伦精品一区二区三区四区视频 | 免费观看的黄色片 | 丁香婷婷在线观看 | 午夜视频播放 | 久免费 | 精品xxx | 欧美日韩一区二区在线 | 日日操日日干 | 99久久精品久久久久久清纯 | 国产热re99久久6国产精品 | 肉色欧美久久久久久久免费看 | 日韩精品中文字幕在线播放 | 激情久久网 | 国产成人精品久 | 毛片网在线观看 | 国产精品av久久久久久无 | 丁香视频全集免费观看 | 亚洲精品久久激情国产片 | 丁香免费视频 | 日韩a免费 | 久久黄色影视 | 国产在线观看91 | 五月开心婷婷网 | 国产成人一区二 | 亚洲影音先锋 | 久艹视频在线观看 | 精品久久久久久久久亚洲 | 亚洲精品国产视频 | 天天色天天操天天爽 | 2021av在线 | 日韩一区二区三区在线看 | 黄色大全免费观看 | 97国产精品一区二区 | 99爱视频在线观看 | 99精品视频在线观看视频 | 奇米影视777四色米奇影院 | 五月激情丁香婷婷 | 午夜在线免费观看 | 久久久网 | 国产视频99 | 高清av中文在线字幕观看1 | 麻豆视频观看 | 精品国产观看 | 欧洲在线免费视频 | 精品免费视频 | 午夜婷婷网 | 久久久黄色av | av成人在线电影 | 欧美一级久久久久 | 亚洲理论视频 | 狠狠色丁香婷婷综合最新地址 | 国产va饥渴难耐女保洁员在线观看 | 日本一区二区三区免费看 | 久久久久免费精品视频 | 色婷婷国产 | 99久久精品国产观看 | 欧美色综合天天久久综合精品 | 国产精品久久久久久999 | 久久久久久网址 | 日韩激情综合 | 中文字幕av日韩 | 久久国产系列 | 成年人视频在线免费 | 国产美女搞久久 | 日韩有码欧美 | av免费看看 | 亚一亚二国产专区 | 久久a国产 | 999久久精品 | 成人在线一区二区 | 久久福利剧场 | 久久大片网站 | 亚洲精品国产电影 | 久久免费视频这里只有精品 | 91大神精品视频在线观看 | 亚洲精品美女久久17c | 成人精品视频 | 深夜成人av | 国产福利资源 | 成人国产一区二区 | 日韩视频免费 | 91中文字幕永久在线 | 国产成人av网址 | 欧美一二三专区 | 999成人国产 | 国产高清不卡 | 香蕉网在线观看 | 麻豆视频在线免费看 | 久久久久久久久久久免费视频 | 在线中文视频 | 成人小视频在线观看免费 | 国产韩国精品一区二区三区 | 蜜桃视频精品 | 免费中文字幕在线观看 | 色资源在线 | 91视频在线播放视频 | 亚洲成人欧美 | 性色av香蕉一区二区 | 国产黄a三级 | 久久久久久久久久久成人 | 五月婷丁香网 | 91精品国产91久久久久 | 久久精品精品 | 亚洲四虎影院 | 亚洲,播放 | 国产精品永久久久久久久www | 中文字幕在线观看你懂的 | 久久久久久久久久久久久久免费看 | 在线免费观看欧美日韩 | 草莓视频在线观看免费观看 | 久久免费视频99 | 天天草天天摸 | 韩国一区二区三区视频 | 国产精品久久久久久久午夜片 | 91麻豆产精品久久久久久 | av电影在线免费 | 国产一区在线播放 | www五月天com| 成人在线中文字幕 | 丁香久久婷婷 | 99精品国产一区二区三区不卡 | 日韩一区二区三区免费电影 | 天天爱综合 | 国产精品69久久久久 | 日日夜夜天天 | av在线播放中文字幕 | av免费在线免费观看 | 99热这里只有精品在线观看 | 久久婷婷视频 | 亚洲国产美女精品久久久久∴ | 91亚洲成人| 精品久久久久久综合日本 | 久久视频精品在线 | 一区二精品 | 亚洲精品ww | 国产免费叼嘿网站免费 | 91精品国产成人观看 | 免费观看v片在线观看 | 97成人啪啪网 | 日韩婷婷 | 精品久久亚洲 | 国产精品久久 | 国产一区二区在线免费视频 | 91香蕉视频好色先生 | 成年人免费av | 天堂av免费观看 | 91精品久久久久久久久久久久久 | 国产精品原创av片国产免费 | 久久婷婷五月综合色丁香 | 亚洲精品456在线播放 | av资源免费观看 | 国产精品国产三级国产aⅴ9色 | 中文字幕色婷婷在线视频 | 91在线视频精品 | 精品国产99国产精品 | 99riav1国产精品视频 | 精品国产不卡 | 丁香影院在线 | 中文字幕观看在线 | 欧美一二三在线 | 国产亚洲精品久久久网站好莱 | 人人爽人人插 | 欧洲一区二区在线观看 | 亚洲日日日 | 国产高清第一页 | 久久免费看片 | 探花视频在线观看 | 国外成人在线视频网站 | 日韩精品久久一区二区 | 午夜精品久久久久久久爽 | 色a资源在线 | 国产亚洲精品美女久久 | 国产一级黄 | 成片免费观看视频大全 | 在线a亚洲视频播放在线观看 | 国产一区高清在线 | 亚洲乱码国产乱码精品天美传媒 | 日本性xxx | 999视频精品 | 欧美精品免费视频 | 综合久久2023| 国产高清在线观看av | 久久黄色影视 | 色老板在线 | 国产手机在线观看视频 | 特黄特黄的视频 | 欧美老女人xx| 亚洲美女在线国产 | 久久视频精品在线观看 | 黄网站免费大全入口 | 中国一区二区视频 | 91av蜜桃| 黄色片网站免费 | 国产一区精品在线 | 国产精品久久久久久久久久久久冷 | 免费国产在线视频 | 欧美一级片免费观看 | 在线小视频你懂的 | 国产精品国产亚洲精品看不卡 | 日韩欧美一区二区不卡 | 日韩免费在线观看 | 久久r精品 | 欧美日韩一区二区免费在线观看 | 国产日本亚洲高清 | 久草新在线 | 色妞色视频一区二区三区四区 | 亚洲综合激情五月 | 中文字幕一区二区在线播放 | 亚洲成人av影片 | 欧美视频www | 日韩高清精品一区二区 | 日本在线观看中文字幕无线观看 | 91九色视频 | 日韩电影在线看 | 亚洲一二三久久 | 毛片美女网站 | 日韩免费观看高清 | 91丨九色丨蝌蚪丰满 | 久久久久国产精品一区二区 | www.五月婷婷 | 特级西西人体444是什么意思 | 久久手机精品视频 | 天天综合网久久综合网 | 96久久欧美麻豆网站 | 五月婷婷丁香综合 | 8x成人免费视频 | 国产日韩中文字幕 | 97超碰国产在线 | 国产精品美女久久久久久免费 | 久久综合丁香 | 免费www视频 | 91在线国产观看 | 黄色91在线观看 | 久久久黄色av| 日韩一二三区不卡 | 亚洲情感电影大片 | 永久免费视频国产 | 中文字幕丝袜制服 | 黄色在线看网站 | 丁香婷婷深情五月亚洲 | 亚洲视频久久久久 | 全黄色一级片 | 国产在线欧美在线 | 国产午夜精品久久 | av片一区二区 | 99久久99久久免费精品蜜臀 | 伊人婷婷色 | 四虎成人精品在永久免费 | 婷久久| 午夜视频免费播放 | 精品99久久 | 亚洲欧美国内爽妇网 | 一区二区三区四区在线免费观看 | 美女国内精品自产拍在线播放 | 欧美一级裸体视频 | 在线国产专区 | 国产精品3 | 日本精品xxxx| 精品a视频 | 欧美综合久久久 | 亚洲成年人在线播放 | 天天天天天天天天操 | 日韩在线免费电影 | 欧美成人一区二区 | 久久久久久99精品 | 国产探花视频在线播放 | 九精品| 国产高清在线永久 | 精品久久久久国产免费第一页 | 亚洲欧洲中文日韩久久av乱码 | 亚洲乱码久久 | 欧美黑人xxxx猛性大交 | 中文字幕在线观看视频一区二区三区 | 国产在线超碰 | 日韩在线视频免费看 | 最近中文字幕mv免费高清在线 | 天天天操操操 | 国产成在线观看免费视频 | 欧美另类亚洲 | 四川bbb搡bbb爽爽视频 | av成人动漫在线观看 | 天天色天天射天天综合网 | 亚洲狠狠操 | www色,com| 中文字幕日韩国产 | 亚洲成a人片在线观看网站口工 | 久草香蕉在线视频 | 欧美一级片免费在线观看 | 国产剧情在线一区 | 色片网站在线观看 | 69av在线视频 | 91黄色免费网站 | 日本精品免费看 | 91av在线电影 | 天天射天天 | 在线观看理论 | 免费日韩 精品中文字幕视频在线 | 久久国产午夜精品理论片最新版本 | www看片网站 | 午夜视频不卡 | www.com黄 | 少妇bbb搡bbbb搡bbbb′ | 国产精品久久久久久久久蜜臀 | 最新国产精品视频 | 亚洲精品午夜久久久久久久 | 久久精品国产一区二区 | 91精品国自产在线偷拍蜜桃 | 欧美性生活小视频 | 国产精品精品久久久久久 | 成人一级片视频 | 91精品久久久久久久久久久久久 | 久久99精品久久久久婷婷 | www.亚洲精品视频 | 久久精品福利视频 | 91日本在线播放 | 免费在线观看一区二区三区 | 91av小视频| 成人一级黄色片 | 久久久久国产精品视频 | 久久久久伦理电影 | 久草在线 | 最新99热| 色婷婷电影网 | 在线影视 一区 二区 三区 | 精品无人国产偷自产在线 | 在线免费av电影 | 最新极品jizzhd欧美 | 最近中文字幕免费视频 | 西西人体4444www高清视频 | 国产精品区一区 | 涩涩网站在线播放 | 成人a在线 | 香蕉影视app| 欧洲不卡av| 午夜a区 | 精品一二三区视频 | 国产成人免费网站 | 国产无套精品久久久久久 | 天天操夜夜操 | 91高清在线| 色中色亚洲 | 亚洲成av人电影 | 免费一级特黄毛大片 | 精品欧美一区二区在线观看 | 日本激情视频中文字幕 | 亚洲撸撸| 免费精品 | 久久人人爽人人爽人人片 | 99这里精品 | 久久久久国产成人免费精品免费 | 99精品国产成人一区二区 | 在线观看视频亚洲 | 久久亚洲影视 | 999久久久欧美日韩黑人 | 国产免费高清视频 | 福利av在线 | 日韩三级在线 | 国产午夜精品一区二区三区四区 | 麻豆精品在线 | 亚洲天天干| 国产精品自在线 | 国产一区二区视频在线 | 欧美亚洲另类在线视频 | 精品国产欧美一区二区 | 国产3p视频 | 中文字幕在线视频精品 | 婷婷色网视频在线播放 | 狠狠色狠狠色综合系列 | 日韩中文字幕免费在线观看 | 久久精品视频在线观看免费 | 中文av不卡 | 国产一区高清在线观看 | 天天做综合网 | 波多野结依在线观看 | 久久亚洲精品国产亚洲老地址 | 国产色视频网站2 | 午夜一级免费电影 | 97精品超碰一区二区三区 | 欧美激情va永久在线播放 | 91探花系列在线播放 | 国产欧美日韩视频 | 亚洲成人午夜av | 欧美在线观看视频 | 日韩无在线 | 国产 亚洲 欧美 在线 | 少妇bbb搡bbbb搡bbbb | 亚洲a网| 国产色婷婷精品综合在线手机播放 | 天天干天天操天天搞 | 欧美日韩国产一二 | 国产精品欧美激情在线观看 | 97视频在线观看成人 | 亚洲午夜大片 | 美女啪啪图片 | 性色av免费在线观看 | 五月天六月丁香 | 99在线热播 | 91九色国产蝌蚪 | 欧美日韩中文在线 | 夜夜操天天干, | 国产美女网 | 国产精品久久久一区二区 | 草久久久久久 | 亚洲视频高清 | 美女在线免费观看视频 | 婷婷色网站 | 午夜性色 | 免费在线a | 久草视频免费看 | 免费在线成人av电影 | 在线日韩中文 | 欧美a免费 | 久久成人久久 | 91精品电影| 久久久www成人免费毛片麻豆 | 视频一区亚洲 | 日日躁你夜夜躁你av蜜 | 日韩一区二区三区免费视频 | 免费看黄的视频 | 6080yy精品一区二区三区 | 国产国语在线 | 精品美女国产在线 | 人人干天天干 | 91观看视频| 欧美日韩1区 | 黄色网在线免费观看 | 91精品久久久久久久久久久久久 | 国产精品一区二区久久精品爱涩 | 久久神马影院 | 国产精品一区二区久久国产 | 国产码电影 | 岛国av在线| 欧美午夜久久久 | 综合久久久久久久久 | 天天操天天干天天爱 | 麻豆视频免费网站 | 欧美成亚洲 | 国产女v资源在线观看 | 国产午夜小视频 | 国产91电影在线观看 | 久久超碰99| 久久久不卡影院 | 开心激情综合网 | 亚洲aⅴ在线 | 国语自产偷拍精品视频偷 | 国产精品美女久久久久久免费 | 福利视频网站 | 国产精品视频免费 | 在线播放精品一区二区三区 | 欧美一区二区三区特黄 | 久久99热这里只有精品 | 狠狠成人 | 国产精品午夜在线 | 天天干天天操天天拍 | 在线视频一区观看 | 亚洲乱码久久久 | 亚洲午夜久久久影院 | 久久精品在线免费观看 | 国产视频在线观看一区 | 欧美日韩高清在线 | 国产精品中文久久久久久久 | 在线观看av中文字幕 | 欧美一级看片 | 狠狠躁日日躁狂躁夜夜躁av | 欧美另类性 | 少妇搡bbbb搡bbb搡aa | 久久免费视频3 | 欧美日韩在线观看一区二区三区 | 亚洲干视频在线观看 | 毛片激情永久免费 | 久久久久久久久久久久亚洲 | 欧美成人性战久久 | av在线播放不卡 | 天天夜夜狠狠操 | 人人澡人 | 免费观看日韩 | 伊人黄色网| 欧美成年人在线观看 | 亚洲在线看 | 欧美日韩视频精品 | 超碰人人草 | 日韩一区二区三区观看 | 91福利国产在线观看 | 精品亚洲在线 | 中文字幕一区二区三区四区 | www国产亚洲 | 91在线亚洲 | 天天操天天操天天爽 | 激情综合网五月婷婷 | 亚洲精品国产视频 | 国产精品久久久久久久久毛片 | 91精品国产99久久久久久久 | 国产在线永久 | 中文免费观看 | www.国产高清 | 久草视频99 | 996久久国产精品线观看 | 亚洲在线成人精品 | 欧美在线视频一区二区 | 波多野结衣在线视频一区 | 中文字幕电影一区 | 精品一区二区三区四区在线 | 69精品在线 | 成年人黄色免费网站 | 西西444www大胆高清图片 | 中文国产在线观看 | 国产日韩精品在线观看 | 婷婷丁香久久五月婷婷 | 日韩av在线小说 | 国产免费观看视频 | 91久久人澡人人添人人爽欧美 | 久久免费福利视频 | 黄色一级性片 | 国产精品视频在线看 | 狠狠躁天天躁综合网 | 一级做a爱片性色毛片www | 国产高清在线免费 | 天堂av最新网址 | 国产精品va最新国产精品视频 | 免费在线观看av不卡 | 91福利小视频| 美女黄视频免费 | 97在线成人| 99精品视频免费看 | www.亚洲激情.com| 91视频 - v11av | 婷婷开心久久网 | 日韩有码在线观看视频 | 91精品国产综合久久久久久久 | 亚洲午夜电影网 | 国产亚洲精品久久久久久大师 | 色中色资源站 | 亚洲欧美视频网站 | 久久国产精品99久久久久久老狼 | 狠狠狠色丁香婷婷综合激情 | 国产精品99页 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 免费观看丰满少妇做爰 | 亚洲国产偷 | 日韩一区二区三区不卡 | 91免费视频黄 | 91精品国产99久久久久久红楼 | 日韩在线二区 | 亚洲视频播放 | 国产大片黄色 | 欧美性脚交 | 午夜精品中文字幕 | 久久综合五月 | 国产一级电影免费观看 | 欧美日韩视频一区二区 | 麻豆影音先锋 | www,黄视频 | 久久精品免费 | 91九色精品女同系列 | 成人免费在线网 | 天天色中文 | av在线播放免费 | 精品久久久久久国产91 | a资源在线| 国产精品久久久久久久午夜 | 国产小视频你懂的在线 | 香蕉看片 | 日韩高清在线不卡 | 欧美日韩一区二区在线观看 | 国产午夜一级毛片 | 人人干狠狠操 | 天天综合天天做天天综合 | 精品亚洲欧美无人区乱码 | 久草在线在线精品观看 | 久久怡红院 | 国产xxxxx在线观看 | 三级黄色大片在线观看 | 中文免费观看 | 嫩草伊人久久精品少妇av | 日韩黄色免费在线观看 | 国内精品久久久久久久久久久久 | a√天堂资源| 日本久久成人 | 免费日韩在线 | 午夜精品一区二区三区免费视频 | 日本电影久久 | 亚洲高清91| 日韩视频一区二区在线观看 | 欧美黄色成人 | 日韩精品视频一二三 | 中文字幕一区二区三区在线观看 | 国产精品99久久久久久小说 | 免费三级网 | 久久久久久久久久免费 | 91久久精品一区二区三区 | 成人sm另类专区 | 91精品欧美| 欧美一级片免费观看 | 97超碰色偷偷 | 深爱开心激情网 | 在线观看黄色大片 | 香蕉网在线观看 | 国产成人精品不卡 | 欧美日韩高清一区二区 国产亚洲免费看 | 亚洲欧美日韩国产 | 亚洲成人高清在线 | 亚洲人人网 | av在线免费在线观看 | 韩国av电影在线观看 | 天天看天天操 | 国产在线最新 | 能在线观看的日韩av | 日韩欧美精品在线观看视频 | 免费看的黄色的网站 | 丁香激情综合 | 天天综合成人网 | 丝袜一区在线 | 日韩高清精品免费观看 | 日韩av视屏 | 91亚洲夫妻 | 亚洲精品国产免费 | 99精品一区| 国产91综合一区在线观看 | 国产精品成人av电影 | 国产视频在线观看一区 | 日韩电影一区二区三区在线观看 | 久久久www成人免费精品张筱雨 | 精品国产电影 | 在线观看成人福利 | 人人超碰在线 | 成人久久久久久久久 | 日本在线免费看 | 麻豆视频免费在线观看 | 国产免费久久久久 | 亚洲午夜精品久久久 | 91在线免费观看国产 | 日韩精品免费一区二区在线观看 | 国产成人99久久亚洲综合精品 | 亚洲精品自在在线观看 | 在线观看亚洲电影 | 友田真希av| www91在线 | 久久久久久久久久久久国产精品 | 国产精品成人一区二区 | 九九免费在线看完整版 | 91免费的视频在线播放 | 国产精品激情偷乱一区二区∴ | 五月婷婷视频在线 | 狠狠干我| 国产色视频 | 成人性生活大片 | 99视频播放 | 国产视频资源 | 久草在线高清视频 | 美女久久久久久久久久久 | 婷婷综合久久 | 六月丁香激情综合色啪小说 | 久久视频在线看 | 一区视频在线 | 粉嫩一二三区 | 黄a在线观看 | av免费试看 | 色资源网在线观看 | www.狠狠操.com| 久久久久国产a免费观看rela | 欧美日韩视频在线一区 | 精品国产伦一区二区三区 | 久香蕉 | 亚洲欧美日韩精品久久奇米一区 | 国产成人久久77777精品 | 亚洲精品h | 欧美日韩xxx| 亚洲黄色影院 | 亚洲美女视频在线 | 懂色av一区二区在线播放 | 91夫妻视频 | 欧美午夜精品久久久久 | av综合av | 亚洲一级二级 | 亚洲国产精彩中文乱码av | 亚洲成人黄色av | 黄色精品一区二区 | 五月综合色 | 超碰在线人 | 久久精品一区二区三区四区 | 亚洲精品在线视频网站 | 中文字幕精品一区二区精品 | 国产精品成人自拍 | 操久久网 | 色姑娘综合 | 精品久久久久一区二区国产 | 日韩国产精品久久 | 四虎影视成人永久免费观看视频 | 欧美日韩视频免费看 | 天天插综合 | 午夜久久影院 | 国际av在线 | 97超碰人人模人人人爽人人爱 | 国内揄拍国内精品 | 日韩在线免费观看视频 | 九九热精品视频在线播放 | 亚洲美女视频在线 | 天天综合网 天天综合色 | 91精品久久久久久久久 | 天天干天天做天天操 | av黄色在线观看 | 国产成人av一区二区三区在线观看 | 综合在线观看色 | 天天操人 | 成年人天堂com | 久久久久久蜜av免费网站 | 国产精品国产精品 | 黄色影院在线播放 | 久久都是精品 | 伊人网站| 草久热 | 成人黄色免费在线观看 | 9999亚洲| 综合激情伊人 | 久久国产精品一二三区 | 久久天堂亚洲 | 日韩字幕在线 | avv天堂| 欧美精品久久久久久久久久久 | 国产破处视频在线播放 | 欧美精品在线一区 | 一级欧美一级日韩 | 国产又粗又长的视频 | 中文字幕二区在线观看 | 狠狠狠色丁香婷婷综合激情 | av在线播放免费 | 日韩成人精品一区二区三区 | 国产精品婷婷午夜在线观看 | 中文免费 | 国产精品自产拍在线观看网站 | 成人av在线影视 | 天天拍天天色 | 国产精品一区二 | 亚洲精选视频免费看 | 欧美成人久久 | 亚洲成人av在线播放 | 国产美女在线精品免费观看 | 国产精品黑丝在线观看 | 麻豆成人精品 | 91pony九色丨交换 | 正在播放亚洲精品 | 欧美成人在线免费观看 | www.亚洲视频| 偷拍精偷拍精品欧洲亚洲网站 | www.神马久久 | 黄色福利视频网站 | 黄色一级在线视频 | 久久国产精品一国产精品 | 亚洲精品福利在线观看 | 天天艹天天 | 亚洲精品乱码久久久久久按摩 | 在线观看的av网站 | 亚洲九九精品 | 97在线观看免费高清完整版在线观看 | 久久午夜鲁丝片 | 免费在线一区二区 | 成人一区二区三区中文字幕 | 久久艹国产视频 | 亚洲网站在线 | 国产一在线精品一区在线观看 | 国产精品二区在线观看 | 国产精品国产亚洲精品看不卡15 | 美女免费视频一区二区 | av在线最新 | 久久久国产精品一区二区三区 | 天天色天天干天天色 | 免费在线观看日韩视频 | 五月天综合在线 | 婷婷综合激情 | 国产精品自产拍在线观看桃花 | 久久精品视频99 | 玖玖视频精品 | 久久精品国产亚洲aⅴ | 在线亚洲激情 | 成 人 黄 色 视频免费播放 | 一区中文字幕在线观看 | 午夜的福利 | 91在线国内视频 | 欧美色噜噜 | 伊人五月天综合 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 国产高清精| 久久99亚洲网美利坚合众国 | 婷婷综合成人 | av在线专区 | 久久国产成人午夜av影院潦草 | 欧美韩国在线 | 深夜免费福利网站 | 美女视频又黄又免费 | www.久久婷婷 | 99久久超碰中文字幕伊人 | 国产免费视频在线 | 91在线视频免费观看 | av.com在线 | 97av影院 | 日本护士三级少妇三级999 | 91精品一区国产高清在线gif | 国产五月婷 | 国产精品久久久久久久久久白浆 | 国产999精品视频 | 日韩av电影手机在线观看 | 亚洲精品动漫在线 | 亚洲伦理电影在线 | 色婷久久 | 丝袜美腿在线播放 | 狠狠久久婷婷 | 国产精品免费成人 | 日日干日日 | 一区二区国产精品 | 人人澡人人模 | 成人av电影在线 | av观看免费在线 | 日韩一区二区三区在线看 | 免费看片成年人 | 米奇影视7777 | 日本最新一区二区三区 | 亚洲网站在线看 | 99视频播放 | 免费在线观看亚洲视频 | 一区av在线播放 | 国产一级片观看 | 国产 一区二区三区 在线 | 97在线看 | 国内精品久久久久影院优 | 黄色国产区| 国产精品一区二区果冻传媒 | 久久99久久精品 | 久久国产精品成人免费浪潮 | 国产亚洲精品成人av久久ww | 天天天天天天天天操 | 国产香蕉久久精品综合网 | www.超碰97.com | 又黄又爽免费视频 | 久久亚洲免费 | 国产成人一区二区三区免费看 | 精品91视频| 91超级碰碰 | 97视频免费看 | 91看片黄色 | 欧美精品三级 | 日韩视频一区二区在线观看 | 麻豆一区在线观看 | 日批在线观看 |