日韩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)站內容還不錯,歡迎將生活随笔推薦給好友。

久久伊人精品天天 | 色婷婷精品大在线视频 | 激情动态 | 亚洲精品国产高清 | 欧美日韩伦理一区 | 一区二区三区免费在线观看视频 | 久久综合毛片 | 亚洲综合欧美日韩狠狠色 | 九九热视频在线免费观看 | 午夜精品一区二区三区免费视频 | 欧美一性一交一乱 | 国产精品亚州 | 国产精品久久久久影院日本 | 一级黄色毛片 | 欧美少妇bbwhd | 涩涩在线 | 91九色在线视频观看 | 9草在线| 激情欧美网 | 最近2019中文免费高清视频观看www99 | 四月婷婷在线观看 | 91精品999| 综合网av | 亚洲精品在线视频网站 | 欧美少妇xxx | 国产精品久久久久久久免费 | 天天操天天怕 | 久久综合狠狠综合 | 中文字幕在线网 | 好看的国产精品视频 | 三级黄色在线观看 | 久久香蕉国产 | 亚州av成人 | 国产精品高潮久久av | 九九久久免费视频 | 国产精品1区2区3区 久久免费视频7 | 国产精品视频内 | 97在线免费观看视频 | 久久伊人五月天 | 丁五月婷婷 | www.婷婷色| 999成人国产 | 国产一区在线不卡 | 国产日韩视频在线播放 | www.色午夜 | 免费一级毛毛片 | 6699私人影院| 天天插天天干天天操 | 亚洲精品在线视频观看 | 91精品国产综合久久久久久久 | 一区二区视频在线看 | 91九色porny在线| 天天操天天综合网 | 免费看v片网站 | 麻豆免费视频观看 | 成人97人人超碰人人99 | 欧美一级黄色视屏 | 国产香蕉97碰碰碰视频在线观看 | 国产视频1区2区3区 久久夜视频 | 久久刺激视频 | 国产精品6 | 在线成人免费 | 国产男女免费完整视频 | 女女av在线 | 一二三区在线 | 久久免费精品视频 | 狠狠激情中文字幕 | 国产一性一爱一乱一交 | 亚洲做受高潮欧美裸体 | 日韩av快播电影网 | 国产亚洲精品久久久久久大师 | 亚洲精品中文字幕视频 | 欧美成人精品欧美一级乱黄 | 久久亚洲私人国产精品 | 日本在线中文 | 国产精品久久一区二区三区不卡 | 亚洲国产精品成人av | 久久久精品小视频 | 久久热首页 | 97视频成人| 在线观看日韩 | 国产乱码精品一区二区蜜臀 | 久久免费99精品久久久久久 | 日日综合 | 黄色三级免费 | 免费人人干 | 97电影院在线观看 | 91精品在线免费视频 | 国产一区二区视频在线 | 狠狠躁夜夜躁人人爽视频 | av在线播放快速免费阴 | 尤物97国产精品久久精品国产 | av高清在线| 超碰人人在线 | 91av免费看| 久久三级视频 | 日韩一二三 | 五月激情电影 | 999国产| 一级c片 | 欧美精品在线观看 | 国产精品久久久久久a | 97精品一区 | 欧美日韩免费视频 | 黄色av影视 | 成年人在线观看视频免费 | 在线观看福利网站 | 99久久99久久精品国产片果冰 | 免费高清在线观看电视网站 | 99精品免费久久久久久久久 | 99久久夜色精品国产亚洲 | 色网免费观看 | 人人爽久久久噜噜噜电影 | 亚州精品视频 | 精品视频国产一区 | 黄色三级av| 国产精品福利一区 | 久久久久国产精品免费网站 | 国产女教师精品久久av | 911久久香蕉国产线看观看 | 欧美精品亚州精品 | 中文字幕a在线 | 在线av资源 | 激情综合亚洲 | 国产成人高清 | 五月婷婷综 | 日本中文一级片 | 天天干天天看 | 天天插天天 | 亚洲日本欧美在线 | 在线免费试看 | 色综合久久久久久久 | 日韩在线短视频 | 国产特黄色片 | 欧美精品亚洲二区 | 久久99视频精品 | 久久国产亚洲视频 | 欧美日韩精品区 | 91成年视频 | 97精品国产97久久久久久久久久久久 | 中文字幕一区二区三区乱码在线 | 超碰人人国产 | 国产成人久久久77777 | 日韩二区在线 | 激情婷婷在线观看 | 911精品美国片911久久久 | 成年人毛片在线观看 | 欧美夫妻生活视频 | 欧美视频在线观看免费网址 | 综合激情婷婷 | 99热高清 | 久久久www成人免费精品张筱雨 | 国产一区二区视频在线 | 91视视频在线直接观看在线看网页在线看 | 7777xxxx| 亚洲色影爱久久精品 | 午夜婷婷在线观看 | 亚洲欧美视频在线 | 成年人看片 | 91亚洲国产成人久久精品网站 | 成年人免费看的视频 | 香蕉视频导航 | 婷婷五综合 | 国产综合片 | 久草在线免 | 激情在线网站 | 国产精品成人一区二区 | 国内99视频 | 天天爽夜夜爽人人爽曰av | 成人免费视频网站在线观看 | 97色资源 | 婷婷日日 | 国产91免费在线 | 日韩中文字幕视频在线 | 国产精品毛片一区 | 亚洲婷婷在线 | 亚洲另类人人澡 | 国产涩图 | 国产区精品 | 日本精品免费看 | 色视频 在线 | 国产精品美乳一区二区免费 | 精品国产一区二区三区在线观看 | 精品国产一区二区三区男人吃奶 | 亚洲精品美女 | 成人动漫精品一区二区 | 开心色停停 | 97av超碰| 成人羞羞视频在线观看免费 | 久久国内视频 | 日韩高清免费在线观看 | 日韩三区在线观看 | www亚洲一区 | 欧美性黑人| 99在线免费视频观看 | 婷婷综合国产 | 中文字幕在线观看视频网站 | 成人午夜在线观看 | 午夜精品久久久久久久99无限制 | 人人干人人干人人干 | 狠狠狠狠狠狠操 | 午夜视频免费在线观看 | 在线观看的a站 | 在线观看视频在线观看 | 精品久久久久久久久久 | 久久久99精品免费观看 | 久久久久看片 | 亚洲一二区视频 | 午夜视频免费在线观看 | 日本黄色免费在线观看 | 久久久久免费电影 | 久久天堂精品视频 | 伊人日日干 | 区一区二区三区中文字幕 | 午夜色性片 | 久久综合久久八八 | 一级欧美日韩 | 久久久久国产一区二区 | 在线看片一区 | 在线免费国产 | 九九热免费在线视频 | 粉嫩av一区二区三区四区五区 | 亚洲天天干 | 热久久这里只有精品 | 天天干夜夜想 | 久久爱影视i | 久久99久久99精品免视看婷婷 | 最新国产中文字幕 | 欧美一级黄色视屏 | 国产精品久久久久久久久久免费 | 久久久久久久99精品免费观看 | 91av成人 | 亚洲精品成人网 | 99视频99 | 天天干,天天插 | 最近更新好看的中文字幕 | 粉嫩av一区二区三区入口 | 亚洲区另类春色综合小说 | 中文字幕免 | 日韩a级黄色| 色婷婷久久 | 亚洲综合成人专区片 | 国产亚洲精品日韩在线tv黄 | 激情网婷婷 | 国产成人333kkk | 在线播放国产一区二区三区 | 久久久久久久久久免费视频 | 91久久久国产精品 | 日韩 在线| 久久久精品欧美一区二区免费 | 伊人久久国产 | 天天色天天草天天射 | 91视频免费网址 | 国产精品久久一区二区无卡 | 91色网址 | 亚洲精品在线观看中文字幕 | 欧美一区二区在线免费看 | 久久久久久久久久影院 | 国语久久 | 久久精品导航 | 欧美日韩一区二区三区免费视频 | 一区二区影院 | 欧美伦理一区 | 国产精品资源网 | 国产中文字幕在线免费观看 | 国产免码va在线观看免费 | 亚洲视频一 | 午夜婷婷综合 | 欧美a级免费视频 | 97国产人人 | 亚洲国产视频网站 | 曰本免费av | 91亚洲国产成人久久精品网站 | www免费| 日韩精品一区二区三区外面 | 香蕉视频在线播放 | 久久一区精品 | 国产精品18久久久久久vr | 婷婷精品国产一区二区三区日韩 | 免费观看黄色av | 免费亚洲片 | 色就是色综合 | 亚洲国产精品传媒在线观看 | 成人黄色毛片 | 91中文字幕在线播放 | 久久久高清免费视频 | 国产精品第一页在线观看 | 欧美日韩xxx | 成人av网站在线观看 | 69av国产 | 色综合久久久久综合 | 99久久国产免费,99久久国产免费大片 | 综合久久久久久久 | 成年人在线 | 欧美一区二区三区激情视频 | 精品视频| 国产精品国产亚洲精品看不卡 | 女人18片 | 日韩有码专区 | 日韩高清精品免费观看 | 久久日韩精品 | 一本大道久久精品懂色aⅴ 五月婷社区 | 美女性爽视频国产免费app | a级片久久久 | 在线视频专区 | 亚洲精品乱码久久久久久蜜桃动漫 | 色wwwww| 激情五月婷婷综合 | 欧美亚洲另类在线视频 | 国产人成精品一区二区三 | 免费视频a | 亚洲专区在线 | 日本中文字幕在线免费观看 | 91一区二区三区在线观看 | 亚洲国产精品免费 | 日韩久久一区 | 久久国内视频 | 日日狠狠 | 爱爱av网站 | 干狠狠| 综合精品久久久 | 91精品视频免费在线观看 | 欧美日韩一区二区三区在线观看视频 | 亚洲永久免费av | 国产精品精品久久久久久 | 欧美在线观看视频一区二区三区 | 黄色一级大片免费看 | 丝袜美腿一区 | 免费观看9x视频网站在线观看 | 丁香婷婷在线观看 | 成人国产网址 | 免费在线观看视频一区 | 久久成人高清 | 天干啦夜天干天干在线线 | 中文字幕在线一区观看 | 丝袜制服天堂 | 国产人免费人成免费视频 | www亚洲国产 | 免费观看的av | 成人黄大片 | 亚洲春色成人 | www.香蕉视频在线观看 | 成人免费观看大片 | 日韩久久精品一区二区三区下载 | 特黄色大片 | 亚洲 欧美 变态 国产 另类 | 在线免费观看欧美日韩 | 99久热精品 | 久久精品99国产国产 | 久久精国产 | 国产精品私人影院 | 欧美日韩国产在线 | 9999免费视频 | japanesexxxxfreehd乱熟 | 亚洲午夜在线视频 | 亚洲91在线| 97国产大学生情侣酒店的特点 | 日韩中文字幕a | 永久免费在线 | 91成人精品一区在线播放69 | 天堂网av 在线 | 日韩伦理片hd | 欧美精品一区在线发布 | 久久久免费毛片 | 国产成人精品一区二区三区福利 | 日本精品中文字幕在线观看 | 色七七亚洲影院 | 精品伊人久久久 | 日韩精品一区二区三区在线视频 | 国产精品乱码一区二区视频 | 欧美午夜视频在线 | 六月婷操 | 一区二区伦理 | 日韩在线视频网站 | 91一区一区三区 | 免费亚洲婷婷 | 日本久久成人 | 亚洲人天堂 | 天天操夜夜做 | 久久久久亚洲精品成人网小说 | 国产亚洲精品成人av久久影院 | 黄色av一级片 | 999精品| 中日韩免费视频 | 日日碰狠狠躁久久躁综合网 | 国产精品女人久久久 | 国产精品免费久久久久久 | 日韩欧美一区二区三区在线观看 | 天天操婷婷 | 一区在线观看 | 久久成电影 | 国产日韩精品一区二区三区在线 | 久久精品黄 | 婷婷精品进入 | 日日操日日操 | 亚洲精品国产精品国自产 | 天天干夜夜想 | 91人人射| 天天干天天操天天 | 亚洲无吗av| 在线精品亚洲一区二区 | av亚洲产国偷v产偷v自拍小说 | 国产夫妻性生活自拍 | 中文字幕在线播放日韩 | 亚洲免费不卡 | 中文字幕网站 | 中文字幕一区2区3区 | 九精品| 国产最新91| 不卡精品 | 毛片一区二区 | 色香蕉网| 91完整版 | 91精品第一页 | 久久国产精品免费观看 | 五月天丁香视频 | 操处女逼 | 亚洲 欧美日韩 国产 中文 | 国产一级片免费视频 | 亚洲国内精品在线 | 在线看的av网站 | 91网在线观看 | 午夜精品一区二区三区在线播放 | 国产精品久久一 | 亚洲精品视频久久 | 日韩视频一区二区三区 | 欧美成人中文字幕 | 色97在线 | 中文字幕电影在线 | 免费观看的av | 国产精品h在线观看 | 美女视频久久久 | www.福利| 五月天电影免费在线观看一区 | 天天激情综合网 | 色吊丝在线永久观看最新版本 | 97超碰香蕉 | 91亚色视频在线观看 | 日本成人免费在线观看 | 中文在线免费视频 | av在线等 | 亚洲涩涩一区 | 久久er99热精品一区二区三区 | 久久精品7 | 日韩欧美在线国产 | 国产精品午夜免费福利视频 | 91人网站 | 国产一级不卡视频 | 日韩精品一区二区三区免费观看 | 国产成人免费网站 | 国产在线观看你懂得 | 国产精久久久 | 色欧美视频 | 国产资源网 | 色综合久久久久 | 国产剧情一区二区在线观看 | 欧美久久久一区二区三区 | 香蕉视频在线视频 | 天天草网站| 久久久一本精品99久久精品66 | 日韩免费视频播放 | 亚洲国产精品成人女人久久 | 91在线视频在线 | www.久久久久 | 久久视频在线免费观看 | 亚洲精品视频免费在线观看 | 一区二区精品在线视频 | 成人黄色大片在线观看 | 欧洲精品视频一区二区 | 中文字幕欲求不满 | 玖玖视频免费在线 | 97人人澡人人添人人爽超碰 | 国产亚洲视频在线免费观看 | 国产原创91| 麻豆 videos | 六月丁香婷婷久久 | 日韩精品三区四区 | 亚洲激情在线 | 欧美精品一区二区三区四区在线 | 深爱激情五月婷婷 | 91精品啪在线观看国产线免费 | 成年人免费在线看 | 超碰成人av | 久久成年人网站 | 成人在线你懂得 | 一级黄色av | 在线免费91 | 一区二区三区免费网站 | 视频在线观看日韩 | 又黄又刺激视频 | 香蕉97视频观看在线观看 | 91香蕉视频污在线 | 97超碰在线久草超碰在线观看 | 久草国产精品 | 欧美精品被 | 成人观看| 亚洲伦理电影在线 | 中文字幕一区二区三区四区视频 | 人人爽人人澡人人添人人人人 | 99亚洲国产精品 | 91在线永久 | 99中文字幕视频 | 成人性生交大片免费观看网站 | 色综合激情网 | 精品国产aⅴ麻豆 | 91在线播| 五月天婷亚洲天综合网精品偷 | 狠狠狠狠狠狠狠干 | 国产成人精品久久二区二区 | 国产精在线 | 日韩专区在线观看 | 91九色丨porny丨丰满6 | 久久男人免费视频 | 成人网看片 | 美女精品国产 | 欧美淫视频 | 久久久久久久久久国产精品 | 91大神免费视频 | 国产精品久久久久久婷婷天堂 | 国产精品麻豆欧美日韩ww | 伊人天天狠天天添日日拍 | 99在线热播精品免费99热 | 日韩av免费网站 | av电影中文 | 国产一级视频在线 | 欧美日韩三级在线观看 | 91黄色视屏 | 99精品在线免费视频 | 中文永久字幕 | 深爱开心激情网 | 中文字幕网站视频在线 | 99久久夜色精品国产亚洲 | 中文字幕欧美激情 | 国产精品乱码一区二三区 | 中文在线中文资源 | 四虎在线免费视频 | 成年人国产视频 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 成人h视频在线播放 | 美女网站视频免费黄 | 99视频在线观看一区三区 | 91九色视频观看 | 亚洲天堂网视频在线观看 | 911久久 | 亚洲国产wwwccc36天堂 | 免费一级片久久 | 不卡电影免费在线播放一区 | 精品九九久久 | av三级av | 欧美一级性生活 | www天天操 | 91超碰在线播放 | 国产粉嫩在线 | 偷拍福利视频一区二区三区 | 能在线看的av | 日韩精品91偷拍在线观看 | 久久九九网站 | 手机在线黄色网址 | 深爱激情五月综合 | 日韩免费b | 国内精品在线看 | 免费中文字幕在线观看 | 97av精品 | 欧美精品一级视频 | 97视频免费看 | 女人久久久久 | 五月婷婷在线观看视频 | 99久久精品免费看国产麻豆 | 久久午夜电影院 | 中文字幕在线第一页 | 色婷婷久久久综合中文字幕 | 91视频91蝌蚪 | 国产中文字幕久久 | 色国产精品一区在线观看 | 国产精品激情在线观看 | 一区二区三区电影大全 | 亚洲综合视频网 | 国产精品99久久久精品 | 西西444www | 亚洲a网 | 麻豆国产网站 | 久久观看最新视频 | 亚洲va欧美| 亚洲视频免费在线 | 天堂在线视频免费观看 | 久久久久久久久久久福利 | 成人毛片a| 久久久久久久久精 | 免费一级日韩欧美性大片 | 精品视频不卡 | 美女黄濒 | 激情五月在线观看 | 久草在线免费资源 | 91高清视频 | 久久色在线播放 | 九九精品视频在线观看 | 久久理论影院 | 免费国产一区二区 | 久久私人影院 | 热re99久久精品国产99热 | 黄色片视频在线观看 | 欧美精品久久久久久久免费 | 伊人小视频 | 在线视频成人 | 免费看一级特黄a大片 | 免费看91的网站 | 92国产精品久久久久首页 | 日韩中文在线字幕 | 黄色精品免费 | 欧美精品亚洲二区 | 国产专区一 | 久久久免费在线观看 | 中文字幕在线观看免费观看 | 狠狠操电影网 | 久久高清免费视频 | 国产精品免费看 | 日本中文字幕久久 | 亚洲 欧美 国产 va在线影院 | 国产在线中文字幕 | 在线精品视频免费播放 | 日韩午夜网站 | 色婷婷在线观看视频 | 五月天婷婷丁香花 | 91麻豆看国产在线紧急地址 | 免费观看十分钟 | 伊人热| 成人在线视频免费 | 91在线播| 一区二区三区四区久久 | 黄网站色成年免费观看 | 国产精品一区二区在线免费观看 | 狠狠色香婷婷久久亚洲精品 | 中文字幕在线国产 | 天天射,天天干 | 成人午夜电影久久影院 | 午夜电影 电影 | 亚洲天天看| 久久久精品欧美一区二区免费 | 久久高清国产 | 久久精品123| 久久精品欧美 | 日本久久中文 | 高清不卡一区二区在线 | 国产精品一区二区av | 国语精品免费视频 | 日本久久久亚洲精品 | 久久久精品亚洲 | 色爱区综合激月婷婷 | 天天操天天摸天天干 | 久久人人爽人人爽人人 | www色,com| 精品亚洲va在线va天堂资源站 | 免费网站污 | 国产99久久久国产精品免费看 | 黄色网址中文字幕 | 日本久久久久久久久久久 | 国产精品一区二区av日韩在线 | 免费碰碰 | 欧美 日韩 国产 成人 在线 | 欧美一级久久久久 | 99久久久久久久 | 亚洲精品国产高清 | 久草在线这里只有精品 | 婷婷在线资源 | 国产免费叼嘿网站免费 | 高潮久久久久久久久 | 久久99热这里只有精品 | 久久夜av | 久久不射电影院 | 日韩精品久久一区二区 | 亚洲精品日韩一区二区电影 | 黄色片软件网站 | 久久久人人爽 | 国产精品99免费看 | 国产精品18p | 亚洲视频在线播放 | 国产不卡在线看 | 91干干干| 91天堂在线观看 | 国产精品爽爽久久久久久蜜臀 | 亚洲欧美一区二区三区孕妇写真 | 国产在线观看黄 | 99精品视频观看 | 亚洲精品国产精品国自产观看 | 激情综合网色播五月 | 国产欧美精品一区二区三区 | 国内精品视频久久 | 天天综合网天天 | 园产精品久久久久久久7电影 | 久久福利| 免费av网站在线 | 亚洲精品视频大全 | 日韩精品久久久久久久电影竹菊 | 伊人五月 | 伊人婷婷网 | 天天色天天射天天操 | 精品字幕 | 成人网444ppp | 日本中文字幕在线电影 | 久久久久久久久久电影 | 日韩精品一区二区三区在线播放 | 国产精品第一页在线 | 色婷婷电影网 | 久久高清国产视频 | 成人国产综合 | 国产精品一区二区在线播放 | 国产精品国产三级国产aⅴ无密码 | 国产成人免费 | 激情亚洲综合在线 | 国产精品观看在线亚洲人成网 | 91九色成人| 国产男女免费完整视频 | 激情在线网 | 成人97视频一区二区 | 亚洲视频电影在线 | 午夜精品一区二区三区在线观看 | 特片网久久 | 97视频入口免费观看 | av高清不卡 | 国产免费人成xvideos视频 | 国产高清在线观看 | 中文字幕日韩高清 | 天天搞天天干 | 久久久久久久久久久久影院 | 在线观看视频国产 | 狠狠干五月天 | 日日夜夜精品免费视频 | 91污污| 国产精品理论在线观看 | 激情五月综合 | 久久久久久久久黄色 | 91精品久久久久久粉嫩 | 激情丁香综合五月 | 国产精品久久久久久a | 97av视频 | 国产精品毛片久久久久久 | 99久久久国产精品免费观看 | 中文有码在线视频 | 亚洲在线视频免费 | 国产一区在线不卡 | 久久久免费精品 | 探花视频在线观看免费版 | av亚洲产国偷v产偷v自拍小说 | www色网站| 亚洲成人av一区二区 | 超碰夜夜| 夜夜躁日日躁 | 久久这里只有精品23 | 91传媒免费在线观看 | www.狠狠插.com | 五月天久久精品 | 天天爽人人爽夜夜爽 | 丁香婷婷久久久综合精品国产 | 亚洲毛片在线观看. | 日韩欧美在线中文字幕 | 黄色成人毛片 | 天天操天天色天天射 | 国产精品对白一区二区三区 | 国产资源免费在线观看 | 精品一区二区视频 | 国产黄色在线看 | 伊人久久一区 | 91av视频在线播放 | 手机成人在线电影 | 香蕉精品视频在线观看 | 99九九99九九九视频精品 | 久草视频免费看 | 日韩精品一区二区三区免费观看视频 | 天天综合婷婷 | 国产精品乱码高清在线看 | 欧美性大战久久久久 | 国产成人精品电影久久久 | 日韩在线免费电影 | 中文字幕 国产专区 | 激情视频一区二区三区 | 99久久精品久久久久久动态片 | 亚洲精品一区二区三区在线观看 | 久草免费新视频 | 成人久久毛片 | 偷拍精品一区二区三区 | 久久久久 | 欧美日韩亚洲精品在线 | 视频国产精品 | 在线观看的黄色 | 欧美日韩午夜爽爽 | 午夜在线观看影院 | 婷婷香蕉 | 国产福利av在线 | 国产成人三级在线 | 黄色网中文字幕 | 久久狠狠婷婷 | 国产黄影院色大全免费 | 人人精品久久 | 国产明星视频三级a三级点| 久久精品国产第一区二区三区 | 国产亚洲精品美女 | 国产最新在线 | 久操视频在线 | 亚洲精品视频在线免费 | 亚洲人成在线观看 | 日日干视频 | 天天操网址 | 天天插天天操天天干 | 中文字幕在线观看日本 | 精品亚洲午夜久久久久91 | 日韩高清在线一区二区三区 | 国产成人精品午夜在线播放 | 色午夜 | 中文字幕欲求不满 | 免费观看福利视频 | 亚洲区另类春色综合小说校园片 | 欧美成人免费在线 | 欧美日韩视频在线一区 | www日韩视频 | 日韩欧美专区 | 欧美一区免费在线观看 | 色综合久久久久久中文网 | 免费网站观看www在线观看 | 99九九视频 | 97成人精品视频在线观看 | 国产最顶级的黄色片在线免费观看 | 色综合天天狠天天透天天伊人 | 成人精品一区二区三区电影免费 | 国产精品一级在线 | 国产精品久久久一区二区 | 日韩免费视频一区二区 | 色视频网站在线观看一=区 a视频免费在线观看 | 国产粉嫩在线 | 国产精品麻豆视频 | 亚洲精品在线国产 | 视频 天天草 | 成人啪啪18免费游戏链接 | 久久午夜羞羞影院 | 欧美日韩在线观看一区二区三区 | 国产精品精品国产婷婷这里av | 一区二区三区免费在线观看 | 婷婷免费在线视频 | 久久精品视频免费 | 国产精品久久久久毛片大屁完整版 | 在线观看日本韩国电影 | 久久午夜免费观看 | 视频一区在线播放 | 超碰av在线播放 | 久久久久欧美精品999 | 91精品国产成 | av夜夜操| 成人动漫精品一区二区 | 国产精品免费视频网站 | 丁香视频在线观看 | 狠狠亚洲 | 午夜电影久久久 | www.香蕉 | 欧美色图30p | 黄色毛片在线看 | 在线看日韩 | 西西4444www大胆艺术 | 97超级碰 | 中国精品少妇 | 欧美视频xxx| 97超碰成人 | 国内精品久久久久影院优 | 激情丁香 | se婷婷 | 三上悠亚一区二区在线观看 | 亚洲精品网站在线 | 亚洲国产精品成人va在线观看 | 欧美色888| 久久久久久久久久久影视 | 国产一区二区在线播放视频 | 亚洲干 | 欧美日韩午夜 | 久久狠狠干 | 久久久精品综合 | 在线观看国产一区 | 91色影院| 婷婷中文字幕综合 | a亚洲视频 | 国产91在线播放 | 在线观看视频91 | 最新日韩在线 | 中文字幕高清在线 | 精品国产免费观看 | 日本精品一区二区在线观看 | 91精品在线免费观看 | www.888.av | 六月色婷 | 少妇bbb搡bbbb搡bbbb | 91免费看黄 | 日本激情视频中文字幕 | 亚洲午夜精 | 免费观看v片在线观看 | 精品一区二区三区香蕉蜜桃 | 婷婷网站天天婷婷网站 | 免费在线观看视频a | 成人va在线观看 | 91av视频导航| 国产精品18久久久久久久久久久久 | a黄色片在线观看 | 国产成人精品亚洲a | 久久精品一区二区三区中文字幕 | 亚洲乱码精品 | 中文字幕欧美日韩va免费视频 | 色www精品视频在线观看 | 色爽网站 | 亚洲国产久 | 日韩va亚洲va欧美va久久 | 在线免费av网站 | 国产男女免费完整视频 | 中文字幕欲求不满 | 久久国产精品色av免费看 | 一二三区av | 黄色毛片视频 | 国产九色视频在线观看 | 欧美污网站 | 欧美成年人在线观看 | 国产又粗又硬又爽的视频 | 国产精品9999久久久久仙踪林 | 97人人添人澡人人爽超碰动图 | 婷婷在线播放 | 亚洲最新视频在线 | 天天曰| 999色视频 | 日本高清免费中文字幕 | 久久精品美女视频网站 | 久久精品一区二区三区国产主播 | 九九久久久久久久久激情 | 国产欧美日韩视频 | 91激情视频在线播放 | 超碰在线9 | 国产男女爽爽爽免费视频 | 日韩精品中文字幕在线不卡尤物 | 欧洲亚洲国产视频 | 亚洲少妇影院 | 久草视频在线资源 | 亚洲激情中文 | 亚洲综合成人婷婷小说 | 亚洲欧美一区二区三区孕妇写真 | 久久免费视频在线观看30 | 黄色毛片电影 | 五月婷婷综合久久 | 欧美日韩国产欧美 | 一区二区三区电影在线播 | 在线看片91 | 在线中文日韩 | 国语麻豆| 免费观看一级一片 | 91精品日韩 | 国产黄色大片 | 亚洲精品视频在线观看免费视频 | 91精品国产91p65| 天天爱天天射天天干天天 | 992tv人人网tv亚洲精品 | 天天爽综合网 | 成人作爱视频 | 特级大胆西西4444www | 久久人人爽人人爽 | 欧美巨大荫蒂茸毛毛人妖 | 国产精品一区免费看8c0m | 九色自拍视频 | 97在线视频免费看 | 一区二区三区高清不卡 | 99精品一区二区三区 | 国产精品69av | av 一区二区三区四区 | bbbbb女女女女女bbbbb国产 | 五月天色综合 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 最新极品jizzhd欧美 | 久久精品超碰 | 91精品专区 | 久久国语| 久久久久久久久久久国产精品 | 欧美看片| 色91在线| 粉嫩高清一区二区三区 | 免费在线观看av的网站 | 亚洲乱码精品久久久 | 免费观看91 | 午夜性色 | av福利在线看 | 九九日韩 | 国产美女精品在线 | 日韩在线国产精品 | 中文字幕观看在线 | 高清精品在线 | 亚洲精品激情 | 婷婷综合激情 | 欧美乱码精品一区二区 | 久草视频免费在线观看 | 人人爽人人爽 | 国产一级二级三级在线观看 | 99精品一区二区 | 国产精品入口麻豆 | 91精品专区 | 97看片网 | 精品福利在线 | 精品二区视频 | 九九热免费观看 |