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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Dorado用法与示例

發(fā)布時間:2023/11/28 生活经验 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dorado用法与示例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Dorado用法與示例
dorado用后總結
一.dorado概念
dorado的產(chǎn)品全名是“dorado展現(xiàn)中間件”。從產(chǎn)品形態(tài)上dorado由兩部分組成,第一部分是一個具有AJAX特征的Web應用表現(xiàn)層的快速開發(fā)框架,第二部分配套的IDE開發(fā)工具。開發(fā)工具又可分為獨立的dorado studio與eclipse插件兩個選擇,eclipse插件將在以后發(fā)布,本文的開發(fā)工具專指dorado studio。
  Web表現(xiàn)層方面的產(chǎn)品主要技術流派有離散控件構架、后臺衍伸構架、展現(xiàn)中間件構架等數(shù)種。離散控件構架多是一套各個控件互不相關的JavaScript庫,如bindows,后臺衍伸構架多是為專有的后臺業(yè)務邏輯框架服務,如工作流的表單設計器。展現(xiàn)中間件構架提Wedget Lib(表現(xiàn)層控件庫)并由展現(xiàn)層引擎統(tǒng)一驅動與管理。控件使用的個數(shù)越多種類越多,越有效用。可對接的業(yè)務邏輯層也不限于某種框架,可以廣泛地通過整合 接口與各種第三方后臺邏輯框架相整合。還可以通過展現(xiàn)層引擎整合基于離散控件架構的Web表現(xiàn)層產(chǎn)品,進一步增強Web的展現(xiàn)力、操作性與承載量,同時提高開發(fā)效率。
二.dorado主要包含5個組成部分
? 富瀏覽器客戶端:基于標準瀏覽器技術,增強web界面的信息承載量、表現(xiàn)力與操作性。包含了應用客戶端常用表格、樹、表單、多頁標簽等一整套界面組件
? 展現(xiàn)引擎:支持AJAX特性,用于增強dorado客戶端的交互能力。   
? MVC開發(fā)框架:包括數(shù)據(jù)持久層的實現(xiàn)、頁面流控制、展現(xiàn)層角色機制、國際化資源管理、配置管理與監(jiān)控控制臺等。既可自成體系,又可與各種開發(fā)模式與框架相結合。   
? 集成開發(fā)工具:dorado專用的IDE,可進一步提升開發(fā)速度。   
? 應用框架:又稱marmot,用于為基于Struts、WebWork、Spring、 Hibernate、iBatis等開源框架的開發(fā)模式提供與Dorado集成的范例性的實現(xiàn)代碼。其中包含了應用主框架、完整權限的框架、用戶 Profile管理、即時消息等實用功能的實現(xiàn)代碼。
三.在項目里引入dorado

1. 在web.xml里面追加如下代碼:

Xml代碼

  1.  <!-- Dorado Serlvet -->  
    
  2.  <servlet>  
    
  3.    <servlet-name>dorado-servlet</servlet-name>  
    
  4.      <servlet-class>com.bstek.dorado.core.DoradoServlet</servlet-class>  
    
  5.      <load-on-startup>2</load-on-startup>  
    
  6.  </servlet>  
    
  7.  <servlet-mapping>  
    
  8.      <servlet-name>dorado-servlet</servlet-name>  
    
  9.      <url-pattern>*.d</url-pattern>  
    
  10. </servlet-mapping>  
    
  11. <filter-name>GZIPEncoder</filter-name>  
    
  12. <filter-class>com.bstek.dorado.core.GZIPEncodeFilter</filter-class>  
    
  13. <filter-name>dorado-filter</filter-name>  
    
  14. <filter-class>com.bstek.dorado.core.DoradoFilter</filter-class>  
    
  15. <filter-name>GZIPEncoder</filter-name>  
    
  16. <url-pattern>*.jsp</url-pattern>  
    
  17. <filter-name>dorado-filter</filter-name>  
    
  18. <url-pattern>*.d</url-pattern>  
    
  19. <filter-name>dorado-filter</filter-name>  
    
  20. <url-pattern>*.do</url-pattern>  
    
  21. <filter-name>dorado-filter</filter-name>  
    
  22. <url-pattern>*.action</url-pattern>  
    
  23. <taglib>  
    
  24.     <taglib-uri>http://www.bstek.com/dorado</taglib-uri>  
    
  25.     <taglib-location>/WEB-INF/dorado.tld</taglib-location>  
    
  26.     </taglib>  
    
  27. 在lib目錄里加入如下jar包
    Html代碼

  28. dorado5-action.jar

  29. dorado5-admin.jar

  30. dorado5-biz.jar

  31. dorado5-common.jar

  32. dorado5-core.jar

  33. dorado5-data.jar

  34. dorado5-designsrv.jar

  35. dorado5-i18n.jar

  36. dorado5-module.jar

  37. dorado5-security.jar

  38. dorado5-smartweb.jar

  39. dorado5-utils.jar

  40. dorado5-view.jar

  41. 在項目中加入home目錄,跟src目錄同級別,里面的內容可以從doradosample里去拷貝過來。
    四. 使用過程中遇到的問題

  42. 如何使用項目中的自定義連接,不用dorado默認的連接
    在dorado的說明文檔上有關于這個問題的說明,其中說明里寫道

