日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

Dorado用法与示例

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

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

  42. 如何使用項(xiàng)目中的自定義連接,不用dorado默認(rèn)的連接
    在dorado的說(shuō)明文檔上有關(guān)于這個(gè)問(wèn)題的說(shuō)明,其中說(shuō)明里寫(xiě)道

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

Dorado重用最佳實(shí)踐
在實(shí)際開(kāi)發(fā)中,都會(huì)面臨組件重用的問(wèn)題, 面向?qū)ο蟮恼Z(yǔ)言,可以通過(guò)各種設(shè)計(jì)模式,實(shí)現(xiàn)重用.那么。在dorado框架中如何進(jìn)行重用呢? 對(duì)于dorado的重用問(wèn)題,下面從三個(gè)方面進(jìn)行說(shuō)明.
1.通過(guò)使用jsp:include指令進(jìn)行重用
將要重用的內(nèi)容寫(xiě)到一個(gè)jsp頁(yè)面中, 然后通過(guò)jsp:include標(biāo)記在需要使用的位置進(jìn)行重用, 該jsp中可再引用d:view標(biāo)簽,比如定義一個(gè)jsp頁(yè)面:

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

  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. }

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

  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.     // 因?yàn)樵诔跏蓟渌鹶iewModelConfig的時(shí)候需要使用到狀態(tài), 而此時(shí)還沒(mé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對(duì)象  
    
  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.     * 在多個(gè)view.xml文件中遍歷直到找出要對(duì)應(yīng)的javabean模型數(shù)據(jù)來(lái)創(chuàng)建control  
    
  156.     *   
    
  157.     * @param config  
    
  158.     * @param id  
    
  159.     * @param loop  
    
  160.     *            是否循環(huán)查找, 如果是在compositeViewModelConfigs中查找的話應(yīng)該避免循環(huán)查找, 否則會(huì)死循環(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.        // 在當(dāng)前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)點(diǎn), 在一定程度上消除了缺點(diǎn), 與jsp重用相比, 優(yōu)點(diǎn)在于,不會(huì)受到組件在頁(yè)面中的位置布局的影響。在重用粒度上能對(duì)單個(gè)的組件進(jìn)行重用, 相比jsp重用要細(xì), 但是比Server API的重用方式要粗一些。因?yàn)橹皇桥渲梦募系闹赜? 因此主要是對(duì)配置文件的維護(hù), 可維護(hù)性要比Server API方式要好, 該方式需要使用者對(duì)view.xml配置文件, jsp dorado taglib, ViewModel類三者之間的關(guān)系有非常好的認(rèn)識(shí)。
易用程度:★★☆☆☆
適用范圍:★★★★☆
重用粒度:★★★★☆
可維護(hù)性:★★★★★
其他重用技巧
如果view.xml文件都一樣(說(shuō)明界面一樣), 只是ViewModel不同(說(shuō)明后臺(tái)業(yè)務(wù)邏輯不同)的情況下, 可以讓其公用同一個(gè)view.xml, 只是在d:view的配置上加上clazz屬性指定二者不同的ViewModel即可。比如這樣的寫(xiě)法:

  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>
    如何選擇
    其實(shí)這幾種重用方式互相之間并不矛盾, 可以在一個(gè)功能模塊中根據(jù)需要結(jié)合起來(lái)適用。但是如果使用太多的重用方式, 會(huì)提高項(xiàng)目的復(fù)雜程度, 這樣就會(huì)影響到可維護(hù)性, 因此重用也應(yīng)該適可而止, 否則就是過(guò)猶不及。

參考鏈接:
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

總結(jié)

以上是生活随笔為你收集整理的Dorado用法与示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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