亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

用Struts開發基于MVC的Web應用

2019-11-17 06:26:30
字體:
來源:轉載
供稿:網友

  MVC介紹

  MVC模式是一種非常理想化的設計模式,應用MVC模式完成兩個以上項目的人都有同樣的體會,他們已經對以前的工作方法進行了徹底的改造。工作模式的改變要付出痛苦的代價,但現在你有現成的技術架構可以采用,避免在項目中自己開發、摸索。它就是開源Apache Struts framework,它提供了實現MVC設計模式最好的實現工具。

  在本文中,我們將簡單了解、體會一下模型-視圖-控制器(MVC)設計模式,非凡地,我們來看看如何用Struts架構來完美地實現MVC模式。我們先從理論上簡單地描述MVC模式,然后用我們一個簡單的例子來實現我們自己的MVC架構。在對MVC模式有了了解后,我們用Struts來看這個新技術是如何幫助我們迅速、簡單地創建基于MVC的Web應用。

  模型-視圖-控制器(Model-View-Controller)模式

  MVC模式最早是在Smalltalk(一種面向對象的語言)這種程序語言設計中被提出來的。我們暫時先忽略它的歷史,集中注重力在關注它怎樣被應用在Web應用開發中。

  當java的Servlets技術最開始出現的時候,程序員們馬上意識到這是一項極其有用的技術。與同時代的CGI Web開發技術相比,Servlets更快,更靈活,更可靠,更強大。然而,開發基于Servlets技術的Web應用有一個巨大的缺陷--需要使用例如out.PRintln之類的語句來輸出瀏覽器識別的Html。頻繁使用這個方法是個錯誤的傾向,開發極其浪費時間(程序員需要經常退出所有應用程序進行重新編譯)。并且這也使修改Web頁面的工作也變得很困難,因為Web的表現和邏輯在一堆令人懼怕的代碼中摻乎在一起。

  于是作為解決方法的JavaServer Pages(jsp)出現了,它們將Servlets變成它們運行的結果。應用JSP技術,我們將業務邏輯用一系列夾雜在HTML中的<%>標識來表達。以開發JSP為核心的應用盡管比以Servlet為核心的應用有進步,但看起來仍然是雜亂無章的,仍然需要用額外的代碼來控制應用頁面的流轉。在布滿格式化代碼的JSP頁面上,沒有地方來增加這樣額外的控制代碼。顯然需要尋找別的出路。

  不久人們熟悉到同時應用JSP和Servlets兩種技術開發Web應用是一種不錯的選擇。究竟,Servlets擅優點理業務邏輯的編程,處理請求,控制功能頁面的流轉,而JSP則是格式化請求處理結果,通過瀏覽器獲得用戶輸入。這種工作機制后來變成了人們長說的Model2(用JSP或Servlets中單獨的一種實現web應用被稱做Model 1).

  Model 2不是一項革命性的新模式,其實它是來自于Smalltalk語言研發過程中出現的MVC模式。大多數情況下,Java程序員趨向于可完全互換地使用這兩個名詞。
  什么是MVC模式?

  此前我們已對MVC在開發基于Java技術Web應用中的使用歷史有了初步的了解,現在讓我們來看看這種模式的細節。本節中,我們來準確地了解一下Models、Views、Controllers的確切含義,它們實現的任務,以及如何利用它們實現一個簡單的MVC框架。我們先來看看Model、View、Controller是如何交互工作的。