這樣可以禁用 dorado本身的事務管理。 使用自定連接的時候,在home目錄的setting.xml文件里一定不要加入這句話。 2. 使用marmot框架的前提是項目必須要使用spring框架,如果沒有用spring的話,marmot就沒法用了。 因為marmot里指定的dataprovider必須是spring配置文件的bean別名。 五. dorado的優(yōu)缺點 優(yōu)點:畫面確實很美觀,簡單的業(yè)務邏輯開發(fā)效率極高。幾乎可以不用寫代碼就能完成,提供了豐富的到處 功能。對表格的展現(xiàn)不得不說是很棒的。 缺點:當開發(fā)復雜的業(yè)務邏輯是,感覺里面的屬性完全不夠用。由于封裝性,原本可以在客戶端的開發(fā)變得 麻煩。提供的api不夠豐富,詳細。尤其是訪問dataset的時候。而且必須要引入spring,對于只用struts 的項目來說,比較無賴。 Dorado知識點總結 1. Dorado 展現(xiàn)中間件產(chǎn)品包含主要的功能 WEB客戶端 。IDE集成開發(fā)。服務端引擎 2. DORADO是 WEB展現(xiàn)層的 中間件。 3. Dorado7提供了以資源包的形式對 JavaScript和CSS 文件進行管理的功能,不但系統(tǒng)內部的庫文件以此種方式進行管理,用戶也可以將自己的庫文件納入這一管理機制。通過這一功能,用戶可以定義各資源包之間的依賴關系、實現(xiàn)庫文件的運行時自動合并、以及庫文件的按需裝載。這可以在性能優(yōu)化、項目維護等方面帶來諸多好處。 4. 立體數(shù)據(jù)模型 是Dorado7最重要的概念,也是Dorado7最為核心的設計思想,這使得Dorado7不再局限數(shù)據(jù)必須以二維表結構與DataSet對接,而是可以支持非常自由的數(shù)據(jù)形式。這些變化使得展現(xiàn)層中的數(shù)據(jù)更加純粹、更加貼切真實的業(yè)務含義。自然,也使開發(fā)變得更加便利、更加生動 5. Dorado7以 XML 形式的視圖配置文件作為定義Web界面的主要手段。 6. 智能方法匹配是指允許開發(fā)人員盡可能按照自己的意愿、業(yè)務的需要來定義業(yè)務方法,然后由Dorado引擎自動根據(jù)場景、參數(shù)名、參數(shù)類型等因素來判斷應當怎樣調用該業(yè)務方法。“該功能”是Dorado7提供的一個非常有特色的功能,提供此功能的主要目的是盡量減少開發(fā)人員所需要掌握的Dorado API,讓業(yè)務方法的代碼更加”業(yè)務化”,更加易于閱讀。通過“該功能”也可以很好的體驗出Dorado7所提倡的“基于約定而非配置”進行開發(fā)的理念。在實際的應用場景中大部分實現(xiàn)了Dorado前端的功能中可能并不需要引入任何Dorado的API。 7. Dorado7提倡 基于約定而非配置 的理念進行開發(fā)。 8. Dorado7中的數(shù)據(jù)模型對象既支持 全局、私有、匿名等可見性,又支持類似面向對象的繼承和復寫。這些特性可以為配置信息的重用和維護提供很多的便利。 9. Dorado7 IDE采用Plug-in技術,以插件形式與 Eclipse開發(fā)環(huán)境融為一體。 10. Dorado7的視圖配置文件后綴是 view.xml 網(wǎng)址默認是。D 11. DataType分為以下三類:簡單DataType、聚合DataType、實體DataType,List、Set 、Array 屬于聚合DataType。 12. EntityList 表示數(shù)據(jù)實體的集合,是Dorado中展現(xiàn)數(shù)據(jù)的載體 13. DataProvider是數(shù)據(jù)提供者,是一種用于為dorado展現(xiàn)層提供數(shù)據(jù)的對象。 “該功能”通常的作用是根據(jù)其自身的定義和外部傳入的參數(shù)調用后臺業(yè)務邏輯層的業(yè)務方法,對得到的返回加以封裝,變成展現(xiàn)數(shù)據(jù)然后返回給外界。 盡管DataType具有自動根據(jù)數(shù)據(jù)的Class類型進行映射的功能,不過仍然可以通過“該功能”的resultDataType屬性為將要返回的數(shù)據(jù)手工指定“該對象”。 “該功能”具有類型的概念,可以用不同類型的“該功能”封裝不同種的展現(xiàn)數(shù)據(jù)獲取方式。用戶可以創(chuàng)建自己的“該功能”類型。如同Dorado5中的Dataset也可以有各種類型 14. DataType即數(shù)據(jù)類型,是dorado7中全新的、最關鍵的概念之一。 “該功能”實現(xiàn)的功能有點類似復雜的數(shù)據(jù)字典,用于描述各種數(shù)據(jù)。如描述某數(shù)據(jù)實體中每個屬性的標題、顯示格式、校驗規(guī)則等等。 對于基于ORM開發(fā)的Web應用而言,Dorado能夠自動的根據(jù)VO的Class類型為其分配適當?shù)摹霸摴δ堋薄?“該功能”可以描述通常所見的所有類型的數(shù)據(jù),既包含用戶定義的POJO,也包含了Java中的簡單數(shù)據(jù)類型。如定義一個“該功能”用來描述系統(tǒng)中的java.util.Date這種數(shù)據(jù),這樣就可以通過“該功能”為所有的日期類數(shù)據(jù)定義默認的輸出格式。 “該功能”是一種在服務端和客戶端都存在生命周期的對象,即在服務端和客戶端都可以使用,因此“該功能”支持一些在客戶端才有的特性,如EntityDataType支持名為afterDataChanged的客戶端事件,每當有屬于該類型的實體對象的某屬性值在客戶端被修改時,此事件就會被觸發(fā)。 15. DataPath可稱為數(shù)據(jù)路徑,在Dorado的客戶端所使用的,用于描述如何提取、挖掘數(shù)據(jù)的表達式。 “該功能”是在Dorado的客戶端所使用的,用于描述如何提取、挖掘數(shù)據(jù)的表達式。作用比較類似于XML中所使用的XPath。 16. DataResolver是數(shù)據(jù)處理器,是一種用于將dorado中的展現(xiàn)數(shù)據(jù)提供給后臺業(yè)務邏輯層的對象。 “該功能”的作用大致與DataProvider相反,一般而言“該功能”調用的,都是后臺業(yè)務邏輯層中與數(shù)據(jù)持久化相關的操作。 “該功能”也具有類型的概念,不同類型的“該功能”封裝有不同種的展現(xiàn)數(shù)據(jù)處理或持久化方式。用戶可以創(chuàng)建自己的“該功能”類型。 17. DataSet是數(shù)據(jù)的容器,主要的生命周期是在客戶端,主要作用是用于包含展現(xiàn)數(shù)據(jù)。 “該功能”最主要的生命周期是在客戶端,主要作用是用于包含展現(xiàn)數(shù)據(jù)。主要作用是為一組展現(xiàn)數(shù)據(jù)起個別名,以便于數(shù)據(jù)敏感控件和開發(fā)人員使用,而“該功能”的id就是這堆展現(xiàn)數(shù)據(jù)的別名。 “該功能”本身是一個輕量級對象,與Dorado5中的“該功能”不同,沒有類型之分。“該功能”中所包含的數(shù)據(jù)由其中的DataProvider所返回的數(shù)據(jù)決定。 “該功能”支持利用DataPath對其中的數(shù)據(jù)進行快速的挖掘。 18. dorado工程在WEB-INF目錄下會包含一個dorado-home 的文件夾,用于定義dorado的一些系統(tǒng)全局配置和關鍵的spring配置 19. context.xml是dorado的核心配置文件 20. config.properties是dorado的屬性配置文件 21. packages-config.xml是JS文件和相關客戶端資源文件的打包規(guī)則設定文件。 22. servlet-context.xml是用于存放SpringMVC相關的配置文件 23. w3c-html4-template.html是dorado視圖的默認模板 24. dorado中默認提供了多種運行機制:production(生產(chǎn)環(huán)境),test(測試),debug(開發(fā)和測試) 25. 視圖配置文件view通常包含Arguments、 Model、View 、Context節(jié)點。 26. 在dorado中一般將控件區(qū)分為不可見控件和可見控件 27. DockLayout(停靠式布局)、FormLayout(表單式布局)、AnchorLayout(錨定式布局)是Dorado7目前提供的布局管理器 28. 在Dorado7中服務定位表達式是用來描述服務的查找方式,即Dorado7通過服務定位表達式來查找到具體服務,以便于對服務進行調用。基本格式:協(xié)議:服務名[#方法名] 29. 動態(tài)EL表達式是在普通EL表達式基礎上的進一步擴展,動態(tài)EL表達式以__ 的方式定義。$${expression} 30. Dorado7中量身定制了全新的Debugger,用于輔助開發(fā)人員做系統(tǒng)調試。可以在瀏覽器中直接按 F2 或 Ctrl+F2打開Dorado Debugger小工具。 31. AutoForm中stretchWidth 是否將表單的寬度自動擴展為撐滿容器 32. AutoForm中editorWidth用于統(tǒng)一設置內部AutoFormElement的文本編輯框的寬度。 33. 通常將一個二維表結構的數(shù)據(jù),以 Grid形式展現(xiàn)給用戶 34. 在Grid中RowSelectorColumn為選擇器列,一般用于輔助表格的多選功能。 35. 在Grid中添加行號列應選擇RowNumColumn 36. 在Grid中添加組合列應選擇ColumnGroup 37. AjaxAction 用于執(zhí)行遠程過程的動作控件。此控件僅在配合Dorado服務端的開發(fā)模式中有意義。 38. AjaxAction調用的服務一般都需要使用@Expose 標記注冊 39. UpdateAction用于提交動作控件。此控件僅在配合Dorado服務端的開發(fā)模式中有意義。 40. UpdateAction對應服務器端接受該請求的代碼一般都通過DataResolver 標記注冊。 41. Ajax檢驗 正則表達式長度檢驗,都是DORADO默認提供的校驗器。 42. SplitPanel的主要作用是通過分隔欄將頁面上的空間分為兩塊。 43. Data Pilot一般情況下都是與DataGrid控件配合使用,用于在Grid中數(shù)據(jù)的增刪改和當前記錄的定位功能,提供了翻頁數(shù)據(jù)顯示的功能。 44. Data DropDown一般用于顯示和選擇日期的下拉控件 45. DataTreeGrid一般用于樹狀表格展現(xiàn)控件是 46. Menu一般用于展現(xiàn)常見的菜單工具欄式的菜單的控件 47. BDF2中所有模塊,皆以 __ 形式存在,以于一些需要在頁面中展現(xiàn)的元素,諸如報表展現(xiàn)、用戶個性化、數(shù)據(jù)導出等,全部以標準Dorado7組件形式提供 Dorado7 Addon。 48. BDF2功能模塊可根據(jù)項目情況靈活選擇需要使用,同時創(chuàng)建的項目支持Maven與標準的Dynamic web project兩種格式。 49. BDF中提供了流程管理操作常用的API、流程模塊的管理與配置、流程模塊的在線調試等眾多常用的流程功能的模塊是UFLO。 50. BDF中提供了在應用服務端,定義一些可以周期性執(zhí)行的動作任務調試的任務調試模塊是BDF2-JOB。 51. BDF中提供了報表在一個基于WEB的運行環(huán)境,利用該模塊,可以實現(xiàn)報表在WEB環(huán)境中導出、在線顯示、在線打印等功能的模塊是BDF2-JASPERREPORTS 52. BDF中提供了一個調用Webservice服務的客戶端,利用這個客戶端,通過幾行簡單的代碼,就可以實現(xiàn)對目標Webservice服務的調用的模塊是BDF2-WEBservice-CLENT 53. BDF中提供了權限下放管理功能的模塊是BDF2-AUTHORITYDELEGATION。(所謂權限下放管理即系統(tǒng)超級管理員,通過定義一些用戶為下級管理員,分配一些可以管理的用戶、部門、崗位、群組及URL資源,具有權限管理的功能。) 54. BDF中提供了以Datagrid或者Autoform為顯示模板,導出其數(shù)據(jù)為PDF或者Excel格式,支持Datagrid控件中filterBar數(shù)據(jù)過濾導出、列頭組合自定義、數(shù)據(jù)自定義導出等功能的模塊是BDF2-EXPORT。 55. BDF中提供了主要excel導入功能,可以將存放于Excel當中的數(shù)據(jù)批量導出到數(shù)據(jù)庫(或者其它存儲介質)的模塊是 BDF2-IMPORT 56. BDF中提供了可以在線瀏覽特定數(shù)據(jù)庫表信息,可以實現(xiàn)對數(shù)據(jù)庫信息進行跨平臺維護的模塊是BDF2-DBCONSOLE

Dorado重用最佳實踐
在實際開發(fā)中,都會面臨組件重用的問題, 面向對象的語言,可以通過各種設計模式,實現(xiàn)重用.那么。在dorado框架中如何進行重用呢? 對于dorado的重用問題,下面從三個方面進行說明.
1.通過使用jsp:include指令進行重用
將要重用的內容寫到一個jsp頁面中, 然后通過jsp:include標記在需要使用的位置進行重用, 該jsp中可再引用d:view標簽,比如定義一個jsp頁面:

  1. <%@ page contentType=“text/html; charset=UTF-8”%>
  2. <%@ taglib uri=“http://www.bstek.com/dorado” prefix=“d”%>
  3. <d:View config=“com.baiyao.workflow.component.ChargeType”>
  4.  <d:SubWindow id="winChargeType" title="選擇類型" width="300" height="200"  
    
  5.      draggable="true" resizable="true" status="hidden"  
    
  6.      showMinimizeButton="false" showMaximizeButton="false"  
    
  7.      showCloseButton="true">  
    
  8.      <d:Layout type="border" width="100%" height="100%">  
    
  9.          <d:Pane position="center">  
    
  10.             <d:DataTable id="tblType" />  
    
  11.         </d:Pane>  
    
  12.         <d:Pane position="bottom" align="center">  
    
  13.             <d:Button id="btnOK" />  
    
  14.         </d:Pane>  
    
  15.     </d:Layout>  
    
  16. </d:SubWindow>  
    
  17. </d:View>
    在另外一個頁面中進行引入:
  18. <d:View config=“com.baiyao.workflow.charge.ChargeInput”>
  19.  <d:AutoForm id="frmForm">  
    
  20.      <d:FormElementRenderer group="group1" element="render1">  
    
  21.          <d:Layout type="border">  
    
  22.              <d:Pane position="center">  
    
  23.                  <d:DataTable id="tblFormItem" />  
    
  24.              </d:Pane>  
    
  25.              <d:Pane position="bottom" align="center">  
    
  26.                  <d:Button id="btnAdd" />&nbsp;&nbsp;   
    
  27.                 <d:Button id="btnDelete" />  
    
  28.             </d:Pane>  
    
  29.         </d:Layout>  
    
  30.     </d:FormElementRenderer>  
    
  31. </d:AutoForm>  
    
  32. <jsp:include page="/workflow/component/win_charge_type.jsp" />  
    
  33. </d:View>

該重用方式比較原始, 主要是利用了jsp:include指令, 會編寫jsp的人都會用, 相對來說還是非常簡單的。比較適合組件在頁面中的布局中規(guī)中矩的情況, 比如實現(xiàn)某一類功能的組件都集中在頁面中的某一區(qū)域。如果某一類功能的組件在頁面中的分布跨度比較大的話, 則會因為沒法封裝在一個jsp中而無法實現(xiàn)重用。由于重用范圍僅限于jsp頁面中, 因此其維護性還是非常不錯的。但是如果對單個簡單組件專門寫一個jsp從而在多個jsp頁面重用顯然有些得不償失。而且如果對于page1頁面中適用到了conrol1,conrol2,conrol3幾個組件, 同樣在page2頁面中也有這3個組件, 大部分屬性都差不多, 但是只有少數(shù)幾個屬性不同, 那么只能對jsp進行重用, 而jsp對應的view.xml文件則需要寫兩個。因此重用性會大一定的折扣
易用程度:★★★★★
適用范圍:★★★☆☆
重用粒度:★★☆☆☆
可維護性:★★★★★
2. 對view組件定義進行重用
view重用分為兩種, 一種是通過調用Server API來創(chuàng)建客戶端所需要的組件, 另外一種就是將多個view.xml中定義的組件進行組合。
2.1.通過調用Server API來創(chuàng)建客戶端所需要的組件
通過調用Server API使用java代碼在后臺來來創(chuàng)建頁面所需要的各種Control和Dataset, 而不是在view.xml文件中定義需要的control和dataset, 因為采用這種方式就可以通過利用java的OO特性(封裝, 繼承和多態(tài)), 如一個保存按鈕, 可能在一個涉及到編輯操作的頁面中都會用到, 因此可以創(chuàng)建一個ViewModel基類,在基類的initControls()方法中通過new Button()的方式來創(chuàng)建該按鈕, 然后指定按鈕的屬性, 有時間的還要加上事件的javascript腳本, 這樣所有從該基類繼承的ViewModel所對應的view所在的頁面都可以適用該按鈕了。

  1. @Override
  2. protected void initControls() throws Exception {
  3.  Button btnSave = (Button) createControl("Button", "btnSave");   
    
  4.  btnSave.setCommand("cmdSave");   
    
  5.  btnSave.setValue("保存");   
    
  6.  btnSave.setWidth("70");   
    
  7.  UpdateCommand cmdSave= (UpdateCommand) createControl(   
    
  8.          "UpdateCommand", "cmdSave");   
    
  9. cmdSave.setMethod("save");   
    
  10. DatasetInfo info = cmdSave.addDatasetInfo("dsEntity");   
    
  11. info.setSubmitScope(DatasetInfo.ALL_CHANGE);   
    
  12. return btnSave;   
    
  13. }

該重用方式實際上就是將在view.xml配置文件中定義的control或者dataset通過java代碼來實現(xiàn), 實際上是換了一種寫法而已, 但是相對于配置文件中的定義來說, 不夠直觀, 而且要寫更多java的代碼, 如果該該組件比較復雜的話, 比如寫有復雜的事件代碼, 需要去拼javascript字符串腳本, 這樣維護性將非常差。但是這種方式的重用粒度非常細, 比如可以只對一個button中的某幾個屬性進行重用。而且對于基類定義的組件可以根據(jù)需要進行重載, 這樣靈活性將非常好。
易用程度:★★★☆☆
適用范圍:★★☆☆☆
重用粒度:★★★★★
可維護性:★☆☆☆☆
2.2.多個view.xml中定義的組件進行組合重用
在前面介紹jsp重用方式的時候, 知道是將一個jsp頁面分解成多個頁面來進行重用, 而這里換一個角度: 將一個view.xml根據(jù)重用的需要分解成多個view.xml文件, 其實在jsp重用中, 也使用了多個view.xml文件(進行了view.xml的分解), 但是二者的合并時機是不同的, jsp重用是在jsp頁面的時候做的view.xml合并, 這里的合并是在ViewModel初始化中進行的。
這里先來介紹一下JSP Dorado Taglib, ViewModel和view.xml之間的關系(僅限個人理解)
在dorado的view tag中, 根據(jù)給定的view文件所在的位置, 創(chuàng)建ViewModel對象, 該對象中會包含一個ViewModelConfig, 對應的view.xml文件的一個解析, 接著進行ViewModel的初始化工作, 初始化就是實際創(chuàng)建組件的過程, 這里面有一些細節(jié)這里不做研究(比如對于不同的control, 創(chuàng)建的時機是不同的)。最后得到的是一個個組件的Java對象, 可以將其看成一個個javabean, jsp頁面上的dorado taglib就會根據(jù)這些組件對象來生成html或者js腳本。
三者之間的關系大致是這樣, 接著開始探討將多個view.xml合并的時機, 最開始采用在生成ViewModel的時候將要組合的其他view.xml引入, 來生成最終需要的ViewModelConfig對象(在原有基礎上添加了其他view.xml中的組件), 后來這種做法失敗了(這個過程太多復雜, 比如還涉及到緩存問題, 很容易出現(xiàn)在第一次展現(xiàn)沒有問題, 但是在通過command發(fā)送ajax請求找不到對應的對象而出錯), 在ViewModel初始化(就是init方法)的時候將要組合的view.xml引入進去, 這時候成功了, 沒有出現(xiàn)問題。可能dorado原來的設計沒有考慮到合并多個view.xml的做法, 因此ViewModel在這一方面還是很封閉的, 很多相關的方法都是private的, 因此需要copy出來。

  1. public class BaseViewModel extends DefaultViewModel {
  2.  protected static ControlFactory controlFactory;   
    
  3.  protected List<ViewModelConfig> compositedViewModelConfigs;   
    
  4.  protected List<String> compositedConfigNames;   
    
  5.  private int state;   
    
  6.  @Override  
    
  7.  public void init(int state) throws Exception {   
    
  8.      List<String> result = new ArrayList<String>();   
    
  9.     addViewModelConfig(result);   
    
  10.     // 因為在初始化其他viewModelConfig的時候需要使用到狀態(tài), 而此時還沒有執(zhí)行super的init方法,   
    
  11.     // 因此sate還是最初的STATE_VIEW狀態(tài)   
    
  12.     setState(state);   
    
  13.     initCompositedViewModelConfigs(state, result);   
    
  14.     super.init(state);   
    
  15. }   
    
  16. protected void setState(int state) {   
    
  17.     this.state = state;   
    
  18. }   
    
  19. public int getState() {   
    
  20.     return state;   
    
  21. }   
    
  22. /**  
    
  23.  * 添加需要組合的view.xml文件路徑  
    
  24.  *   
    
  25.  * @param result  
    
  26.  */  
    
  27. protected void addViewModelConfig(List<String> result) {   
    
  28.     result.add(JbpmConstants.VIEW_TASK_INSTANCE);   
    
  29. }   
    
  30. /**  
    
  31.  * 根據(jù)ViewModelConfig初始化創(chuàng)建組件  
    
  32.  *   
    
  33.  * @param state  
    
  34.  * @param configNames  
    
  35.  * @throws Exception  
    
  36.  */  
    
  37. protected void initCompositedViewModelConfigs(int state,   
    
  38.         List<String> configNames) throws Exception {   
    
  39.     for (String configName : configNames) {   
    
  40.         ViewModelConfig config = getViewModelConfig(configName);   
    
  41.         loadDatasetConfigs(config);   
    
  42.         loadControlConfigs(config);   
    
  43.         if (state == STATE_VIEW) {   
    
  44.             loadEventConfig(DoradoContext.getContext(), config);   
    
  45.         }   
    
  46.     }   
    
  47. }   
    
  48. /**  
    
  49.  * 根據(jù)view.xml文件名得到ViewModelConfig對象  
    
  50.  *   
    
  51.  * @param configName  
    
  52.  * @return  
    
  53.  * @throws Exception  
    
  54.  */  
    
  55. protected ViewModelConfig getViewModelConfig(String configName)   
    
  56.         throws Exception {   
    
  57.     ViewModelConfig config = null;   
    
  58.     if (compositedViewModelConfigs == null) {   
    
  59.         compositedViewModelConfigs = new ArrayList<ViewModelConfig>();   
    
  60.         compositedConfigNames = new ArrayList<String>();   
    
  61.     }   
    
  62.     if (!compositedConfigNames.contains(configName)) {   
    
  63.         ViewModel viewModel = ViewModelManager.getViewModel(null,   
    
  64.                 configName, getNamespace(), "request");   
    
  65.         config = viewModel.getConfig();   
    
  66.         compositedViewModelConfigs.add(config);   
    
  67.         compositedConfigNames.add(configName);   
    
  68.     }   
    
  69.     return config;   
    
  70. }   
    
  71. @SuppressWarnings("unchecked")   
    
  72. protected static ControlFactory getControlFactory() {   
    
  73.     if (controlFactory == null)   
    
  74.         try {   
    
  75.             String clazz = Setting.getString("view.controlFactory");   
    
  76.             Class cl = Class.forName(clazz);   
    
  77.             controlFactory = (ControlFactory) cl.newInstance();   
    
  78.         } catch (IllegalAccessException ex) {   
    
  79.             Log.error(ex);   
    
  80.         } catch (InstantiationException ex) {   
    
  81.             if (System.getProperty("java.version").compareTo("1.4") >= 0)   
    
  82.                 Log.error(ex.getCause());   
    
  83.             else  
    
  84.                 Log.error(ex);   
    
  85.         } catch (ClassNotFoundException ex) {   
    
  86.             Log.error(ex);   
    
  87.         }   
    
  88.     return controlFactory;   
    
  89. }   
    
  90.    @SuppressWarnings("unchecked")   
    
  91.    protected void loadDatasetConfigs(ViewModelConfig viewModelConfig)   
    
  92.            throws Exception {   
    
  93.        if (viewModelConfig == null)   
    
  94.            return;   
    
  95.        List keys = viewModelConfig.datasetNodes();   
    
  96.        int count = keys.size();   
    
  97.        for (int i = 0; i < count; i++) {   
    
  98.            String id = (String) keys.get(i);   
    
  99.            XmlNode node = viewModelConfig.getDatasetNode(id);   
    
  100.            if (state != 2 && state != 3)   
    
  101.                createDataset(node);   
    
  102.        }   
    
  103.    }   
    
  104.    @SuppressWarnings("unchecked")   
    
  105.    protected void loadControlConfigs(ViewModelConfig config) throws Exception {   
    
  106.        if (config == null)   
    
  107.            return;   
    
  108.        List keys = config.controlNodes();   
    
  109.        int count = keys.size();   
    
  110.        for (int i = 0; i < count; i++) {   
    
  111.            String id = (String) keys.get(i);   
    
  112.            XmlNode node = config.getControlNode(id);   
    
  113.            String type = node.getAttribute("type");   
    
  114.            Class typeClass = getControlFactory().getControlType(type);   
    
  115.            if (typeClass != null) {   
    
  116.                if ((com.bstek.dorado.view.control.Logical.class)   
    
  117.                        .isAssignableFrom(typeClass)) {   
    
  118.                    createControl(type, id);   
    
  119.                    continue;   
    
  120.                }   
    
  121.                if (state == STATE_VIEW   
    
  122.                        && !(com.bstek.dorado.view.control.Placeable.class)   
    
  123.                                .isAssignableFrom(typeClass))   
    
  124.                    createControl(type, id);   
    
  125.            } else {   
    
  126.                throw new IllegalArgumentException("Unknown control type '"  
    
  127.                        + type + "'!");   
    
  128.            }   
    
  129.        }   
    
  130.    }   
    
  131.    protected void loadEventConfig(DoradoContext context, ViewModelConfig config) {   
    
  132.        if (config == null)   
    
  133.            return;   
    
  134.        XmlNode eventNodes[] = null;   
    
  135.        XmlNode eventsNode = config.getRoot().getChild("Events");   
    
  136.        if (eventsNode != null)   
    
  137.            eventNodes = eventsNode.getChildren();   
    
  138.        if (eventNodes != null) {   
    
  139.            for (int i = 0; i < eventNodes.length; i++) {   
    
  140.                XmlNode eventNode = eventNodes[i];   
    
  141.                String script = XmlConfigUtils.getNodeContent(eventNode,   
    
  142.                        context);   
    
  143.                EventHandler event = new EventHandler(eventNode   
    
  144.                        .getAttribute("name"), script);   
    
  145.                addEventHandler(event);   
    
  146.            }   
    
  147.        }   
    
  148.    }   
    
  149.    public Control getControl(String id) throws Exception {   
    
  150.        ViewModelConfig config = getConfig();   
    
  151.        Control control = getControl(config, id, true);   
    
  152.        return control;   
    
  153.    }   
    
  154.    /**  
    
  155.     * 在多個view.xml文件中遍歷直到找出要對應的javabean模型數(shù)據(jù)來創(chuàng)建control  
    
  156.     *   
    
  157.     * @param config  
    
  158.     * @param id  
    
  159.     * @param loop  
    
  160.     *            是否循環(huán)查找, 如果是在compositeViewModelConfigs中查找的話應該避免循環(huán)查找, 否則會死循環(huán)  
    
  161.     * @return  
    
  162.     * @throws Exception  
    
  163.     */  
    
  164.    private Control getControl(ViewModelConfig config, String id, boolean loop)   
    
  165.            throws Exception {   
    
  166.        Control control = (Control) controls.get(id);   
    
  167.        if (control == null && config != null) {   
    
  168.            XmlNode node = config.getControlNode(id);   
    
  169.            if (node != null) {   
    
  170.                String type = node.getAttribute("type");   
    
  171.                control = createControl(type, id);   
    
  172.            } else if (loop) {   
    
  173.                // 注意順序, 添加組合的view.xml文件的原則是后添加的同id的control或dataset將覆蓋前面的   
    
  174.                for (int i = compositedViewModelConfigs.size() - 1; i >= 0; i--) {   
    
  175.                    compositedViewModelConfigs.get(i);   
    
  176.                    control = getControl(compositedViewModelConfigs.get(i), id,   
    
  177.                            false);   
    
  178.                    if (control != null) {   
    
  179.                        break;   
    
  180.                    }   
    
  181.                }   
    
  182.            }   
    
  183.        }   
    
  184.        return control;   
    
  185.    }   
    
  186.    public Control createControl(String type, String id) throws Exception {   
    
  187.        Control control = (Control) controls.get(id);   
    
  188.        if (control == null) {   
    
  189.            control = constructControl(type, id);   
    
  190.            ViewModelConfig config = getConfig();   
    
  191.            if (config != null) {   
    
  192.                initControl(control, config, id);   
    
  193.            }   
    
  194.            controls.forceAdd(id, control);   
    
  195.            initControl(control);   
    
  196.        }   
    
  197.        return control;   
    
  198.    }   
    
  199.    private void initControl(Control control, ViewModelConfig config, String id)   
    
  200.            throws Exception {   
    
  201.        XmlNode node = config.getControlNode(id);   
    
  202.        if (node == null) {   
    
  203.            for (int i = compositedViewModelConfigs.size() - 1; i >= 0; i--) {   
    
  204.                config = compositedViewModelConfigs.get(i);   
    
  205.                node = config.getControlNode(id);   
    
  206.                if (node != null) {   
    
  207.                    break;   
    
  208.                }   
    
  209.            }   
    
  210.        }   
    
  211.        control.init(DoradoContext.getContext(), node);   
    
  212.    }   
    
  213.    protected ViewDataset createDataset(String type, String id, XmlNode node)   
    
  214.            throws Exception {   
    
  215.        ViewDataset dataset = constructDataset(type, id);   
    
  216.        DoradoContext context = DoradoContext.getContext();   
    
  217.        if (node != null) {   
    
  218.            dataset.init(context, node);   
    
  219.            if (state == STATE_REPORT)   
    
  220.                dataset.setAutoLoadData(true);   
    
  221.        }   
    
  222.        datasets.forceAdd(id, dataset);   
    
  223.        initDataset(dataset);   
    
  224.        return dataset;   
    
  225.    }   
    
  226.    public ViewDataset createDataset(XmlNode node) throws Exception {   
    
  227.        String type = node.getAttribute("type");   
    
  228.        String id = node.getAttribute("id");   
    
  229.        return createDataset(type, id, node);   
    
  230.    }   
    
  231.    @Override  
    
  232.    public ViewDataset getDataset(String id) {   
    
  233.        // 在當前config中找, 如果找不到, 將在組合config中去找   
    
  234.        ViewDataset dataset = super.getDataset(id);   
    
  235.        if (dataset == null) {   
    
  236.            for (ViewModelConfig config : compositedViewModelConfigs) {   
    
  237.                if (dataset == null && config != null) {   
    
  238.                    XmlNode node = config.getDatasetNode(id);   
    
  239.                    if (node != null)   
    
  240.                        try {   
    
  241.                            String type = node.getAttribute("type");   
    
  242.                            dataset = createDataset(type, id);   
    
  243.                            if (dataset != null)   
    
  244.                                break;   
    
  245.                        } catch (Exception ex) {   
    
  246.                            Log.error(ex);   
    
  247.                        }   
    
  248.                }   
    
  249.            }   
    
  250.        }   
    
  251.        return dataset;   
    
  252.    }   
    
  253.    @Override  
    
  254.    public ViewDataset createDataset(String type, String id) throws Exception {   
    
  255.        XmlNode node = null;   
    
  256.        ViewModelConfig config = getConfig();   
    
  257.        if(config != null) {   
    
  258.            node = config.getDatasetNode(id);   
    
  259.            if (node == null) {   
    
  260.                for (ViewModelConfig vmc : compositedViewModelConfigs) {   
    
  261.                    node = vmc.getDatasetNode(id);   
    
  262.                    if (node != null) {   
    
  263.                        break;   
    
  264.                    }   
    
  265.                }   
    
  266.            }   
    
  267.        }   
    
  268.        return createDataset(type, id, node);   
    
  269.    }   
    
  270. }

該重用方式集成了jsp重用的優(yōu)點, 在一定程度上消除了缺點, 與jsp重用相比, 優(yōu)點在于,不會受到組件在頁面中的位置布局的影響。在重用粒度上能對單個的組件進行重用, 相比jsp重用要細, 但是比Server API的重用方式要粗一些。因為只是配置文件上的重用, 因此主要是對配置文件的維護, 可維護性要比Server API方式要好, 該方式需要使用者對view.xml配置文件, jsp dorado taglib, ViewModel類三者之間的關系有非常好的認識。
易用程度:★★☆☆☆
適用范圍:★★★★☆
重用粒度:★★★★☆
可維護性:★★★★★
其他重用技巧
如果view.xml文件都一樣(說明界面一樣), 只是ViewModel不同(說明后臺業(yè)務邏輯不同)的情況下, 可以讓其公用同一個view.xml, 只是在d:view的配置上加上clazz屬性指定二者不同的ViewModel即可。比如這樣的寫法:

  1. <d:View config=“com.baiyao.workflow.settlement.SettlementInput”
  2.  clazz="com.baiyao.workflow.settlement.ExpenseSettlementInputViewModel">  
    
  3.  <jsp:include page="/workflow/settlement/settlement_input.jsp" />  
    
  4. </d:View>
    如何選擇
    其實這幾種重用方式互相之間并不矛盾, 可以在一個功能模塊中根據(jù)需要結合起來適用。但是如果使用太多的重用方式, 會提高項目的復雜程度, 這樣就會影響到可維護性, 因此重用也應該適可而止, 否則就是過猶不及。

參考鏈接:
https://www.iteye.com/blog/xiangtui-675693
https://www.cnblogs.com/linsond/archive/2010/02/26/1674409.html
https://blog.csdn.net/weixin_30448603/article/details/98497684

總結

以上是生活随笔為你收集整理的Dorado用法与示例的全部內容,希望文章能夠幫你解決所遇到的問題。

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

99热这里只有精品免费 | 婷婷色中文字幕 | 国产视| 亚州中文av | 狠狠狠的干 | 99视频在线 | 国产v视频 | 波多野结衣视频一区二区 | 在线精品观看国产 | 丁香六月激情婷婷 | 国产99一区 | 中文字幕二区在线观看 | 国产不卡在线 | 国产一区在线免费观看视频 | 亚洲三级毛片 | 99色99| 婷婷五天天在线视频 | 成人久久18免费网站 | 97超碰人人澡 | 国产精品6999成人免费视频 | 国产亚洲一级高清 | 在线观看日本高清mv视频 | 国产超碰在线 | 久久精品综合一区 | 午夜精品视频一区 | 精品国产免费一区二区三区五区 | av黄色成人 | 最近高清中文字幕 | 91精品国产三级a在线观看 | 91精品福利在线 | 精品1区2区| 一区三区视频在线观看 | 91精品国产一区二区在线观看 | 国产一级免费av | 激情网站| 玖玖玖在线观看 | 日韩av免费一区 | 国产精品99久久久久的智能播放 | 91久久精品一区二区二区 | 成 人 黄 色视频免费播放 | 国产美女免费视频 | 婷婷av电影 | 中文字幕乱码一区二区 | 亚洲国产资源 | 91mv.cool在线观看 | 在线播放视频一区 | 精品免费国产一区二区三区四区 | 99 久久久久 | 国产二区精品 | 中文字幕在线电影 | 国产欧美精品xxxx另类 | 你操综合 | 99在线精品视频在线观看 | 日韩有色 | 日韩午夜电影 | 国产精品久久久久一区二区 | 国产成人精品亚洲精品 | 日韩av在线一区二区 | 精品国产123 | 97精品国产97久久久久久免费 | 奇米影视999 | 91在线视频导航 | 8x成人免费视频 | 日本最大色倩网站www | 五月婷婷欧美视频 | 综合国产视频 | 亚洲一区美女视频在线观看免费 | 亚洲美女免费精品视频在线观看 | 色黄视频免费观看 | 91精品久久久久久综合乱菊 | 丁香花五月 | 丁香婷婷自拍 | 99久久精品日本一区二区免费 | www色,com | 久久久www成人免费精品张筱雨 | 国产精品美女久久久久久2018 | 91亚洲精品久久久中文字幕 | 91精品办公室少妇高潮对白 | 精品免费久久久久久 | 中文字幕高清免费日韩视频在线 | 色九九视频 | 欧美日韩精品久久久 | 91精品国产综合久久福利 | 在线国产高清 | 西西44人体做爰大胆视频 | 久久成人国产精品一区二区 | 国际精品久久久 | 色就是色综合 | 国产中文字幕一区 | 久久精品国产免费 | 日本爽妇网 | 免费高清av在线看 | 色综合天天在线 | 在线小视频 | 国产精品永久在线 | 日日夜夜国产 | 免费91在线观看 | 91禁在线看 | 在线国产91| 操操操夜夜操 | 成人黄色在线看 | www婷婷 | japanese黑人亚洲人4k | www.五月天激情 | 九色91福利 | 久久精品国产v日韩v亚洲 | 欧美日比视频 | 国产精品国产三级国产aⅴ无密码 | 99精品视频在线 | 亚洲毛片一区二区三区 | 又黄又爽的视频在线观看网站 | 久久黄色精品视频 | 久久久久久久久影视 | 亚洲区另类春色综合小说校园片 | 精品久久久久久国产偷窥 | 在线观看亚洲精品视频 | 天天操夜夜操天天射 | 国产在线视频在线观看 | 中文字幕高清免费日韩视频在线 | 亚洲电影网站 | 五月天色婷婷丁香 | 99视频在线观看一区三区 | 精品欧美一区二区精品久久 | 免费在线观看不卡av | 久久久久久久久久久网 | 精品久久久久久久久久久院品网 | www.av免费| 久久激情五月丁香伊人 | 国产日韩视频在线观看 | 国产黄网在线 | 日韩在线中文字幕 | 亚洲午夜久久久综合37日本 | 色婷婷 亚洲| 激情五月婷婷丁香 | 在线激情影院一区 | 高清av中文在线字幕观看1 | 97在线看 | av电影 一区二区 | 国产一区二区三区高清播放 | 精品一区二三区 | a视频免费| www.久久免费视频 | 四虎影视国产精品免费久久 | 亚洲精品视频在线播放 | 99在线精品视频观看 | avcom在线 | 国产精品嫩草影院123 | 99久久精品免费视频 | 亚洲精品视频播放 | 久久国产精品成人免费浪潮 | 国产一区二区影院 | 69精品视频在线观看 | 日韩毛片在线播放 | 色婷婷av一区二 | 色网站在线| av在线电影网站 | 在线观看一区 | 999视频精品 | 久精品一区 | 国产精品v欧美精品 | 日日爽天天| 国产资源在线观看 | 国内精品久久久久久久久久久 | av一本久道久久波多野结衣 | av电影在线免费观看 | 久久国产剧场电影 | 国产精品国内免费一区二区三区 | 国产精品一区专区欧美日韩 | 麻豆精品视频在线观看免费 | 操处女逼 | 国产精品第二页 | 在线观看中文字幕一区 | 热久久这里只有精品 | 欧美一级免费片 | 四虎最新域名 | 国产xxxx性hd极品 | 91av视频播放 | 色久综合 | 国产午夜影院 | 亚洲视频专区在线 | 日韩在线字幕 | 亚洲综合色播 | av高清一区二区三区 | 黄色一级免费电影 | 久久99国产一区二区三区 | 午夜色性片| 国产精品免费成人 | 精品国产综合区久久久久久 | a在线视频v视频 | 99久久精品电影 | 亚洲精品一区二区精华 | 五月婷香 | 97国产情侣爱久久免费观看 | 国产精品久久久久999 | www.伊人网 | 午夜精品麻豆 | 欧美日韩国产亚洲乱码字幕 | 天天干天天上 | 成人免费网站视频 | 国产精品一区在线播放 | 日韩在线欧美在线 | 久久久久女人精品毛片 | 极品美女被弄高潮视频网站 | 色丁香综合 | 欧洲亚洲精品 | 天天综合网 天天综合色 | 成人免费在线电影 | 中文字幕 91 | 九九热在线免费观看 | 免费久久精品视频 | 日本护士三级少妇三级999 | av手机在线播放 | 狠狠躁夜夜躁人人爽超碰91 | www黄色大片 | 日韩欧美第二页 | 日日夜夜操操操操 | 久久久这里有精品 | 中文字幕三区 | 亚洲免费在线 | 99久久精品久久亚洲精品 | 日本中文字幕视频 | 欧美日韩在线视频免费 | 国产视频久久久 | 激情五月婷婷激情 | 国内视频一区二区 | 亚洲黄色软件 | 91欧美国产 | 中文字幕av在线免费 | 精品夜夜嗨av一区二区三区 | 欧美精品一区二区蜜臀亚洲 | 蜜臀av夜夜澡人人爽人人桃色 | 亚洲精品女人久久久 | 91视频 - 88av| 久久国产亚洲视频 | 国产精品九九久久99视频 | www.香蕉视频在线观看 | 四虎国产精品成人免费影视 | 精品国产91亚洲一区二区三区www | 男女视频国产 | 97国产大学生情侣白嫩酒店 | 中文字幕一区二区三区久久蜜桃 | 国产一级特黄电影 | 精品国产伦一区二区三区观看说明 | 亚洲欧洲一区二区在线观看 | 久草在线免费新视频 | 日本性视频 | 国产v欧美 | 91黄色免费看 | 国产精品亚洲人在线观看 | 狠狠操狠狠插 | 午夜久久视频 | 中文字幕日韩av | 91精品国产三级a在线观看 | 国产亚洲在线 | 五月激情姐姐 | 1024手机看片国产 | 久久综合九色综合久久久精品综合 | 成人在线免费观看视视频 | 亚洲综合在线观看视频 | 91av电影在线 | 国产精品h在线观看 | 91九色国产蝌蚪 | 国产一二区视频 | 亚洲天堂首页 | 手机看片99| 国产中文字幕国产 | 久久精品国亚洲 | 最近中文字幕第一页 | 在线av资源| 日韩av片在线 | 国产一区在线视频播放 | 天天天天天天干 | 久久综合在线 | 免费91麻豆精品国产自产在线观看 | 成人av动漫在线 | 亚洲 欧美变态 另类 综合 | 99免费在线播放99久久免费 | 亚洲视频在线观看网站 | 国产成人av电影 | 狠狠操天天操 | 美女网站视频免费黄 | 美女露久久 | 成人免费视频播放 | 日日夜夜精品视频天天综合网 | 久久久久久高潮国产精品视 | 久久视频网址 | 亚洲3级 | 一区二区三区电影 | 狂野欧美激情性xxxx | 在线看的av网站 | 国内综合精品午夜久久资源 | 六月色婷婷 | 国产日韩欧美在线一区 | 国产免费观看久久 | 99中文视频在线 | 欧美激情视频一二三区 | 久久精品一区二区三区视频 | 精品国产一区二区三区在线 | 国产999精品久久久久久麻豆 | 超碰在线色 | www.日本色| 2019天天干天天色 | 久久久精品成人 | 国产精品免费久久久久 | 91欧美在线 | 日本公妇色中文字幕 | 不卡中文字幕av | 色网站国产精品 | 精精国产xxxx视频在线播放 | 午夜少妇 | 国产在线观看污片 | 国产精品中文久久久久久久 | 天天狠狠操 | 18国产精品福利片久久婷 | 99国产精品免费网站 | 欧美狠狠操| 中文字幕日韩在线播放 | 9999亚洲| 成人综合免费 | 久草综合在线 | 免费看污污视频的网站 | 日韩av电影网站在线观看 | 丰满少妇在线观看网站 | 免费a网址| 久久国产精品99国产 | 91最新在线视频 | 中文字幕黄色av | 久久久久久国产精品美女 | 国产精品手机看片 | 在线观看一级 | 成人一区二区在线观看 | 天天色天天射天天干 | 亚洲精品视频久久 | 中文字幕中文字幕中文字幕 | 福利av影院 | 99re视频在线观看 | 国产精品视频99 | 国内小视频 | 91精品国产91久久久久 | 色香蕉网 | 日韩另类在线 | 91成人免费在线 | 日韩在线视| 国产夫妻自拍av | 精品亚洲男同gayvideo网站 | 五月婷婷影视 | 国产免费三级在线观看 | 六月色婷 | av 一区二区三区四区 | 日日夜夜精品免费视频 | 国产精彩视频一区二区 | 成人在线视频在线观看 | 日韩免费一二三区 | 国产精品自产拍在线观看网站 | 最新av在线播放 | 日本久久久影视 | 九九久久精品视频 | 狠狠婷婷 | 久久成人国产精品 | 丁香六月综合网 | 国产字幕av | 91网址在线看 | 精品久久久久久久 | 91最新视频在线观看 | 欧美在线日韩在线 | 国产精品久久久久婷婷 | 久久这里只有精品23 | 天天操夜操视频 | 亚洲不卡123 | 亚洲闷骚少妇在线观看网站 | 成人欧美亚洲 | 国产91勾搭技师精品 | 五月婷婷黄色 | av在线日韩| 国产精品黄网站在线观看 | 国产 欧美 日本 | 国产精品欧美日韩 | 黄色一级性片 | 色91在线| 91成品人影院 | 9在线观看免费 | 成人中文字幕+乱码+中文字幕 | 亚洲国产成人高清精品 | 中文在线| 国产黄色精品网站 | 久久天堂精品视频 | 美女黄濒 | 手机av在线免费观看 | 88av网站| 亚洲天堂社区 | 人人添人人澡人人澡人人人爽 | 久久人人爽爽 | 日日干夜夜干 | 91新人在线观看 | 久久久影视| 欧美日韩亚洲第一 | 精品国产免费人成在线观看 | 色国产精品一区在线观看 | 97视频在线观看视频免费视频 | 国产精品嫩草影视久久久 | 欧美精品久久久久久久 | 久久国产精品99久久久久久老狼 | 欧美日韩午夜在线 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 国产精品自在线拍国产 | 欧美精品中文字幕亚洲专区 | 亚洲 中文字幕av | av观看免费在线 | 久久99国产精品免费网站 | 国产黄色美女 | 探花系列在线 | 91久草视频 | 精品亚洲一区二区三区 | 免费无遮挡动漫网站 | 视频在线观看入口黄最新永久免费国产 | 一区二区在线不卡 | 中文不卡视频在线 | 国产理论一区二区三区 | 97超视频在线观看 | 久久久国产精品网站 | 精品国产乱码久久久久久三级人 | 国产午夜在线观看 | 青草视频免费观看 | 欧美黑人xxxx猛性大交 | 日韩欧美在线视频一区二区三区 | 国产精品第一页在线观看 | 美女视频黄的免费的 | 国产精品1区 | 国产一区二区精品久久91 | 视频一区在线播放 | 亚洲手机av | 五月婷婷操 | 日日夜av| 天天干天天干天天 | 2024国产精品视频 | 国产又粗又猛又黄又爽的视频 | 免费在线观看成人小视频 | 国产精品一区二区久久精品爱涩 | 免费进去里的视频 | av丝袜在线 | 波多野结衣视频一区 | 日韩在线欧美在线 | 丁香婷婷成人 | 麻豆成人网 | 亚洲v精品 | 国产精品视频资源 | 中文字幕免费在线看 | 国产精品久久久久久久7电影 | 黄色软件网站在线观看 | 国产精品久久久久免费 | 亚洲精品 在线视频 | 玖玖在线精品 | 婷婷五天天在线视频 | 91精品国产成| 亚洲一区二区三区精品在线观看 | 久久情爱| 国产亚洲一区二区三区 | 99视频一区二区 | 亚洲综合色视频 | 中文字幕在线观看的网站 | 日韩黄色免费 | 啪一啪在线 | 亚洲精品视频在线免费播放 | 久久,天天综合 | 精品久久久久久久久久久久久久久久久久 | 在线午夜av | 东方av免费在线观看 | 高清av免费观看 | 91精品在线免费观看视频 | 五月激情六月丁香 | 精品在线观看一区二区 | 伊人网站| 日本黄色免费播放 | 国产亚洲aⅴaaaaaa毛片 | 久久久久亚洲精品国产 | 天天舔夜夜操 | 99免费看片| 国产一级视频在线免费观看 | 最新av免费在线 | 91女人18片女毛片60分钟 | 国产精在线 | 97视频总站 | 欧美激情xxxx | 精品一区三区 | 玖玖在线看 | 91视频在线观看免费 | 色婷婷成人 | 亚洲精品国偷拍自产在线观看 | 午夜精品一区二区三区在线观看 | 麻豆va一区二区三区久久浪 | 欧美另类美少妇69xxxx | 国产麻豆视频在线观看 | 国产在线播放一区二区 | 麻豆免费视频观看 | 亚洲精品五月天 | 玖玖玖在线观看 | 中文欧美字幕免费 | 午夜视频黄 | 中国一级特黄毛片大片久久 | 91九色porny在线 | 91免费看黄色 | 中文字幕一区二区三区精华液 | 欧美日本啪啪无遮挡网站 | 天天摸夜夜添 | 69xx视频 | 亚洲第一香蕉视频 | 99热在 | 国产一级免费在线观看 | 九九九电影免费看 | 中文字幕在线免费观看视频 | 涩涩网站在线播放 | 天堂av在线7 | 在线国产精品视频 | 91电影福利| 美女网站视频久久 | 日本三级不卡视频 | 久久精品视频在线看 | 久久久久综合精品福利啪啪 | 亚洲一级片在线观看 | 中文字幕在线观看91 | 91社区国产高清 | 免费av在线网站 | 99精品久久精品一区二区 | 韩国一区视频 | 黄av在线| 欧美一进一出抽搐大尺度视频 | 免费国产在线精品 | 色播激情五月 | 色鬼综合网 | 国产区网址 | 精品乱码一区二区三四区 | 亚洲国内精品视频 | 久久久久国 | 国内精品在线观看视频 | 人人涩 | 久久精品亚洲国产 | 精品无人国产偷自产在线 | 亚洲国产欧美在线看片xxoo | 黄色毛片在线 | 亚洲日日射 | 亚洲国产欧美一区二区三区丁香婷 | 黄a网 | 精品久久久久久久 | 国产系列 在线观看 | 91大神免费在线观看 | 国产精品久久久久久久久久久久午夜片 | 亚洲成人精品久久 | 一级特黄aaa大片在线观看 | 国产91精品一区二区麻豆亚洲 | 97视频在线观看视频免费视频 | 国产精品一区二区三区99 | 国产xxxxx在线观看 | 在线观看国产一区二区 | 六月丁香久久 | 干干操操| 在线а√天堂中文官网 | 国产精品一区二区三区在线看 | 五月婷婷激情综合 | 久久久黄色免费网站 | 操操操干干干 | 久久婷五月 | 久草久草在线 | 四虎成人免费影院 | 激情欧美xxxx | 天天综合人人 | 韩国av一区二区 | 999日韩 | 久久免费影院 | 亚洲精品视频免费看 | 欧美成人精品欧美一级乱 | 免费a现在观看 | 久99久在线 | 久久免视频 | 久久99精品国产麻豆婷婷 | 久久久穴| 国产无区一区二区三麻豆 | 人成电影网| 狠狠的操| 91日韩精品一区 | 久久精品二区 | 色资源在线| 午夜精品一区二区国产 | 精品一区二区影视 | 91精品对白一区国产伦 | 91麻豆精品国产91久久久久久久久 | 激情视频区 | 日韩久久一区 | 天天爱天天操 | 天堂网一区 | 高潮久久久久久 | 国产免费片 | 精品美女视频 | 久久99久久99久久 | 在线日本看片免费人成视久网 | 国产成人在线一区 | 免费视频一级片 | 69av免费视频 | 国产久视频 | 中文字幕a∨在线乱码免费看 | 色在线视频网 | 香蕉色综合 | 午夜精品一区二区三区在线视频 | 曰韩精品 | 久久久久久久久毛片精品 | 免费色视频网址 | 国产精品一区二区三区在线看 | 亚洲乱亚洲乱妇 | 欧美久久久久久 | 国产又粗又猛又黄又爽的视频 | 久久人91精品久久久久久不卡 | 天天爽网站 | 麻豆国产电影 | 少妇精69xxtheporn | 婷婷久久一区 | 亚洲精品在线视频播放 | 国产成人精品在线 | 9797在线看片亚洲精品 | 人人干天天干 | 在线日韩 | 久久久91精品国产一区二区三区 | 黄色成人免费电影 | 国产亚洲一区二区三区 | 国产一区二区成人 | 国产精品一区二区久久精品爱微奶 | 91污视频在线 | 操操色| 亚洲国产视频在线 | 久草国产在线 | 性色大片在线观看 | 久久久伦理 | 91丨九色丨蝌蚪丨老版 | 色婷婷九月 | 国产欧美中文字幕 | 久久图| 欧美一级特黄高清视频 | 九九免费在线观看 | 99色在线播放 | 国产成人av福利 | 欧美大香线蕉线伊人久久 | 在线精品亚洲一区二区 | 超碰av在线 | 亚洲成成品网站 | 亚洲成人精品国产 | 中文字幕中文字幕 | 97视频在线免费播放 | 夜夜操天天操 | 婷婷久月 | 国产99久久九九精品免费 | 国产香蕉97碰碰碰视频在线观看 | 亚洲精品中文在线观看 | 婷婷免费在线视频 | 日韩av一区二区在线 | 精品国产成人在线影院 | 国产成人91| 久草视频在线新免费 | 亚洲精品在线观看视频 | 日韩精品一区在线观看 | 国产精品日韩在线观看 | 西西4444www大胆视频 | 精品日韩在线 | 欧美日韩中文字幕综合视频 | 日本久久久久久久久 | 国产精品毛片一区二区 | 999精品视频 | 国产字幕在线看 | 在线岛国av | 午夜精品一二三区 | 日韩精品久久久久久中文字幕8 | 日韩免费视频线观看 | 欧美韩日精品 | 91天堂在线观看 | 国产日韩在线观看一区 | 日本大片免费观看在线 | 日韩视频在线观看视频 | 国产区精品在线观看 | 成人a大片 | 日日夜夜干 | av在线播放一区二区三区 | 免费网站观看www在线观看 | 日韩电影在线看 | 久草香蕉在线视频 | 蜜臀久久99精品久久久久久网站 | а天堂中文最新一区二区三区 | 中文字幕在线观看一区二区三区 | 久久中文精品视频 | 香蕉视频在线观看免费 | 久久99热精品这里久久精品 | 久草在线观看资源 | 亚洲综合色站 | 久久综合中文字幕 | 欧美性色黄 | 国产这里只有精品 | 97在线观看免费高清完整版在线观看 | 91成人精品一区在线播放69 | 色狠狠干| 超碰大片 | 亚洲免费婷婷 | 精品久久久影院 | 色综久久 | 色97在线 | 97超碰人人爱| 亚洲黄色片 | 五月天综合婷婷 | 国产乱视频 | 国产亚洲精品av | 一区二区三区四区免费视频 | 亚洲精品99 | 国产精品一区二 | 九色精品免费永久在线 | 五月天综合婷婷 | 日韩欧美在线一区二区 | 激情小说网站亚洲综合网 | 很黄很黄的网站免费的 | 国产在线不卡 | 久久久久久久久久久久久久电影 | 国产香蕉久久精品综合网 | 国产精品久久伊人 | 亚洲高清久久久 | 成人h视频在线 | 久久这里只有精品9 | 中文字幕婷婷 | 狠狠色丁香久久婷婷综 | 97热视频 | 国产成人在线网站 | 天天色天天综合网 | 激情开心色| 中文字幕精品一区久久久久 | 毛片二区 | 国产九九热 | 人人草在线观看 | 亚洲一本视频 | 中文字幕乱码日本亚洲一区二区 | 开心丁香婷婷深爱五月 | 免费高清在线视频一区· | 午夜精品一区二区三区可下载 | 亚洲精品国产麻豆 | 国产日韩精品欧美 | 久久色视频 | 亚洲成人二区 | 日韩r级在线 | 久久久亚洲精品 | va视频在线| 超碰99在线| av在线超碰 | 最近高清中文在线字幕在线观看 | 国产精品久久久毛片 | 99免费精品视频 | 亚洲精品中文字幕视频 | 97色婷婷成人综合在线观看 | 在线影院av| 狠狠狠色丁香综合久久天下网 | 夜夜躁日日躁狠狠躁 | 超碰在线99 | 色噜噜狠狠狠狠色综合久不 | 亚洲天天草| 在线观看视频亚洲 | 一区精品在线 | 久久网站av| 五月婷婷一区 | 99免费精品| 不卡av在线 | 久草精品在线观看 | 中文字幕在线免费观看 | 国产精品9999久久久久仙踪林 | 在线观看视频免费播放 | 亚洲黄色激情小说 | 欧美激情综合色综合啪啪五月 | 97色国产| 国产亚洲欧洲 | 特级a毛片 | av电影免费在线看 | 在线亚洲欧美日韩 | 国产成人久久久久 | 91九色成人蝌蚪首页 | 欧美另类人妖 | 天堂在线一区二区 | av网站在线观看免费 | 国产中文在线字幕 | 天天操福利视频 | 国产精品一区二区三区四区在线观看 | 久久久久久久久久久影视 | 日韩av成人在线观看 | 一级黄色av | 免费看一级 | 免费裸体视频网 | 午夜精品一二三区 | 97超碰在线免费 | 久久久91精品国产一区二区三区 | 国产精品一区免费看8c0m | 国产伦精品一区二区三区免费 | 69国产在线观看 | 久久激情视频 久久 | 一区二区视频网站 | 色偷偷88888欧美精品久久 | 在线视频日韩欧美 | 国产99久久久久久免费看 | 国产中文字幕视频在线观看 | 五月亚洲婷婷 | 久久久久久久久久久久久久电影 | 亚洲视频免费在线观看 | 精品91| 最新中文字幕在线观看视频 | 美女精品久久 | 中文字幕国产精品 | 97在线免费观看 | 中文字幕av全部资源www中文字幕在线观看 | 国产一区二区观看 | 又大又硬又黄又爽视频在线观看 | 国产精品一区二区在线观看免费 | 久久艹艹 | 欧美a级成人淫片免费看 | 欧洲不卡av | 国产成人一级电影 | 97电影院在线观看 | 日本三级在线观看中文字 | 97国产大学生情侣酒店的特点 | 国产一区二区网址 | 天堂在线免费视频 | 国产中文字幕在线播放 | av在线一 | 久久久穴 | 在线国产片 | 久久久片| 国产一级大片免费看 | 日韩极品视频在线观看 | 最近日本中文字幕 | 天堂av影院| 国产精品久久久久久久午夜 | 91免费看黄| 久久久久免费精品国产小说色大师 | 国产麻豆精品久久 | 视频在线日韩 | av天天澡天天爽天天av | 在线看av网址 | 色网站在线 | 亚洲精品白浆高清久久久久久 | 天天操夜夜操 | 国产精品ssss在线亚洲 | 成人免费观看av | 亚洲国产高清在线 | 欧美激情va永久在线播放 | 欧美一区在线观看视频 | 久99久精品| 亚洲丝袜一区 | 国产69精品久久99不卡的观看体验 | aa一级片 | 国产一区免费视频 | 国产午夜视频在线观看 | 国产1区在线观看 | 国产精品久久久久久久久久99 | 国产精品一级在线 | 久久综合视频网 | 九九热免费观看 | 久久国产经典 | 国产黄色精品在线 | 天天插一插 | 国产偷国产偷亚洲清高 | 国产剧情一区 | 97av视频在线 | 国产高清亚洲 | 亚洲黄色在线观看 | 久草在线手机观看 | 在线免费性生活片 | 韩国av不卡 | 久久久久久国产精品 | 日韩中文久久 | 国产精品第三页 | 色www精品视频在线观看 | 嫩草伊人久久精品少妇av | 丁香六月婷婷开心婷婷网 | 久久精品久久久久电影 | 欧美精品久久久久久 | 日本少妇高清做爰视频 | 中文字幕丝袜美腿 | 亚洲涩涩一区 | 亚洲国产午夜视频 | 国产a级免费 | 激情影院在线观看 | 中文字幕有码在线播放 | 97人人澡人人爽人人模亚洲 | 国产成人精品一区二区三区福利 | 亚洲综合射 | 麻豆国产精品视频 | 久久久久久久久久久黄色 | 97国产一区二区 | 精品欧美小视频在线观看 | 成人小视频在线免费观看 | 久久久久久久久久久福利 | 在线看国产| 黄色资源在线观看 | 亚洲精品字幕在线观看 | 亚洲久草在线 | 狠狠干干| 国产中的精品av小宝探花 | 久久艹影院 | 五月导航| 日韩| 69av久久 | 日韩xxxx视频 | 成人午夜黄色 | 精品国产欧美一区二区三区不卡 | 国产精品1区2区3区 久久免费视频7 | 国产区av在线 | 国产精品三级视频 | 久久激情小视频 | 久久99国产一区二区三区 | 97精品国产97久久久久久久久久久久 | 亚洲电影在线看 | 人人爽人人插 | av 一区二区三区 | 国产男女无遮挡猛进猛出在线观看 | 蜜臀久久99精品久久久无需会员 | 欧美激情综合色 | 精品国产亚洲一区二区麻豆 | 国产精品久久久久免费观看 | 最新高清无码专区 | 成人h视频在线 | 亚洲高清激情 | 日韩黄色大片在线观看 | 91夜夜夜| 日韩有色 | 日日夜夜综合 | 97电影网手机版 | 精品国产日本 | 又爽又黄在线观看 | 天天操天天摸天天干 | 美女久久视频 | 国产区精品区 | 久草影视在线 | 人人爽人人澡人人添人人人人 | 九九热精品视频在线观看 | 亚洲专区欧美 | 亚洲人在线7777777精品 | 天天弄天天干 | 国产一区二区在线免费观看 | 99这里只有精品99 | 精品久久久久一区二区国产 | 美女久久久久久久 | 一本一本久久a久久精品综合妖精 | 91成人亚洲 | av免费网站 | 99热99热| 国产精品av久久久久久无 | 午夜精品视频一区 | 精品国产一区二区三区久久影院 | 色婷五月| 黄色av成人在线 | 在线观看91| 久久伦理 | 国产一级片观看 | 午夜精品福利一区二区 | 一区在线免费观看 | 日韩a级免费视频 | www在线观看视频 | 久久成年视频 | av在线免费播放 | 日本爱爱片 | 日韩在线一区二区免费 | 久章草在线观看 | av中文字幕免费在线观看 | 欧美网站黄色 | 国内精品久久久久影院一蜜桃 | 国产精品毛片久久蜜 | 免费毛片aaaaaa | 91探花在线 | av网站手机在线观看 | 天天色天天| av免费高清观看 | 日韩综合一区二区 | 波多野结衣最新 | 日本乱码在线 | 99色在线观看 | 精品a在线 | 国产黄大片 | 国产91av视频在线观看 | 久草在线免费资源站 | 热久久视久久精品18亚洲精品 | 国产精品资源网 | 国产剧在线观看片 | 欧美十八 | 看v片| 色综合久久网 | 亚洲精品久久久蜜桃 | 91香蕉视频黄 | 国产成人综合精品 | 国产亚洲成人网 | 色婷婷五 | 久久歪歪 | 国产资源精品在线观看 | 日韩视频在线不卡 | 中文字幕在线观看av | 在线播放av网址 | 亚洲乱码在线观看 | 日韩av电影免费观看 | 日韩在线三级 | 国产成人在线观看 | 麻豆一精品传二传媒短视频 | 夜又临在线观看 |