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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

最全面的SpringMVC教程(二)——SpringMVC核心技术篇

發(fā)布時間:2023/12/16 javascript 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最全面的SpringMVC教程(二)——SpringMVC核心技术篇 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

本文為 【SpringMVC教程】核心技術篇 相關詳細介紹,具體將對視圖和模型拆分,重定向與轉發(fā),RequestMapping與其衍生注解,URL 模式匹配,牛逼的傳參,設定字符集,返回json數(shù)據(jù)(序列化),獲取請求中的json數(shù)據(jù),數(shù)據(jù)轉化,數(shù)據(jù)校驗,視圖解析器詳解,全局異常捕獲,處理資源,攔截器,全局配置類等SpringMVC相關核心技術進行詳盡介紹~

📌博主主頁:小新要變強 的主頁
👉Java全棧學習路線可參考:【Java全棧學習路線】最全的Java學習路線及知識清單,Java自學方向指引,內含最全Java全棧學習技術清單~
👉算法刷題路線可參考:算法刷題路線總結與相關資料分享,內含最詳盡的算法刷題路線指南及相關資料分享~
👉Java微服務開源項目可參考:企業(yè)級Java微服務開源項目(開源框架,用于學習、畢設、公司項目、私活等,減少開發(fā)工作,讓您只關注業(yè)務!)

??本文上接:最全面的SpringMVC教程(一)——SpringMVC簡介


目錄

文章標題

  • 前言
  • 目錄
  • 一、視圖和模型拆分
  • 二、重定向與轉發(fā)
  • 三、RequestMapping與其衍生注解
  • 四、URL 模式匹配
  • 五、牛逼的傳參
  • 六、設定字符集
  • 七、返回json數(shù)據(jù)(序列化)
  • 八、獲取請求中的json數(shù)據(jù)
  • 九、數(shù)據(jù)轉化
  • 十、數(shù)據(jù)校驗
  • 十一、視圖解析器詳解
  • 十二、全局異常捕獲
  • 十三、處理資源
  • 十四、攔截器
  • 十五、全局配置類
  • 后記

一、視圖和模型拆分

視圖和模型相伴相生,但是springmvc給我們提供了更好的,更優(yōu)雅的解決方案:

  • Model會在調用handler時通過參數(shù)的形式傳入
  • View可以簡化為字符串形式返回

這樣的解決方案也是企業(yè)開發(fā)中最常用的:

@RequestMapping("/test1") public String testAnnotation(Model model){model.addAttribute("hello","hello annotationMvc as string");return "annotation"; }

二、重定向與轉發(fā)

在返回的字符串中,默認使用視圖解析器進行視圖跳轉。

springmvc給我們提供了更好的解決【重定向和轉發(fā)】的方案:

🍀返回視圖字符串加前綴redirect就可以進行重定向

redirect:/redirectController/redirectTest redirect:https://www.baidu.com

🍀返回視圖字符串加前綴forward就可以進行請求轉發(fā),而不走視圖解析器

// 會將請求轉發(fā)至/a/b forward:/a/b

三、RequestMapping與其衍生注解

  • @RequestMapping這個注解很關鍵,他不僅僅是一個方法級的注解,還是一個類級注解。
  • 如果放在類上,相當于給每個方法默認都加上一個前綴url。
@Controller @RequestMapping("/user/") public class AnnotationController {@RequestMapping("register")public String register(Model model){......return "register";}@RequestMapping("login")public String login(){......return "register";} }

🍀好處

  • 一個類一般處理一類業(yè)務,可以統(tǒng)一加上前綴,好區(qū)分
  • 簡化書寫復雜度

🍀RequestMapping注解有六個屬性

value: 指定請求的實際地址,指定的地址可以是URI Template 模式(后面將會說明);
method: 指定請求的method類型, GET、POST、PUT、DELETE等;
consumes: 指定處理中的請求的內容類型(Content-Type),例如application/json;
produces: 指定返回響應的內容類型,僅當request請求頭中的(Accept)類型中包含該指定類型才返回;

@GetMapping(value = "{id}",produces = {"application/json;charset=utf-8"})

params: 指定request中必須包含某些參數(shù)值處理器才會繼續(xù)執(zhí)行;
headers: 指定request中必須包含某些指定的header值處理器才會繼續(xù)執(zhí)行。

@RequestMapping(value = "add",method = RequestMethod.POST,consumes = "application/json",produces = "text/plain",headers = "name",params = {"age","times"}) @ResponseBody public String add(Model model){model.addAttribute("user","add user");return "user"; }

@RequestMapping還有幾個衍生注解,用來處理特定方法的請求:

@GetMapping("getOne") public String getOne(){return "user"; }@PostMapping("insert") public String insert(){return "user"; }@PutMapping("update") public String update(){return "user"; }@DeleteMapping("delete") public String delete(){return "user"; }

源碼中能看帶GetMapping注解中有@RequestMapping作為元注解修飾:

@RequestMapping(method = {RequestMethod.GET}) public @interface GetMapping {}

四、URL 模式匹配

@RequestMapping可以支持【URL模式匹配】,為此,spring提供了兩種選擇(兩個類):

  • PathPattern:PathPattern是 Web 應用程序的推薦解決方案,也是 Spring WebFlux 中的唯一選擇,比較新。
  • AntPathMatcher:使用【字符串模式與字符串路徑】匹配。這是Spring提供的原始解決方案,用于選擇類路徑、文件系統(tǒng)和其他位置上的資源。

小知識: 二者目前都存在于Spring技術棧內,做著相同的事。雖說現(xiàn)在還鮮有同學了解到PathPattern,我認為淘汰掉AntPathMatcher只是時間問題(特指web環(huán)境哈),畢竟后浪總歸有上岸的一天。但不可否認,二者將在較長時間內共處,那么它倆到底有何區(qū)別呢?

  • (1)出現(xiàn)時間,AntPathMatcher是一個早在2003年(Spring的第一個版本)就已存在的路徑匹配器,而PathPattern是Spring
    5新增的,旨在用于替換掉較為“古老”的AntPathMatcher。
  • (2)功能差異,PathPattern去掉了Ant字樣,但保持了很好的向下兼容性:除了不支持將**寫在path中間之外,其它的匹配規(guī)則從行為上均保持和AntPathMatcher一致,并且還新增了強大的{*pathVariable}的支持,他能匹配最后的多個路勁,并獲取路徑的值。
  • (3)性能差異,Spring官方說PathPattern的性能優(yōu)于AntPathMatcher。

