第七章-ADF Business Rules Definiens

ADF BC - 实体对象与业务规则
本文详细介绍了ADF BC中的实体对象概念及其组成部分,包括EntityImpl、EntityDefImpl和EntityCache,并深入探讨了如何在实体对象中定义业务规则,如验证规则和域验证。

上一章,簡單的對於Entity Object做了一些簡單的說明,也許有一些尚未說到,但是會於後面漸漸補充,這一章的重點,將會在於一些Business Rules的制訂,所以示範的範例較多,希望可以讓大家對於一些基本的Validation有相對的認識。


 在ADF BC中,我們先來介紹Entity Object,回想一下,Entity Object通常代表一個實體的DB的Table或是View,首先,Entity Object共分成三個部分:


  1. EntityImpl


  2. EntityDefImpl 
  3. EntityCache


 其中我們可以發現,當我們基本的Entity Object Create起來後,通常會包含一個Entity Class和一個XML File,如下圖所示:


 其中,EntityImpl通常是代表Entity Object的實體Class檔,以Employee為例,ADF BC會Create一個實體Class檔,就是EmployeesImpl.java,這個Class檔是EntityImpl的子類別。


 其中,ADF BC將會基於EntityImpl來產生Entity Object Instance,每一個Instance是代表實體Table中的每一筆Row,而EmployeesImpl.java將會有將資料做新增、修改和刪除的相關Method。


 我們先點Employee這個Entity Object,可以在上圖中看到,當你打開Entity Object Editor,如果你尚未和DB連線,你就需要先行登入,如下圖:


 當我們已經打開,我們可以觀察到Entity Object有相當多的Attribute,接著我們將來介紹EmployeesImpl。


 我們點到Enployee這個Entity Object,我們可以在系統導覽區看到Source分類下,有Employees.xml和EmployeesImpl.java這兩個檔案,我們可以按下右鍵,並且選擇Open,將可以打開EmployeesImpl.java這個檔案。


 我們可以看到關於EmployeesId的JavaBean屬性,有一組getXXX和setXXX的屬性組,只要有一個Attribute,就將會有一組JavaBean的屬性組,如下圖示:


 在此值得一提是getXXX和setXXX,其中因為EmployeesImpl是延伸由EntityImpl而來,所以以getEmployeesId為例,也是延伸由getAttribute而來,其中重要的是,當你已經使用EmployeesImpl的getXXX或是setXXX都可以保證型態轉換正確,但是如果直接使用getAttribute等等的Method,將不保證型態是正確的,可能會於Complier-error或是Run-time error等等,所以一般建議直接使用子類別提供的getXXX和setXXX等等Method。


 Entity Object可以放Business Rules的制訂,我們可以在實體的Entity Object的Class檔中設定,例如可以直接修改setEmployeeId這個Method,可以插入相關的程式碼,訂製你所需要的行為。


 另外一個值得一提的是,我們都知道每一個Employee Entity Instance都是代表實體資料庫中的每一筆Row,所以Entity Object中有相關的Create和Delete的Method,意味當有一個Instance建立時,會觸動Create的Method,所以你當然可以放一些相關的程式碼,做一些當你Create時,所需要處理的程式,下面有相關說明:


 可以針對Employee這個Entity Object打開Entity Object Editor,可以選到Java的分類,你可以看到第一個紅色框框,當你Default Create出Entity Object時,這個勾勾 Default會勾起來,所以你會產生一個EmployeesImpl.java這個檔,當你將勾勾拿掉,Oracle JDeveloper會將EmployeesImpl.java刪除掉,有些狀況,你可能不會需要這個檔案,所以你可以將這個檔案刪掉,這樣可以增加一點點相關的Performance,但是一般建議保留,因為應該差不了多少。


 前面我們已經提過,可以放入一些Method在Entity的Class檔中,例如需要新增一筆Row,需要同時新增一些Rule,可以將Create Method這個勾勾打勾,程式碼會自動幫你加入


 如下圖,已經將Create Method的勾勾打勾。


 當按下確定,Oracle JDeveloper會自動Create程式碼。


 如下圖,我們可以5728導覽區選取Employees這個Entity,然後可以在結構區選到EmployeesImpl.java這個檔案,我們可以看一下程式碼有沒有 Create好。


 可以看到Create這個Method已經Create好,可以按下右鍵選,【Go to Source】。


 可以看到已經Create好相關程式碼,你可以加入自己的程式邏輯。


 緊接著,我們已經看到Entity的實體Class檔,接著我們可以看到有一個XML檔,Employees.xml是代表Entity的Metadata,也就是描述該實體Entity所代表的Table的Metadata,也就是類似Table的欄位名稱,欄位長度等等。


 所以你可以看到下圖,代表Employees這個Entity的Metadata,例如:EmployeeId,會定義包括欄位名稱,欄位型態等等,一般來說,都比較不會去動這個XML File,如果你需要動態更動Metadata,下面我們會介紹如何做。


 當你需要更改Entity的Definition,一般來說,Oracle JDeveloper會幫你Create出Default的XML File,但是如果你需要動態更動這樣的定義,可以將第二個紅色框框打勾,Oracle ADF BC將會Create出一個Class檔來替代這個XML File,所以你可以加入一些相關的程式碼或是加入一個可以影響整個Entity的Method。


 第一個紅色框框是代表Entity Collection Class,這個Class檔是代表Entity的Cache,你可以加入相關的程式碼,可以來操控Entity Cache。


 其中需要說明的是:


 EmployeesImpl是extend EntityImpl 這個Class檔,所以當如果你需要利用或是操控Attribute的值,你可以選擇EmployeesImpl中的getXXX這樣的Method來使用,這些Oracle都是保證型態安全,但是如果你用EntityImpl這樣的Class檔,你需要用到getAttribute這樣的Method,但是需要進行型態轉換,否則將會得到錯誤。


 關於EmployeesDefImpl或是EmployeesColImpl都是各自Extend EntityDefImpl和EntityColImpl這兩個Class檔,關於詳細的操作或是JavaDoc都可以在Oracle JDveloper的Help裡找到,所以可以好好善加利用。


 以下我們將開始介紹範例,歡迎大家繼續看下去。


 第一個範例:建立薪水不能超過 30000 元的Business Rules。


 第一部份,我們要建立利用Entity Validation Rules來定義我們的Business Rules。


 其中包括Oracle JDeveloper所Default提供的相關元件,慢慢看下去。


 先選Employees這個Entity Object,並按下右鍵,且選擇Edit Employees。


 當你開啟了Entity Object Editor,你可以看到有一個選項是【Validation】,你可以選到這個Node,可以看到有List所有的Attribute。


 因為我們需要對薪水設Validation,所以我們先點到Salary這個Attribute。


 這是針對Salary這個Attribute所需要定義的Validation Rules Definition。


 針對Rules的形式,共有包括CompareValidator、ListValidator、RangeValidator或MethodValidator,共有四種固定的Rules方式,等下都會一一說明。


 所以我們先選著Rules:CompareValidator,接著我們先看一下Attribute,因為我們是需要針對Salary,所以Default會選到Salary,但是你可以動態更改,一樣會是代表你所選的Attribute的Validator,例如:如果我去選HireDate,則一樣會去代表HireDate的Validator。


 你可以選擇條件,例如選取等於或是小於等等,所以你可以選取你所需要的。


 所以我們選到Operator是LessThan,而Compare With則是有三個型態,包括可以來自於一個固定數字、一段SQL的第一筆資料或是一個View Object的Attribute,所以你可以取到你所需要的。


 例如你在Compare With選到Query Result,代表你需要比較的是一段SQL,所以你可以在中間輸入SQL,但是因為是比較單值,所以是代表這段SQL的第一筆資料列的第一個欄位。


 所以又在CompareWith選到View Object Attibute,代表是和這個View Object的第一筆資料相比,所以也是一個值,但是隨著View Object Attribute而變。


 回歸我們的範例,所以我們像下圖的選擇,固定值輸入30000,並且在Error Message輸入【企業員工的薪水不能超過上限】,所以整個Validator是代表員工的薪水要小於一個數值,而這個數值是 30000。


 所以你可以看到已經新增一個Validation Rules,這樣Attribute就會受到規範。


 我們可以上圖按下確定,並且繼續打開Business Component Browser,在HrAppModule下按下右鍵,選擇Test,然後按下Connect,則可以打開Business Component Browser,如果不清楚,請參閱前面的章節。


 我們點到EmployeesView1這個View Object。


 我們將員工編號是100的員工的薪水,從18000調整為30001元,所以他的薪水將會超過30000元,我們可以看到下面的結果。


 可以看到Business Component Browser會丟出一個Exception,並且將你所設定的Error Message秀出來,可以按下OK。


 你可以按鍵盤的ESC鍵,將可以把薪水回復回來,方便使用。


 可以看到多了一個EmployeesImplMsgBundle.java這個檔,會去定義你的Error Message。


 所以你可以看一下他的相關程式碼。