圖SM01
用Struts開發基于MVC的Web應用(圖一)
Figure 1 : Model 2/MVC架構

  如上圖所示,用戶通過提交requests與Controller組件(通常表現為Servlets)交互。接著Controller組件實例化Model組件(通常表現為JavaBeans或者類似技術),并且根據應用的邏輯操縱它們。一旦Model被創建,Controller決定下一個為用戶顯示的View(經常表現為JSP),同時View與Model交互操作,獲得并為用戶顯示相關數據。在它被提交到Controller重新開始此操作之前,View可以修改Model的狀態。

  為了更全面得理解組件之間的交互,我們來看一個應用這種框架實現的簡單例子。這是一個完成提交、記錄用戶登陸信息的簡單應用。

  View

  本例的View由兩個簡單的JSP頁面組成。請參考代碼 (login.jsp、welcome.jsp)。

  1>login.jsp只是簡單地提供了用戶輸入姓名和口令的操作界面。輸入完成后,登陸頁提交輸入到controller Servlet(代碼如后Controller部分說明),告訴它需要調用"登陸操作(login action)"(操作參數通過form來傳遞);

  2>welcome.jsp頁面利用用戶前頁提供的用戶姓名顯示一個歡迎信息。這里只是簡單地調用了session中的JavaBean(從userBean的tag標識可以看到)。這個Bean是被Controller置于session中,我們接下來可以看到。

  Controller

  樣例中的controller由一個Servlet構成,代碼參見(Controller.class)。實現了我們應用中的Controller。

  這是個簡單的controller,僅僅根據一個request參數(action)決定調用哪一個action。本例中,頁面將login action作為參數傳遞進來,所以LoginAction被調用。該action實現了一個標準接口(Action),定義了將Request和Response對象作為參數的execute方法。這個action類返回被調用的下一頁的路徑,于是用戶重定向到此頁面。

  LoginAction類從request中獲得username參數,創建一個新的model對象(UserBean),并將其傳至Session,并返回"/welcome.jsp"標識流轉的下一頁面是welcome.jsp.

  Model.

  我們示例中的model也很簡單,僅由一個JavaBean構成。代碼參考UserBean.class。

  Action的擴展應用

  如你所示,這是一個很簡單的Model 2應用,但它可以被在更大程度擴展。比如,我們可以動態配置映射request參數的action,我們也可以具體化controler的流轉控制(比如action可以通過一個配置治理器(configuration manager)來動態獲得需要返回的頁面,而不是象現在這樣寫死在程序里)。

  然而,事實上有一個現成的框架提供所有這些控制、MVC組裝相關的可配置項,甚至更多。

  這個現成的框架就是Struts。

更多的請看:http://www.QQread.com/windows/2003/index.html

Struts介紹

  Struts項目作為一個設想是Craig McClanahan2000年提出的,目標是為利用Java技術開發基于MVC模式的Web應用提供一個標準模式。Struts 1.0在2001年中期被最終發布,現在成為Apache Foundation的Jakarta項目的一部分。StrUCts應用范圍極廣,可以用在不同的項目,不同的行業(我所見到的從電信到電子商務都有應用實例)。

  Struts是一個高度可配置、高度擴展性的MVC框架,我們幾乎可以用它開發任何能想到的用Java技術的Web應用。MVC模式的每一部分在Structs中都有相關對應部分。

  Struts的安裝

  可以在http://apache.get-software.com/jakarta/struts/binaries/jakarta-struts-1.1.zip下載獲得Struts的最新版本(目前是1.1)。下載后解壓zip文件。發布包中包含了所有開發Struts應用所需的類庫。發布包的Webapps目錄下有一個空白的Struts Web應用(struts-blank.war),它已經包含了一個Web應用的骨架,非常有用,在這個基礎上建立自己的應用顯然對初學者能很快得到成就感。

  自己的代碼放在WEB-INF/classes 目錄下,根據自己的需要修改配置文件WEB-INF/struts-config.xml,做到這步,Struts的配置就完成了?,F在就擁有了一個完全有效的Struts應用了。
讓我們來看看Struts提供的組件

  View層

  大多數Struts應用的view層是由JSP組成的。為了使view的開發更加輕易,Struts提供了一整套JSP自定義的tag庫。這些tag庫使我們能很輕易地提供完全國際化的用戶界面,這些界面通常是與Struts應用中的Model組件交互。

  通常Web應用的動態前端都是基于HTML表單的,這些應用的用戶需要應用的可靠性得到保證,這樣就需要表單校驗。假如用標準的JSP,記錄表單的內容和從一個JavaBean獲得表單內容簡單乏味而且輕易出錯。Structs應用FormBean使表單處理和校驗變得輕易。FormBean與Struts的tag庫結合,使帶form的View開發變得輕易而自然。

  下面是一個Struts的JSP頁面樣例。

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<html:html>
<head></head>

<body bgcolor="white">

<html:errors/>
<html:form action="/logon">
<table border="0" width="100%">
<tr>
<td>
Username:
</td>
<td>
<html:text property="username"/>
</td>
</tr>
<tr>
<td>
PassWord:
</td>
<td>
<html:password property="password"/>
</td>
</tr>
<tr>
<td>
<html:submit/>
</td>
<td>
 