🍀一些模式匹配的示例

  • “/resources/ima?e.png” - 匹配路徑段中的一個字符
  • “/resources/*.png” - 匹配路徑段中的零個或多個字符
  • “/resources/**” - 匹配多個路徑段
  • “/projects/{project}/versions” - 匹配路徑段并將其【捕獲為變量】
  • “/projects/{project:[a-z]+}/versions” - 使用正則表達式匹配并【捕獲變量】

捕獲的 URI 變量可以使用@PathVariable注解,示例例如:

@GetMapping("/owners/{ownerId}/pets/{petId}") public Pet findPet(@PathVariable Long ownerId, @PathVariable Long petId) {// ... }

還可以在類和方法級別聲明 URI 變量,如以下示例所示:

@Controller @RequestMapping("/owners/{ownerId}") public class OwnerController {@GetMapping("/pets/{petId}")public Pet findPet(@PathVariable Long ownerId, @PathVariable Long petId) {// ...} }

🍀一個url可以匹配到多個路由的情況

有時候會遇到一個url可以匹配到多個路由的情況,這個時候就是由Spring的AntPatternComparator完成優(yōu)先級處理,大致規(guī)律如下:

比如:有兩個匹配規(guī)則一個是 /a/**,一個是 /a/b/**,還有一個是/a/b/*,如果訪問的url是/a/b/c,其實這三個路由都能匹配到,在匹配優(yōu)先級中,有限級如下:

匹配方式優(yōu)先級
全路徑匹配,例如:配置路由/a/b/c第一優(yōu)先級
帶有{}路徑的匹配,例如:/a/{b}/c第二優(yōu)先級
正則匹配,例如:/a/{regex:\d{3}}/c第三優(yōu)先級
帶有*路徑的匹配,例如:/a/b/*第四優(yōu)先級
帶有**路徑的匹配,例如:/a/b/**第五優(yōu)先級
僅僅是雙通配符:/**最低優(yōu)先級

注意:

  • 當有多個*和多個‘{}'時,命中單個路徑多的,優(yōu)先越高;
  • 多’*’的優(yōu)先級高于‘**’,會優(yōu)先匹配帶有*。

🍀我們還可以從一個類中看出,當一個url匹配了多個處理器時,優(yōu)先級是如何考慮的,這個類是AntPathMatcher的一個內部類

protected static class AntPatternComparator implements Comparator<String> {@Overridepublic int compare(String pattern1, String pattern2) {PatternInfo info1 = new PatternInfo(pattern1);PatternInfo info2 = new PatternInfo(pattern2);.....boolean pattern1EqualsPath = pattern1.equals(this.path);boolean pattern2EqualsPath = pattern2.equals(this.path);// 完全相等,是無法比較的if (pattern1EqualsPath && pattern2EqualsPath) {return 0;}// pattern1和urlequals,返回負數(shù) 1勝出else if (pattern1EqualsPath) {return -1;}// pattern2和urlequals,返回正數(shù),2勝出else if (pattern2EqualsPath) {return 1;}// 都是前綴匹配,長的優(yōu)先 /a/b/** /a/**if (info1.isPrefixPattern() && info2.isPrefixPattern()) {return info2.getLength() - info1.getLength();}// 非前綴匹配的優(yōu)先級高else if (info1.isPrefixPattern() && info2.getDoubleWildcards() == 0) {return 1;}else if (info2.isPrefixPattern() && info1.getDoubleWildcards() == 0) {return -1;}// 匹配數(shù)越少,優(yōu)先級越高if (info1.getTotalCount() != info2.getTotalCount()) {return info1.getTotalCount() - info2.getTotalCount();}// 路徑越短越好if (info1.getLength() != info2.getLength()) {return info2.getLength() - info1.getLength();}// 單通配符個數(shù),數(shù)量越少優(yōu)先級越高if (info1.getSingleWildcards() < info2.getSingleWildcards()) {return -1;}else if (info2.getSingleWildcards() < info1.getSingleWildcards()) {return 1;}// url參數(shù)越少越優(yōu)先if (info1.getUriVars() < info2.getUriVars()) {return -1;}else if (info2.getUriVars() < info1.getUriVars()) {return 1;}return 0;} }

源碼中我們看到的信息如下:

  • (1)完全匹配者,優(yōu)先級最高
  • (2)都是前綴匹配(/a/**), 匹配路由越長,優(yōu)先級越高
  • (3)前綴匹配優(yōu)先級,比非前綴的低
  • (4)需要匹配的數(shù)量越少,優(yōu)先級越高,this.uriVars + this.singleWildcards + (2 * this.doubleWildcards);
  • (5)路勁越短優(yōu)先級越高
  • (6)*越少優(yōu)先級越高
  • (7){}越少優(yōu)先級越高

五、牛逼的傳參

在學習servlet時,我們是這樣獲取請求參數(shù)的:

@PostMapping("insert") public String insert(HttpServletRequest req){String username = req.getParameter("username");String password = req.getParameter("password");// 其他操作return "success"; }

有了springmvc之后,我們不再需要使用getParamter一個一個獲取參數(shù):

@Controller @RequestMapping("/user/") public class LoginController {@RequestMapping("login")public String login(String username,String password){System.out.println(username);System.out.println(password);return "login";} }

如果一個表單幾十個參數(shù)怎么獲取啊?更牛的傳參方式如下:

需要提前定義一個User對象:

public class User {private String username;private String password;private int age;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getAge() {return age;}public void setAge(int age) {this.age = age;} }

直接在參數(shù)中申明user對象:

@Controller @RequestMapping("/user/") public class LoginController {@RequestMapping("register")public String register(User user){System.out.println(user);return "register";}@RequestMapping("login")public String login(String username,String password){System.out.println(username);System.out.println(password);return "login";} }

🍀(1)@RequestParam

可以使用@RequestParam注解將【請求參數(shù)】(即查詢參數(shù)或表單數(shù)據(jù))綁定到控制器中的方法參數(shù)。

@Controller @RequestMapping("/pets") public class EditPetForm {@GetMappingpublic String setupForm(@RequestParam("petId") int petId, Model model) { Pet pet = this.clinic.loadPet(petId);model.addAttribute("pet", pet);return "petForm";} }

默認情況下,使用此注解的方法參數(shù)是必需的,但我們可以通過將@RequestParam注解的【required標志設置】為 false來指定方法參數(shù)是可選的。如果目標方法參數(shù)類型不是String,則應用會自動進行類型轉換,這個后邊會講。

請注意,使用@RequestParam是可選的。默認情況下,任何屬于簡單值類型且未被任何其他參數(shù)解析器解析的參數(shù)都被視為使用【@RequestParam】。

🍀(2)@RequestHeader

可以使用@RequestHeader注解將請求的首部信息綁定到控制器中的方法參數(shù)中:

假如我們的請求header如下:

Host localhost:8080 Accept text/html,application/xhtml+xml,application/xml;q=0.9 Accept-Language fr,en-gb;q=0.7,en;q=0.3 Accept-Encoding gzip,deflate Accept-Charset ISO -8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive 300

以下示例獲取Accept-Encoding和Keep-Alive標頭的值:

@GetMapping("/demo") public void handle(@RequestHeader("Accept-Encoding") String encoding, @RequestHeader("Keep-Alive") long keepAlive) { //... }

小知識:當@RequestHeader注解上的使用Map<String, String>, MultiValueMap<String, String>或HttpHeaders參數(shù),則map會被填充有所有header的值。當然,我們依然可以使用requied的屬性來執(zhí)行該參數(shù)不是必須的。

🍀(3)@CookieValue

可以使用@CookieValue注解將請求中的 cookie 的值綁定到控制器中的方法參數(shù)。

假設我們的請求中帶有如下cookie:

JSESSIONID=415A4AC178C59DACE0B2C9CA727CDD84

以下示例顯示了如何獲取 cookie 值:

@GetMapping("/demo") public void handle(@CookieValue("JSESSIONID") String cookie) { //... }

🍀(4)@ModelAttribute

可以使用@ModelAttribute注解在方法參數(shù)上來訪問【模型中的屬性】,或者在不存在的情況下對其進行實例化。模型的屬性會覆蓋來自 HTTP Servlet 請求參數(shù)的值,其名稱與字段名稱匹配,這稱為數(shù)據(jù)綁定,它使您不必【處理解析】和【轉換單個查詢參數(shù)】和表單字段。以下示例顯示了如何執(zhí)行此操作:

@RequestMapping("/register") public String register(@ModelAttribute("user") UserForm user) {... }

還有一個例子:

@ModelAttribute 和 @RequestMapping 注解同時應用在方法上時,有以下作用:

  • 方法的【返回值】會存入到 Model 對象中,key為 ModelAttribute 的 value 屬性值。
  • 方法的返回值不再是方法的訪問路徑,訪問路徑會變?yōu)?@RequestMapping 的 value值,例如:@RequestMapping(value = "/index") 跳轉的頁面是 index.jsp 頁面。
@Controller public class ModelAttributeController {// @ModelAttribute和@RequestMapping同時放在方法上@RequestMapping(value = "/index")@ModelAttribute("name")public String model(@RequestParam(required = false) String name) {return name;} }

🍀(5)@SessionAttribute

如果您需要訪問全局管理的預先存在的會話屬性,并且可能存在或可能不存在,您可以@SessionAttribute在方法參數(shù)上使用注解,如下所示示例顯示:

@RequestMapping("/") public String handle(@SessionAttribute User user) { // ... }

🍀(6)@RequestAttribute

和@SessionAttribute一樣,可以使用@RequestAttribute注解來訪問先前創(chuàng)建的存在與請求中的屬性(例如,由 ServletFilter 或HandlerInterceptor)創(chuàng)建或在請求轉發(fā)中添加的數(shù)據(jù):

@GetMapping("/") public String handle(@RequestAttribute Client client) { // ... }

🍀(7)@SessionAttributes

@SessionAttributes注解應用到Controller上面,可以將Model中的屬性同步到session當中:

@Controller @RequestMapping("/Demo.do") @SessionAttributes(value={"attr1","attr2"}) public class Demo {@RequestMapping(params="method=index")public ModelAndView index() {ModelAndView mav = new ModelAndView("index.jsp");mav.addObject("attr1", "attr1Value");mav.addObject("attr2", "attr2Value");return mav;}@RequestMapping(params="method=index2")public ModelAndView index2(@ModelAttribute("attr1")String attr1, @ModelAttribute("attr2")String attr2) {ModelAndView mav = new ModelAndView("success.jsp");return mav;} }

附加一個注解使用的案例:

@RequestMapping("insertUser")public String insertUser(@RequestParam(value = "age",required = false) Integer age,@RequestHeader(value = "Content-Type",required = false) String contentType,@RequestHeader(required = false) String name,@CookieValue(value = "company",required = false) String company,@SessionAttribute(value = "username",required = false) String onlineUser,@RequestAttribute(required = false) Integer count,@ModelAttribute("date") Date date,@SessionAttribute(value = "date",required = false) Date sessionDate) {System.out.println("sessionDate = " + sessionDate);System.out.println("date = " + date);System.out.println("count = " + count);System.out.println("onlineUser = " + onlineUser);System.out.println("age = " + age);System.out.println("contentType = " + contentType);System.out.println("name = " + name);System.out.println("company = " + company);return "user";}

🍀(8)數(shù)組的傳遞

在類似批量刪除的場景中,我們可能需要傳遞一個id數(shù)組,此時我們僅僅需要將方法的參數(shù)指定為數(shù)組即可:

@GetMapping("/array") public String testArray(@RequestParam("array") String[] array) throws Exception {System.out.println(Arrays.toString(array));return "array"; }

我們可以發(fā)送如下請求,可以是多個名稱相同的key,也可以是一個key,但是值以逗號分割的參數(shù):

http://localhost:8080/app/hellomvc?array=1,2,3,4

或者

http://localhost:8080/app/hellomvc?array=1&array=3

結果都是沒有問題的:

🍀(9)復雜參數(shù)的傳遞

當然我們在進行參數(shù)接收的時候,其中可能包含很復雜的參數(shù),一個請求中可能包含很多項內容,比如以下表單:

當然我們要注意表單中的name(參數(shù)中key)的寫法:

<form action="user/queryParam" method="post">排序字段:<br><input type="text" name="sortField"><hr>數(shù)組:<br><input type="text" name="ids[0]"> <br><input type="text" name="ids[1]"><hr>user對象:<br><input type="text" name="user.username" placeholder="姓名"><br><input type="text" name="user.password" placeholder="密碼"><hr>list集合<br>第一個元素:<br><input type="text" name="userList[0].username" placeholder="姓名"><br><input type="text" name="userList[0].password" placeholder="密碼"><br>第二個元素: <br><input type="text" name="userList[1].username" placeholder="姓名"><br><input type="text" name="userList[1].password" placeholder="密碼"><hr>map集合<br>第一個元素:<br><input type="text" name="userMap['user1'].username" placeholder="姓名"><br><input type="text" name="userMap['user1'].password" placeholder="密碼"><br>第二個元素:<br><input type="text" name="userMap['user2'].username" placeholder="姓名"><br><input type="text" name="userMap['user2'].password" placeholder="密碼"><br><input type="submit" value="提交"> </form>

然后我們需要搞一個實體類用來接收這個表單的參數(shù):

@Data public class QueryVo {private String sortField;private User user;private Long[] ids;private List<User> userList;private Map<String, User> userMap; }

編寫接口進行測試,我們發(fā)現(xiàn)表單的數(shù)據(jù)已經盡數(shù)傳遞了進來:

@PostMapping("queryParam") public String queryParam(QueryVo queryVo) {System.out.println(queryVo);return "user"; }

🍀拓展知識

  • VO(View Object): 視圖對象,用于展示層,它的作用是把某個指定頁面(或組件)的所有數(shù)據(jù)封裝起來。
  • DTO(Data Transfer Object): 數(shù)據(jù)傳輸對象,這個概念來源于J2EE的設計模式,原來的目的是為了EJB的分布式應用提供粗粒度的數(shù)據(jù)實體,以減少分布式調用的次數(shù),從而提高分布式調用的性能和降低網(wǎng)絡負載,但在這里,我泛指用于展示層與服務層之間的數(shù)據(jù)傳輸對象。
  • DO(Domain Object): 領域對象,就是從現(xiàn)實世界中抽象出來的有形或無形的業(yè)務實體。
  • PO(Persistent Object): 持久化對象,它跟持久層(通常是關系型數(shù)據(jù)庫)的數(shù)據(jù)結構形成一一對應的映射關系,如果持久層是關系型數(shù)據(jù)庫,那么,數(shù)據(jù)表中的每個字段(或若干個)就對應PO的一個(或若干個)屬性。

下面以一個時序圖建立簡單模型來描述上述對象在三層架構應用中的位置:

大致流程如下:

  • 用戶發(fā)出請求(可能是填寫表單),表單的數(shù)據(jù)在展示層被匹配為VO;
  • 展示層把VO轉換為服務層對應方法所要求的DTO,傳送給服務層;
  • 服務層首先根據(jù)DTO的數(shù)據(jù)構造(或重建)一個DO,調用DO的業(yè)務方法完成具體業(yè)務;
  • 服務層把DO轉換為持久層對應的PO(可以使用ORM工具,也可以不用),調用持久層的持久化方法,把PO傳遞給它,完成持久化操作;
  • 數(shù)據(jù)傳輸順序:VO => DTO => DO => PO

相對來說越是靠近顯示層的概念越不穩(wěn)定,復用度越低。分層的目的,就是復用和相對穩(wěn)定性。

小知識: 一般的簡單工程中,并不會進行這樣的設計,我們可能有一個User類就可以了,并不需要什么VO、DO啥的。但是,隨著項目工程的復雜化,簡單的對象已經沒有辦法在各個層的使用,項目越是復雜,就需要越是復雜的設計方案,這樣才能滿足高擴展性和維護性。

六、設定字符集

springmvc內置了一個統(tǒng)一的字符集處理過濾器,我們只要在web.xml中配置即可:

<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> </filter> <filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern> </filter-mapping>

七、返回json數(shù)據(jù)(序列化)

我們經常需要使用ajax請求后臺獲取數(shù)據(jù),而不需要訪問任何的頁面,這種場景在前后分離的項目當中尤其重要。

這種做法其實很簡單,大致步驟如下:

  • 將我們的對象轉化為json字符串。
  • 將返回的內容直接寫入響應體,不走視圖解析器。
  • 然后將Content-Type設置為application/json即可。

為了實現(xiàn)這個目的,我們可以引入fastjson:

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.68</version> </dependency> // produces指定了響應的Content-Type @RequestMapping(value = "getUsers",produces = {"application/json;charset=utf-8"}) @ResponseBody // 將返回的結果直接寫入響應體,不走視圖解析器 public String getUsers(){List<User> users = new ArrayList<User>(){{add(new User("Tom","2222"));add(new User("jerry","333"));}};return JSONArray.toJSONString(users); }

測試: 成功!

注意:@ResponseBody能將返回的結果直接放在響應體中,不走視圖解析器。

瀏覽器中添加插件json viewer可以有如上顯示。

當然springmvc也考慮到了,每次這樣寫也其實挺麻煩,我們還可以向容器注入一個專門處理消息轉換的bean。

這個轉化器的作用就是:當不走視圖解析器時,如果發(fā)現(xiàn)【返回值是一個對象】,就會自動將返回值轉化為json字符序列:

<mvc:annotation-driven ><mvc:message-converters><bean id="fastjson" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"><property name="supportedMediaTypes"><list><!-- 這里順序不能反,一定先寫text/html,不然ie下會出現(xiàn)下載提示 --><value>text/html;charset=UTF-8</value><value>application/json;charset=UTF-8</value></list></property></bean></mvc:message-converters> </mvc:annotation-driven>

以后我們的controller就可以寫成下邊的樣子了:

@RequestMapping(value = "getUsersList") @ResponseBody public List<User> getUsersList(){return new ArrayList<User>(){{add(new User("邸智偉","2222"));add(new User("劉展鵬","333"));}}; }

當然我們還可以使用一個更加流行的組件jackson來處理,他的工作和fastjson一致

首先需要引入以下依賴:

<!--jackson--> <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId> </dependency> <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId> </dependency> <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId> </dependency>

我們還可以對序列化的過程進行額外的一些配置:

public class CustomObjectMapper extends ObjectMapper {public CustomObjectMapper() {super();//去掉默認的時間戳格式configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);//設置為東八區(qū)setTimeZone(TimeZone.getTimeZone("GMT+8"));//設置日期轉換yyyy-MM-dd HH:mm:sssetDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));// 設置輸入:禁止把POJO中值為null的字段映射到json字符串中configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);// 空值不序列化setSerializationInclusion(JsonInclude.Include.NON_NULL);// 反序列化時,屬性不存在的兼容處理getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);// 序列化枚舉是以toString()來輸出,默認false,即默認以name()來輸出configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true);} }

編寫配置文件:

<mvc:annotation-driven><mvc:message-converters><bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><!-- 自定義Jackson的objectMapper --><property name="objectMapper" ref="customObjectMapper" /><property name="supportedMediaTypes"><list><value>text/plain;charset=UTF-8</value><value>application/json;charset=UTF-8</value></list></property></bean></mvc:message-converters></mvc:annotation-driven> <!--注入我們寫的對jackson的配置的bean--> <bean name="customObjectMapper" class="com.ydlclass.CustomObjectMapper"/>

測試: 成功!

八、獲取請求中的json數(shù)據(jù)

在前端發(fā)送的數(shù)據(jù)中可能會如如下情況,Contetn-Type是application/json,請求體中是json格式數(shù)據(jù):

@RequestBody注解可以【直接獲取請求體的數(shù)據(jù)】。

如果我們配置了消息轉化器,消息轉化器會將請求體中的json數(shù)據(jù)反序列化成目標對象,如下所示:

@PostMapping("insertUser") public String insertUser(@RequestBody User user) {System.out.println(user);return "user"; }

當然,我們可以把消息轉化器注解掉,直接使用一個String來接收請求體的內容。

九、數(shù)據(jù)轉化

假如有如下場景,前端傳遞過來一個日期字符串,但是后端需要使用Date類型進行接收,這時就需要一個類型轉化器進行轉化。

自定義的類型轉化器只支持從requestParam獲取的參數(shù)進行轉化,我們可以定義如下,其實學習spring時我們已經接觸過這個Converter接口:

public class StringToDateConverter implements Converter<String, Date> {@Overridepublic Date convert(String source) {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy_MM_dd hh,mm,ss");try {return simpleDateFormat.parse(source);} catch (ParseException e) {e.printStackTrace();}return null;} }

然后,我們需要在配置文件中進行配置:

<!-- 開啟mvc的注解 --> <mvc:annotation-driven conversion-service="conversionService" /><bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"><property name="converters"><set><bean id="stringToDateConverter" class="cn.itnanls.convertors.StringToDateConverter"/></set></property> </bean>

對于時間類型的處理,springmvc給我們提供了一個比較完善的解決方案,使用注解@DateTimeFormat,同時配合jackson提供的@JsonFormat注解幾乎可以滿足我們的所有需求。

  • @DateTimeFormat:當從requestParam中獲取string參數(shù)并需要轉化為Date類型時,會根據(jù)此注解的參數(shù)pattern的格式進行轉化。
  • @JsonFormat:當從請求體中獲取json字符序列,需要反序列化為對象時,時間類型會按照這個注解的屬性內容進行處理。

這兩個注解需要加在實體類的對應字段上即可:

// 對象和json互相轉化的過程當中按照此轉化方式轉哈 @JsonFormat(pattern = "yyyy年MM月dd日",timezone = "GMT-8") // 從requestParam中獲取參數(shù)并且轉化 @DateTimeFormat(pattern = "yyyy年MM月dd日") private Date birthday;

處理的過程大致如下:

十、數(shù)據(jù)校驗

  • JSR 303 是 Java 為 Bean 數(shù)據(jù)合法性校驗提供的標準框架,它包含在 JavaEE 6.0 中。
  • JSR 303 通過在 Bean 屬性上標注類似于 @NotNull、@Max 等標準的注解指定校驗規(guī)則,并通過標準的驗證接口對 Bean
    進行驗證。
Constraint詳細信息
@Null被注解的元素必須為 null
@NotNull被注解的元素必須不為 null
@AssertTrue被注解的元素必須為 true
@AssertFalse被注解的元素必須為 false
@Min(value)被注解的元素必須是一個數(shù)字,其值必須大于等于指定的最小值
@Max(value)被注解的元素必須是一個數(shù)字,其值必須小于等于指定的最大值
@DecimalMin(value)被注解的元素必須是一個數(shù)字,其值必須大于等于指定的最小值
@DecimalMax(value)被注解的元素必須是一個數(shù)字,其值必須小于等于指定的最大值
@Size(max, min)被注解的元素的大小必須在指定的范圍內
@Digits (integer, fraction)被注解的元素必須是一個數(shù)字,其值必須在可接受的范圍內
@Past被注解的元素必須是一個過去的日期
@Future被注解的元素必須是一個將來的日期
@Pattern(value)被注解的元素必須符合指定的正則表達式

🍀Hibernate Validator 擴展注解

Hibernate Validator 是 JSR 303 的一個參考實現(xiàn),除支持所有標準的校驗注解外,它還支持以下的擴展注解(Hibernate Validator 附加的 constraint):

Constraint詳細信息
@Email被注解的元素必須是電子郵箱地址
@Length被注解的字符串的大小必須在指定的范圍內
@NotEmpty被注解的字符串的必須非空
@Range被注解的元素必須在合適的范圍內

🍀Spring MVC 數(shù)據(jù)校驗

Spring MVC 可以對表單參數(shù)進行校驗,并將結果保存到對應的【BindingResult】或 【Errors 】對象中。

要實現(xiàn)數(shù)據(jù)校驗,需要引入已下依賴:

<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version> </dependency> <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>6.0.9.Final</version> </dependency>

并在實體類加上特定注解:

@Data @AllArgsConstructor @NoArgsConstructor public class UserVO {@NotNull(message = "用戶名不能為空")private String username;@NotNull(message = "用戶名不能為空")private String password;@Min(value = 0, message = "年齡不能小于{value}")@Max(value = 120,message = "年齡不能大于{value}")private int age;@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT-8")@DateTimeFormat(pattern = "yyyy-MM-dd")@Past(message = "生日不能大于今天")private Date birthday;@Pattern(regexp = "^1([358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}$", message = "手機號碼不正確")private String phone;@Emailprivate String email; }

在配置文件中配置如下內容,增加hibernate校驗:

<bean id="localValidator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"><property name="providerClass" value="org.hibernate.validator.HibernateValidator"/> </bean> <!--注冊注解驅動--> <mvc:annotation-driven validator="localValidator"/>

controller使用@Validated標識驗證的對象,緊跟著的BindingResult獲取錯誤信息

@PostMapping("insert") public String insert(@Validated UserVO user, BindingResult br) {List<ObjectError> allErrors = br.getAllErrors();Iterator<ObjectError> iterator = allErrors.iterator();// 打印以下錯誤結果while (iterator.hasNext()){ObjectError error = iterator.next();log.error("user數(shù)據(jù)校驗錯誤:{}",error.getDefaultMessage());}if(allErrors.size() > 0){return "error";}System.out.println(user);return "user"; }

注意: 永遠不要相信用戶的輸入,我們開發(fā)的系統(tǒng)凡是涉及到用戶輸入的地方,都要進行校驗,這里的校驗分為前臺校驗和后臺校驗,前臺校驗通常由javascript來完成,后臺校驗主要由java來負責,這里我們可以通過spring mvc+hibernate validator完成。

十一、視圖解析器詳解

我們默認的視圖解析器是如下的配置,它主要是處理jsp頁面的映射渲染:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"><!-- 前綴 --><property name="prefix" value="/WEB-INF/page/" /><!-- 后綴 --><property name="suffix" value=".jsp" /> </bean>

如果我們想添加新的視圖解析器,則需要給舊的新增一個order屬性,或者直接刪除原有的視圖解析器:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"><!-- 前綴 --><property name="prefix" value="/WEB-INF/page/" /><!-- 后綴 --><property name="suffix" value=".jsp" /><property name="order" value="10"/> </bean>
  • 這里的order表示視圖解析的【優(yōu)先級】,數(shù)字越小優(yōu)先級越大(即:0為優(yōu)先級最高,所以優(yōu)先進行處理視圖),InternalResourceViewResolver在項目中的優(yōu)先級一般要設置為最低,也就是order要最大。不然它會影響其他視圖解析器。
  • 當處理器返回邏輯視圖時(也就是return “string”),要經過視圖解析器鏈,如果前面的解析器能處理,就不會繼續(xù)往下傳播。如果不能處理就要沿著解析器鏈繼續(xù)尋找,直到找到合適的視圖解析器。

如下圖所示:


然后,我們可以配置一個新的Tymeleaf視圖解析器,order設置的低一些,這樣兩個視圖解析器都可以生效:

<!--thymeleaf的視圖解析器--> <bean id="templateResolver"class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver"><property name="prefix" value="/WEB-INF/templates/" /><property name="suffix" value=".html" /><property name="templateMode" value="HTML" /><property name="cacheable" value="true" /> </bean> <!--thymeleaf的模板引擎配置--> <bean id="templateEngine"class="org.thymeleaf.spring4.SpringTemplateEngine"><property name="templateResolver" ref="templateResolver" /><property name="enableSpringELCompiler" value="true" /> </bean> <bean id="viewResolver" class="org.thymeleaf.spring4.view.ThymeleafViewResolver"><property name="order" value="1"/><property name="characterEncoding" value="UTF-8"/><property name="templateEngine" ref="templateEngine"/> </bean>

添加兩個相關依賴:

<dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf</artifactId><version>3.0.14.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf-spring4 --> <dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring4</artifactId><version>3.0.14.RELEASE</version> </dependency>

模板中需要添加對應的命名空間:

<html xmlns:th="http://www.thymeleaf.org" >

thymeleaf官網(wǎng)地址:https://www.thymeleaf.org/

十二、全局異常捕獲

🍀(1)HandlerExceptionResolver

在Java中,對于異常的處理一般有兩種方式:

  • 一種是當前方法捕獲處理(try-catch),這種處理方式會造成業(yè)務代碼和異常處理代碼的耦合。
  • 另一種是自己不處理,而是拋給調用者處理(throws),調用者再拋給它的調用者,也就是一直向上拋,指導傳遞給瀏覽器。

被異常填充的頁面是長這個樣子的:


在這種方法的基礎上,衍生出了SpringMVC的異常處理機制。系統(tǒng)的dao、service、controller都通過throws Exception向上拋出,最后由springmvc前端控制器交由異常處理器進行異常處理,如下圖:

小知識: service層盡量不要處理異常,如果自己捕獲并處理了,異常就不生效了。特別是不要生吞異常。


Spring MVC的Controller出現(xiàn)異常的默認處理是響應一個500狀態(tài)碼,再把錯誤信息顯示在頁面上,如果用戶看到這樣的頁面,一定會覺得你這個網(wǎng)站太LOW了。

要解決Controller的異常問題,當然也不能在每個處理請求的方法中加上異常處理,那樣太繁瑣了。

通過源碼我們得知,需要寫一個HandlerExceptionResolver,并實現(xiàn)其方法:

public class GlobalExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) {ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("error", ex.getMessage());modelAndView.setViewName("error");return modelAndView;} } <bean id="globalExecptionResovler" class="com.lagou.exception.GlobalExecptionResovler"></bean> @Component public class GlobalExecptionResovler implements HandlerExceptionResolver {}

小知識: 在web中我們也能對異常進行統(tǒng)一處理:

<!--處理500異常--> <error-page><error-code>500</error-code><location>/500.jsp</location> </error-page> <!--處理404異常--> <error-page><error-code>404</error-code><location>/404.jsp</location> </error-page>

🍀(2)@ControllerAdvice

該注解同樣能實現(xiàn)異常的全局統(tǒng)一處理,而且實現(xiàn)起來更加簡單優(yōu)雅,當然使用這個注解有一下三個功能:

  • 處理全局異常
  • 預設全局數(shù)據(jù)
  • 請求參數(shù)預處理

我們主要學習其中的全局異常處理,@ControllerAdvice 配合 @ExceptionHandler 實現(xiàn)全局異常處理:

@Slf4j @ControllerAdvice public class GlobalExceptionResolverController {@ExceptionHandler(ArithmeticException.class)public String processArithmeticException(ArithmeticException ex){log.error("發(fā)生了數(shù)學類的異常:",ex);return "error";}@ExceptionHandler(BusinessException.class)public String processBusinessException(BusinessException ex){log.error("發(fā)生了業(yè)務相關的異常:",ex);return "error";}@ExceptionHandler(Exception.class)public String processException(Exception ex){log.error("發(fā)生了其他的異常:",ex);return "error";} }

十三、處理資源

當我們使用了springmvc后,所有的請求都會交給springmvc進行管理,當然也包括靜態(tài)資源,比如/static/js/index.js,這樣的請求如果走了中央處理器,必然會拋出異常,因為沒有與之對應的controller,這樣我們可以使用一下配置進行處理:

<mvc:resources mapping="/js/**" location="/static/js/"/> <mvc:resources mapping="/css/**" location="/static/css/"/> <mvc:resources mapping="/img/**" location="/static/img/"/>

十四、攔截器

  • (1)SpringMVC提供的攔截器類似于JavaWeb中的過濾器,只不過SpringMVC攔截器只攔截被前端控制器攔截的請求,而過濾器攔截從前端發(fā)送的【任意】請求。
  • (2)熟練掌握SpringMVC攔截器對于我們開發(fā)非常有幫助,在沒使用權限框架(shiro,spring security)之前,一般使用攔截器進行認證和授權操作。
  • (3)SpringMVC攔截器有許多應用場景,比如:登錄認證攔截器,字符過濾攔截器,日志操作攔截器等等。


🍀(1)自定義攔截器

SpringMVC攔截器的實現(xiàn)一般有兩種方式:

  • (1)自定義的Interceptor類要實現(xiàn)了Spring的HandlerInterceptor接口。
  • (2)繼承實現(xiàn)了HandlerInterceptor接口的類,比如Spring已經提供的實現(xiàn)了HandlerInterceptor接口的抽象類HandlerInterceptorAdapter。
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {} }

🍀(2)攔截器攔截流程

🍀(3)攔截器規(guī)則

我們可以配置多個攔截器,每個攔截器中都有三個方法。下面將總結多個攔截器中的方法執(zhí)行規(guī)律。

  • preHandle: Controller方法處理請求前執(zhí)行,根據(jù)攔截器定義的順序,正向執(zhí)行。
  • postHandle: Controller方法處理請求后執(zhí)行,根據(jù)攔截器定義的順序,逆向執(zhí)行。需要所有的preHandle方法都返回true時才會調用。
  • afterCompletion: View視圖渲染后處理方法:根據(jù)攔截器定義的順序,逆向執(zhí)行。preHandle返回true也會調用。

🍀(4)登錄攔截器

接下來編寫一個登錄攔截器,這個攔截器可以實現(xiàn)認證操作。就是當我們還沒有登錄的時候,如果發(fā)送請求訪問我們系統(tǒng)資源時,攔截器不放行,請求失敗。只有登錄成功后,攔截器放行,請求成功。登錄攔截器只要在preHandle()方法中編寫認證邏輯即可,因為是在請求執(zhí)行前攔截。代碼實現(xiàn)如下:

/*** 登錄攔截器*/ public class LoginInterceptor implements HandlerInterceptor {/**在執(zhí)行Controller方法前攔截,判斷用戶是否已經登錄,登錄了就放行,還沒登錄就重定向到登錄頁面*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {HttpSession session = request.getSession();User user = session.getAttribute("user");if (user == null){//還沒登錄,重定向到登錄頁面response.sendRedirect("/toLogin");}else {//已經登錄,放行return true;}}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {} }

編寫完SpringMVC攔截器,我們還需要在springmvc.xml配置文件中,配置我們編寫的攔截器,配置代碼如下:

  • 配置需要攔截的路徑
  • 配置不需要攔截的路徑
  • 配置我們自定義的攔截器類
<mvc:interceptors><mvc:interceptor><!--mvc:mapping:攔截的路徑/**:是指所有文件夾及其子孫文件夾/*:是指所有文件夾,但不包含子孫文件夾/:Web項目的根目錄--><mvc:mapping path="/**"/><!--mvc:exclude-mapping:不攔截的路徑,不攔截登錄路徑/toLogin:跳轉到登錄頁面/login:登錄操作--><mvc:exclude-mapping path="/toLogin"/><mvc:exclude-mapping path="/login"/><!--class屬性就是我們自定義的攔截器--><bean id="loginInterceptor" class="com.ydlclass.interceptor.LoginInterceptor"/></mvc:interceptor> </mvc:interceptors>

十五、全局配置類

springmvc有一個可用作用于做全局配置的接口,這個接口是WebMvcConfigurer,在這個接口中有很多默認方法,每一個默認方法都可以進行一項全局配置,這些配置可以和我們配置文件的配置一一對應:這些配置在全局的xml中也可以進行配置。

🍀列舉幾個xml的配置

<!--處理靜態(tài)資源--> <mvc:resources mapping="/js/**" location="/static/js/"/> <mvc:resources mapping="/css/**" location="/static/css/"/> <mvc:resources mapping="/./image/**" location="/static/./image/"/><!--配置頁面跳轉--> <mvc:view-controller path="/toGoods" view-name="goods"/> <mvc:view-controller path="/toUpload" view-name="upload"/> <mvc:view-controller path="/websocket" view-name="websocket"/><mvc:cors><mvc:mapping path="/goods/**" allowed-methods="*"/> </mvc:cors>

🍀列舉幾個常用的WebMvcConfigurer的配置

@Configuration @EnableWebMvc public class MvcConfiguration implements WebMvcConfigurer {// 攔截器進行配置@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns(List.of("/toLogin","/login")).order(1);}// 資源的配置@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/js/**").addResourceLocations("/static/js/");registry.addResourceHandler("/css/**").addResourceLocations("/static/css/");}// 跨域的全局配置@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/api/**").allowedOrigins("*").allowedMethods("GET","POST","PUT","DELETE").maxAge(3600);}// 頁面跳轉的配置@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/index").setViewName("index");}}

后記

👉Java全棧學習路線可參考:【Java全棧學習路線】最全的Java學習路線及知識清單,Java自學方向指引,內含最全Java全棧學習技術清單~
👉算法刷題路線可參考:算法刷題路線總結與相關資料分享,內含最詳盡的算法刷題路線指南及相關資料分享~

總結

以上是生活随笔為你收集整理的最全面的SpringMVC教程(二)——SpringMVC核心技术篇的全部內容,希望文章能夠幫你解決所遇到的問題。

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

亚洲国产中文在线观看 | 911久久| 免费在线播放黄色 | 亚洲成人资源网 | 激情婷婷六月 | www.久艹 | 四虎影视成人精品 | 美女久久久久久久久久 | 9i看片成人免费看片 | 成人一区影院 | 2019精品手机国产品在线 | 久久99国产精品视频 | 伊人久久婷婷 | 久久久99国产精品免费 | 亚洲精品美女在线观看播放 | 69av在线播放 | 中文字幕丰满人伦在线 | 夜夜躁日日躁狠狠久久av | 最新av在线免费观看 | 国产日韩精品一区二区三区在线 | 成人四虎 | 久久久久女人精品毛片九一 | 亚洲综合在线发布 | 亚洲精品网站 | 久草精品电影 | 久久综合激情 | 国产综合在线视频 | 91秒拍国产福利一区 | 亚洲欧洲国产视频 | 日韩在线播放视频 | 天天干天天操 | 丁香激情综合国产 | 一区中文字幕电影 | av免费在线观看网站 | 亚洲黄色免费在线看 | 五月天久久精品 | 久久久久国产精品厨房 | 高清免费在线视频 | 成人91在线 | 97免费中文视频在线观看 | 亚洲日韩中文字幕 | 一区二区精品视频 | 麻豆精品传媒视频 | 日韩综合一区二区 | 色a综合| 婷婷视频在线观看 | 91麻豆精品国产 | 免费久久精品视频 | 午夜美女网站 | 成年人国产在线观看 | 欧美日韩一区二区三区免费视频 | 91麻豆精品国产91久久久使用方法 | 欧美亚洲成人免费 | 国产高清在线永久 | 91麻豆网站 | 天天狠狠操 | 狂野欧美激情性xxxx | 六月丁香婷婷网 | 久久免费在线观看视频 | 在线观看免费av片 | 亚洲精品视频网址 | 天天干天天天天 | 中文字幕日韩电影 | 久久96国产精品久久99漫画 | 国内精品在线一区 | 99精品国产免费久久久久久下载 | 久草在线这里只有精品 | 国内成人精品2018免费看 | 日韩一级成人av | 色综合久久久久综合体 | 中文乱幕日产无线码1区 | 黄网站免费看 | 亚洲精品在线一区二区 | 亚洲极色| 精品国产日本 | 久久久久久网址 | 精精国产xxxx视频在线播放 | 国产伦理一区二区三区 | 成人久久18免费网站 | 久久国语露脸国产精品电影 | 在线观看黄网站 | 日韩欧美综合 | 精品在线看 | 97成人免费视频 | 国内免费的中文字幕 | 国产精品一区二区三区四 | 色综合久久88色综合天天6 | 97在线观 | 中文字幕视频在线播放 | 日韩在线播放欧美字幕 | 国产综合香蕉五月婷在线 | 在线观看免费视频 | 国产又粗又猛又黄视频 | 大型av综合网站 | 91精品中文字幕 | 欧美日韩久久一区 | 国产亚洲观看 | 久久人人爽人人 | 日韩色视频在线观看 | 五月婷婷视频 | 国产精品永久免费在线 | 精品国产乱码久久久久久1区二区 | 精品电影一区 | 中文字幕观看视频 | 国产免费久久 | 国产色女 | 又黄又爽又无遮挡免费的网站 | 国产中文字幕av | 亚洲激情在线视频 | 日韩免费电影在线观看 | 最近日韩中文字幕中文 | 99色免费视频 | 成人在线视频论坛 | 欧美日韩视频免费 | 天天操夜夜想 | 在线精品一区二区 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 综合铜03| 日韩中文字幕免费视频 | 国产精品日韩在线播放 | 久久久久成人精品 | 日日摸日日| 手机在线视频福利 | 久操中文字幕在线观看 | 808电影| 色av男人的天堂免费在线 | 日韩精品极品视频 | 色综合久久88色综合天天6 | 在线观看视频你懂的 | 精品国产乱码久久久久 | www在线观看国产 | 96精品在线 | 99视| 久久黄页 | 精品久久一级片 | 免费看黄电影 | 精品91视频| 国产一区二区三区在线 | 毛片基地黄久久久久久天堂 | 国产精品久久久av | 日本韩国欧美在线观看 | 97狠狠干| 亚a在线 | 888av| 中文字幕亚洲欧美 | 久久精品3| 日韩av手机在线观看 | 国精产品999国精产 久久久久 | 天天摸天天操天天爽 | 干天天 | 亚洲一区不卡视频 | 久久国产精品网站 | 亚洲伊人婷婷 | 精品五月天| 国产a视频免费观看 | 亚洲高清免费在线 | 国产91欧美| 国产免费久久精品 | 探花视频在线观看+在线播放 | 国产精品一区二区av | 97精品超碰一区二区三区 | 91入口在线观看 | 超碰人在线 | 国产美女视频 | 国产又粗又猛又爽又黄的视频先 | 成人小电影在线看 | 伊人狠狠色丁香婷婷综合 | 在线黄色免费av | 成人一区影院 | 在线国产99 | 国产精品视频资源 | 欧美日韩三级在线观看 | 日本三级香港三级人妇99 | 精品视频99 | 不卡中文字幕在线 | 五月精品 | 国产精品99视频 | 久久99亚洲精品久久 | 亚洲综合成人专区片 | 免费观看国产视频 | 成人全视频免费观看在线看 | 99热播精品 | 亚洲黄色精品 | 国产精品一区二区久久精品爱微奶 | 日本中文乱码卡一卡二新区 | 久久精品中文字幕少妇 | 久久久久亚洲精品成人网小说 | 国产精品视频大全 | www.久久成人 | 国产免费小视频 | 日韩视频在线播放 | 国产免费xvideos视频入口 | 国产一区在线免费观看视频 | av在线播放快速免费阴 | 国内精品国产三级国产aⅴ久 | 在线看国产 | 国产一区二区三区免费在线 | 国产在线色视频 | 免费精品 | 国产香蕉久久 | 夜夜操网站| 久久久久国产一区二区三区四区 | 国产精品毛片久久久久久久 | 亚洲精品美女久久久久网站 | 午夜国产在线观看 | 国产一级免费播放 | 亚洲最大av| 成人精品视频久久久久 | 免费a v在线 | 综合久久2023 | 正在播放亚洲精品 | 久久久久免费电影 | 免费高清在线观看成人 | 人人看黄色 | 亚洲欧洲国产视频 | 又黄又网站 | 天堂网一区二区 | 人人爽人人爽人人片 | 99免费观看视频 | 中文字幕高清视频 | 超碰在线天天 | 久久久久免费 | 人人爽人人乐 | 二区精品视频 | av一级在线观看 | 欧美永久视频 | 黄污在线观看 | 91最新地址永久入口 | 国产女人40精品一区毛片视频 | 国精产品999国精产品岳 | 亚洲va天堂va欧美ⅴa在线 | 欧美激情另类文学 | 久久久久国产精品免费网站 | 成人av影视在线 | 久二影院| 少妇性bbb搡bbb爽爽爽欧美 | 欧美国产高清 | 久黄色 | ,午夜性刺激免费看视频 | 香蕉网站在线观看 | 91漂亮少妇露脸在线播放 | 日韩天天操 | 成年人免费av | 成人性生交大片免费观看网站 | 亚洲免费在线观看视频 | 欧美色黄| 天天操天天色综合 | 欧美三级在线播放 | av网站免费线看精品 | 国内精品久久久久影院一蜜桃 | 999在线精品| 激情伊人五月天 | 亚洲国产偷| 亚洲精品91天天久久人人 | 色综合久久中文综合久久牛 | 免费国产在线精品 | 亚洲一区二区三区miaa149 | 久热只有精品 | 欧美视频xxx| 九九久久电影 | 91字幕 | 国产精品久久久区三区天天噜 | 亚洲天天在线日亚洲洲精 | 成人av动漫在线观看 | 婷婷综合影院 | 波多野结衣视频一区 | 丁香九月激情综合 | 最近的中文字幕大全免费版 | 九七视频在线 | 免费黄色a网站 | 国产一区二区综合 | 亚洲日日射 | 日韩欧美一区二区三区在线观看 | 成人av电影在线 | 91色一区二区三区 | 国产小视频精品 | 99精品视频在线观看播放 | 97超碰人人模人人人爽人人爱 | 久久国精品 | 日日夜夜天天综合 | 国产精品一区二区三区视频免费 | 日韩精品1区2区 | 免费日韩一区二区三区 | 国产精品永久免费视频 | 亚洲天堂精品视频在线观看 | 国产成人在线免费观看 | 丁香花在线视频观看免费 | 亚洲天堂香蕉 | 91一区二区三区久久久久国产乱 | 中文字幕日韩精品有码视频 | 免费av在线网站 | 欧美大片在线观看一区 | 免费观看黄色12片一级视频 | 99视频国产精品 | 日韩成人在线一区二区 | 色资源二区在线视频 | 在线观看香蕉视频 | 五月综合 | 天天做天天爱夜夜爽 | 日韩亚洲在线 | 免费性网站 | 精品国产乱码久久久久久三级人 | 中文在线资源 | 婷婷色中文 | 亚洲国内精品视频 | 成人黄色电影在线 | 亚洲最新视频在线 | 中文字幕第 | 久久综合9988久久爱 | 亚洲精品久久久蜜桃直播 | 亚洲一二三久久 | 黄色a一级视频 | 97色狠狠 | 日韩精品久久一区二区 | 黄色大片av | 蜜臀av性久久久久av蜜臀三区 | 亚洲成a人片在线www | 久久久午夜精品理论片中文字幕 | 久久国产精品精品国产色婷婷 | www.福利视频 | 久久久久日本精品一区二区三区 | 人人草网站 | 五月天九九 | 国产a级片免费观看 | 日韩精品一区二区三区在线视频 | 九色琪琪久久综合网天天 | 免费黄色网址网站 | 午夜美女视频 | av成人在线电影 | 日韩精品免费在线 | 久久久91精品国产一区二区精品 | 黄色免费视频在线观看 | 五月天婷婷在线观看视频 | 婷婷久操 | 欧美日韩午夜爽爽 | 中文字幕亚洲情99在线 | 国产精品theporn | 97热久久免费频精品99 | 欧美性网站 | 深夜福利视频在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 免费色视频网址 | 玖玖爱国产在线 | 亚洲天堂网站 | 国产精品二区在线观看 | 69国产在线观看 | 玖草在线观看 | 欧美视频在线观看免费网址 | 亚洲精品国内 | 91福利影院在线观看 | 亚洲性xxxx| 亚洲国产视频直播 | 久艹视频在线免费观看 | 中文字幕国产 | 亚洲精品国产成人av在线 | 91大神视频网站 | 日韩精品亚洲专区在线观看 | 日本中文字幕网址 | 91丨九色丨国产在线观看 | 在线看片一区 | 欧美性生活久久 | 国产亚洲一级高清 | 亚洲精品一区中文字幕乱码 | 日韩中文字 | 国产精品免费在线视频 | 99成人精品 | 久久草在线精品 | 国产精品毛片久久 | 看全黄大色黄大片 | av中文字幕亚洲 | 国产精品一区免费观看 | 免费在线观看一区二区三区 | 国产精品18久久久久久久久久久久 | 亚洲午夜电影网 | 日韩.com | 99久热精品| 精品国产乱码久久久久久1区2匹 | 91自拍91 | 99久久99视频只有精品 | 亚洲精品在线观看免费 | 成人av网址大全 | 免费一级黄色 | 成年人看片 | 欧美孕妇与黑人孕交 | 9在线观看免费高清完整版 玖玖爱免费视频 | 91视频在线免费下载 | 一区二区欧美在线观看 | 在线观看黄色的网站 | 精品国产成人在线 | 天天干天天操 | 久久电影色 | 综合在线观看色 | 9在线观看免费高清完整版 玖玖爱免费视频 | 狠狠色丁香婷婷综合久小说久 | 91av久久 | 久久一区二区三区国产精品 | 午夜av免费 | 97成人在线视频 | 国产亚洲一级高清 | 99久久精品网 | 成人教育av | 五月婷婷综合在线视频 | 欧美日韩破处 | av免费黄色| 免费在线观看黄色网 | 亚洲精品久久久久久久蜜桃 | 91大神精品视频在线观看 | 丁香六月婷婷开心婷婷网 | 精品在线观看一区二区 | 男女全黄一级一级高潮免费看 | 成人av免费| 国产黄影院色大全免费 | 人人cao | 日本在线观看中文字幕无线观看 | 91成年人网站 | av3级在线| 日韩av在线不卡 | 亚州精品在线视频 | 欧美日韩精品在线视频 | 久久久久久久久久影院 | 免费激情在线电影 | 亚洲精品国偷拍自产在线观看 | 91视频免费看网站 | 亚洲精品中文字幕视频 | 欧美一级黄大片 | 日日干av| 亚洲久久视频 | 久久午夜国产精品 | 最新国产视频 | 丁香六月激情 | 日韩在线观看视频一区二区三区 | 字幕网资源站中文字幕 | 亚洲v欧美v国产v在线观看 | 超碰97中文 | 国产区欧美 | 丰满少妇在线观看网站 | 久久久在线视频 | 国产一级h | 国产日韩欧美在线影视 | 久久免费电影网 | 久久久一本精品99久久精品66 | 日本精品在线视频 | 黄色一级大片在线免费看产 | 国产精品美女网站 | 91人人爽久久涩噜噜噜 | 日本三级大片 | 中文字幕色网站 | 美腿丝袜一区二区三区 | 伊人亚洲精品 | 五月婷婷色 | 国产精品久久久久久久久久尿 | 国产九九热视频 | 中文字幕国产精品一区二区 | 欧美一级专区免费大片 | 中文在线免费观看 | 久久婷婷开心 | av在线一| 久艹视频免费观看 | 一区久久久 | 欧美日韩精品免费观看视频 | 国产精品自产拍在线观看桃花 | 美女视频是黄的免费观看 | 天天插狠狠插 | 午夜视频在线观看一区 | 一区二区精品在线 | 亚洲国产片 | 婷婷丁香五 | 中文字幕在线观看免费高清完整版 | 免费看网站在线 | 国产黄在线 | av中文字幕日韩 | 在线观看一区 | 久久国产精品久久精品国产演员表 | 中文av免费| 亚洲成人在线免费 | 涩涩网站在线看 | 国产精品 中文字幕 亚洲 欧美 | 国产精品免费不卡 | 亚洲精品欧美成人 | 超碰人人在线观看 | 日韩欧美综合在线视频 | 一区二区三区四区五区在线 | 免费日韩 精品中文字幕视频在线 | 偷拍区另类综合在线 | 91精品久久久久久久久 | 日韩在线色视频 | 婷婷精品国产一区二区三区日韩 | 国产一级在线视频 | 天堂素人在线 | 欧美日韩国产在线精品 | 一级黄色片在线播放 | 国产91电影在线观看 | 色丁香婷婷 | 国产在线一区二区三区播放 | 国产精品久久久久久久久久免费看 | 99超碰在线播放 | 日韩久久精品 | 国产人免费人成免费视频 | 麻豆精品视频在线观看免费 | 网站免费黄色 | 2019久久精品| 97视频人人免费看 | 日韩一级黄色片 | 少妇搡bbbb搡bbb搡aa | 色噜噜噜 | 日韩在线观看的 | 伊人伊成久久人综合网小说 | 久久99热这里只有精品 | 国产在线观看91 | www.天天干 | 在线观看av麻豆 | 日韩成人中文字幕 | 精精国产xxxx视频在线播放 | 日韩av影片在线观看 | 日韩在线视频免费观看 | 亚洲精品免费在线观看 | 午夜精品久久久久久久99水蜜桃 | 国产精品九九九九九九 | 天天天干天天天操 | 日韩激情视频 | 欧洲av不卡 | 日韩在线观看av | 国产精品嫩草影院99网站 | 久久久久久久久毛片精品 | 在线观看黄色 | 99视频这里只有 | 久久综合久久综合久久综合 | www.97色.com| 成人免费看电影 | 九九爱免费视频 | 精品国产一区二区三区在线 | 日本精品一区二区在线观看 | 毛片一级免费一级 | 国产永久免费高清在线观看视频 | av中文字幕在线播放 | 久久久久久久久影视 | 国产精品第一页在线观看 | 久久久久久视频 | 久久久999免费视频 日韩网站在线 | 九月婷婷人人澡人人添人人爽 | 91九色最新 | 韩国av免费观看 | 国产成人精品一区二区三区免费 | 在线 视频 亚洲 | 91看片在线免费观看 | 一区二区三区免费在线观看视频 | 日韩特级片 | 欧美日韩视频免费 | 久久亚洲综合国产精品99麻豆的功能介绍 | 二区视频在线观看 | 国产成人精品一区二区在线观看 | 国产精品18久久久久久不卡孕妇 | 精品一区二区日韩 | 天天做日日爱夜夜爽 | 九九免费在线观看 | 超薄丝袜一二三区 | 亚洲欧洲精品一区 | 啪啪肉肉污av国网站 | 西西www4444大胆视频 | 国产一区二区免费在线观看 | www亚洲一区| www久久 | 日韩a在线看 | 免费精品久久久 | 色资源二区在线视频 | 97中文字幕 | 在线影院 国内精品 | 最新午夜| 亚洲禁18久人片 | 欧美韩国在线 | 中文字幕a∨在线乱码免费看 | av丝袜制服 | 日韩精品中文字幕一区二区 | 日韩午夜av电影 | 国产探花在线看 | 国产主播99 | 欧美一区二区在线刺激视频 | 最近日本中文字幕a | 日韩av电影国产 | 超碰在线公开免费 | avove黑丝 | 伊人影院得得 | 91精品人成在线观看 | 亚洲精品一区二区18漫画 | 亚洲第一区在线播放 | 久久视 | 天天操天天射天天 | 久久精品亚洲一区二区三区观看模式 | 日韩av在线资源 | 精品成人免费 | 最新久久久 | 深爱开心激情网 | 美女精品在线观看 | 亚洲成人黄色在线观看 | 性色av一区二区 | av中文在线 | 国产黄免费 | 国产精品99久久久久久宅男 | 欧美伦理一区二区三区 | 精品视频资源站 | 国产小视频在线免费观看 | 亚洲在线 | 欧美午夜a | 亚洲最大免费成人网 | 国产色爽| 欧洲成人av | 欧美中文字幕第一页 | 国产免费久久精品 | 午夜精品导航 | 国产成人久久久77777 | 色综合久久久久久久久五月 | 亚洲精品久久久久久国 | 黄色在线免费观看网址 | 超碰久热 | 四虎在线免费观看 | .国产精品成人自产拍在线观看6 | 欧美视频日韩视频 | 狠狠色丁香九九婷婷综合五月 | 免费av 在线 | 五月激情电影 | 天堂视频中文在线 | 国产精品99久久久久久人免费 | 九九导航 | 在线视频日韩精品 | 成人免费共享视频 | 97超碰精品 | 欧美日韩高清一区二区三区 | 亚洲精品国产视频 | 毛片网在线观看 | 黄网站免费看 | 精品国产乱码久久久久久浪潮 | 91传媒在线| 草久视频在线 | 九九免费在线视频 | 色资源二区在线视频 | 97超视频 | 亚洲区色 | 亚洲精品在线观看网站 | 婷婷丁香色综合狠狠色 | 久久精品一区二区三区国产主播 | 免费看国产精品 | 成片免费观看视频 | 丁香5月婷婷 | 久久久久久久久久久高潮一区二区 | 在线观看中文字幕一区 | 欧美成人区 | a爱爱视频 | 国产综合在线视频 | 91伊人影院 | 美女久久一区 | 99久久久久国产精品免费 | 亚洲精品在线一区二区 | 日本在线观看一区 | 色偷偷97 | 99精品偷拍视频一区二区三区 | www日韩高清| 国产精选视频 | 美女网站在线看 | 免费网站看v片在线a | 久久男人中文字幕资源站 | 精品国产一区二区三区免费 | 精品国模一区二区三区 | 天天干天天搞天天射 | 有码一区二区三区 | av免费在线播放 | 91高清视频免费 | 亚洲精品视频在线观看网站 | 精品国产一区二区三区免费 | 亚洲成人频道 | 国产精品久久电影网 | 亚洲成人av在线电影 | 国产青春久久久国产毛片 | 黄色大片日本免费大片 | 高清精品在线 | 国际精品久久久 | 一区 二区 精品 | 特级西西人体444是什么意思 | 久久婷婷国产色一区二区三区 | 黄色网址国产 | www.久久91 | 岛国一区在线 | 国产区精品区 | 精品久久久久一区二区国产 | 免费视频成人 | 国产视频久久久 | 欧美一二三区播放 | 欧美日韩精品在线观看 | 国产一级黄色av | 日本mv大片欧洲mv大片 | 97免费公开视频 | 国产精品久久久久久99 | 日韩在线中文字幕视频 | 国产成人亚洲在线观看 | 亚洲三级毛片 | 国产视频1区2区3区 久久夜视频 | 五月天婷亚洲天综合网鲁鲁鲁 | 天天干天天插 | 2018好看的中文在线观看 | 国产精品久久嫩一区二区免费 | 日韩精品视频第一页 | 久久综合五月 | 亚洲影院一区 | av片在线看 | 天天干天天天 | 在线电影中文字幕 | av一区在线播放 | av免费成人 | 免费a级毛片在线看 | 国产一区二区三区四区在线 | 久久国产品 | 日韩欧美在线综合网 | 亚洲专区免费观看 | 人人超在线公开视频 | 久久久久久久影视 | 亚洲男人天堂a | 色综合天天爱 | 国产你懂的在线 | 日本大片免费观看在线 | 我要看黄色一级片 | 久久激情久久 | 国产喷水在线 | 欧美亚洲久久 | 美女精品网站 | 色999精品| 国产精品久99 | 欧美日韩国产一区二区在线观看 | 黄视频网站大全 | 国内成人精品2018免费看 | 激情五月六月婷婷 | 久久精品国产亚洲a | 欧美福利视频一区 | 91秒拍国产福利一区 | 狠狠狠色狠狠色综合 | 91成人黄色 | 国产一级在线播放 | 国产欧美综合视频 | 亚洲综合色视频 | 成人资源在线播放 | 欧美一区二区免费在线观看 | 91久久丝袜国产露脸动漫 | 日韩在线免费高清视频 | 国产精品免费观看国产网曝瓜 | 激情一区二区三区欧美 | 亚洲自拍偷拍色图 | 99视频这里有精品 | 国产小视频在线免费观看视频 | 综合成人在线 | 成人欧美一区二区三区黑人麻豆 | .国产精品成人自产拍在线观看6 | 91综合色| 中文字幕一区二区三区乱码在线 | 手机在线小视频 | 国产福利在线免费 | 久久国内精品视频 | 久久资源总站 | 99热国产在线中文 | 国产高清视频免费在线观看 | 免费人成在线观看 | 99精品视频在线观看播放 | a视频在线观看 | 国产精品99久久久久久大便 | 亚洲精品小视频在线观看 | 日韩精品免费在线视频 | 麻豆成人精品 | 狠狠色伊人亚洲综合成人 | 少妇性bbb搡bbb爽爽爽欧美 | 久久国产精品小视频 | 国产在线一线 | 在线观看国产www | 综合亚洲视频 | 日韩有码在线播放 | 91av播放 | 中文字幕.av.在线 | 日韩av午夜 | 超级av在线 | 欧美日韩国产一区二区三区在线观看 | 黄网站免费看 | 亚洲综合在线发布 | 波多野结衣理论片 | 久久国产精品免费一区二区三区 | 天天干天天操天天拍 | 日韩视频区| 色婷五月天| 少妇av片 | 国产精品一区二区在线观看免费 | 久久躁日日躁aaaaxxxx | 久久狠狠婷婷 | 日韩不卡高清 | 国产在线理论片 | 精品久久91| 日韩av片在线 | 久久亚洲私人国产精品va | 狠狠狠狠狠色综合 | 综合在线色 | 日韩在线免费播放 | 色综合久久久久综合体 | 久久的色 | 日韩在线观看网站 | 亚洲成人av一区二区 | 手机看片99 | 日韩欧美一区二区三区视频 | 精品播放 | 大荫蒂欧美视频另类xxxx | 久久无码精品一区二区三区 | 国产精品久久一区二区三区不卡 | 18网站在线观看 | 操操操夜夜操 | 国产高清在线一区 | 国内精品久久久久影院一蜜桃 | 久久久综合色 | 久草在线免费新视频 | 中文字幕日韩一区二区三区不卡 | adn—256中文在线观看 | 久久草在线视频国产 | 五月天婷婷在线观看视频 | 欧美日韩在线观看一区二区三区 | 亚洲免费不卡 | 四虎国产精品永久在线国在线 | 久久久国产高清 | 国产一区二区在线播放 | 丁香午夜| 在线一区av | 日韩久久精品 | 99国产成+人+综合+亚洲 欧美 | 伊色综合久久之综合久久 | 国产精品热 | 综合亚洲视频 | 国产日韩在线看 | 色偷偷中文字幕 | 999精品网| 99在线视频免费观看 | 天天干,天天射,天天操,天天摸 | 国产手机视频精品 | 免费在线国产精品 | 最近2019好看的中文字幕免费 | 国产只有精品 | 中文字幕国产一区二区 | 国语久久 | 中文字幕激情 | 狠狠狠狠狠狠狠干 | 亚洲精品视频网 | 国产一级特黄电影 | 成人亚洲精品国产www | 正在播放亚洲精品 | 国产精品ⅴa有声小说 | 性色va | 日批网站在线观看 | 亚洲精品高清在线 | 综合网久久 | 亚洲在线精品 | 国产亚洲精品久久久久久久久久久久 | 97视频免费在线 | 日韩av午夜在线观看 | 手机在线日韩视频 | 91av资源网 | 亚洲最新av | 美国人与动物xxxx | 久久国产一区二区 | 在线视频一区观看 | 亚洲精品乱码久久久久v最新版 | 91亚瑟视频 | 色婷婷综合视频在线观看 | 婷婷久久久 | 激情在线免费视频 | 在线看片日韩 | 国产中文字幕在线视频 | 日韩视频中文字幕在线观看 | 国产亚洲精品成人av久久影院 | 一区二区 精品 | 四虎影视8848dvd | 在线免费视频 你懂得 | 在线免费观看视频一区二区三区 | 激情视频91 | 久久91久久久久麻豆精品 | 日韩精品一卡 | 国产一级免费在线 | 日韩免费视频观看 | 九九热精品视频在线播放 | av成人免费 | 丁香六月天 | 中文字幕日韩无 | 激情五月看片 | 日韩在线免费播放 | 国产一级在线观看视频 | 国产香蕉视频在线播放 | 亚洲成人资源 | 亚洲国产日本 | 亚洲国产午夜 | 不卡的一区二区三区 | 天天射综合 | 日韩一区二区免费播放 | 中文字幕丝袜 | 国产黄大片在线观看 | 亚洲精品一区二区18漫画 | 天天爱天天射天天干天天 | 亚州av成人| 久久丁香| 探花视频网站 | 99久热| 国产中文字幕视频在线观看 | 91视频 - x99av| 亚洲精品天天 | av在线com| 天天躁天天操 | 亚洲精品国产区 | 97人人模人人爽人人喊中文字 | 不卡视频一区二区三区 | 开心激情五月婷婷 | 国产97在线观看 | 成人av在线一区二区 | 韩国一区二区三区视频 | 久久人人爽人人爽 | 婷婷国产精品 | 国产精品18久久久久久久久 | 最新超碰 | 国产不卡av在线播放 | 中文字幕在线一区二区三区 | 天天操偷偷干 | 成人超碰在线 | 国产黄色精品在线 | www中文在线 | 亚洲天堂网站 | 午夜久久久久久久久久影院 | 国产不卡精品视频 | 私人av| 色丁香婷婷| 国产成人精品一区二区在线 | 黄网av在线 | 中文字幕4 | 久久国产影视 | 好看的国产精品视频 | 伊人久久五月天 | 国产伦精品一区二区三区免费 | 日韩av男人的天堂 | 亚洲精品乱码久久久一二三 | 日韩午夜精品 | 欧美久久精品 | 成人黄大片视频在线观看 | 天天综合网 天天综合色 | 日韩午夜视频在线观看 | 免费在线观看av不卡 | 在线岛国av| 国产精品毛片久久久久久 | 久久久久久久久久久影视 | 日本中文字幕在线电影 | 这里只有精品视频在线观看 | 免费日韩 精品中文字幕视频在线 | 国内外成人在线视频 | 亚洲综合激情 | 久久在草 | 黄色小网站在线 | 国产在线观看你懂得 | 不卡av在线免费观看 | 99看视频在线观看 | 中文字幕中文字幕在线中文字幕三区 | 97在线精品 | 久久久久久免费网 | 亚洲精品福利在线观看 | 国产高清99| 福利视频导航网址 | 久久国产精品99精国产 | 中文字幕电影一区 | 在线蜜桃视频 | 亚洲国产精品传媒在线观看 | 国产丝袜制服在线 | 国产视频一 | 日韩av电影手机在线观看 | 午夜性色| 在线观看视频你懂的 | 一级黄色片网站 | 国产精品一区二区三区四 | 亚洲黄色一级视频 | 精品国产黄色片 | 久久精品毛片 | 69国产精品视频 | 成年人在线免费看视频 | 成年人在线观看网站 | 99国产视频| 中文字幕免费久久 | av免费片 | 婷婷丁香五 | 免费福利在线视频 | 亚洲精品成人av在线 | 久久九九免费视频 | 免费韩国av | 欧美日韩裸体免费视频 | 日批视频在线 | 欧美日韩中文字幕视频 | 成人app在线免费观看 | 成人h电影在线观看 | 人人射人人澡 | 丁香婷婷激情 | 麻豆一精品传二传媒短视频 | www.久久久 | 午夜精品一二区 | 最近最新中文字幕视频 | 在线电影播放 | 91原创在线观看 |