Unable to render embedded object: File (Oracle_JDeveloper_Ch7_img_34.jpg) not found.


 接著,我們將這個功能做了簡單的示範,以下會做一些不同功能的說明,先來介紹ListValidator。


 因為ListValidator是確定在某一些特定List內,而Operator則分為In或是NotIn。


 你可以選擇一些固定的值,或是一段SQL,或是一個View Object Attribute的第一筆資料,可以參考前面的說明。


 第三個是RangeValidator,是代表Validate一個固定的範圍,所以你可以選擇Between或是NotBetween,可以輸入最大值以及最小值。


 當然所有的方式,都可以去控管某一個Attribute的行為以及Business Rules,所以我們又稱為Attribute-Level Validation。


 接著我們來看另一種方式,就是Validation Rules,你可以Create一個Business Rules的Class檔來和Entity Validation來做結合,所以一下我們將要示範這樣的作法。


 首先我們必須先將此Class檔產生,此Class稱為Validation Rule Skeleton Class,


 你必須先在Model的Project部分,先行按下右鍵,選擇Project Properities。


 首先先到Business Components下,你必須要先來Registered Rules。


 所以你需要點到Registered Rules這個Node,並且按下New。


 因為我們必須建立一個Class是來確定【最小長度限制】的相關功能的Validation,所以將名稱改成minLengthValidation,而Package改成hr.model。


 如下圖的更改。


 當你按下確定,你可以看到你的Project Properities會有一個Validation先行註冊。


 你可以回到導覽區,可以看到有一個Class檔已經被Create好了,名稱為minLengthValidation.java,同時間,下面的架構區會顯示此Class檔的成員。


 接著,按下你可以點二下minLengthValidation.java,並且幫你開到主要編輯區,所以你可以看到有一下的Tab分類,因為我們必須要Create一個屬性來接受我們的Validation的最小長度的數值為何,所以我們先點到 Class 這個Tab。


 我們可以利用Oracle JDveloper所提供的Class Tab來增加一個屬性,按下Add。


 輸入欄位名稱:minLength,型態選擇int。


 如下圖的畫面設定。


 按下確定,你可以看到可用的欄位多了一個,等會我們來看一下程式。


 我們可以回到系統導覽列,我們可以先點到minLenghtValidation.java這個檔案,


 接著看一下下方的架構區,可以看到程式的大概架構,已經有多一組getXXX / setXXX的Method,其中屬性的名稱是minLength,所以等會可以看一下程式,另外重要的是,我們需要去將 validateValue 這個Method,新增你自己的Business Rules,所以等會會有詳盡的說明。


 所以我們可以在validateValue這個Method上按下右鍵,選Go to Source這個功能,將可以幫你直接找到程式中的位置。


 所以Oracle JDeveloper會幫你找到程式的validateValue這個Method,方便你使用。


 剛剛我們加入一個屬性,同時會包含一組getXXX和setXXX的Method。


 我們可以加入我們所需要判別的程式碼,我們確定需要加入Validation的欄位,所可以輸入的值,不能小於Validation所設定的值,否則回傳False。


 我們已經將相關的Validation Rules寫好了,接著,我們必須要自訂Exception的相關錯誤訊息的設定,所以我們可以找到vetoableChange這個Method所以我們在程式結構區,在vetoableChange中按下右鍵,選Go to Source。


 Oracle JDeveloper會幫你帶到程式碼區,並且找到vetoableChange這個Method。


 因為ADF會幫你帶好Default的錯誤訊息,所以你可以更改成你所喜好的訊息,但是一般來說,如果你釘死在程式碼,難免會比較不好使用,且重複使用性也不好,所以可以將內容更動成this.getDescription,因為我們有一個屬性是Description,所以可以動態來抓取Description。


 我們先將剛剛我們所修改或是新增的部分,先行存檔。


 接著我們必須要將剛剛的Validation Class加入Project,所以我們需要在Model這個Project上按下右鍵,選Add to Project,將此Class加入。


 Oracle JDveloper會開啟檔案開啟的對話框。


 我們將目錄切到HRES\Model\src\model下,選擇剛剛我們所新增的Validation Class:minLengthValidation.java。


 因為Validation Class已經加入,所以可以開始選擇那一個欄位需要有此條件的驗證,所以如圖開啟Entity Object Editor。


 我們一樣選到Validation這個Node,準備選擇相關欄位。


 我們先針對FirstName這個欄位來加入Validation,所以點到Validation這個Node,並且選到FirstName這個選項。


 我們可以將Rules選到我們之前所建立的Validation,也就是minLengthValidation,所以你可以將Rule選到minLengthValidation。


 當你選到minLengthValidation這個Validation Rules,可以明顯看到會出現之前所建立的兩個屬性,在minLengthValidation.java裡的兩個屬性。


 可以在description中輸入錯誤時所需要顯示的Error Message,在此輸入如下的敘述,可以在minLength這個屬性,輸入最小長度的限制,目前設為3,按下確定。


 如下圖,FirstName已經加入Validation,所以接著可以對於LastName做相同動作。


 如下圖,依此下列條件進行Validation Rules做設定。


 如下圖,你已經將FirstName和LastName兩個Entity Attribute設定好相關的Validation Rules。


 當你按下確定後,Oracle JDeveloper會進行實體Class和相關的XML檔的程式異動,所以會出現下面的圖。


 接著可以針對Model Project做整體的Rebuild,也就是整體程式的重新編譯。


 當程式已經進行編譯後,可以啟動Oracle Business Browser,可以在HrAppModule上按下右鍵,選Test來開啟Oracle Business Component Browser。


 直接按下Coonect,如果有所不清楚,可以看一下前面的章節說明。


 當Oracle Business Component Browser已經打開,可以點選到EmployeesView1這個Node,來打開EmployeeView這個View Object。


 我們先選到EmployeeId為102這個員工,可以看到FirstName為Lex。


 我們可以將FirstName的值從Lex更改到Le,因為我們已經規定FirstName的Validation Rules是最小的長度是 3,所以改成Le,會造成Validation Error。


 我們可以點到下一筆,如下圖所示,點該選項。


 你會得到一個Validation Error,如下圖所示,代表你的FirstName必須最小長度是超過3。


 我們可以按一下ESC,可以將剛剛更改過的值回復,接著我們將LastName的值從De Haan更改成De,將會進行LastName的Validation。


 接著,我們一樣按到下一筆資料,如下圖所示。


 你也會得到一個Validation Error,因為LastName是必須是最小長度要超過4。


 以上是Validation Rules的相關範例,可以試一試。


 我們已經談了一些 Validation Rules 的方式,接著我們來談 Validation Domain,


 可以使我們的 Attribute 符合某一種格式,以下我們舉個例子:


 先將 Business Components Diagram 打開,可以看到我們之前建立的Diagram圖。


 我們將Component Palette打開,如果你看不到,可以到標題列中的View分類,可以將Component Palette打開,接著我們將Domain點一下。


 將Domain拉到這個Diagram的空白處。


 如果你已經和資料庫離線,Oracle JDeveloper會先行要求你登入。


 Default會將Domain的名稱設定為Domain1。


 所以我們將Domain的名稱更改成PhotoNumberDomain。


 如下圖,如果你名子取錯,不能改,請直接將Domain移除,重新加入。


 可以看到Navigator的視窗中,看到已經多了一個PhotoNumberDomain這個關於欄位PhotoNumber的Domain。


 Domain會建好一個Class檔和一個XML File,你可以依下圖,先將Class檔編譯。


 當你已經打開PhotoNumberDomain.java的Class檔,可以先去找到Validate這個Method,這個Method是需要去Implement Validation Code,所以我們點著這個Method,按下右鍵,選Go to Source。


 首先先來關心一下這個Class檔,可以知道mData就是該欄位當時的值,所以最後會出叫Validate這個Method,所以我們需要去Validate這個Method中加上我們的Validation Clode。


 因為這個欄位是電話格式,所以我們利用正規式的比對,程式碼如下:


 先行存檔一下。


 我們已經建好Domain,我們可以來設定何欄位要來設定


 打開 Entity Object Editor,並且選到PhoneNumber這個Attribute。


 將Attribute的Type往下拉,選到hr.model.common.PhotoNumberDomain這個選項,確認PhoneNumber的Type改成此Domain。


 當我們已經選到相關的Domain ,可以發現Database Column已經被改成是Oracle的VARCHAR2(255),但是因為真正是只有VARCHAR(20),所以要手動改回。


 如下圖,已經還原真正Database Column的Type。


 按下確定,Oracle JDeveloper會開始建立相關程式。


 一樣地,我們進去ADF Business Component Browser看一下測試結果,按一下Test。


 如下圖,按下Connect。


 請點到EmployeeView1這個Node。


 我們將PhotoNumber加上一個8,也就是515.123.45678,將會不符合我們剛剛對於PhotoNumber所設定的Domain,所以當我們瀏覽到下一筆,我們可以看到ADF會丟出錯誤訊息。


 如圖,ADF 會丟出我們所自訂的錯誤訊息。


 另外來說,我們來看EmployeeId是148這個員工,當電話是011.44.1344.619268,我們可以將前面加上 1。


 如下圖,我們已經更改PhotoNumber,我們可以接著按瀏覽下一筆。


 你將可以得到一個錯誤訊息,因為你給了一個不符合的格式。


 接下來,我們來看一個另一種Validation,剛剛我們都是看到關於某一個attribute,現在我們來看如何做整個Entity Level的Validation。


 先將Employees Entity Editor 打開(確定經理級,薪水的限制)。


 如果需要做Entity Level的Validation,需要在Java這個Node,點選特定的選項,ADF 會自動幫你 Create 撰寫Validation的Code。


 你可以在Validation Method的框框打勾,ADF將會幫你Create好相關的Method,你可以將Validation Code寫到那裡,將會在下面介紹。


 ADF自動Create中…..


 當你建立完成後,你可以在EmployeesImpl.java中看到這個Method。


 按下右鍵,並且選擇Open。


 接著,可以先往Structure區中看一下,可以找到一個Method,名為validateEntity這個Method,會扮演控制整個Entity Validation的角色,選一下右鍵,並選Go to Source。


 可以看到 Oracle JDeveloper幫你帶到validateEntity這個Method。


 輸入一下程式碼,如下圖,你打上JboException,可以按下Alt+Enter來Import Class


 如下圖,我們選racle.jbo.jboException,這樣ADF才能抓到相關Exception。


 以下程式碼則是當Job ID是VP或是PRES結尾的,代表此人是經理階級,所以補上檢查薪水不應少於多少,以下依此類推。


 先行存檔。


 準備進行測試,可以進入Business Component Browser進行測試,按下測試。


 選擇 Connect。


 當我們看到員工編號是 100 的,我們看到JobId是AS_PRES,所以代表是經理階級,所以薪水必須是大於15000,所以當你進行薪水異動,將會產生Exception。


 已經將薪水更動成13000。


 你會得到以下的Exception,藉由JobID再去Validate薪水的欄位。


 接著,我們看到103這個員工編號,他的JobID是IT_PROG,所以乃是非經理階,所以薪水最高是14999,如果超過,將會得到Exception。


 將薪水更動成18000元。


 你可以得到非經理階的Exception,所以可以控管整個Entity Level的Validation。


 所以我們可以按下ESC來還原剛剛所設錯的值。


 關於Entity Object的部分,將於這個章節結束,下一章將會介紹Data Model,等待介紹到JSP後,會將整個ADF Framework發揮出功用,所以現在只是瞭解ADF的一些相關細節,繼續加油喔。


