Oracle ADF ビジネスコンポーネント

ハブラビテスへの一日の良い時間。 私の以前の記事は、ADFの簡単な紹介でした。 そして、調査の結果によると、このトピックは興味深いことがわかったので、ADFについて書き続けています。



このフレームワークについての短い話をした後、「バトルに突入」して、ADF機能をより具体的に検討することができます。 この記事では、ADF Business Componentsについて説明します。 宣言的およびプログラム的にそれらを扱う方法について。





一般的な概念



ADF Business Components(以降BC)は、視覚的で宣言的な開発を提供するデータベースフレームワークの一部です。 BC構成はXMLファイルに格納されますが、必要に応じてJavaクラスを生成し、ロジックを追加または再定義できます。

BCは5つの主要な部分に分かれています。



EOはデータベースのテーブルであり、したがって、EOインスタンスはテーブルの行です。

このコンポーネントは、データ、検証ルール、および永続ロジックをカプセル化します。



EOアソシエーションは、2つのエンティティ(テーブル)間の関係を定義します



VOは、データソースからデータを読み取るためのコンポーネントであり、それらを更新するための操作も含まれます。



リンクの表示-VO間の関係を定義します(関連付けと同様)



アプリケーションモジュールは、ビジネスコンポーネント(つまり、VOおよびビューリンク)で作業を提供するサービスレベルです。 追加のメソッドを追加して、他のアプリケーションモジュールをネストすることもできます。 最終的に、アプリケーションモジュールはデータコントロールとして使用されます。



IDE時間



テストデータデータベースの場合は、oracle HRスキーマの employees表を使用します



「テーブルからのビジネスコンポーネント」ウィザードを通過すると、結果として次のファイルセットが取得されます。





ここでは、Employees-EO、EmployeesView-VO、EmployeesAppModule-Application Module、EmpManagerFkAssoc-従業員とそのマネージャー間の関連付け、EmpManagerFkLink-同様の接続のリンクを表示しますが、VO、Business Components Diagram-コンポーネントの図。



データコントロールパネルで、対応するデータコントロールが作成されます。





チャートを見てください。



EmployeesViewはEmployees EOに基づいていることがわかります。 そして、2つのEmployeesViewインスタンスがApplicationModuleに入りました。 1人はマネージャーを担当し、2人目は従業員を担当します。



生成されたファイルの簡単な概要。



従業員



生成されたEOでは、含まれる属性を確認、編集、独自の追加、または削除できます。





データ検証ルールを管理することもできます。





EmployeesView



VO属性は、従業員EOから取得されていることを示しています。





VOリクエスト、その変数、および基準(where句という名前)を確認できます





EmployeesAppModule



前に見たように、アプリケーションモジュールには、EmployeesViewの2つのインスタンスが含まれています





EmpManagerFkAssoc



エンティティ間の関係。





EmpManagerFkLink



同じリンク元とリンク先は、ビューリンクはアソシエーションに基づいて構築されると言います。





CRUD







はい、はい。 CRUDは完全に宣言的な方法で実装され、コードを1行も記述しません。



結果がどうなるか見てみましょう。

最初に、従業員を含むテーブルが表示されます。





[従業員の作成]をクリックすると、新しい従業員の作成に移行します。





[保存]をクリックすると、新しい従業員がデータベースに追加され、テーブルに戻ります。





[従業員の更新]をクリックすると、従業員情報の編集に移行します。





変更を保存した後、再び表に戻ります。





最後に、従業員の削除をクリックすると、従業員は蒸発します。





操作は、制限されたタスクフローによって制御されます。 タスクフローの操作方法に関する別の記事があります。 今のところ、チャートを見てください。





ViewEmployees、createEmployee、およびupdateEmployeeは、テーブルとフォームの表示を担当するJSFFビューアクティビティです。

従業員をテーブルに表示するには、EmployeeViewをデータコントロールからページに転送し、作成オプションで目的のタイプのテーブルを選択する必要があります(私の場合、読み取り専用です)。





createEmployeeページとupdateEmployeeページにフォームを表示するには、同様の操作を行う必要がありますが、フォームカテゴリから選択します(私の場合、これはADFフォームです)





他のすべてのアクティビティは、DataControlに対する操作です。 これらの操作は、データコントロールパネルからも転送されます。





CreateInsertは、イテレーターに新しい行を作成し、イテレーターカーソルをその上に置きます。

Deleteは、カーソルが現在あるイテレーター内の行を削除します。

CreateInsertアクションとDeleteアクションを有効にするには、Commit操作とRollbackを呼び出して、変更をロールバックする必要があります。

これで、CRUDの実装が完了しました。



CRUD v2



ここで、宣言パスを完全に放棄するのではなく、マネージドBeanで操作を起動する場合を考えてみましょう。



簡単にするために、残りは同様に実行されるため、挿入の実装のみを考慮します。

最初のステップは、マネージドBeanを作成することです。





最後にBeanコードを検討します。



新しいページを作成し、そのページにテーブルを転送して、新しいデータと新しい従業員を追加するためのフォームを表示できるようにします。