</td>
</tr>
</table>

</html:form>
</body>
</html:html>
  從以上JSP樣例可以看出,這與標準的HTML 表單不同。頁面中沒有雜亂無章的JSP<%>代碼,然而它卻能完成更多的功能。此JSP引入了Struts的HTML tag 庫,它增加了能夠完成收集提供了校驗、錯誤處理、model交互功能的表單。注重<html:errors> tag,它可以顯示model或者controller已經注冊的錯誤。<html:form> tag則創建了一個基于ActionForm對象的HTML表單。上例中表單的action被置于 /login,我們用這個值到配置文件(示例如后)中去找對應的ActionForm。這種映射關系由表單對象的名字和它被存儲的范圍(session,頁面,應用等等)組成。對象的屬性用<html:text> 、<html:password> tag來表示,構成表單。值得炫耀的好處是,ActionForm被提交時可以自動拾獲對應的表單數據,無須我們操心。

  從前面我們提到的ActionForm的用處來看,它似乎應該被視為應用的Model,然而事實上他們應當被當作應用中controller的一部分。ActionForm bean中顯示了model的屬性,但它們不包含任何持續性邏輯或者業務邏輯。ActionForm只是用來在Model、View之間傳遞Model信息。

  因為ActionForm屬于controller中的一部分,我們將在后面controller的部分來具體了解它。

  Model層

  Struts應用中的model層可以應用任何基于Java的技術實現,比如EJB,Hibernate,或者JDO。通常,model是作為包含數據和業務邏輯的簡單JavaBean出現的。如前所述ActionForm對象不是真正model層的體現,同時Model層應當獨立于HTML的表單對象。假如可能的話,model對象的開發應當是與使用的開發技術和開發環境(Struts或者其他)無關的,這樣我們就可以在不同的環境和應用中很輕易地重用它們。

  為了演示,我們開發了一個簡單的基于JavaBean的model層對象,它不包含持續性邏輯。這個對象與我們的ActionForm對象映射,未來使用model層對象時,我們只需用更復雜的邏輯來代替它。

  Controller層

  Struts內置一個實現了controller主要功能的Servlet,它提供將需要調用的URL與一個action對象對應起來的功能。這個Servlet被稱作ActionServlet,完成下列功能:

  1>根據用戶要求決定需要的action;

  2>為View提供View需要的數據;

  3>決定要顯示的下一個View。

  ActionServlet(強調:該Servlet已由Struts實現,是Struts架構的核心所在,開發者無須關心)的重頭工作是調用一系列簡單的Action類。Struts開發人員的工作主要是提供這些actions來實現應用的邏輯。創建action必須實現action接口。此接口包含以下方法:

public ActionForward execute(ActionMapping mapping,
ActionForm form,HttpServletRequest request,HttpServletResponse response)
throws Exception;
  如上所示,該方法將ActionForm作為它的一個參數。上面提到的ActionServlet保證了正確的form傳遞給這個方法。在View層我們說過,ActionForms在Model層和View之間傳遞數據。

  ActionForms是一個非常簡單的對象;以下代碼顯示了我們將在一個簡單的HTML表單中用到的ActionForms:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class Login extends ActionForm {

 protected String username;
 protected String password;

 public void setUsername(String username) {
  this.username = username;
 }

 public String getUsername() {
  return username;
 }

 public void setPassword(String password) {
  this.password=password;
 }

 public String getPassword() {
  return password;
 }

}
  Action還包含一個ActionMapping對象。它被ActionServlet自動處理,體現應用的配置。具體配置可以從一個XML文件獲得,通常就是struts-config.xml文件,下面將會提到。

  action運行方法將標準的request 、response作為參數,應用可以利用這些調用參數。action類處理完畢后,將ActionMapping所映射的要調用的下一個頁面作為參數返回給ControllerServlet(Struts內置)。

更多的請看:http://www.qqread.com/windows/2003/index.html

