この章では、Oracle Application Development Framework(Oracle ADF)のアーキテクチャと主要機能について説明します。
この章の内容は次のとおりです。
Oracle Application Development Framework(Oracle ADF)は、J2EE標準とオープン・ソース・テクノロジを基盤とするエンドツーエンドのアプリケーション・フレームワークであり、サービス指向アプリケーションの実装を簡略化および迅速化する目的で設計されています。Web、ワイヤレス、デスクトップ、Webサービスなどのインタフェースを使用してデータの検索、表示、作成、変更および検証を行うエンタープライズ・ソリューションを開発する場合、Oracle ADFを利用することでその作業が容易になります。Oracle JDeveloper 10gとOracle ADFを組み合せて使用すると、設計からデプロイに至る開発ライフサイクル全体に対応した環境が提供され、ドラッグ・アンド・ドロップによるデータ・バインディング、ビジュアルUI設計、チーム開発などの組込み機能を使用できます。
Oracle ADFを使用してアプリケーションを構築すると、業界のベスト・プラクティスに従うように、モデル、ビューおよびコントローラ・アーキテクチャに準拠したビジネス・ロジック、ページ・ナビゲーション、ユーザー・インタフェースの明確な分離が実現します。図1-1で示すように、MVCアーキテクチャの概要は次のとおりです。
モデル・レイヤーは、現在のページに関連したデータ値を表します。
ビュー・レイヤーには、データの表示および変更に使用するUIページがあります。
コントローラ・レイヤーでは、ユーザー入力を処理してページ・ナビゲーションを決定します。
ビジネス・サービス・レイヤーでは、データ・アクセスを処理してビジネス・ロジックをカプセル化します。
図1-2は、このアーキテクチャを構成する各ADFモジュールの場所を示しています。このフレームワークのコア・モジュールは、JSR-227仕様を実装した宣言的なデータ・バインディング機能であるOracle ADF Modelです。Oracle ADF Modelレイヤーにより、統一化されたアプローチを使用して、各ユーザー・インタフェースをコード記述なしで任意のビジネス・サービスにバインドできます。Oracle ADFを構成するその他のモジュールは、次のとおりです。
Oracle ADF Business Components: Oracle Forms、PeopleTools、SiebelTools、Visual Studioなどの4GLツールをよく理解している開発者のためにビジネス・サービスの構築作業を簡略化します。
Oracle ADF Faces: JavaServer Faces(JSF)で構築されるWebアプリケーションに豊富なUIコンポーネント・ライブラリを提供します。
Oracle ADF Swing: Swingで構築されるデスクトップ・アプリケーションにOracle ADF Modelを拡張します。
Oracle ADF Controller: StrutsおよびJSFをOracle ADF Modelに統合します。
Webユーザー・インタフェースの設計場所であるアプリケーションのビュー・レイヤーでは、従来のJavaServer Pages(JSP)または最新のJavaServer Faces(JSF)標準を使用して開発を行うことができます。または、デスクトップUIの外観や対話方式を選択し、既製のSwingコンポーネントまたはライブラリを使用して開発を行うことで、希望のルック・アンド・フィールを実現することも可能です。どの方法を選択しても、WYSIWYGベースのビジュアル・デザイナを操作して、ドラッグ・アンド・ドロップによるデータ・バインディングを実行できます。JSFが推奨される理由の1つとして、ADF Facesモジュールにより提供される100近くのJSFコンポーネントの包括的なライブラリを使用できることがあげられます。
ADF Facesコンポーネントには、ルック・アンド・フィールのスキン管理などの高度な機能や、最新のAjaxプログラミング技術の使用により変更されたページの一部のみを増分的に更新する機能などが含まれます。コンポーネント・ライブラリでは、複数のJSFレンダー・キットをサポートしているため、WebブラウザとPDA Telnetデバイスのインタフェースが可能です。これらのコンポーネントにより、HTMLやJavaScriptを記述することなく、魅力的で高機能なWeb UIおよびワイヤレスUIを驚くほど簡単に構築できます。
Webアプリケーションのページ・フロー処理を主要機能とするコントローラ・レイヤーでは、一般的に使用されているApache StrutsフレームワークとJSFに搭載された組込みのページ・ナビゲーション機能の両方がOracle ADFと統合されています。どちらの場合でも、JDeveloperのビジュアル・ページ・フロー・ダイアグラマを使用してページ・フローを設計できます。また、ADF Controllerモジュールの適切なプラグインを使用して、ADF Modelのデータ・バインディング機能をコントローラ・レイヤーのページ処理ライフサイクルに統合できます。
モデル・レイヤーのOracle ADF Modelは、データ・コントロールと呼ばれるJSR-227のサービス抽象化機能を備えており、一般的なビジネス・サービス・テクノロジ用としてすぐに使用できるデータ・コントロール実装を提供します。どのテクノロジを採用する場合でも、JDeveloperとOracle ADFを組み合せて使用することで、ユーザー・インタフェースの作成時にドラッグ・アンド・ドロップによる宣言的なデータ・バインディング機能を使用できます。サポートされるテクノロジは、次のとおりです。
ADFアプリケーション・モジュール
これらのサービス・コンポーネントは、ビジネス・ルールを自動適用するSQL問合せ結果の更新可能なデータセットを公開します。
Webサービス
アプリケーションに必要とされるサービスが標準のWebサービス・インタフェースを公開している場合、サービス・エンドポイントに関連するWeb Services Description Language(WSDL)のURLをOracle ADFに指定するだけで、それらと対話して結果を表示するユーザー・インタフェースの構築を開始できます。
XML
XMLや、Webサービスとして公開されていないカンマ区切りの値(CSV)のデータをアプリケーションで操作する場合でも、プロバイダURLおよびオプションのパラメータを指定するのみで、それらのデータを操作できます。
JavaBeansおよびEnterprise JavaBeans(EJB)セッションBean
必要に応じて、トランザクションをサポートするEJBも含めたJavaベースのサービス・クラスを簡単に操作できます。
新しいWebアプリケーションを構築するエンタープライズ4GL開発者には、ビュー・レイヤーとコントローラ・レイヤーではJavaServer Faces、ビジネス・サービス実装ではADF Business Componentsの使用をお薦めします。この組合せは、オラクル社内の4000名以上のエンタープライズ4GL開発者が、Oracle E-Business Suiteの開発に日々使用しているものと同様の生産性の高いJ2EEテクノロジ・スタックを提供します。また、1999年にリリースされて以来、何千もの顧客およびパートナが、Oracle ADFベースのアプリケーションの構築およびデプロイに成功しています。現在も、そして、これからも、オラクル社をはじめとする多くの企業が、Oracle ADFとADF Business Componentsを利用してビジネスを行っていきます。
Oracle Forms、PeopleTools、SiebelTools、Visual Basicなどの高速アプリケーション開発ツールの経験の長いユーザーでも、Java 2 Enterprise Editionに触れた経験があるはずです。オラクル社のE-Business Suite部門でもそうであったように、J2EEに対して興味を持つきっかけとなったのは、プロフェッショナル・ユーザー向けの従来のデスクトップUIの置き換えのための、セルフサービスのWebアプリケーションの標準に基づくアーキテクチャの評価であると思われます。または、自己啓発および自身の能力開発のために、空き時間を利用して学習していたことなども考えられます。
最初のきっかけが何であったとしても、そのユーザーのJ2EEに対する最初のイメージは、他の4GLユーザーと共通するものと予想されます。J2EEによって柔軟性、再使用性および選択肢を拡張できることについては理解しても、「組合せ可能な部品」が多いことがユーザーにとっての難点です。習熟した4GLツールでは画面を次々と構築できていたため、すべてのJ2EEコードを記述する必要がある点にとまどうと思われます。JDeveloper 10gおよびOracle ADFには、次のような使い慣れた4GL機能が用意されているため、安心して学習できます。
宣言的なデータ・アクセスおよび検証
宣言的なユーザー・インタフェース設計およびページ・ナビゲーション
宣言的なデータ・バインディング
単純なイベント・ドリブン・アプローチによる、必要に応じたカスタム・ロジックの追加
Oracle ADFのXMLベースおよびJavaベースの宣言的な開発機能をOracle JDeveloper 10gで使用する場合、設計時エラーの強調表示機能、状況依存の編集支援機能、コンパイル時のエラー・チェック機能などを利用できます。
サービス指向J2EEアプリケーションを構築する場合、コア・ビジネス・ロジックを1つ以上のビジネス・サービスとして実装します。これらのバックエンド・サービスは、適切なビジネス・ルールを適用すると同時に、必要に応じてビジネス・データの問合せ、挿入、更新、削除の手段をクライアントに提供します。ADF Business Componentsは、高パフォーマンスで豊富な機能を持つ、データ中心のサービスを提供および維持するための、組込みのアプリケーション・オブジェクトです。これらを使用すると、オラクル社のアプリケーション開発者が作業を正確に実施するために発見した、すぐに使用できるすべてのJ2EEデザイン・パターンとベスト・プラクティスの実装方法を利用できます。これらのテスト済のコードを活用することにより、すべてを一から作成しなおすのではなく、自社アプリケーションに特有のロジックに重点を置くことができます。
図1-3に説明するように、Oracle ADFはデータベース中心のビジネス・サービスを簡単に構築するために、次の主要なコンポーネントを提供しています。
エンティティ・オブジェクト
エンティティ・オブジェクトは、データベース表内の1行を表し、すべてのDML操作を処理することでデータ変更を簡略化します。また、該当する行のビジネス・ロジックをカプセル化し、ビジネス・ルールが一貫して適用されることを保証します。エンティティ・オブジェクトを他のエンティティ・オブジェクトと関連付け、基盤となるデータベース・スキーマの関係を反映することで、複数のアプリケーションで再使用できるビジネス・ドメイン・オブジェクトのレイヤーを作成します。
アプリケーション・モジュール
アプリケーション・モジュールは、UIクライアントがアプリケーション・データの操作に使用するトランザクション・コンポーネントです。アプリケーション・モジュールによって、エンド・ユーザー・タスクに関連した作業論理ユニットに関連する、更新可能なデータ・モデルやトップレベルのプロシージャおよびファンクション(サービス・メソッド)を定義します。
ビュー・オブジェクト
ビュー・オブジェクトはSQL問合せを表し、その結果の作業を簡略化します。使い慣れたSQL言語を十分に活用し、エンド・ユーザーのタスクが必要とする手近な形に、データを正確に結合、計画、フィルタ、ソートおよび集約します。これには、ビュー・オブジェクトを他のビュー・オブジェクトにリンクし、複雑度にかかわらずマスター/ディテール階層を作成する機能も含まれます。エンド・ユーザーがユーザー・インタフェースを使用してデータを変更すると、ビュー・オブジェクトはエンティティ・オブジェクトと連携し、変更内容が一貫して検証され、保存されます。
ヒント: Oracle Formsの開発者には、この機能の組合せが、フォーム、データ・ブロック、レコード・マネージャ、フォームレベルのプロシージャおよびファンクションによって提供されるデータ中心機能と同様のセットであることがすぐに理解できます。ユーザー・インタフェースがデータ・アクセス機能および検証機能とは明確に区別されている点が、ADFの大きな違いです。詳細は、4.3.1項「Oracle Forms開発者が理解しやすい概念」を参照してください。 |
JavaServer Facesでは、属性、イベント、および一貫性のある実行時APIを備えたWeb UIコンポーネントの導入により、Webユーザー・インタフェースを簡単に作成できます。扱いにくいタグやスクリプトを操作するかわりに、JSF標準に準拠したすぐに使用できるデータ認識型のコンポーネントのライブラリを使用してWebページを組み立てることが可能です。
JavaServer Faces標準を共同開発した業界の専門家たちは、設計に数多くの宣言的な開発技術を取り入れました。たとえば、JSFでは、表示する情報に対して単純な式言語を使用します。選択されたユーザーのセットを参照する#{UserList.selectedUsers}
、特定のユーザー名を参照する#{user.name}
、ユーザーがマネージャかどうかを判断する#{user.role == 'manager'}
などが式の例です。汎用の式評価機能により、実行時にそれぞれList
、String
、boolean
値が戻されるため、個々のオブジェクトにコードを必要とせず、自動的にアクセスできます。この宣言的な式言語(略称EL)は、もともとJSTLタグ・ライブラリの一部として導入され、その改良バージョンが現在のJSPおよびJSF標準に組み込まれています。
JSF UIコンポーネントの値は、実行時にそのvalue
属性によって決定されます。コンポーネントにはその値として静的テキストを割り当てることができますが、通常、value
属性には、表示データを決定するために実行時インフラストラクチャにより評価されるEL式が含まれます。たとえば、現在ログイン中のユーザーの名前を表示するoutputText
コンポーネントには、value
属性に#{UserInfo.name}
という式を設定できます。EL式を使用してコンポーネントの任意の属性に値を割り当てることができるため、データ駆動型の動的なユーザー・インタフェースを簡単に作成できます。たとえば、UIコンポーネントのrendered
属性に#{not empty UserList.selectedUsers}
などのブール値の式を使用すると、表示するオブジェクト・セットが空のときにはそのコンポーネントを非表示にできます。UserList
というオブジェクトの選択ユーザーのリストが空の場合、rendered
属性はfalse
と評価されるため、コンポーネントはページに表示されません。
コントローラ・レイヤーのアプリケーション・ロジックの管理を容易にするため、JSFでは、宣言的なオブジェクト作成メカニズムを採用しています。このメカニズムを使用するには、JavaオブジェクトをJSFのfaces-config.xml
ファイルに構成します。これらのオブジェクトは、JavaBeansの仕様に従ったプロパティを持ち、EL式によって最初に参照されるときに必要に応じてJSFランタイムでそのインスタンス化が管理されるため、マネージドBeanと呼ばれます。JSFでは、最初に作成される際にこれらのBeanのプロパティを設定するための宣言的なメカニズムを提供します。マネージドBeanには、管理プロパティを設定できますが、その実行時の値は開発者が指定したEL式に基づいてJSFランタイムにより割り当てられます。管理プロパティは、それぞれ独自の管理プロパティを持つ他のBeanに依存することもあります。この場合、関連するBeanのツリーが適切な順序で作成されることは、JSFランタイムにより保証されます。
図1-4では、JSFのマネージドBeanには、2つの主な役割があることを表しています。
特定のページに密接に関連付けられたリクエスト・スコープのマネージドBeanは、そのプロパティやメソッドで実行時にページをサポートすることから、口語的表現でバッキングBeanと呼ばれます。ページ内のUIコンポーネントとバッキングBeanのプロパティおよびメソッド間の関係は、コンポーネントの適切な属性に含まれる次のようなEL式により決定されます。
value="#{expr}"
表示または変更対象のデータを保持するプロパティを参照します。
action="#{expr}"
イベントを処理するメソッドを参照します。
binding="#{expr}"
表示と非表示の切替えや色の選択など、プログラム的に操作する必要のあるUIコンポーネントの対応インスタンスを保持するプロパティを参照します。
ページのバッキングBeanの役割を果さないマネージドBeanは、単なるアプリケーション・ロジックBeanとみなされます。これらのBeanには、単一のページに限定されないコードやプロパティが含まれます。また、これらのBeanは、(この用途にかぎられませんが)単一のリクエストの範囲を超えてコントローラ・レイヤーにメソッド結果をキャッシュし、複数のページから使用できるビジネス・サービス・メソッドを一元的に事前処理または事後処理するためのビジネス・サービス・ラッパーとして機能することがあります。
JSFページのリクエスト処理に関連する標準の処理フェーズを拡張するため、マネージドBeanの使用に加え、PhaseListener
クラスにアプリケーション・コードを記述することも可能です。JSFランタイムが各ページで処理するこれらの標準ステップは、ページのライフサイクルと呼ばれます。実際、ほとんどのJSFアプリケーションでは、最終的になんらかのカスタム・フェーズ・リスナーを実装してライフサイクルをカスタマイズします。通常、ページを最初に表示するときのレンダリング用モデル・データを準備するなどのタスクを実行する場合、このカスタマイズを行います。
宣言的なUI設計に加え、JSFではページ・ナビゲーション・ルールを宣言的に定義するメカニズムを提供します。開発者は、ユーザーのページとの対話に対する正規のナビゲーションの「結果」に、論理名を割り当てることでルールを定義します。たとえば、UserDetails.jspx
ページでアカウントの詳細を変更する場合、エンド・ユーザーが「保存」ボタンをクリックしてページと対話したとします。この対話の論理的なナビゲーションの結果、詳細を表示するMoreDetails.jspx
ページに進むか、またはユーザー・アカウントのリストを表示するBrowseUsers.jspx
ページに戻ります。図1-5で示すように、GotoMoreDetailsPage
やBackToBrowsePage
など、これらの2つの結果を表す名前を設定できます。ナビゲーション・ルール情報は、faces-config.xml
ファイルに他の構成情報とともに保存され、実行時にはこれらの論理結果名に基づいてJSFでページ・ナビゲーションを処理します。
Oracle ADFモデル・レイヤーでは、汎用データ・バインディング機能の実行にXML構成ファイルを使用します。ADF Modelでは、ユーザー・インタフェース・テクノロジとビジネス・サービス実装の分離を可能にするJSR-227の2つの概念(データ・コントロールと宣言的バインディング)が具体化されています。
データ・コントロールでは、関連するプロパティ、メソッド、タイプの情報を含め、サービスの操作とデータ・コレクションを表す標準のメタデータ・インタフェースを使用してビジネス・サービスの実装技術を抽象化します。設計時に、JDeveloperのようなビジュアル・ツールで標準的なサービス・メタデータを操作し、任意のデータ・コントロール操作やデータ・コレクションへのUIコンポーネントのバインドを簡略化します。実行時に、汎用のOracle ADF Modelレイヤーによって、適切なXMLファイルからデータ・コントロールおよびバインディングを記述した情報が読み取られ、ユーザー・インタフェースとビジネス・サービスを結合する双方向の関係が実装されます。この結合方法には、次の3つの主要なメリットがあります。
記述コードが減少するため、テストおよびデバッグする行数も減少します。
どのUIテクノロジおよびビジネス・サービス・テクノロジでも、同じように処理できます。
独自コードを記述することなく、有益な実行時機能を使用できます。
宣言的なバインディングによって、データ・コントロール内のデータ・コレクションからのデータ・アクセスの詳細と、その操作の実行が抽象化されます。すべてのエンタープライズ・アプリケーションに必要とされるデータ・バインディングの主要な機能を自動化する宣言的なバインディング・オブジェクトには、次の3つの基本的な種類があります。
データ・コレクションの現在の行を追跡するイテレータをバインドするイテレータ・バインディング
UIコンポーネントをデータ・コレクションの属性に関連付ける値のバインディング
データ・コントロールまたはデータ・コレクションのカスタム操作または組込み操作を実行するアクション・バインディング
イテレータ・バインディングを使用すると、データ・コレクションのスクロール処理やページ移動、または概要情報から詳細情報へのドリルダウンを可能にするユーザー・インタフェースを簡単に作成できます。データを表示するUIコンポーネントでは、値のバインディングを使用します。値のバインディングは、単純なテキスト・フィールドで使用する最も基本的なものから、リスト、表、ツリーでのUIコントロールのニーズをサポートするような、より高度なリスト、表、ツリーのバインディングまで、様々な種類があります。アクション・バインディングは、ハイパーリンクやボタンなどのUIコンポーネントで使用され、コードを記述することなく、データ・コレクションやデータ・コントロールの組込み操作またはカスタム操作を実行します。
図1-6は、ADF Modelで宣言的なデータ・バインディングを使用する場合のJSFアプリケーションのアーキテクチャを示しています。Oracle ADF ModelとJavaServer Facesを組み合せると、実際のアプリケーションに必要とされる典型的なマネージドBeanコードを大量に記述せずに済みます(図1-4参照)。
実際、組込みのアクションまたはサービス・メソッドの起動によって処理できないプログラム的なコントローラ・ロジックを実行する場合を除き、作成するほとんどのページでバッキングBeanを使用する必要はありません(コードを記述しなくともADF Modelによって自動的に処理されます)。また、ADF Modelのデータ・コントロールによって適切な機能が実装されるため、ビジネス・サービスをラップするアプリケーション・ロジックBeanも必要ありません。さらに、ADF Modelには、必要とされるほとんどの共通操作をページ定義メタデータの情報に基づいて宣言的な方法で実行する汎用のJSFフェーズ・リスナーが付属するため、通常は独自のJSFフェーズ・リスナーを記述する必要もありません。
Oracle ADFは多くの宣言的な機能を提供しているため、エンタープライズJ2EEアプリケーションに必要なJ2EEデザイン・パターンをすべて学習して実装する必要はありません。精通している4GLツールと同様に、記述する必要のあるJavaコードは、固有のビジネス・アプリケーションまたはユーザー・インタフェース対話に一意のもののみです。Oracle ADFを使用して構築したWebベースのアプリケーションは、次の要素からなる明確に階層化されたアーキテクチャで構成されます。
ビュー・レイヤーのUIコンポーネントから構成されるJSFページ
コントローラ・レイヤーのUIイベント処理とページ・フロー・ロジックを含むJSFバッキングBean
モデル・レイヤーのADFモデルの宣言的なデータ・バインディング
ビジネス・サービス・レイヤーにおけるデータ・アクセスおよび検証を実装するADF Business Components
実際には、UIコンポーネントがJSPページのネストされたタグとして表され、宣言的なバインディングがXMLページ定義ファイルで取得されるため、アプリケーション固有のコードを記述する2つのレイヤーは、コントローラ・レイヤーおよびビジネス・サービス・レイヤーとなります。
エンド・ユーザーがブラウザでJSF UIコンポーネントと対話すると、処理可能なイベントが発生します。たとえば、ユーザーが次のように操作したとします。
ボタンやハイパーリンクをクリックする
ドロップダウン・リストの選択を変更する
ツリー表示のレベルを開くまたは閉じる
これらのUIイベントが発生したときにトリガーされるように、このページのJSFバッキングBean内にイベント処理コードを記述できます。これらのイベント・ハンドラは次のとおりです。
例1-1 バッキングBeanでのボタン・クリック・イベントの処理
public String saveButton_onClick() { // Add event code here... if (userRequiresMoreDetailsPage()) { return "GotoMoreDetailsPage"; else { return "BackToBrowsePage"; } }
例1-2 バッキングBeanでのドロップダウン・リストからの値変更イベントの処理
public void roleList_onListChanged(ValueChangeEvent event) { // Add event code here... }
例1-3 バッキングBeanでのツリー・コントロールを開くまたは閉じるイベントの処理
public void mgmtChainTree_onExpandCollapse(DisclosureEvent event) { // Add event code here... }
ヒント: これらの3つのJSFイベント処理メソッドは、Oracle Forms内のUI関連トリガー、WHEN-BUTTON-PRESSED 、WHEN-LIST-CHANGED およびWHEN-TREE-NODE-EXPANDED にそれぞれ類似しています。 |
これらのメソッド内に追加したコードは、ユーザーが関連するUIコンポーネントと対話すると、JSFランタイムにより自動的にトリガーされ、イベントを処理します。これらは通常、表示/非表示、色の変更など、ページ上のUIコンポーネントを操作するコード、あるいは条件ページ・ナビゲーション・ロジックを実行するコードを含みます。一部のロジックで、ブラウザ・コンポーネント内のみで処理を実行する場合、サーバー側のJSFイベント処理コードに加え、クライアント側でJavaScriptをUIコンポーネントと関連付けられます。
ユーザーがUI内でデータ処理を行う際、ADFモデル・レイヤーではデータ・コントロール内の対応するデータ・コレクションの変更が管理されます。たとえば、このガイドで説明するWebベースの顧客サービス・ポータル・アプリケーションにおいて、システム内のロールが異なる複数のエンド・ユーザーが次の操作を行ったとします。
問題解決のためのサポートを依頼するための、新しいサービス・リクエストの作成
新規技術者に割り当てるためのサービス・リクエストの更新
サービス・リクエスト削除の試行
これらのイベントに対し、ビジネス要件として次を満たす必要があります。
サービス・リクエストのリクエスト日付を、10分単位で四捨五入した現在の時間にデフォルト設定
サービス・リクエストを最初にデータベースに保存するときに、空き状況と専門分野に応じて、適切な技術者を割当て
技術者割当てを評価し、その技術者が現在のリクエストに適した専門性を有していることを確認
マネージャのみがサービス・リクエストを削除可能
どのビュー・オブジェクトにエンド・ユーザーのアクションが影響するかにかかわらず、SERVICE_REQUESTS
表のデータと関連する場合、セントラルServiceRequest
エンティティ・オブジェクトによってこれらの変更の確認および保存が処理されます。このエンティティ・オブジェクトのカスタムJavaクラスで記述するイベント処理コードは、適切なタイミングでトリガーされます。これらのイベント・ハンドラは次のようになります。
例1-4 エンティティ・オブジェクト内の作成イベントの処理
protected void create(AttributeList attrs) { // First perform the default "built-in" functionality super.create(attrs); // Add custom creation-time defaulting logic here... // Default the request date to the current date setRequestDate(currentTimeRoundedToNearestTenMinutes()); }
例1-5 エンティティ・オブジェクト内のINSERT DMLイベントの処理
protected void prepareForDML(int operation, TransactionEvent event) { // First perform the default "built-in" functionality super.prepareForDML(operation, event); // If we're doing an INSERT, then default the technican id if (operation == DML_INSERT) { // Auto-assign the new service request setAssignedTo(determineDefaultTechnicianId()); } }
例1-6 AssignedToの属性検証イベントの処理
public boolean validateAssignedTo(Number newTechnicianId) { // Add custom validation code here for AssignedTo attribute // return true if valid, and false if not. return doesTechnicianHaveAppropriateExpertise(newTechnicianId); }
例1-7 エンティティ・オブジェクト内の削除イベントの処理
public void remove() { // Add custom remove-time logic here... if (isUserAllowedToDeleteRequest() == false) { throw new JboException("You aren't allowed to remove a service request."); } super.remove(); }
ヒント: これら4つのイベント処理メソッドは、Oracle Forms内のデータ関連トリガーであるWHEN-CREATE-RECORD 、PRE-INSERT 、WHEN-VALIDATE-ITEM およびWHEN-REMOVE-RECORD にそれぞれ類似しています。 |
コードのモジュール化とカプセル化を保証するため、currentTimeRoundedToNearestTenMinutes()
、determineDefaultTechnicianId()
、doesTechnicianHaveAppropriateExpertise()
、isUserAllowedToDeleteRequest()
などのサンプル・イベント・ハンドラによりコールされるヘルパー機能が、同じエンティティ・オブジェクト・クラス内のプライベート・メソッドとして記述されます。
すべてのOracle ADFはそれ自体がJavaに実装されているため、フレームワークの基本機能を拡張したり、組織のニーズを満たすようデフォルトの動作をグローバルに変更できます。つまり、機能拡張のリクエストがOracleに実装されるのを待つのではなく、適切なベースADFクラスを拡張するクラスに自分で実装できます。
前述の例で、10分単位に四捨五入した現在の時間へのDate
属性のデフォルト設定について考えてみます。create()
というイベント・ハンドラ・メソッドは、開発時にこの機能を必要とする最初のエンティティ・オブジェクトが発生した際に記述するメソッドです。ただし、アプリケーション内で、他の多くのエンティティ・オブジェクトでもこの機能が必要であると判明した場合、エンティティ・オブジェクト・ベース・クラスにこの機能をグローバルに追加できます。例1-8は、ベースADFエンティティ・オブジェクト・クラス(EntityImpl
)を拡張するカスタムOurCompanyEntityImpl
クラスを表し、このクラスは同じcreate()
イベント処理メソッドより優先されますが、この場合はグローバルに優先されます。
デフォルトの機能を実行するsuper.create()
メソッドをコールした後、このコードでは次の手順を実行します。
このエンティティ行に対するすべての属性定義をループします。
この属性のタイプがDate
であり、開発者がカスタム・プロパティTenMinuteDate
を設定すると、属性値はデフォルトで10分単位に四捨五入されるようになります。
例1-8 独自の新規機能によるOracle ADFエンティティ・オブジェクトの拡張
package com.yourcompany.fwkext; public class OurCompanyEntityImpl extends EntityImpl { protected void create(AttributeList attrs) { super.create(attrs); // First perform the default "built-in" functionality // 1. Then loop over all attribute definitions for this entity row for (AttributeDef attr : getEntityDef().getAttributeDefs()) { // 2. If attr is a Date and "TenMinuteDate" custom property is set if (attr.getJavaType().equals(Date.class) && attr.getProperty("TenMinuteDate") != null) { // 3. Default attr value to current time rounded to nearest 10 min setAttribute(attr.getIndex(),currentTimeRoundedToNearestTenMinutes()); } } } }
これはビジネス・サービス・レイヤーにおける例ですが、同様のグローバルなフレームワークのカスタマイズは、Oracle ADFアーキテクチャのどのレイヤーでも理論的に実行できます。実際は、ほとんどのOracle ADFの顧客がそれぞれのベースADFクラスを拡張するクラス・レイヤーを自分で作成し、ADFのデフォルトのクラス名ではなく、カスタマイズしたフレームワーク・ベース・クラスを使用するようOracle JDeveloperを構成しています。1回設定すると、「設定は最初のみ」というJDeveloperのポリシーにより、すべてのOracle ADFエディタに適用されます。最初にフレームワークを拡張する必要性がない場合でも、フレームワーク拡張クラスのレイヤーを設定しておくと、いつでもこれらのクラスにコードを追加できます。たとえば、発見した不具合の解消、または新しいフレームワーク機能や追加フレームワーク機能の実装を、既存のアプリケーションすべてを見直すことなく実行できます。
注意: サポート契約を締結しているお客様については、Oracle ADFに関する完全なソースをOracle Worldwide Supportから入手可能です。フレームワークの完全なソース・コードは、問題の診断、およびベース・フレームワーク機能のニーズに応じた正しい拡張を支援するための重要なツールです。 |
ADFには、開発の生産性を大幅に向上させる追加機能があります。これらの機能は次のとおりです。
JDeveloperのStudio Editionには、Oracle ADFおよびJavaServer Facesを使用したエンタープライズ・ソリューションの開発を容易にする、次の機能がすべて含まれます。
ビジネス・サービス開発の機能
ビジネス・コンポーネント・ウィザードおよびエディタ
生産性の高いウィザードとエディタを使用し、ビジネス・サービスを構成するコンポーネントを迅速に作成および変更します。既存の表からコンポーネントのリバース・エンジニアリングを行います。基礎となるデータベース・スキーマに対する、ユーザーまたはDBAによる変更と、コンポーネントを同期化させます。
ビジネス・コンポーネント・ブラウザ
ユーザー・インタフェースを構築する前に、ビジネス・サービスのデータ・モデルを対話的にテストします。ビジネス・コンポーネント・ブラウザでは、ユーザー・インタフェースを実行することなくデータ・モデルを実行しながら、アプリケーションのどこで問題が発生したかを特定できます。
ビジネス・コンポーネント・ダイアグラマ
UMLダイアグラムを使用し、ビジネス・サービスおよびビジネス・ドメイン・レイヤー・コンポーネントを視覚化、作成および変更します。参照用、またはシステムのドキュメントに含めるため、ダイアグラムを様々なフォーマットで出力します。
宣言的なデータ・バインディングの機能
データ・コントロール・ウィザード
ADFアプリケーション・モジュールは、データ・コントロールとして自動的に公開されます。Webサービス、URLからのXMLデータまたはCSVデータ、JavaBeans、EJBセッションBeanでの作業が必要な場合、便利なデータ・コントロール・ウィザードで順に進められます。
データ・コントロール・パレット
すべてのアプリケーション・モジュールおよびその他のビジネス・サービスが視覚化されます。このパレットのデータ・コレクション、プロパティ、メソッド、メソッド・パラメータおよびメソッド結果をドラッグして、適切にバインドされたユーザー・インタフェース要素を作成します。読取り専用または編集可能なフォーム、表、マスター/ディテール表示、および個別にバインドされたUIコンポーネント(単一選択リストと複数選択リスト、チェック・ボックス、ラジオ・グループなど)を簡単に作成できます。検索フォーム、データ作成ページ、およびメソッド起動用のパラメータ・フォームを作成することも簡単です。他のチームのページ設計者と共同で作業している場合は、ページ内の既存のコンポーネントに属性をドロップすることで、事後的にそれらの属性をバインドできます。UIコンポーネントが作成されるのみでなく、強力なUNDO機能をサポートするページ定義ファイルに適切な宣言的バインディングが自動的に作成および構成されるため、バインディングとUIコンポーネントの同期を維持しながらユーザー・インタフェースを変更できます。
ページ定義エディタ
構造ウィンドウにページ定義メタデータが一覧表示されます。これにより、適切なエディタまたはプロパティ・インスペクタを使用して宣言的なバインディング・プロパティを構成できます。目的の構造にバインディングを挿入することで、新規バインディングを作成できます。構造および有効な値に関してコンテキストに依存するXMLスキーマ駆動型の支援機能を使用して、バインディング・メタデータを編集できます。
サービス・メソッド起動
EL式に基づいたパラメータを渡すことにより、ビジネス・サービス・メソッドの起動を構成します。リンクやボタンなどのコマンド・コンポーネントがクリックされたときにメソッドを起動するか、JSFライフサイクルの適切なフェーズにメソッドが自動的に起動されるようページ定義を構成できます。
ページ・ライフサイクル制御
特定のJSFライフサイクル・フェーズ中にデータをリフレッシュするようイテレータ・バインディングを宣言的に構成し、そのリフレッシュの発生するタイミングをより詳細に制御するための条件EL式を(オプションで)指定できます。自動メソッド起動によるメソッドの実行タイミングの指定にも同じ制御方法を使用できます。
エラー・レポートの一元管理
ページごとにではなく、単一の場所でアプリケーションのエラー・レポート方法をカスタマイズできます。
ビジュアルなWebページ設計機能
ビジュアルなWebページ・デザイナ
ビジュアルなWebページ・デザイナを使用し、Webページをビジュアルに設計します。デザイナはデータ・コントロール・パレットと統合され、ユーザー・インタフェースのドラッグ・アンド・ドロップによる作成、および初期ページ・モデルに適用する後続のデータ・バインディングを含めたUIの最初のページ設計の両方の機能をサポートします。ビジュアルなエディタでは、JavaServer Facesと従来のJSP開発の両方がサポートされます。
ページ・フロー・ダイアグラマ
ビジュアルなWebページ・フロー・ダイアグラムを使用し、Webページ・ナビゲーションを設計します。ダイアグラマでは、JavaServer FacesとApache Strutsの両方がサポートされます。
Swingを使用したデスクトップ・フィデリティのUIのためのビジュアル設計機能
ビジュアル・フォーム・デザイナ
JDeveloperでは、Java自体の一部として提供される標準Swingコントロールを使用するフォームおよびパネルによるデスクトップ・フィデリティのユーザー・インタフェースの開発が完全にサポートされます。Oracle ADFの宣言的なデータ・バインディングおよびADF Business Components機能のすべてによって、クライアント/サーバー型または3層のSwingアプリケーションを容易に構築できます。
注意: 開発者ガイドのこのエディションでは、JSFを使用したWeb開発に重点が置かれています。Oracle ADFおよびADF Swingを使用したデスクトップ・フィデリティのユーザー・インタフェースの開発については、その点を専門的に扱う別の開発者ガイドで詳しく説明しています。 |
JSFの参照実装では、基本のHTML入力フィールド・タイプと単純な表の表示機能が組み込まれたUIコンポーネントの最小限のセットが提供されますが、これらは実際のアプリケーションを構築するには不十分です。ADF Modelレイヤーには、Oracle ADF Facesライブラリの高性能なUIコンポーネントと連携して、エンド・ユーザーに必要とされるリッチな機能を迅速に導入できる次のようないくつかの機能が実装されています。
対話型UIの宣言的な部分ページ更新
ページ内のすべてのUIコンポーネントに対し、ブラウザ・ページ全体を更新するのではなく、どのコンポーネントで新規データによる更新をトリガーするかを宣言的に指示できます。このようなより強力な対話型のWeb技術は、Web 2.0またはAjaxスタイルのページと呼ばれます。
高機能な表モデル
表は、エンタープライズ・アプリケーションのUIにおける重要な要素です。JSFのデフォルトでは、表のページ移動やソート処理はサポートされません。ADF Facesの表とADF Modelの表バインディングを組み合せると、任意の列に基づいてソートできるページ移動可能な表、編集可能な表または読取り専用の表を表示できます。
キーに基づく現在の選択の追跡
Webユーザー・インタフェースにおける最も一般的なタスクの1つは、情報のリストを表示して、ユーザーがそのリストをスクロールできるように、またはリスト内の1つ以上のエントリを選択できるようにすることです。ADF Modelのイテレータ・バインディングにより、効果的な方法で簡単に選択行を追跡できます。この方法では、データがリフレッシュされると変更される可能性のある位置インジケータのかわりに、行キーが使用されます。この行キーをADF Facesの表および複数選択コンポーネントと組み合せることで、単一または複数の選択を操作することや、マスター/ディテール情報をナビゲートする画面を作成することが容易になります。
宣言的な階層ツリー・コンポーネントおよびグリッド
エンタープライズ・アプリケーションの大部分の情報は階層的ですが、JSFのデフォルトでは階層的なデータの表示や操作がサポートされません。ADF Modelレイヤーでは、宣言的に構成してADF Facesツリーまたは階層的なグリッド・コンポーネントと組み合せて使用できる階層バインディングが提供されるため、最も直感的な形式でユーザーにデータを表示することが可能な対話型のユーザー・インタフェースを実装できます。
共通のUIコンポーネント用の柔軟性に富んだモデル
チェック・ボックスなどの単純なコンポーネントにも、改良の余地があります。JSFのデフォルトでは、チェック・ボックスのバインディングがブール型プロパティに制限されます。ADF Modelでは、データが提供可能なtrue値または有効値の任意の組合せに対してチェック・ボックスをマップできます。ADF Modelが威力を発揮するもう1つの領域に、リスト・コンポーネントがあります。リストの有効な値は、データ・コントロール内の任意のデータ・コレクションから取得できます。また、必要に応じて、リストを更新することや行ナビゲーションに使用することが可能です。ADF Modelのリスト・バインディングでは、変換可能な「<選択なし>」をオプションでリストに追加することにより、NULL値も簡単に処理できます。
Oracle ADFでは、複数のアプリケーション機能の再使用性を向上するために、レイヤー化されたメタデータを、ADF Business Componentsと関連付けることができます。また、他のデータ・コントロール・タイプについては、データ・コレクションを表すデータ・コントロール構造と関連付けられます。これにより、情報を表すすべてのページでの再使用が可能になります。この機能の例は次のとおりです。
容易にローカライズ可能なプロンプト、ツールチップおよびフォーマット・マスク
JSFでは、リソース・バンドルで翻訳可能な文字列を参照する単純なメカニズムがサポートされますが、文字列の用途は考慮されず、特定のビジネス・ドメイン・オブジェクトに文字列を関連付ける方法も提供されていません。ADF Business Componentsでは、エンティティ・オブジェクトまたはビュー・オブジェクト・コンポーネントの属性と関連付けられる翻訳可能なプロンプト、ツールチップおよびフォーマット・マスクをJSFページで参照することにより、この問題を改善しています。このため、このデータが含まれるすべてのページで、ロケールに依存した一貫性のある方法でデータを表示できます。
宣言的な検証
JSFでは、UIコンポーネントと関連付けられるバリデータがサポートされます。これにより、データ値に対する基本的な構文チェックの実行が可能になります。ただし、JSFにはエンタープライズにおけるデータベース中心の検証を容易にするメカニズムはありません。また、同一のビジネス・ドメイン・データを、使用されているすべての画面において一貫性のある方法で簡単に検証する方法もありません。ADF Business Componentsでは、エンティティ・オブジェクトで拡張可能な一連のバリデータ・オブジェクトを関連付けたり、1.3.4項「単純なイベント・ドリブン・アプローチによる、カスタム・ロジックの追加」で示すように、イベント・ハンドラに記述する検証コードで補完することによって、この問題を改善します。これにより、オブジェクト・データの入力や変更にユーザーがどのページを使用するかにかかわらず、一貫した検証を行うことができます。
宣言的なセキュリティ
JSFには、認可情報をUIコンポーネントと統合するためのメカニズムはありません。ADF Business Componentsでは、ユーザーまたはロール認可情報をエンティティ・オブジェクトの各属性に関連付けることができるため、参照する権限のあるユーザーにのみJSFページの情報を表示できます。
このガイドの後半で説明するように、Oracle JDeveloper 10gおよびOracle ADFでは、宣言的な開発技術を最大限に活用し、豊富な機能のデータベース中心J2EEアプリケーションを構築するための、生産性の高いビジュアルな環境を提供します。しかし、Oracle Designerのように、高レベルなアプリケーション構造定義に基づく完全なユーザー・インタフェース生成を提供するツールの経験がある場合、J2EE開発においても同様の機能が求められる場合があります。その場合は、Oracle JHeadstart 10g Application Generatorが適しています。これはOracle ADFの組込み機能と並ぶJDeveloperの拡張機能であり、アプリケーション・モジュールに対して完全なWeb階層の生成を実現します。ADFビジネス・サービスのために設計したデータ・モデルに基づき、JHeadstartによりJDeveloper環境に追加された統合エディタを使用して、より高レベルのアプリケーション構造の定義を繰り返して定義できます。また、生成されたWebユーザー・インタフェースのビュー・オブジェクト情報の機能と組織を制御します。チェック・ボックスのチェック、およびドロップダウン・リストからの様々なオプションの選択によって、検索するリージョン、検証を含めた値リスト(LOV)、シャトル・コントロール、ネストされた表およびその他の機能などの様々な形式を含めたページの論理階層を表すことができます。このような宣言的な選択では、Oracle FormsやDesignerのユーザーが熟知している用語を使用し、Web開発を容易にします。アプリケーション構造定義に基づき、このガイドに示すベスト・プラクティスを自動的に実装する完全なWebアプリケーションを生成します。また、Oracle ADFおよびJSFが提供する最も高度な機能も容易に活用できます。
JHeadstart Application Generatorを実行する場合、コードを生成するのではなく、ADFベースのWebアプリケーションのすべての宣言的なビューおよびコントロール・レイヤーのアーティファクトを作成(または再生成)します。これらのアーティファクトは、ADFモデル・レイヤーを使用し、ビジネス・サービスとしてADFアプリケーション・モジュールと連携します。生成されたファイルは、JDeveloperに組み込まれたビジュアル・エディタを使用して生成するファイルと同様のものです。JHeadstartにおける相違点は、高レベルの定義に基づいてファイルをバルク・ベースで作成し、生成されたページがエンド・ユーザーの要件に可能なかぎりマッチするまで繰り返し修正できるということです。生成されるファイルは次のとおりです。
データ・バインドされたADF Faces UIコンポーネントを含むJSFページ
各ページのデータ・バインディングを表すADFモデル・ページ定義XMLファイル
ページ・フローを処理するJSFナビゲーション・ルール
ローカライズ可能なUI文字列を含むリソース・ファイル
Webユーザー・インタフェースを最大数まで生成した後は、JDeveloperの生産性の高い環境で結果を調整し、特に注意が必要なモデルとなるページに集中することができます。生成したページを変更した後は、Application Generatorのページの実行時に再生成されないように設定を調整できます。また、生成されたページとカスタム設計のページが同一のADF Faces UIコンポーネントを利用しているため、すべてのページに同一のルック・アンド・フィールが自動的に継承されます。価格、サポート、追加サービスの詳細を含め、JHeadstartの評価のための十分な機能のトライアルの入手方法については、http://otn.oracle.com/consulting/9iServices/JHeadstart.html
を参照してください。