入力コンポーネントでは、マネージドBeanに値の関係を配置しました。 そして最後に、マネージドBeanメソッドをアクションリスナーとして使用してボタンを追加します。



その結果、jspxマークアップは次のようになります。

<af:form id="f1"> <af:table value="#{bindings.EmployeesView1.collectionModel}" var="row" rows="#{bindings.EmployeesView1.rangeSize}" emptyText="#{bindings.EmployeesView1.viewable ? 'No data to display.' : 'Access Denied.'}" fetchSize="#{bindings.EmployeesView1.rangeSize}" rowBandingInterval="0" id="t1"> <af:column sortProperty="#{bindings.EmployeesView1.hints.FirstName.name}" sortable="false" headerText="#{bindings.EmployeesView1.hints.FirstName.label}" id="c1"> <af:outputText value="#{row.FirstName}" id="ot1"/> </af:column> <af:column sortProperty="#{bindings.EmployeesView1.hints.LastName.name}" sortable="false" headerText="#{bindings.EmployeesView1.hints.LastName.label}" id="c2"> <af:outputText value="#{row.LastName}" id="ot2"/> </af:column> <af:column sortProperty="#{bindings.EmployeesView1.hints.Email.name}" sortable="false" headerText="#{bindings.EmployeesView1.hints.Email.label}" id="c3"> <af:outputText value="#{row.Email}" id="ot3"/> </af:column> <af:column sortProperty="#{bindings.EmployeesView1.hints.PhoneNumber.name}" sortable="false" headerText="#{bindings.EmployeesView1.hints.PhoneNumber.label}" id="c4"> <af:outputText value="#{row.PhoneNumber}" id="ot4"/> </af:column> <af:column sortProperty="#{bindings.EmployeesView1.hints.JobId.name}" sortable="false" headerText="#{bindings.EmployeesView1.hints.JobId.label}" id="c5"> <af:outputText value="#{row.JobId}" id="ot5"/> </af:column> </af:table> <af:panelFormLayout id="pfl1"> <af:inputText value="#{backingBeanScope.employeeBean.employeeId}" label="#{bindings.EmployeeId.hints.label}" required="#{bindings.EmployeeId.hints.mandatory}" columns="#{bindings.EmployeeId.hints.displayWidth}" maximumLength="#{bindings.EmployeeId.hints.precision}" shortDesc="#{bindings.EmployeeId.hints.tooltip}" id="it1"> <f:validator binding="#{bindings.EmployeeId.validator}"/> <af:convertNumber groupingUsed="false" pattern="#{bindings.EmployeeId.format}"/> </af:inputText> <af:inputText value="#{backingBeanScope.employeeBean.firstName}" label="#{bindings.FirstName.hints.label}" required="#{bindings.FirstName.hints.mandatory}" columns="#{bindings.FirstName.hints.displayWidth}" maximumLength="#{bindings.FirstName.hints.precision}" shortDesc="#{bindings.FirstName.hints.tooltip}" id="it2"> <f:validator binding="#{bindings.FirstName.validator}"/> </af:inputText> <af:inputText value="#{backingBeanScope.employeeBean.lastName}" label="#{bindings.LastName.hints.label}" required="#{bindings.LastName.hints.mandatory}" columns="#{bindings.LastName.hints.displayWidth}" maximumLength="#{bindings.LastName.hints.precision}" shortDesc="#{bindings.LastName.hints.tooltip}" id="it3"> <f:validator binding="#{bindings.LastName.validator}"/> </af:inputText> <af:inputText value="#{backingBeanScope.employeeBean.email}" label="#{bindings.Email.hints.label}" required="#{bindings.Email.hints.mandatory}" columns="#{bindings.Email.hints.displayWidth}" maximumLength="#{bindings.Email.hints.precision}" shortDesc="#{bindings.Email.hints.tooltip}" id="it4"> <f:validator binding="#{bindings.Email.validator}"/> </af:inputText> <af:inputText value="#{backingBeanScope.employeeBean.phoneNumber}" label="#{bindings.PhoneNumber.hints.label}" required="#{bindings.PhoneNumber.hints.mandatory}" columns="#{bindings.PhoneNumber.hints.displayWidth}" maximumLength="#{bindings.PhoneNumber.hints.precision}" shortDesc="#{bindings.PhoneNumber.hints.tooltip}" id="it5"> <f:validator binding="#{bindings.PhoneNumber.validator}"/> </af:inputText> <af:inputDate value="#{backingBeanScope.employeeBean.hireDate}" label="#{bindings.HireDate.hints.label}" required="#{bindings.HireDate.hints.mandatory}" columns="#{bindings.HireDate.hints.displayWidth}" shortDesc="#{bindings.HireDate.hints.tooltip}" id="id1"> <f:validator binding="#{bindings.HireDate.validator}"/> <af:convertDateTime pattern="#{bindings.HireDate.format}"/> </af:inputDate> <af:inputText value="#{backingBeanScope.employeeBean.jobId}" label="#{bindings.JobId.hints.label}" required="#{bindings.JobId.hints.mandatory}" columns="#{bindings.JobId.hints.displayWidth}" maximumLength="#{bindings.JobId.hints.precision}" shortDesc="#{bindings.JobId.hints.tooltip}" id="it6"> <f:validator binding="#{bindings.JobId.validator}"/> </af:inputText> <af:commandButton text="Create Employee" id="cb1" actionListener="#{backingBeanScope.employeeBean.createEmployee}"/> </af:panelFormLayout> </af:form>
      
      