03-19
<think>好的,我现在需要帮助用户了解ESP-ADF框架的相关信息,包括文档和概述。用户已经提供了三个引用来源,我需要结合这些信息来构建回答。 首先,我应该确认ESP-ADF是什么。根据引用[3],用户提到了ESP-IDF和ESP-ADF的官网下载链接,所以ESP-ADF应该是乐鑫(Espressif)公司的一个框架,可能与音频开发相关,因为ADF可能代表Audio Development Framework。用户提供的引用[1]和[2]都涉及到环境配置,特别是与ESP32和ESP-IDF相关,所以ESP-ADF可能基于ESP-IDF构建,专用于音频应用。 接下来,我需要整理用户提供的引用内容。引用[1]提到在终端输入idf等同于运行一个导出脚本,用于配置ESP-ADF环境。引用[2]讨论了在VS Code中搭建ESP-ADF环境,选择目录和已下载的esp-adf目录。引用[3]提供了ESP-IDF的官方文档链接,这可能是ESP-ADF的基础。 用户想要的是ESP-ADF的文档或概述,所以需要引导他们到官方资源。根据引用[3],虽然链接指向ESP-IDF的文档,但乐鑫的官网可能有专门的ESP-ADF部分。需要确认是否有独立的ESP-ADF文档,或者是否集成在ESP-IDF文档中。同时,用户的问题可能涉及到如何获取框架的概述,比如主要功能、应用场景等。 可能还需要补充ESP-ADF的主要特性,如支持的音频编解码器、音频处理功能、与ESP32芯片的兼容性等。此外,环境搭建步骤也是用户关心的,引用[1]和[2]提到了配置环境的方法,应该包括这些步骤,但需要简明扼要。 然后,生成相关问题。用户可能对如何开始使用ESP-ADF、如何配置环境、常见应用场景等感兴趣。根据引用中的环境配置步骤,相关问题可以涉及环境搭建的详细步骤、与ESP-IDF的关系、开发工具的支持(如VS Code插件)等。 最后,确保回答结构清晰,分点说明,并正确引用提供的资料。注意使用中文,数学公式使用正确的LaTeX格式,但在这个问题中可能不需要数学表达式。检查引用标识是否正确对应,如引用[1]、[2]、[3]分别对应不同的内容。</think>### ESP-ADF框架概述 ESP-ADF(Espressif Audio Development Framework)是乐鑫(Espressif)为ESP32系列芯片设计的音频开发框架,基于ESP-IDF(IoT Development Framework)构建,专注于音频应用的开发。它提供完整的音频处理工具链,支持从音频采集、处理到传输的全流程开发。 #### 核心功能 1. **音频协议支持**:支持MP3、AAC、FLAC、WAV等常见音频格式编解码。 2. **多场景应用**:适用于智能音箱、语音助手、网络收音机等场景。 3. **硬件兼容性**:适配ESP32、ESP32-S系列芯片,集成I2S、ADC/DAC等音频接口驱动。 4. **云端服务对接**:内置与主流云平台(如AWS、阿里云)的对接模块。 #### 环境配置 1. **依赖ESP-IDF**:需先安装ESP-IDF(版本需与ESP-ADF兼容),参考官方文档配置基础环境[^3]。 2. **设置ESP-ADF路径**: 在终端运行以下命令配置环境变量: ```bash export ADF_PATH=/path/to/esp-adf source $ADF_PATH/export.sh ``` 或通过VS Code插件直接选择已下载的ESP-ADF目录[^2]。 3. **验证环境**:执行`idf.py build`编译示例项目,确认工具链配置正确[^1]。 #### 文档资源 1. **官方文档**:访问[ESP-ADF官方文档](https://docs.espressif.com/projects/esp-adf/)获取API详解、开发指南及示例代码。 2. **GitHub仓库**:查看[ESP-ADF GitHub](https://github.com/espressif/esp-adf)获取源码和更新日志。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值