精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

吐血整理!14個(gè)編寫Spring MVC控制器的實(shí)用小技巧

開發(fā) 前端 開發(fā)工具
本文介紹了編寫Spring MVC框架的控制器(controller)的基礎(chǔ)技巧和最佳操作。在Spring MVC框架中,編寫控制器類通常是為了處理用戶提出的請(qǐng)求。

本文介紹了編寫Spring MVC框架的控制器(controller)的基礎(chǔ)技巧和最佳操作。在Spring MVC框架中,編寫控制器類通常是為了處理用戶提出的請(qǐng)求。

編寫完成后,控制器會(huì)調(diào)用一個(gè)業(yè)務(wù)類來處理業(yè)務(wù)相關(guān)任務(wù),進(jìn)而重定向客戶到邏輯視圖名。Springdispatcher servlet會(huì)對(duì)邏輯視圖名進(jìn)行解析,并渲染結(jié)果或輸出。這就是一個(gè)典型的“請(qǐng)求—響應(yīng)”的完整流程。

[[282570]]

1. 使用@controllerstereotype

創(chuàng)建一個(gè)能夠處理單個(gè)或多個(gè)請(qǐng)求的控制器類,最簡(jiǎn)單的方法就是使用@controllerstereotype注解一個(gè)類,如:

  1. import org.springframework.stereotype.Controller; 
  2. import org.springframework.web.bind.annotation.RequestMapping; 
  3. @Controller 
  4. publicclassHomeController { 
  5.     @RequestMapping("/") 
  6.     publicString visitHome() { 
  7.         // do something before returning view name 
  8.         return"home"; 
  9.     } 

如上所示,visitHome()方法通過重定向跳轉(zhuǎn)到視圖名home來處理應(yīng)用程序內(nèi)容路徑(/)收到的請(qǐng)求。 注意:只有在Spring配置文件中啟用了注解驅(qū)動(dòng),才能使用@controllerstereotype。

  1. <annotation-driven/> 

啟用注解驅(qū)動(dòng)后,Spring的容器(container)會(huì)自動(dòng)掃描如下包中的類:

  1. <context:component-scanbase-packagecontext:component-scanbase-package="net.codejava.spring"/> 

帶有@controller注解的類會(huì)被標(biāo)記成控制器。由于其簡(jiǎn)單方便,且不再需要對(duì)配置文件中的控制器聲明beans,這一方法非常實(shí)用。 注意:使用@controller注解可以創(chuàng)建一個(gè)多動(dòng)作控制器類,可同時(shí)處理多個(gè)不同的請(qǐng)求。如:

  1. @Controller 
  2. publicclassMultiActionController { 
  3.     @RequestMapping("/listUsers") 
  4.     public ModelAndView listUsers() { 
  5.     } 
  6.     @RequestMapping("/saveUser") 
  7.     public ModelAndView saveUser(User user) { 
  8.     } 
  9.     @RequestMapping("/deleteUser") 
  10.     public ModelAndView deleteUser(User user) { 
  11.     } 

如上所示,有三個(gè)處理器(handler)在分別處理三個(gè)請(qǐng)求,/listUsers,/saveUser,和/deleteUser。

2. 實(shí)現(xiàn)控制器接口

在Spring MVC中創(chuàng)建控制器還可以用另一個(gè)經(jīng)典的方法,即對(duì)一個(gè)類實(shí)現(xiàn)Controller接口。如:

  1. import javax.servlet.http.HttpServletRequest; 
  2. import javax.servlet.http.HttpServletResponse; 
  3. import org.springframework.web.servlet.ModelAndView; 
  4. import org.springframework.web.servlet.mvc.Controller; 
  5. publicclassMainControllerimplements Controller { 
  6.     @Override 
  7.     public ModelAndView handleRequest(HttpServletRequest request, 
  8.             HttpServletResponse response) throws Exception { 
  9.         System.out.println("Welcome main"); 
  10.         returnnew ModelAndView("main"); 
  11.     } 

實(shí)現(xiàn)類必須重寫handleRequest()方法(當(dāng)收到相匹配的請(qǐng)求時(shí),Spring dispatcher servlet會(huì)調(diào)用handleRequest)。由該控制器處理的請(qǐng)求URL模式在Spring的內(nèi)容配置文件中的定義如下:

  1. <beannamebeanname="/main"class="net.codejava.spring.MainController"/> 

這一方法的缺點(diǎn)在于其控制類無法同時(shí)處理多個(gè)請(qǐng)求URL。

3. 繼承AbstractController類

如果想要輕松控制受支持的HTTP方法、會(huì)話和內(nèi)容緩存,讓控制類繼承AbstractController類是理想的方法。如:

  1. import javax.servlet.http.HttpServletRequest; 
  2. import javax.servlet.http.HttpServletResponse; 
  3. import org.springframework.web.servlet.ModelAndView; 
  4. import org.springframework.web.servlet.mvc.AbstractController; 
  5. publicclassBigControllerextends AbstractController { 
  6.     @Override 
  7.     protected ModelAndView handleRequestInternal(HttpServletRequest request, 
  8.             HttpServletResponse response) throws Exception { 
  9.         System.out.println("You're big!"); 
  10.         returnnew ModelAndView("big"); 
  11.     } 

上例創(chuàng)建了一個(gè)配置了受支持的方法、會(huì)話和緩存的單動(dòng)作控制器,能夠在控制器的bean聲明中被指明。如:

  1. <beannamebeanname="/big"class="net.codejava.spring.BigController"> 
  2.     <propertynamepropertyname="supportedMethods"value="POST"/> 
  3. </bean> 

這一配置表明該控制器handler方法僅支持POST方法。了解更多配置(如會(huì)話、緩存),參見AbstractController。 SpringMVC還提供了多個(gè)支持特定目的的控制器類,包括:

  • AbstractUrlViewController
  • MultiActionController
  • ParameterizableViewController
  • ServletForwardingController
  • ServletWrappingController
  • UrlFilenameViewController

4. 為處理器指定URL映射

這是編寫控制器類必不可少的一步,旨在處理一個(gè)及以上特定請(qǐng)求。Spring MVC提供了@RequestMapping注解,用于指定URL映射。如:

  1. @RequestMapping("/login") 

這一步映射了URL模式/login,并用注解或注解類對(duì)其進(jìn)行了處理。@RequestMapping注解用于類上時(shí),類變成了單動(dòng)作控制器。如:

  1. import org.springframework.stereotype.Controller; 
  2. import org.springframework.web.bind.annotation.RequestMapping; 
  3. import org.springframework.web.bind.annotation.RequestMethod; 
  4. @Controller 
  5. @RequestMapping("/hello") 
  6. publicclassSingleActionController { 
  7.     @RequestMapping(method = RequestMethod.GET) 
  8.     publicString sayHello() { 
  9.         return"hello"; 
  10.     } 

@RequestMapping注解用于方法上時(shí),則可生成多動(dòng)作控制器。如:

  1. import org.springframework.stereotype.Controller; 
  2. import org.springframework.web.bind.annotation.RequestMapping; 
  3. @Controller 
  4. publicclassUserController { 
  5.     @RequestMapping("/listUsers") 
  6.     publicString listUsers() { 
  7.         return"ListUsers"; 
  8.     } 
  9.     @RequestMapping("/saveUser") 
  10.     publicString saveUser() { 
  11.         return"EditUser"; 
  12.     } 
  13.     @RequestMapping("/deleteUser") 
  14.     publicString deleteUser() { 
  15.         return"DeleteUser"; 
  16.     } 

@RequestMapping注解也可用于指定多個(gè)URL模式,并用單一方法對(duì)其進(jìn)行處理。如:

  1. @RequestMapping({"/hello", "/hi", "/greetings"}) 

此外,該注解還有其他的屬性,在一些情況下能發(fā)揮作用,如下一小節(jié)將講到的method屬性。

5. 為處理器方法指定HTTP請(qǐng)求方法

使用@RequestMapping注解的method屬性,可以指定處理器方法支持的HTTP方法(包括GET、POST、PUT等)。如:

  1. import org.springframework.stereotype.Controller; 
  2. import org.springframework.web.bind.annotation.RequestMapping 
  3. import org.springframework.web.bind.annotation.RequestMethod; 
  4. @Controller 
  5. publicclassLoginController { 
  6.     @RequestMapping(value = "/login"method = RequestMethod.GET) 
  7.     publicString viewLogin() { 
  8.         return"LoginForm"; 
  9.     } 
  10.     @RequestMapping(value = "/login"method = RequestMethod.POST) 
  11.     publicString doLogin() { 
  12.         return"Home"; 
  13.     } 

如上所示,對(duì)于同一個(gè)URL模式/login,該控制器有兩個(gè)處理方法。第一個(gè)方法用于GET方法,第二個(gè)則用于POST方法。 了解更多@RequestMapping注解相關(guān)知識(shí),參見@RequestMapping注解。

6. 將請(qǐng)求參數(shù)映射至處理器方法

SpringMVC的特征之一,就是可以使用@RequestParam注解將請(qǐng)求參數(shù)作為處理器方法的常規(guī)參數(shù)取回。這是一個(gè)將控制器從ServletAPI的HttpServletRequest接口中解耦出來的好方法。 如:

  1. @RequestMapping(value = "/login"method = RequestMethod.POSTpublic String doLogin(@RequestParamString username @RequestParamString password) {} 

Spring將方法參數(shù)用戶名及密碼和命名相同的HTTP請(qǐng)求參數(shù)綁定到一起。這也就意味著可用如下方式調(diào)用一個(gè)URL(以GET請(qǐng)求方法為例):

http://localhost:8080/spring/login?username=scott&password=tiger 類型轉(zhuǎn)換也自動(dòng)完成了。如果對(duì)一個(gè)integer類型的參數(shù)聲明如下:

  1. @RequestParamint securityNumber 

則Spring會(huì)在處理方法中自動(dòng)將請(qǐng)求參數(shù)的值(String類型)轉(zhuǎn)換為指定類型(integer)。 為防止參數(shù)名與變量名不同,可將參數(shù)實(shí)名指定如下:

  1. @RequestParam("SSN") int securityNumber 

@RequestParam注解還有另外兩個(gè)屬性,可在一些情況下發(fā)揮作用。其中一個(gè)屬性是required,可指定一個(gè)參數(shù)是強(qiáng)制參數(shù)還是可選參數(shù)。如:

  1. @RequestParam(required = false) String country 

這就意味著參數(shù)country是可選的,在請(qǐng)求中可略去。當(dāng)請(qǐng)求中沒有參數(shù)country時(shí),則變量country為空值。 另一個(gè)屬性是defaultValue,可在請(qǐng)求參數(shù)為空時(shí)充當(dāng)回退值(fallbackvalue)。如:

  1. @RequestParam(defaultValue = "18") int age 

當(dāng)方法參數(shù)類型為Map

  1. doLogin(@RequestParam Map<String, String> params) 

則映射參數(shù)包含所有鍵值對(duì)形式的請(qǐng)求參數(shù)。了解更多@RequestParam注解相關(guān)知識(shí),參見@RequestParam注解。

7. 返回模型和視圖

處理器方法在處理完業(yè)務(wù)邏輯后,會(huì)返回一個(gè)視圖,該視圖隨后由Springdispatcher servlet進(jìn)行解析。Spring支持handler方法返回String對(duì)象或ModelAndView對(duì)象。如下所示,handler方法返回了一個(gè)String對(duì)象,并表示了視圖名LoginForm:

  1. @RequestMapping(value = "/login"method = RequestMethod.GET) 
  2. public String viewLogin() { 
  3.     return"LoginForm"; 

這是返回視圖名最簡(jiǎn)單的方法。但是如果想要發(fā)送其他數(shù)據(jù)到視圖,則必須返回ModelAndView對(duì)象。如:

  1. @RequestMapping("/listUsers") 
  2. public ModelAndView listUsers() { 
  3.     List<User> listUser = new ArrayList<>(); 
  4.     // get user list from DAO... 
  5.     ModelAndView modelView = new ModelAndView("UserList"); 
  6.     modelView.addObject("listUser", listUser); 
  7.     return modelView; 

如上所示,該處理器方法返回了一個(gè)ModelAndView對(duì)象,該對(duì)象視圖名為UserList,并有一個(gè)可用在視圖中的User對(duì)象集。 Spring是一個(gè)非常靈活的框架,支持將ModelAndView對(duì)象聲明為處理器方法的參數(shù),而無需再重新創(chuàng)建一個(gè)。因此,上例可以重寫為:

  1. @RequestMapping("/listUsers") 
  2. public ModelAndView listUsers(ModelAndView modelView) { 
  3.     List<User> listUser = new ArrayList<>(); 
  4.     // get user list from DAO... 
  5.     modelView.setViewName("UserList"); 
  6.     modelView.addObject("listUser", listUser); 
  7.     return modelView; 

了解更多ModelAndView類相關(guān)知識(shí),參見ModelAndView類。

8. 將對(duì)象放入模型

在MVC架構(gòu)的應(yīng)用程序中,控制器將數(shù)據(jù)輸入到模型中,該模型則被用在視圖中。從上一節(jié)中的舉例中可以看到,ModelAndView類的addObject()用于將對(duì)象以名值對(duì)的形式放入模型中:

  1. modelView.addObject("listUser", listUser); 
  2. modelView.addObject("siteName", newString("CodeJava.net")); 
  3. modelView.addObject("users", 1200000); 

Spring同樣支持聲明處理器方法中的Map類型參數(shù)。Spring使用這一映射存儲(chǔ)將放入模型的對(duì)象。如:

  1. @RequestMapping(method = RequestMethod.GET) 
  2. publicStringviewStats(Map<String, Object> model) { 
  3.     model.put("siteName", "CodeJava.net"); 
  4.     model.put("pageviews", 320000); 
  5.     return"Stats"; 

這一方法比使用ModelAndView對(duì)象更加簡(jiǎn)單。Spring支持用戶靈活選擇Map對(duì)象和ModelAndView對(duì)象。

9. 處理器方法中的重定向

當(dāng)條件允許時(shí),只需在URL前加上redirect:/就可將用戶重定向跳轉(zhuǎn)到另一個(gè)URL。如:

  1. // check login status.... 
  2. if (!isLogin) { 
  3.     returnnew ModelAndView("redirect:/login"); 
  4. // return a list of Users 

在上述代碼中,沒有登陸的用戶將會(huì)跳轉(zhuǎn)到/loginURL。

10. 處理表單提交和表單驗(yàn)證

Spring中的@ModelAttribute注解支持將表單字段綁定到表單返回對(duì)象,BingingRequest接口則支持驗(yàn)證表單字段。這使得處理表單提交變得非常簡(jiǎn)單。一個(gè)處理和驗(yàn)證表單數(shù)據(jù)的典型處理器方法的代碼如下所示:

  1. @Controller 
  2. publicclassRegistrationController { 
  3.     @RequestMapping(value = "/doRegister"method = RequestMethod.POST) 
  4.     publicString doRegister( 
  5.         @ModelAttribute("userForm") User user, BindingResult bindingResult) { 
  6.         if (bindingResult.hasErrors()) { 
  7.             // form validation error 
  8.         } else { 
  9.             // form input is OK 
  10.         } 
  11.         // process registration... 
  12.         return"Success"; 
  13.     } 

了解更多@ModelAttribute注解和BindingResult接口相關(guān)知識(shí),參見Spring官方文檔:

  • Using @ModelAttribute on a method argument
  • Using @ModelAttribute on a method
  • Interface BindingResult

11. 處理文件上傳

Spring支持自動(dòng)將上傳數(shù)據(jù)綁定到CommonsMultiparFile數(shù)組對(duì)象,這使得在處理器方法中處理文件上傳變得非常簡(jiǎn)單。Spring使用Apache CommonsFileUpload作為深層多部分解析器(underlyingmultipart resolver)。 簡(jiǎn)單上傳用戶文件的代碼如下所示:

  1. @RequestMapping(value = "/uploadFiles"method = RequestMethod.POST) 
  2. publicStringhandleFileUpload( 
  3.         @RequestParam CommonsMultipartFile[] fileUpload) throws Exception { 
  4.     for (CommonsMultipartFile aFile : fileUpload){ 
  5.         // stores the uploaded file 
  6.         aFile.transferTo(new File(aFile.getOriginalFilename())); 
  7.     } 
  8.     return"Success"; 

了解Spring MVC處理文件上傳的完整方法,參見Spring MVC 文件上傳教程。

12. 在處理器中自動(dòng)注入業(yè)務(wù)類

為了讓控制器將業(yè)務(wù)邏輯處理委托到相關(guān)業(yè)務(wù)類,可以使用@Autowired注解,讓Spring自動(dòng)將業(yè)務(wù)類的實(shí)際實(shí)現(xiàn)注入到控制器中。如:

  1. @Controller 
  2. publicclassUserController { 
  3.     @Autowired 
  4.     private UserDAO userDAO; 
  5.     publicString listUser() { 
  6.         // handler method to list all users 
  7.         userDAO.list(); 
  8.     } 
  9.     publicString saveUser(User user) { 
  10.         // handler method to save/update a user 
  11.         userDAO.save(user); 
  12.     } 
  13.     publicString deleteUser(User user) { 
  14.         // handler method to delete a user 
  15.         userDAO.delete(user); 
  16.     } 
  17.     publicString getUser(int userId) { 
  18.         // handler method to get a user 
  19.         userDAO.get(userId); 
  20.     } 

本例中所有與用戶管理相關(guān)的業(yè)務(wù)邏輯都由UserDAO接口的實(shí)現(xiàn)提供。如:

  1. interfaceUserDAO { 
  2.     List<User> list(); 
  3.     void save(User user); 
  4.     void checkLogin(User user); 

如上所示,使用@Autowired注解使處理器方法可以將任務(wù)委托到業(yè)務(wù)類:

  1. List<User> listUser = userDAO.list(); 

了解更多@Autowired注解相關(guān)知識(shí),參見Annotation TypeAutowired。

13. 獲取HttpServletRequest和HttpServletResponse

有些情況要求在處理器方法中直接獲取HttpServletRequest或HttpServletResponse對(duì)象。在Spring靈活的框架中,僅需給處理器方法加上一個(gè)相關(guān)參數(shù)就可以完成此任務(wù)。如:

  1. @RequestMapping("/download") 
  2. publicStringdoDownloadFile( 
  3.         HttpServletRequest request, HttpServletResponse response) { 
  4.     // access the request 
  5.     // access the response 
  6.     return"DownloadPage"; 

Spring支持檢測(cè)并自動(dòng)將HttpServletRequest和HttpServletResponse對(duì)象注入到方法中。這樣一來,就可以直接獲取請(qǐng)求和響應(yīng),如獲取InputStream、OutputStream或返回特定的HTTP代碼。

14. 遵守單一職責(zé)原則

在Spring MVC中設(shè)計(jì)和編寫控制器時(shí),應(yīng)遵循以下兩個(gè)非常實(shí)用的操作:

  • 不要用控制器類來執(zhí)行業(yè)務(wù)邏輯,應(yīng)該用控制器類將業(yè)務(wù)處理委托到相關(guān)的業(yè)務(wù)類。這可以保證控制器專注于其指定職責(zé),即控制應(yīng)用程序的工作流。如:
    1. @Controller 
    2. publicclassUserController { 
    3.     @Autowired 
    4.     private UserDAO userDAO; 
    5.     publicString listUser() { 
    6.         // handler method to list all users 
    7.         userDAO.list(); 
    8.     } 
    9.     publicString saveUser(User user) { 
    10.         // handler method to save/update a user 
    11.         userDAO.save(user); 
    12.     } 
    13.     publicString deleteUser(User user) { 
    14.         // handler method to delete a user 
    15.         userDAO.delete(user); 
    16.     } 
    17.     publicString getUser(int userId) { 
    18.         // handler method to get a user 
    19.         userDAO.get(userId); 
    20.     } 
  • 給每個(gè)業(yè)務(wù)領(lǐng)域創(chuàng)建一個(gè)獨(dú)立的控制器。如,用UserController控制用戶管理的工作流,用OrderController控制訂單處理的工作流,等等:
    1. @Controller 
    2. publicclassUserController { 
    3. @Controller 
    4. publicclassProductController { 
    5. @Controller 
    6. publicclassOrderController { 
    7. @Controller 
    8. publicclassPaymentController { 

以上就是本文全部?jī)?nèi)容,希望這14個(gè)小技巧可以幫助讀者準(zhǔn)確且高效地編寫Spring MVC中的控制器類代碼。

 

責(zé)任編輯:趙寧寧 來源: 讀芯術(shù)
相關(guān)推薦

2020-03-06 18:43:58

Spring MVC控制器Java

2023-02-13 15:09:01

開發(fā)webCSS技巧

2011-03-08 08:58:37

springmvc

2021-03-15 08:13:19

JavaScript開發(fā)代碼

2022-11-01 15:57:44

2023-10-26 18:03:14

索引Python技巧

2017-10-30 17:25:11

javascript

2016-05-10 10:16:13

JavaScript技巧

2020-02-24 20:45:33

控制器技術(shù)選型技巧

2020-12-24 09:18:51

SQL數(shù)據(jù)庫(kù)函數(shù)

2023-01-09 17:23:14

CSS技巧

2009-01-12 11:16:58

控制器控制器行為行為結(jié)果

2009-06-19 13:03:31

JavaFX

2022-08-16 10:53:56

JavaScript前端技巧

2011-06-01 09:59:52

2021-04-20 22:23:33

iOS蘋果系統(tǒng)

2023-10-06 08:42:26

2021-04-20 09:55:37

Linux 開源操作系統(tǒng)

2011-06-22 13:07:37

MVC

2019-10-10 16:31:51

PyCharmPythonWindows
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日本道在线观看| 日日摸夜夜添一区| 9色视频在线观看| 国产无遮挡免费视频| 盗摄牛牛av影视一区二区| 亚洲综合激情网| 国产精品普通话| 国产精品边吃奶边做爽| 三级成人黄色影院| 国产精品情趣视频| 欧美在线性爱视频| 中国特黄一级片| 国产欧美日韩电影| 中文在线资源观看网站视频免费不卡 | 日韩一区不卡| 国产精品三区在线观看| 97品白浆高清久久久久久| 偷窥少妇高潮呻吟av久久免费| 成人有码在线播放| 日韩 国产 在线| 精品国产一区二区三区久久久蜜臀| 亚洲一二三级电影| 91亚洲精品视频| avtt天堂在线| 九九热爱视频精品视频| 亚洲毛片av在线| 日本电影亚洲天堂| 国产成人av免费在线观看| 欧美性生活一级片| 337p亚洲精品色噜噜噜| 国产素人在线观看| 色哟哟免费在线观看| 久久精品国产在热久久| 国模叶桐国产精品一区| 日本黄区免费视频观看| 精品国产一区二区三区成人影院| 一区二区三区四区精品在线视频| 亚洲自拍中文字幕| 久草视频在线免费| 日韩在线视屏| 亚洲欧美在线免费观看| 中文字幕永久免费| 日本一区二区中文字幕| 色综合网色综合| 99国产精品白浆在线观看免费| www.97超碰| 丝袜美腿亚洲一区| 97国产在线观看| 国产一二三区精品| 国产伦精品一区二区三区在线播放 | 亚洲国产精品一区二区www在线| 高清国产一区| 中文字幕免费高清在线观看| 日韩一级精品| 欧美激情一二区| 老司机成人免费视频| 经典一区二区| 日韩精品有码在线观看| 久久久久亚洲AV成人网人人小说| 欧美aa在线观看| 久久精品人人做人人爽人人| 国产手机精品在线| 成人毛片视频免费看| 国产酒店精品激情| 国产精品三级网站| 亚洲熟女综合色一区二区三区| 成人影视亚洲图片在线| 一本一道久久a久久精品逆3p| 天天综合网久久| 婷婷综合六月| 一本色道久久综合精品竹菊| 黄色免费福利视频| 欧美家庭影院| 亚洲尤物视频在线| 国产精品videossex国产高清| 久青青在线观看视频国产| 国产精品极品在线观看| 日韩久久精品网| 欧美sm极限捆绑bd| 日本黄色大片在线观看| 国产精品igao视频网网址不卡日韩| 一区二区在线观看免费视频播放| 欧美精品二区三区四区免费看视频 | 亚洲精品二区三区| 精品国模在线视频| 亚洲伦理一区二区三区| 日韩综合一区| 日韩视频―中文字幕| 殴美一级黄色片| 天天av综合| 日韩精品亚洲元码| 国产三级av在线播放| 一区二区三区高清在线观看| 91麻豆精品国产自产在线| 黄色片免费网址| 欧美成人精品三级网站| 亚洲一区二区三区在线| 久久99久久99精品| 色是在线视频| 日本电影亚洲天堂一区| 国产精品97在线| jizz久久久久久| 亚洲综合色成人| 精品欧美一区免费观看α√| 午夜激情成人网| 免费亚洲电影| av影院午夜一区| 亚洲一区二区日本| 国产精品熟女久久久久久| 国产99久久精品| 欧美不卡在线一区二区三区| 在线看的av网站| 亚洲国产三级在线| 亚洲高清在线免费观看| 日韩欧美久久| 日韩精品欧美激情| 国产黄a三级三级| 最新亚洲激情| 国产欧美一区二区三区在线| 亚洲卡一卡二卡三| 欧美极品美女视频| 国产亚洲黄色片| 国产精品99精品一区二区三区∴| 色菇凉天天综合网| 免费欧美一级片| 日韩免费一级| 尤物yw午夜国产精品视频| 欧美日韩国产精品一区二区三区 | 精品国产一二| 天天影视久久综合| 福利视频一区二区| 大肉大捧一进一出好爽视频| 狂野欧美性猛交xxxxx视频| 国产精品你懂的在线欣赏| 视频一区二区三区免费观看| 成人福利在线| 亚洲国产视频a| 在线a免费观看| 视频一区在线观看| 98精品在线视频| 国产乱码久久久久| 中文字幕欧美区| 男人靠女人免费视频网站| 99精品视频在线免费播放| 亚洲人成绝费网站色www| 成人欧美一区二区三区黑人一| 区一区二视频| 欧美一区二区三区免费视| 成人av一区二区三区在线观看| 成人精品鲁一区一区二区| 亚洲一卡二卡区| 国模一区二区| 日韩电影中文字幕一区| 久久久精品99| 久久国产精品色婷婷| 欧美日本韩国在线| 在线免费观看的av| 91精品国产91综合久久蜜臀| 四季av中文字幕| 日日摸夜夜添夜夜添亚洲女人| 国产自产女人91一区在线观看| 国产精品高潮呻吟av| 国产.欧美.日韩| 欧美日韩高清免费| 久久久亚洲精选| av网站中文字幕| 91在线云播放| 国产二区视频在线播放| 曰本一区二区三区视频| 欧洲成人在线观看| 国外av在线| 欧美日韩一区二区三区四区| 麻豆tv在线观看| 91麻豆国产自产在线观看亚洲| 91av在线免费观看视频| 97精品人妻一区二区三区| 久久综合色婷婷| 国产又大又硬又粗| 久久大综合网| 51蜜桃传媒精品一区二区| 久久青青色综合| 日韩精品久久久久| 久久久精品视频在线| 美女久久久精品| 国产精品av免费| 成人精品毛片| 青青久久av北条麻妃海外网| 色婷婷av一区二区三区之红樱桃| 中文字幕一区二区三区在线播放| 亚洲精品国产a久久久久久| 牛夜精品久久久久久久| 九一精品国产| 91视频8mav| 蜜桃视频www网站在线观看| 欧美一区二区三区视频在线观看| 天堂资源在线视频| 国产成人综合在线播放| 欧美日韩激情视频在线观看| 欧美日韩在线二区| 国产精品久久不能| 六十路在线观看| 精品色蜜蜜精品视频在线观看| av在线天堂网| 日av在线不卡| 亚洲国产成人精品无码区99| 欧美先锋资源| 国产成人精品免费视频大全最热 | 久久国产精品无码网站| 国产自产在线视频| 久久国产成人精品| 精选一区二区三区四区五区| 9999精品视频| 日韩免费在线播放| 啦啦啦中文在线观看日本| 在线视频中文亚洲| 日本黄色中文字幕| 国产午夜久久久久| 欧美日韩一区二区区别是什么| 欧美 日韩 国产 一区| 欧美精品尤物在线| 精品一区二区三区四区五区| 欧美寡妇偷汉性猛交| 黄色一级a毛片| 午夜一区二区三区在线观看| xxxx黄色片| 国产精品888| 欧美国产日韩另类| 日韩精品每日更新| 色综合久久久久无码专区| 亚洲手机视频| 今天免费高清在线观看国语| 日韩成人激情| 欧美一区观看| 婷婷综合一区| 亚洲香蕉伊在人在线观| 无码人妻精品一区二区三区66| 免费视频国产一区| 国产亚洲欧美一区二区| 2021年精品国产福利在线| 成人激情免费在线| 国产欧美自拍| 色综合五月天导航| 四虎成人免费在线| 亚洲精品www久久久| 中文字幕日韩经典| 91高清视频免费看| 无码人妻精品一区二区三区蜜桃91| 亚洲欧洲日产国产综合网| 奇米网一区二区| 亚洲国产精品ⅴa在线观看| 日本xxxxxxxxx18| 久久亚洲精精品中文字幕早川悠里| 高清av免费看| 美国毛片一区二区三区| av网站在线不卡| 亚洲片区在线| 1024av视频| 久久久久久穴| 少妇激情一区二区三区| 蜜桃精品在线观看| 日本丰满少妇xxxx| 夜夜夜久久久| 国产精品无码专区av在线播放| 欧美激情四色| 国产a级片网站| 国产精品婷婷| 在线视频日韩一区| 看国产成人h片视频| 午夜视频在线网站| 国产河南妇女毛片精品久久久 | 欧美视频专区一二在线观看| 国产福利视频一区二区| 欧美aaaxxxx做受视频| 久久久久久亚洲| 桃色av一区二区| 国产成人精品视| 亚洲18在线| 99国产超薄肉色丝袜交足的后果| 欧美男女交配| 国产欧美精品日韩精品| 日韩免费成人| 欧美精品国产精品久久久| 日韩影院二区| av女优在线播放| 日韩国产欧美在线视频| 三区视频在线观看| 99这里只有久久精品视频| 中文字幕第4页| 亚洲免费观看在线视频| 国产又大又黄视频| 777色狠狠一区二区三区| 色窝窝无码一区二区三区| 欧美一区二区三区性视频| 亚洲欧美高清视频| 国产一区二区三区在线免费观看| 青青青草网站免费视频在线观看| 亚洲福利在线看| 成人亚洲性情网站www在线观看| 亚洲跨种族黑人xxx| 免费黄色电影在线观看| 91国内在线视频| 日韩综合久久| 麻豆av福利av久久av| 911久久香蕉国产线看观看| a级黄色一级片| 亚洲精品美女91| 999在线观看| 91在线小视频| 99久久婷婷国产综合| 亚洲精品视频在线看| 日本免费在线观看视频| 精品久久一区二区三区| jizz亚洲| 欧美又大又硬又粗bbbbb| 久久综合偷偷噜噜噜色| 日韩欧美在线一区二区| 伊人久久亚洲影院| 日韩成人av免费| 日本一区二区三区四区在线视频| 日本猛少妇色xxxxx免费网站| 国产亚洲欧美日韩日本| 我想看黄色大片| 亚洲综合色站| 国产精品美女免费| 秋霞蜜臀av久久电影网免费| 国产乱码一区| 欧美在线免费| 中文字幕精品一区二区三区在线| 韩国成人在线视频| av影片在线播放| 国产精品第13页| 久久久久久无码精品大片| 欧美午夜一区二区三区| 日韩av成人| 午夜精品久久久久久久99黑人| 写真福利精品福利在线观看| 日韩欧美一区二区视频| 国产又粗又硬又长又爽| 精品视频一区二区三区免费| 午夜视频www| 久久久久久久97| 深夜激情久久| 日本三日本三级少妇三级66| 精品一区二区三区免费观看 | 欧美日韩一卡二卡| 国产二区在线播放| 粗暴蹂躏中文一区二区三区| 日韩一级特黄| 色呦呦网站入口| 国内精品免费在线观看| www.99re6| 777午夜精品视频在线播放| 黄色一级大片在线免费看产| 成人黄色影片在线| 亚洲区小说区图片区qvod| 国产极品粉嫩福利姬萌白酱| 99久久综合色| 国产99久久久| 国产亚洲欧美aaaa| 亚洲不卡系列| 中文字幕欧美人与畜| 国产精选一区二区三区| 久久精品无码一区| 亚洲一二三四区不卡| 日本韩国在线观看| 国产91精品久| 欧州一区二区| 波多野结衣在线免费观看| 亚洲综合自拍偷拍| 污视频在线免费观看| 久久综合网hezyo| jazzjazz国产精品久久| 一区二区日本伦理| 国产一区欧美日韩| av免费播放网站| 91麻豆精品91久久久久同性| 色女人在线视频| 国产欧美精品日韩精品| 欧美a级片一区| 在线天堂www在线国语对白| 亚洲女同ⅹxx女同tv| 好吊视频一区二区三区| 奇米四色中文综合久久| 青草国产精品| a级大片免费看| 精品国产福利视频| 日本在线观看视频| 精品国产中文字幕| 麻豆国产精品一区二区三区| 精品少妇theporn| 一区二区欧美激情| 亚洲wwww| 欧美国产视频一区| 欧美国产精品一区| 人妻少妇精品无码专区| 国产精品午夜视频| 99re6这里只有精品| 孩娇小videos精品| 亚洲成人免费视频| 伊人免费在线|