ページの説明は次のようになります。





コード管理されたbean'a(get'raおよびset'ryは省略)。

フィールド:

  private int employeeId; private String firstName; private String lastName; private String email; private String phoneNumber; private Timestamp hireDate; private String jobId; private BindingContainer bindings;
      
      







ページ上のボタンで使用される挿入方法:

 public void createEmployee(ActionEvent actionEvent) { //  binding  BindingContainer bindings = getBindings(); //      OperationBinding createOperation = bindings.getOperationBinding("CreateInsert"); createOperation.execute(); //    AttributeBinding employeeId = (AttributeBinding)bindings.getControlBinding("EmployeeId"); employeeId.setInputValue(this.employeeId); AttributeBinding firstName = (AttributeBinding)bindings.getControlBinding("FirstName"); firstName.setInputValue(this.firstName); AttributeBinding lastName = (AttributeBinding)bindings.getControlBinding("LastName"); lastName.setInputValue(this.lastName); AttributeBinding phoneNumber = (AttributeBinding)bindings.getControlBinding("PhoneNumber"); phoneNumber.setInputValue(this.phoneNumber); AttributeBinding email = (AttributeBinding)bindings.getControlBinding("Email"); email.setInputValue(this.email); AttributeBinding hireDate = (AttributeBinding)bindings.getControlBinding("HireDate"); hireDate.setInputValue(this.hireDate); AttributeBinding jobId = (AttributeBinding)bindings.getControlBinding("JobId"); jobId.setInputValue(this.jobId); //        OperationBinding commitOperation = bindings.getOperationBinding("Commit"); commitOperation.execute(); }
      
      







マネージドBeanの動作をチェックし、新しいレコードがテーブルにあることを確認します。





CRUD v3



最後の例では、コードのみを使用します。

まず、ビジネスコンポーネントのクラスを準備する必要があります。

これを行うには、EmployeeViewを開き、Javaタブに移動して次のクラスを生成します。





EmployeesViewImplはクエリを操作するために必要であり、EmployeesViewRowImplは属性を持つ文字列になります。



同様に、Application Moduleのクラスを生成します。





EmployeesAppModuleImplでデータベースに行を追加し、このメソッドにデータを転送するためのTOクラスを作成し、マネージドBeanでこのメソッドを呼び出す新しいメソッドを記述することは残っています。



アプリケーションモジュールのメソッド:

  public void createEmployee(EmployeeInfo employeeInfo) { //  ViewObject EmployeesViewImpl employeeView = getEmployeesView1(); //   . EmployeesViewRowImpl employee = (EmployeesViewRowImpl)employeeView.createRow(); employee.setEmployeeId(employeeInfo.getEmployeeId()); employee.setEmail(employeeInfo.getEmail()); employee.setPhoneNumber(employeeInfo.getPhoneNumber()); employee.setFirstName(employeeInfo.getFirstName()); employee.setLastName(employeeInfo.getLastName()); employee.setHireDate(new Timestamp(employeeInfo.getHireDate())); employee.setJobId(employeeInfo.getJobId()); //   . employeeView.insertRow(employee); //  getDBTransaction().commit(); }
      
      







新しいBeanメソッド:

  public void createEmployee2(ActionEvent actionEvent) { //  application module String applicationModuleClass = "com.matim.forhabr.model.EmplyeesAppModuleImpl"; String config = "EmplyeesAppModuleLocal"; EmplyeesAppModuleImpl appModule = (EmplyeesAppModuleImpl) Configuration.createRootApplicationModule(applicationModuleClass, config); //   TO EmployeeInfo employeeInfo = new EmployeeInfo(); employeeInfo.setEmail(this.email); employeeInfo.setEmployeeId(this.employeeId); employeeInfo.setFirstName(this.firstName); employeeInfo.setHireDate(this.hireDate); employeeInfo.setJobId(this.jobId); employeeInfo.setLastName(this.lastName); employeeInfo.setPhoneNumber(this.phoneNumber); //       appModule.createEmployee(employeeInfo); //   Configuration.releaseRootApplicationModule(appModule, false); //       AppModule, //    ,   //   Execute BindingContainer bindings = getBindings(); OperationBinding executeIterator = bindings.getOperationBinding("Execute"); executeIterator.execute(); }
      
      







作業を確認します。





今日は以上です。 このトピックにはまだ多くの情報が残っているので、 ここに詳細情報へのリンクを残します



PS次の記事では、タスクフローについて説明します。



All Articles