集成Struts組件

  我們來看Struts是如何將這三層的組件組合在一起構成完整的應用。Struts應用用struts-config.xml來完成配置。這個配置文件包含了應用的所有可配置信息,包括:

  1>要用到的controller

  2>ActionForms和他們對應的HTML forms

  3>Actions

  4>ActionMappings,它控制應用的整個功能流轉

  struts-config.xml的重要配置元素都包含在<struts-config>標識下。

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
  配置ActionForm對象:

<form-beans>
<form-bean
name="logonForm"
type="com.samjdalton.struts.LogonForm"/>
</form-beans>
  以上配置聲明一個"logonForm"的表單,接著說明需要用com.samjdalton.struts.LogonForm class來完成該表單設置。

  下一步,我們聲明ActionMappings。

<action-mappings>

<action
path="/Login"
forward="/login.jsp"/>
<action
path="/Welcome"
forward="/welcome.jsp"/>

<action
path="/ProcessLogin"
type="com.samjdalton.struts.LoginAction"
name="logonForm"
scope="request"
validate="true"
input="/Login.do">
<forward
name="success"
path="/Welcome.do"/>
<forward
name="failure"
path="/Logon.do"/>
</action>
</action-mappings>
  這段配置聲明了我們應用中的三個action。前兩個(/Login 、/Welcome)很簡單,他們的前向都是JSP頁面。第三個復雜一些,它在一個表單提交時被調用,它創建一個利用logonForm 元素構建的ActionForm,然后調用LoginAction類來處理信息。我們可以看到兩個<forward>元素,這些定義了應用的功能流轉控制。應用參考他們的名字(成功或者失?。缓罂刂票唤坏较嚓P資源。

更多的請看:http://www.qqread.com/windows/2003/index.html

實例學習Struts

  簡單看過了Struts的組成及組裝,現在來實現一個簡單的應用,它實現與本文開頭例子中相同的功能,即用戶登陸并顯示歡迎信息。

  應用中的view由2個簡單JSP構成,第一個為登陸頁,如下:

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<html:html>
<head></head>

<body bgcolor="white">

<html:errors/>

<html:form action="/ProcessLogin">
<table border="0" width="100%">
<tr>
<td>
Username:
</td>
<td>
<html:text property="username"/>
</td>
</tr>
<tr>
<td>
Password:
</td>
<td>
<html:password property="password"/>
</td>
</tr>
<tr>
<td>
<html:submit/>
</td>
<td>
 
</td>
</tr>
</table>

</html:form>
</body>
</html:html>
  這個與不用Struts的例子中的頁面非常類似,不同之處僅僅是用Struts <html> tags定義了表單和調用的Action是配置中定義的"/ProcessLogin"。表單提交后相應的ActionForm將被創建,同時相應的action被調用處理該輸入。我們還可以看到<html:errors> tag被用到,這個是為了自動顯示表單中定義的校驗錯誤信息(下面將提到)。

  第二個JSP如下:

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>

<html:html>

<h1>Welcome <bean:write name="loginForm" property="username" /></h1>

</html:html>
  本頁簡單地顯示了一個命名為"loginForm"的ActionForm bean的一個屬性(username).

  接著是controller層。controller層由ActionForm、Action兩個類實現。ActionForm類很簡單,主要是對應model(本例中是一個簡單的JavaBean對象)。

package com.samjdalton.struts;

import org.apache.struts.action.ActionForm;

public class LoginForm extends ActionForm {
 private LoginBean bean;

 public LoginForm() {
  this.bean=new LoginBean();
 }
 public LoginForm(LoginBean bean) {
  this.bean = bean;
 }

 public void setUsername(String username) {
  bean.setUsername(username);
 }

 public String getUsername() {
  return bean.getUsername();
 }

 public void setPassword(String password) {
  bean.setPassword(password);
 }

 public String getPassword() {
  return bean.getPassword();
 }
}
  Action類用上面的ActionForm從view獲得信息,并且修改model狀態。

  Action類代碼如下:

package com.samjdalton.struts;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;

public class LoginAction extends Action {
 public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm,  javax.servlet.http.HttpServletRequest httpServletRequest,  javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {

// check the username
 LoginForm form = (LoginForm) actionForm;
 if (form.getUsername().equalsIgnoreCase("sam") &&      form.getPassword().equals("password")) {
 // we are in
  return actionMapping.findForward("success");
 } else {
 // not allowed
  return actionMapping.findForward("failure");
 }
}
public ActionErrors validate(ActionMapping actionMapping
HttpServletRequest httpServletRequest) {
 ActionErrors errors = new ActionErrors();

 if ( getUsername() == null getUsername().length() < 1 ) {
  errors.add("name",new ActionError("error.name.required"));
 }

 if ( getPassword() == null getPassword().length() < 1 ) {
  errors.add("pw",new ActionError("error.pw.required"));
 }
 return errors;
}
  可以看到,action檢查用戶在username、password是否輸入了"sam"、"password"。假如輸入正確,action指明要調用的下一個view。

更多的請看:http://www.qqread.com/windows/2003/index.html


  action類還包含一個方法:validate。本例中,validate方法檢查username 和password的輸入,假如輸入有誤,返回錯誤信息。這些錯誤信息包含在一個資源文件(為了支持國際化)中,該文件信息在配置文件中被配置。

  應用的model是一個不包含持續邏輯的標準JavaBean對象,如下所示:

package com.samjdalton.struts;

public class LoginBean {
 private String username;
 private String password;

public void setUsername(String username) {
 this.username=username;
}

public String getUsername() {
 return username;
}

public void setPassword(String password) {
 this.password = password;
}

public String getPassword() {
 return password;
}
}
  應用的struts-config.xml配置文件:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
?。約truts-config>
 ?。糵orm-beans>
   <form-bean name="loginForm" type="com.samjdalton.struts.LoginForm"/>
 ?。?form-beans>

 ?。糰ction-mappings>

   <action path="/Login" forward="/login.jsp"/>
   ?。糰ction path="/Welcome" forward="/welcome.jsp" name="loginForm" scope="request"/>

   ?。糰ction path="/ProcessLogin" type="com.samjdalton.struts.LoginAction"
name="loginForm" scope="request" validate="true" input="/Login.do">
    <forward name="success" path="/Welcome.do"/>
   ?。糵orward name="failure" path="/Login.do"/>
  ?。?action>
?。?action-mappings>
?。糾essage-resources parameter="applicationResources" null="false" />
 </struts-config>
  大多數文件與上例所示相同,僅有的區別是<message-resources> tag。此tag答應我們具體化應用代碼中的string類型,好處是輕易國際化。上例中,資源包含在名字為"ApplicationResources.properties"的文件中,它必須存在于應用的classpath(萬無一失的方法是將它配置到你的WEB-INF/classes路徑下)。

  配置成功后,IE中輸入如下URL(Tomcat):

http://localhost:8080/<war-file-name>/Login.do

  應用運行的顯示結果如下:

用Struts開發基于MVC的Web應用(圖二)
The login page

用Struts開發基于MVC的Web應用(圖三)
The welcome page

用Struts開發基于MVC的Web應用(圖四)
The error page

  小結

  本文中,我們先介紹了MVC模式,用兩種技術完成可一個MVC模式的簡單實現,包括Struts,這項可以開發更靈活、擴展性更強的基于MVC模式的Web應用。顯然這已經遠遠超出了Struts所覆蓋的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人在线激情视频| 美女视频黄免费的亚洲男人天堂| 日韩在线观看网址| 国产精品亚洲аv天堂网| 成人国产精品一区二区| 亚洲精品乱码久久久久久按摩观| 性欧美长视频免费观看不卡| 亚洲精品suv精品一区二区| 最近2019年中文视频免费在线观看| 日韩中文字幕在线看| 日韩av在线网站| 疯狂欧美牲乱大交777| 91成人国产在线观看| 欧美视频精品一区| 欧美成人精品不卡视频在线观看| 中文字幕日韩免费视频| 精品久久久久久久久久久久| 2019中文字幕全在线观看| 91精品国产自产在线| 亚洲欧美日韩区| 精品国产拍在线观看| 亚洲欧美国产日韩天堂区| 亚洲自拍偷拍色片视频| 久久精品国产2020观看福利| 欧美激情一区二区三区久久久| 久久国产精品首页| 欧美亚洲另类在线| 亚洲精品有码在线| 少妇av一区二区三区| 亚洲成人黄色在线观看| 91香蕉嫩草神马影院在线观看| 欧美日韩另类在线| 在线观看91久久久久久| 亚洲精品不卡在线| 国产性色av一区二区| 神马久久桃色视频| 欧美激情啊啊啊| 亚洲性69xxxbbb| 国产69精品99久久久久久宅男| 亚洲国模精品一区| 久久久噜噜噜久久| 成人h视频在线| 精品久久久一区| 中文字幕亚洲色图| 久久精品国产欧美激情| 亚洲国产精彩中文乱码av| 国产成人精品在线播放| 国产精品狼人色视频一区| 国产精品免费一区二区三区都可以| 亚洲一区精品电影| 日韩最新免费不卡| 精品成人69xx.xyz| 国产香蕉精品视频一区二区三区| 日本精品视频在线| 亚洲免费一级电影| 精品国产网站地址| 色偷偷噜噜噜亚洲男人的天堂| 国产精品h在线观看| 欧美日韩一区二区免费视频| 97欧美精品一区二区三区| 美女国内精品自产拍在线播放| 亚洲精品mp4| 亚洲jizzjizz日本少妇| 色av吧综合网| 国产精品尤物福利片在线观看| 2021国产精品视频| 日韩有码在线视频| 日韩精品中文字幕在线播放| 亚洲福利视频网站| 成人国产精品av| 欧洲亚洲免费在线| 欧美第一黄色网| 4p变态网欧美系列| 日韩亚洲综合在线| 中文字幕精品久久| 热99久久精品| 欧美高清性猛交| 国产精品午夜视频| 欧美在线视频观看| 欧美午夜宅男影院在线观看| 国产精品9999| 91av在线不卡| 91wwwcom在线观看| 亚洲日本成人女熟在线观看| 久久视频国产精品免费视频在线| 亚洲黄色av女优在线观看| 在线视频一区二区| 国产精品视频免费在线| 国产精品色悠悠| 8050国产精品久久久久久| 国产精品久久久久久久久久免费| 麻豆成人在线看| 日韩av日韩在线观看| 欧美日韩国产在线播放| 亚洲精品成人久久电影| 欧美精品第一页在线播放| 欧美日本中文字幕| 欧美交受高潮1| 国产精品视频不卡| 久久久91精品国产| 在线观看欧美www| 成人国产在线视频| 2019国产精品自在线拍国产不卡| 北条麻妃久久精品| 欧美激情久久久久久| 亚洲男人天堂2023| 亚洲人成自拍网站| 国产精品女人网站| 欧美激情在线视频二区| 亚洲在线免费观看| 国产精品老女人精品视频| 国产精品网红直播| 色与欲影视天天看综合网| 成人性生交xxxxx网站| 精品欧美一区二区三区| 国产99在线|中文| 成人av.网址在线网站| 国产999精品久久久影片官网| 国产精品一区专区欧美日韩| 自拍偷拍亚洲在线| 色综合五月天导航| 亚洲国产婷婷香蕉久久久久久| 日韩人体视频一二区| 成人国产精品久久久| 91av视频在线免费观看| 久久人人爽人人爽人人片av高清| 亚洲午夜久久久影院| 亚洲精品99久久久久中文字幕| 久久久久久av| 92福利视频午夜1000合集在线观看| 色综合视频网站| 亚洲精品欧美日韩| 欧美老女人www| 91精品久久久久久久久久久久久| 久久久中精品2020中文| 久久男人资源视频| 国产福利精品av综合导导航| 久热精品视频在线观看一区| 欧美激情va永久在线播放| 欧美日韩成人在线观看| 91在线无精精品一区二区| 一本色道久久88综合日韩精品| 在线看福利67194| 亚洲色图13p| 国产亚洲人成网站在线观看| 国产精品日韩欧美大师| 日韩精品在线播放| 97在线观看免费高清| 日本午夜人人精品| 欧美高清电影在线看| 一区二区中文字幕| 国产亚洲欧美另类中文| 国产精品毛片a∨一区二区三区|国| 97色在线播放视频| 日韩人体视频一二区| 久久久久久久爱| 亚洲一区二区三区四区在线播放| 69视频在线免费观看| 欧美日韩一区二区精品| 国产精品视频免费观看www| 91国偷自产一区二区三区的观看方式| 91国自产精品中文字幕亚洲| 国产精品久久久久国产a级| 国产精品高清在线观看|