ヘッダーをスキップ
Oracle Fusion Middleware Oracle WebCenter開発者用チュートリアル
11gリリース1(11.1.1)
B55930-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

5 ポートレットの構築とアプリケーションでのポートレットのワイヤリング

このレッスンでは、2種類のポートレットの構築方法を学習します。Oracle JDeveloperのウィザードを使用して構築する規格に基づいたJSR 168 Javaポートレットと、実行時に段階的なウィザードを使用して構築するOmniPortletです。

ポートレットの作成後、それらをページに追加し、2つのポートレットを接続します。このレッスンの終わりまでに、規格に基づいたJSR 168 JavaポートレットとPDK-Javaポートレット(OmniPortlet)の構築とテストに必要なものをうまく処理できるようになります。2つのポートレットをワイヤリングすることもできます。その結果、一方のポートレットのリンクをクリックすると、もう一方のポートレットのコンテンツが動的に更新されます。

図5-1は、このレッスンの最後にページがどのように表示されるかを示しています。

図5-1 このレッスンの終了時のMyPage.jspx

図5-1の説明が続きます
「図5-1 このレッスンの終了時のMyPage.jspx」の説明

概要

このレッスンの手順は次のとおりです。

これらのポートレットはどちらも、第2章「チュートリアルの準備」でインストールしたチュートリアル・スキーマを使用します。また、データベース接続を必要とします。データベース接続は、第4章「アプリケーションへのWebCenter Web 2.0サービスの追加」でタグ・サービスに追加したときに作成しました。第4章の手順を完了していない場合は、ポートレットを構築する前に第4章の「手順5: タグ・サービス用のWebCenterスキーマへのデータベース接続の作成」の手順に従う必要があります。

手順1: 規格に基づいたJSR 168 Javaポートレットの作成

Oracle WebCenter Frameworkを使用すれば、現在作成しているようなポータルまたはアプリケーションで使用できる規格に基づいたポートレットを迅速かつ簡単に構築できます。


注意:

このポートレットを構築する手順は、使用している命名規則に依存するため、注意深く手順に従ってください。指定した名前を使用しないと、同じ結果にならない可能性があります。

この手順では、「ポートレット・プロデューサ」テンプレートに基づくアプリケーションを作成してから、規格に基づいたポートレットを構築します。その後、そのポートレットをチュートリアル・アプリケーションで消費します。図5-2は、MyTutorialApplicationでの実行時のポートレットを示しています。

図5-2 MyTutorialApplicationでの実行時の規格に基づいたポートレット

図5-2の説明が続きます
「図5-2 MyTutorialApplicationでの実行時の規格に基づいたポートレット」の説明

  1. Oracle JDeveloperで、「ポートレット・プロデューサ・アプリケーション」テンプレート(図5-3)に基づいて新規アプリケーションを作成し、「OK」をクリックします。これには、「ファイル」「新規」を選択し、新規ギャラリで「アプリケーション」「ポートレット・プロデューサ・アプリケーション」を選択します。

    図5-3 新しいポートレット・プロデューサ・アプリケーションの作成

    図5-3の説明が続きます
    「図5-3 新しいポートレット・プロデューサ・アプリケーションの作成」の説明

  2. ポートレット・プロデューサ・アプリケーションの作成ウィザードの「アプリケーション名」フィールドに、MyTutorialPortletと入力します。

  3. デフォルトでは、「ディレクトリ」フィールドには、アプリケーションを置くディレクトリが表示されます(図5-4)。ディレクトリの場所は希望の場所に変更できますが、このチュートリアルではそのままにしてください。

    図5-4 ポートレット・プロデューサ・アプリケーションの作成 - ステップ1

    図5-4の説明が続きます
    「図5-4 ポートレット・プロデューサ・アプリケーションの作成 - ステップ1」の説明

  4. 「次へ」をクリックします。

  5. ウィザードの「プロジェクト名」ページ(図5-5)で、デフォルト名の「Portlets」をそのままにし、「次へ」をクリックします。

    図5-5 ポートレット・プロデューサ・アプリケーションの作成 - ステップ2

    図5-5の説明が続きます
    「図5-5 ポートレット・プロデューサ・アプリケーションの作成 - ステップ2」の説明

  6. ウィザードの最後のページでは、Java設定を構成できます。ポートレット・プロデューサ・アプリケーションに含まれているデフォルト・パッケージは「portlet」です(図5-6)。このチュートリアルでは、デフォルトのオプションをそのままにして、「終了」をクリックします。

    図5-6 ポートレット・プロデューサ・アプリケーションの作成 - ステップ3

    図5-6の説明が続きます
    「図5-6 ポートレット・プロデューサ・アプリケーションの作成 - ステップ3」の説明

  7. アプリケーション・ナビゲータで、新しい「MyTutorialPortlet」アプリケーションの下の「ポートレット」を右クリックし、「新規」を選択します(図5-7)。

    図5-7 メニューからの「新規」の選択

    図5-7の説明が続きます
    「図5-7 メニューからの「新規」の選択」の説明

  8. 「現在のプロジェクト・テクノロジ」タブをクリックします。

  9. 図5-8に示すように、「カテゴリ」リストで、「Web層」カテゴリを開き、「ポートレット」をクリックします。

    図5-8 新しいポートレット・プロデューサ・アプリケーションの作成

    ポートレットの新規ギャラリ
    「図5-8 新しいポートレット・プロデューサ・アプリケーションの作成」の説明

    作成できるポートレットは、次の2種類です。

    • Oracle PDK-Javaポートレット。PDK-Javaポートレットは、WebCenterアプリケーション、Oracle Portal、またはその他何種類かのOracle固有のソリューションで消費できます。Oracle PDK-Javaポートレットは、PDKにより提供されるAPIを使用して構築します。「手順7: 事前構成済ポートレット・プロデューサの登録」で登録するOmniPortletプロデューサは、Oracle PDK-Javaポートレットの1種です。

    • 規格に基づいたJSR 168 Javaポートレット。Javaポートレットは、ポートレット規格をサポートするあらゆるベンダーのポータルで消費できます。このチュートリアルでは、規格に基づいたJSR 168 Javaポートレットを構築します。

  10. 「規格に基づいたJavaポートレット(JSR 168)」を選択し、「OK」をクリックします。

    JSR 168 Javaポートレット・ウィザードが表示されます。ここではポートレット用のスケルトンを生成します。後から独自のロジックをポートレットに追加します。どのように行われるかを見てみましょう。

  11. 「一般ポートレット情報」ページの「名前」フィールドと「クラス」フィールドに、Productsと入力します。


    注意:

    このポートレットを構築する手順は、使用している命名規則に依存するため、注意深く手順に従ってください。指定した名前を使用しないと、同じ結果にならない可能性があります。

  12. 「Oracle WSRP V2拡張機能を使用してポートレット間通信を可能にします」を選択します。このオプションを選択することにより、ポートレットでOracle WSRP 2.0拡張機能がサポートされるようになり、WSRP 2.0機能(ナビゲーション・パラメータなど)のために使用されるoracle-portlet.xmlファイルが生成されます。これらのパラメータは後から、OmniPortletとこのポートレットが相互に通信できるようにするときに必要になります。図5-9は、「一般ポートレット情報」ページがこの時点でどのように表示されるかを示しています。

    図5-9 JSR 168 Javaポートレットの作成 - 一般ポートレット情報

    Webアプリケーションの選択
    「図5-9 JSR 168 Javaポートレットの作成 - 一般ポートレット情報」の説明

  13. 「次へ」をクリックします。

  14. 「追加ポートレット情報」ページは、デフォルト値のままでかまいません。あるいは、データベースの製品についていくつかの詳細を表示することがわかっているので、ポートレットを使用する人にポートレットに含まれているものがわかるように、表示名を変更することもできます。表5-1に従って、このページ上のフィールドを更新します。図5-10は、更新した結果の「追加ポートレット情報」ページを示しています。

    表5-1 名前と属性の値

    プロパティ

    表示名

    JDeveloperのコンポーネント・パレットに表示される名前。クラス名としてProductsを入力したため、このフィールドには自動的にその名前が移入されています。

    ポートレット・タイトル

    ポートレット・ヘッダーに表示されるタイトル。クラス名としてProductsを入力したため、このフィールドには自動的にその名前が移入されています。

    短いタイトル

    モバイル機器のポートレット・ヘッダーに表示されるタイトル。

    デフォルト名のProductsのままにします。

    説明

    ポートレットの説明。このフィールドは、ポートレットをOracle Portal 10g環境で使用する場合のみ該当します。

    This is a JSR 168 portlet that displays the products.などの説明を入力します。

    キーワード

    「キーワード」には、ユーザーが検索中にページ、項目またはポートレットを見つけられるように、これらの追加情報が表示されます。キーワードはOracle WebCenter SuiteでもOracle Portal 10gでもサポートされていませんが、他のベンダーではサポートされます(デプロイメント環境を他のベンダーから取得した場合)。

    sample, Tutorial, productsと入力します。


    図5-10 JSR 168 Javaポートレットの作成 - 追加ポートレット情報

    「一般ポートレット・プロパティ」ページ
    「図5-10 JSR 168 Javaポートレットの作成 - 追加ポートレット情報」の説明

  15. 「次へ」をクリックします。

  16. 「コンテンツ・タイプとポートレット・モード」ページで、text/htmlがデフォルトのコンテンツ・タイプになっていることに注意してください。これは、ポートレットがHTMLでエンコードされたテキストをサポートするということです。text/htmlのデフォルトのポートレット・モードとして「view」と「edit」がリストされます。「view」はポートレット・モードとして常に使用可能です。「edit」モードを選択すると、ユーザーがポートレット・インスタンスをパーソナライズできるページが提供されます。

    図5-11のような「実装メソッド」領域に注意してください。これらのコントロールによって、ポートレットにJSPを生成するかどうか、あるいは独自のカスタムJSPコードを使用するかどうかを指定できます。

    図5-11 JSR 168ポートレットの作成 - コンテンツ・タイプとポートレット・モード

    図5-11の説明が続きます
    「図5-11 JSR 168ポートレットの作成 - コンテンツ・タイプとポートレット・モード」の説明

    このレッスンでは、デフォルトの選択をそのままにすることで、JSPを生成するようにJDeveloperに指示します。

  17. 「次へ」をクリックします。

    ここで「終了」をクリックして基本のポートレットを作成することもできますが、続行して、このポートレットには他のオプションや設定を選択します。

  18. 「カスタマイズ・プリファレンスの指定」ページで、デフォルト値のままにして「次へ」 をクリックします(図5-12)。

    ここではこのページについて何も変更しませんが、将来的に、このページを使用して、ポートレットの他のカスタマイズ・オプションを追加できます。たとえば、ポートレットがZip Codeパラメータを受け入れる場合、ユーザーがZip Codeラベルをパーソナライズできるようにします。この場合は、「追加」ボタンを使用して、Zip Codeラベルをパーソナライズ可能にします。

    図5-12 JSR 168 Javaポートレットの作成 - カスタマイズ・プリファレンス

    図5-12の説明が続きます
    「図5-12 JSR 168 Javaポートレットの作成 - カスタマイズ・プリファレンス」の説明

  19. 「セキュリティ・ロール」ページで、「次へ」をクリックします(図5-13)。「セキュリティ・ロール」ページを使用して、このポートレットに対して設定するアプリケーションのセキュリティ・ロールを指定します。

    図5-13 JSR 168 Javaポートレットの作成 - セキュリティ・ロール

    図5-13の説明が続きます
    「図5-13 JSR 168 Javaポートレットの作成 - セキュリティ・ロール」の説明

  20. 「キャッシュ・オプション」ページで、「次へ」をクリックします(図5-14)。

    このページの設定によって、ポートレットの有効期限に基づいたキャッシュを定義できます。ここではキャッシュ条件は必要ありません。

    図5-14 JSR 168 Javaポートレットの作成 - キャッシュ・オプション

    図5-14の説明が続きます
    「図5-14 JSR 168 Javaポートレットの作成 - キャッシュ・オプション」の説明

  21. 「初期化パラメータ」ページで、「次へ」をクリックします(図5-15)。このポートレットでは、初期化パラメータは必要ありません。

    図5-15 JSR 168 Javaポートレットの作成 - 初期化パラメータ

    図5-15の説明が続きます
    「図5-15 JSR 168 Javaポートレットの作成 - 初期化パラメータ」の説明

  22. 「ポートレット・ナビゲーション・パラメータ」ページで、product IDに基づいてナビゲーション・パラメータを作成します。

    ナビゲーション・パラメータは、WSRP 2.0の機能です。このページでは規格に基づいたポートレットで消費される外部パラメータを指定でき、ページは、ウィザードの最初のページで「Oracle WSRP V2拡張機能を使用してポートレット間通信を可能にします」オプションを選択した場合にのみ表示されます。

    「追加」をクリックします。

  23. 値をダブルクリックして、各値を次のように更新します。

    • 名前: productId

    • ラベル: Product ID

    • ヒント: Enter Product ID

    これらのナビゲーション・パラメータは後から「手順10: 規格に基づいたポートレットとOmniPortletのワイヤリング」で使用します。図5-16は、更新された「ポートレット・ナビゲーション・パラメータ」ページを示しています。

    図5-16 JSR 168 Javaポートレットの作成 - ポートレット・ナビゲーション・パラメータ

    図5-16の説明が続きます
    「図5-16 JSR 168 Javaポートレットの作成 - ポートレット・ナビゲーション・パラメータ」の説明

  24. 「次へ」をクリックします。

  25. ウィザードの最後のページ(ステップ9/9)で、「終了」をクリックします。

    「終了」をクリックした後、アプリケーション・ナビゲータの「ポートレット」 プロジェクトの下に、新しく生成されたいくつかのファイルが表示されます。展開されたナビゲータは、図5-17のようになります。

    図5-17 新しいポートレットに対して生成されたファイル

    新規生成されたファイル
    「図5-17 新しいポートレットに対して生成されたファイル」の説明

    • 「アプリケーション・ソース」の「portlet」「portlet.resource」の下に、次の2つのJavaクラスがあることに注目してください。

      • 「Products.java」は、ポートレット・コンテナにより起動されます。これには、ポートレット標準で必要なすべてのメソッドが含まれます。

      • 「ProductsBundle.java」には、ポートレットの変換文字列がすべて含まれています。

    • 「Webコンテンツ」「Products」「html」の下には次のものがあります。

      • edit.jsp: これには、「パーソナライズ」ダイアログ・ボックスへの移入に必要な情報が含まれます。

      • view.jsp: これは、ポートレットが他のコンポーネントとページを共有しているときに起動されます。

    • 「Webコンテンツ」の下の「WEB-INF」に、次の3つのデプロイメント・ディスクリプタがあります。

      • oracle-portlet.xml: これには、インポート/エクスポートおよびポートレット間通信用のOracle拡張機能をサポートするための情報が含まれます。このファイルは、ウィザードのステップ1で「Oracle拡張機能を使用してWSRP V2のポートレット間通信を可能にします。」を選択したために表示されます。

      • portlet.xml: これにより、すべてのポートレット・リソース(JSR 168 Javaポートレット・ウィザードで入力した情報)が指定されます。

      • web.xml: これにより、Webアプリケーション・リソースが指定されます。

  26. すべてのファイルを保存します。次の手順で、生成したばかりのすべてのポートレット情報を格納するJavaBeanを作成します。

手順2: 規格に基づいたポートレットの情報を格納するためのJavaBeansの作成

この手順では、規格に基づいたポートレットの情報を格納するJavaBeanを作成します。

  1. アプリケーション・ナビゲータで、「portlet」パッケージを右クリックし、「新規」を選択します。図5-18は、アプリケーション・ナビゲータでの「portlet」パッケージを示しています。

    図5-18 「portlet」パッケージ

    図5-18の説明が続きます
    「図5-18 「portlet」パッケージ」の説明

  2. 新規ギャラリで「すべてのテクノロジ」タブをクリックします。

  3. 「カテゴリ」リストの「General」の下で、「Java」を選択し、「項目」リストから「Bean」を選択してから、「OK」をクリックします(図5-19)。

    図5-19 新規ギャラリでのJavaBeanの選択

    図5-19の説明が続きます
    「図5-19 新規ギャラリでのJavaBeanの選択」の説明

  4. 表示される「Beanの作成」ダイアログ・ボックスに次の情報を入力して新しいJavaBeanを設定します(図5-20)。

    • 名前: ProductDetailsBean

    • パッケージ: portlet

    • 拡張対象: java.lang.Object

    図5-20 ProductDetailsBeanの作成

    図5-20の説明が続きます
    「図5-20 ProductDetailsBeanの作成」の説明

    これでportletパッケージにProductDetailsBeanという新しいBeanが作成されます。

  5. 「OK」をクリックします。新しいJavaBeanが「設計」ウィンドウに表示されます(図5-21)。

    図5-21 「設計」ビューのProductDetails JavaBean

    図5-21の説明が続きます
    「図5-21 「設計」ビューのProductDetails JavaBean」の説明

    図5-22は、「構造」ウィンドウのJavaBeanを示しています。第3章「カスタマイズ可能ページを含むWebCenterアプリケーションの作成」で述べたように、「構造」ウィンドウで押しピンを使用すれば、現在のビューを固定および固定解除できます。「設計」ビューで「ProductDetails Bean」を選択したことを確認し、押しピンを切り替えると、「構造」ウィンドウに「ProductDetails Bean」が表示されます。

    図5-22 「構造」ウィンドウの「ProductDetailsBean」

    図5-22の説明が続きます
    「図5-22 「構造」ウィンドウの「ProductDetailsBean」」の説明

  6. JavaBeanの設定が終わりました。それでは、ポートレットに必要な情報を追加しましょう。「構造」ウィンドウで、「ProductDetailsBean」を右クリックし、ポップアップ・メニューから「新規フィールド」を選択します。

    図5-23 ProductDetails Beanの新規フィールドの作成

    図5-23の説明が続きます
    「図5-23 ProductDetails Beanの新規フィールドの作成」の説明

  7. 「フィールドを作成」ダイアログ・ボックスの「名前」フィールドにproductIdと入力します。この名前は、データベース・スキーマの製品名を表します。

  8. 「タイプ」が「String」に設定されていることを確認します。

  9. 「スコープ」が「private」に設定されていることを確認します(図5-24)。

    図5-24 「フィールドを作成」ダイアログ・ボックス

    図5-24の説明が続きます
    「図5-24 「フィールドを作成」ダイアログ・ボックス」の説明

  10. 「OK」をクリックします。新規フィールドがそのJavaBeanの「設計」ビューに表示されます(図5-25)。

    図5-25 ProductDetailsBeanの新規フィールド

    図5-25の説明が続きます
    「図5-25 ProductDetailsBeanの新規フィールド」の説明

  11. 今度は、ポートレットに表示する他の4つのフィールドを作成します。手順6〜10を実行して、次の名前で5つのフィールドを作成します。

    • productName

    • productPrice

    • imageURL

    • categoryDescription

    • supplierName

    現在、JavaBeanの「設計」ビューには6つのフィールドがあります(図5-26)。

    図5-26 6つのフィールドがあるProductsBean

    図5-26の説明が続きます
    「図5-26 6つのフィールドがあるJavaBean」の説明

  12. JavaBeanのフィールドを設定したので、アクセッサを生成します。

    「構造」ウィンドウで、「ProductDetailsBean」を右クリックし、ポップアップ・メニューから「アクセッサの生成」を選択します。

    「アクセッサの生成」ダイアログ・ボックスが表示されます(図5-27)。

    図5-27 「アクセッサの生成」ダイアログ・ボックス

    図5-27の説明が続きます
    「図5-27 「アクセッサの生成」ダイアログ・ボックス」の説明

  13. 「すべて選択」ボタンをクリックして、このBeanのために作成したすべてのフィールドを選択します(図5-28)。

    図5-28 すべてのフィールドが選択された「アクセッサの生成」ダイアログ・ボックス

    図5-28の説明が続きます
    「図5-28 すべてのフィールドが選択された「アクセッサの生成」ダイアログ・ボックス」の説明

  14. 「OK」をクリックすると、これらのフィールドのアクセッサが生成されます。例5-1に示すようなコードが、Oracle JDeveloperによって生成されます。

    例5-1 ProductDetails JavaBean

    package portlet;
    
    public class ProductDetailsBean {
        private String productId;
        private String productName;
        private String productPrice;
        private String imageURL;
        private String categoryDescription;
        private String supplierName;
    
        public ProductDetailsBean() {
        }
    
    
        public void setProductId(String productId) {
            this.productId = productId;
        }
    
        public void setProductName(String productName) {
            this.productName = productName;
        }
    
        public String getProductName() {
            return productName;
        }
    
        public void setProductPrice(String productPrice) {
            this.productPrice = productPrice;
        }
    
        public String getProductPrice() {
            return productPrice;
        }
    
        public void setImageURL(String imageURL) {
            this.imageURL = imageURL;
        }
    
        public String getImageURL() {
            return imageURL;
        }
    
        public void setCategoryDescription(String categoryDescription) {
            this.categoryDescription = categoryDescription;
        }
    
        public String getCategoryDescription() {
            return categoryDescription;
        }
    
        public void setSupplierName(String supplierName) {
            this.supplierName = supplierName;
        }
    
        public String getSupplierName() {
            return supplierName;
        }
    }
    
  15. ProductsBean.javaというポートレット用のもう1つのJavaBeanを作成します。このBeanは製品リストを表し、ポートレットの実行時に表示されます。

    JavaBeanを作成するには、アプリケーション・ナビゲータで「portlet」パッケージを右クリックし、ポップアップ・メニューから「新規」を選択して「Beanの作成」ダイアログを表示します(図5-29)。

    図5-29 ProductsBeanの作成

    図5-29の説明が続きます
    「図5-29 ProductsBeanの作成」の説明

  16. 「ソース」ビューでProductsBean.javaのコードを例5-2のコードに置き換えます。


    注意:

    このテキストのコードの書式設定が機能しない場合は、C:\TutorialContent\Portlets\ProductsBeanJava.txtファイルを開き、そこからコードをコピーして貼り付けてください。

    例5-2 ProductsBean.javaのコード

    package portlet;
    
    import java.util.ArrayList;
    
    public class ProductsBean {
        public static final String DEFAULT_PRODUCT_ID = "12";
    
        private ArrayList<ProductDetailsBean> products =
            new ArrayList<ProductDetailsBean>();
    
        public ProductsBean() {
            super();
        }
    
        public void addProduct(ProductDetailsBean product) {
            products.add(product);
        }
    
        public ArrayList<ProductDetailsBean> getProducts() {
            return products;
        }
    }
    

    Beanの「ソース」ビューは、図5-30のように表示されます。

    図5-30 ProductsBean.javaのコード

    図5-30の説明が続きます
    「図5-30 ProductsBean.javaのコード」の説明

  17. すべてのファイルを保存します。

次の手順では、JavaBeanと、ポートレットで表示するデータを含むデータベース・スキーマとの接続を設定します。

手順3: 規格に基づいたポートレット用ビジネス・ロジックの作成

データベースのデータにアクセスするためのJavaBeanを作成したら、Javaクラスにポートレット用のビジネス・ロジックを作成します。データベースへの接続が含まれるこのクラスは、接続を確立して、クラス・ファイルのSQL文を使用して情報の問合せを行います。規格に基づいたポートレットを作成するときは、手動でこのクラスを作成する必要があります。

  1. アプリケーション・ナビゲータで、「portlet」パッケージを右クリックし、ポップアップ・メニューから「新規」を選択します。

  2. 新規ギャラリで「Java」をクリックし、「項目」リストから「Javaクラス」を選択します(図5-31)。

    図5-31 新規ギャラリの「Javaクラス」オプションの選択

    図5-31の説明が続きます
    「図5-31 新規ギャラリの「Javaクラス」オプションの選択」の説明

  3. 「OK」をクリックします。

  4. 「Javaクラスの作成」ダイアログ・ボックスの「名前」フィールドに図5-32のようにProductsServiceと入力します。

    図5-32 「Javaクラスの作成」ダイアログ・ボックス

    図5-32の説明が続きます
    「図5-32 「Javaクラスの作成」ダイアログ・ボックス」の説明

  5. このダイアログ・ボックスの残りのデフォルト値は、次の手順で上書きするため、そのままにしておき、「OK」をクリックします。

  6. 表示されるProductsService.javaファイルで、自動生成されたコードをすべて、例5-3に示すコードに置き換えます。コードでは、サンプル・スキーマをインストールしたデータベースをローカルと仮定します。コードで、強調されているJDBC接続(jdbc:oracle:thin:@localhost:1521:xe)を、データベースおよびチュートリアル(fod)スキーマを指すように変更します。


    注意:

    このテキストのコードの書式設定が機能しない場合は、C:\TutorialContent\Portlets\ProductsServiceJava.txtファイルを開き、そこからコードをコピーして貼り付けてください。

    例5-3 ProductsService.javaのコード

    package portlet;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class ProductsService {
        public ProductsService() {
        }
    
        public ProductsBean getProducts() throws ClassNotFoundException {
            Connection conn = getConnection();
            ProductsBean products = new ProductsBean();
            if (conn != null) {
                try {
                    Statement stmt = conn.createStatement();
                    String query =
                        "SELECT DISTINCT product_id, product_name name, cost_price 
    price, 'http://localhost:7101/MyTutorialApplication/' || external_url image_url, 
    category_description, supplier_name " +
                        "FROM category_translations, products_base, suppliers" +
                        "    WHERE products_base.category_id = category_
    translations.category_id" +
                        "    AND products_base.supplier_id = suppliers.supplier_id " +
                        "    AND cost_price between 25 and 75 " +
                        "    order by product_id";
                    ResultSet rs = stmt.executeQuery(query);
                    while (rs.next()) {
                        ProductDetailsBean productDetails = new ProductDetailsBean();
                        productDetails.setProductId(rs.getString(1));
                        productDetails.setProductName(rs.getString(2));
                        productDetails.setProductPrice(rs.getString(3));
                        productDetails.setImageURL(rs.getString(4));
                        productDetails.setCategoryDescription(rs.getString(5));
                        productDetails.setSupplierName(rs.getString(6));
    
                        products.addProduct(productDetails);
                    }
                    conn.close();
                } catch (SQLException sqle) {
                    System.out.println("======== Oracle Fusion Middleware Tutorial for 
    WebCenter Developers ======== ");
                    System.out.println("Database Connection established successfully 
    but encountered an error while working with the DB:" +
                                       sqle);
                    System.out.println("=================================================
    =========================== ");
                } catch (Throwable t) {
                    System.out.println("======== Oracle Fusion Middleware Tutorial for 
    WebCenter Developers ======== ");
                    System.out.println("Error while trying to get Product Details: " +
                                       t);
                    System.out.println("==================================================
    ========================== ");
                }
    
            }
            return products;
        }
    
        public static Connection getConnection() throws ClassNotFoundException {
            Connection conn = null;
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
                conn =
    DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "fod",
                                "fusion");
            } catch (SQLException sqle) {
                conn = null;
                System.out.println("======== Oracle Fusion Middleware Tutorial for 
    WebCenter Developers ======== ");
                System.out.println("SQL error while trying to  get connection to DB: " +
                                   sqle);
                System.out.println("=====================================================
    ======================= ");
            } catch (Throwable t) {
                conn = null;
                System.out.println("======== Oracle Fusion Middleware Tutorial for 
    WebCenter Developers ======== ");
                System.out.println("Error while trying to get the connection to DB: " +
                                   t);
                System.out.println("======================================================
    ====================== ");
            }
            return conn;
        }
    }
    

    注意:

    このコードでは、view.jspProductsServiceおよびProductsBeanのパッケージ名とインポート文は、ポートレットに指定する名前、クラス名およびパッケージによって異なります。また、このコードでは、接続情報をチュートリアル(fod)スキーマを含むデータベースを指すように更新する必要があります。このポートレットで問題が発生した場合は、ビジュアル・エディタ(「設計」ビュー)の下にある「メッセージ」ログを調べて、このコードに入力した接続情報が正しいことを確認します。

  7. ファイルを保存します。

  8. ポートレットのview.jspファイルをこのJavaクラスを使用するように更新するには、ポートレット・コードに戻り、パラメータ値を使用します。このパラメータ値は、図5-16Productsポートレットに定義したproductIdナビゲーション・パラメータです。

    「Products.java」タブをクリックして、フォーカスを合せます。または、ファイルが開いていない場合、アプリケーション・ナビゲータで名前をダブルクリックします。

  9. Products.javaファイルで、生成されたポートレット・クラス・ファイルのProcessAction()メソッドを、パラメータ値がポートレットからJava Beanに渡されるように更新する必要があります。これにより、入力したパラメータに応じて該当する製品が表示されるようになります。

    Products.javaファイルで、processAction()メソッドを探します。例5-4は、Products.javaファイルでメソッドが見つかったコードの部分を示しています。

    例5-4 processAction()メソッドが含まれるProducts.javaファイルの最後のセクション

        public void processAction(ActionRequest request,
                                  ActionResponse response) throws PortletException,
                                                                  IOException {
            // Determine which action.
            String okAction = request.getParameter(OK_ACTION);
            String applyAction = request.getParameter(APPLY_ACTION);
    
            if (okAction != null || applyAction != null) {
                // Save the preferences.
                PortletPreferences prefs = request.getPreferences();
                String param = request.getParameter(PORTLETTITLE_KEY);
                prefs.setValues(PORTLETTITLE_KEY, buildValueArray(param));
                prefs.store();
                if (okAction != null) {
                    response.setPortletMode(PortletMode.VIEW);
                    response.setWindowState(WindowState.NORMAL);
                }
            }
        }
    

    例5-4は、更新する必要のあるセクションを示しています。簡単にするために、Products.javaファイルのコードすべてを、C:\TutorialContent\Portlets\ProductsJava.txtファイルのコードと置き換えてもかまいません。一方、例5-5は、更新されたセクションを示しています。

    例5-5 Products.javaファイルの最後のセクションの更新

       // Form field names
        public static final String PARAMETER1 = "productId";
        public static final String FORM_PARAMETER1 = "form_Parameter1";
        public static final String FORM_SUBMIT = "dosub";
        // Portlet Modes
        public static final String MODE_NAME_PARAM = "mode";
        public static final String MODE_VIEW = "view";
    
    
        public void processAction(ActionRequest request,
                                  ActionResponse response) throws PortletException,
                                                                  IOException {
    
            // Determine what kind of action we have by examining the mode parameter
            boolean viewMode =
                MODE_VIEW.equals(request.getParameter(MODE_NAME_PARAM));
    
            // Extract the form field parameter and pass it through as a portlet parameter
            String param1 = request.getParameter(FORM_PARAMETER1);
            if (param1 == null) {
                param1 = ProductsBean.DEFAULT_PRODUCT_ID;
            }
    
            if (viewMode) {
                // Set the new parameter values. These will be intepreted by the
                // container as navigational parameters as the names match the names of
                // the declared parameters.
                response.setRenderParameter(PARAMETER1, param1);
            } else {
                // Determine which action.
                String okAction = request.getParameter(OK_ACTION);
                String applyAction = request.getParameter(APPLY_ACTION);
    
                if (okAction != null || applyAction != null) {
                    // Save the preferences.
                    PortletPreferences prefs = request.getPreferences();
                    String param = request.getParameter(PORTLETTITLE_KEY);
                    prefs.setValues(PORTLETTITLE_KEY, buildValueArray(param));
                    prefs.store();
                    if (okAction != null) {
                        response.setPortletMode(PortletMode.VIEW);
                        response.setWindowState(WindowState.NORMAL);
                    }
                }
            }
        }
    }
    
    
  10. これで、ポートレットを更新し、ポートレットがデータベースと通信できるようにするJavaクラスを作成しました。次に、ポートレットでそのJavaクラスを使用できるように、ポートレットのview.jspファイルを更新します。

    アプリケーション・ナビゲータで、「ポートレット」「Webコンテンツ」「Products」「html」を選択して、view.jspファイルを開きます(図5-33)。

    図5-33 アプリケーション・ナビゲータのview.jsp

    図5-33の説明が続きます
    「図5-33 アプリケーション・ナビゲータのview.jspファイル」の説明

  11. 「ソース」タブをクリックして、このページのコードを表示します。

  12. 「ソース」ビューのコードをすべて選択して、削除します。

  13. view.jspの「ソース」ビューで例5-6のコードを入力します。


    注意:

    このテキストのコードの書式設定が機能しない場合は、C:\TutorialContent\Portlets\ViewJSP.txtファイルを開き、そこからコードをコピーして貼り付けてください。

    例5-6 view.jspのコード

    <%@ page contentType="text/html" pageEncoding="windows-1252" import="javax.portlet.*,
                     java.util.*,
                     portlet.ProductsBean,
                     portlet.ProductDetailsBean,
                     portlet.ProductsService,
                     portlet.Products "%>
    <%@ taglib uri="http://java.sun.com/portlet" prefix="portlet"%>
    
    <!-- Include the Portlet render Response & Request objects -->
    <portlet:defineObjects/>
    
    <%
        // Get the list of products
        ProductsBean products = new ProductsService().getProducts();
        ArrayList<ProductDetailsBean> productDetails = products.getProducts();
    
        // "Portlet encode" the Action URL if running Portlet mode
        String actionURL = "view.jsp";
        if (renderResponse != null) {
          actionURL = renderResponse.createActionURL().toString();
        }
    
        // Extract the current portlet parameter value if running in Portlet mode
        String param1 = "";
        if (renderRequest != null) {
          param1 = renderRequest.getParameter(Products.PARAMETER1);
          if (param1 == null) { param1 = ""; }
        }
    %>
    <form method="POST" action="<%= actionURL %>">
     <table>
      <tr>
       <th>Select</th>
       <th>Product</th>
       <th>Product supplied by</th>
       <th>Our price</th>
      </tr>
    
      <%
       for (int i = 0; i < productDetails.size(); i++) {
          ProductDetailsBean productDetail = productDetails.get(i);
    %>
    
      <tr>
       <td align="center">
        <!-- Set the Form parameter name to passed as a render parameter during processAction -->
        <input type="radio" name="<%= Products.FORM_PARAMETER1 %>"
               value="<%=productDetail.getProductId()%>"
               <%= param1.equals(productDetail.getProductId()) ? " checked='checked'" : "" %>/>
       </td>
       <td>
        <%=productDetail.getProductName()%>
       </td>
       <td>
        <%=productDetail.getSupplierName()%>
       </td>
       <td align="right">
        $<%=productDetail.getProductPrice()%>
       </td>
      </tr>
    
      <% } %>
    
      <tr class="PortletText1">
       <td>
        <input name="<%= Products.FORM_SUBMIT %>" type="submit"
               class="portlet-form-button" value="Show Details"></input>
       </td>
       <td colspan="3">&nbsp;</td>
      </tr>
    
     </table>
    
     <!-- create a hidden parameter to note we're running in "view" mode -->
     <input type="hidden" name="<%= Products.MODE_NAME_PARAM %>"
            value="<%= Products.MODE_VIEW %>"/>
    </form>
    
  14. view.jspを保存します。

データベースへの接続を確立して、新しいJavaBeanを使用するポートレットと、ポートレットの適切な製品情報を取得するJavaクラスを設定しました。これで、WARファイルにポートレットを含める準備ができました。WARはweb archiveの略語で、ポートレットのデプロイに必要なすべてのリソース、ポートレットおよびデプロイメント・ディスクリプタをまとめてパッケージ化したものです。

手順4: 規格に基づいたポートレットのテストとデプロイ

このレッスンでは、規格に基づいたポートレットを、ローカルのデフォルト・サーバー(統合WebLogicサーバー)にデプロイする方法を学習します。ポートレットをデプロイする場合、Java EEサーバー上で実行できるようにポートレットをパッケージ化します。Oracle Portalでは、これは要するにポートレット・プロバイダを作成することです。ポートレット・プロバイダは、WSRPの世界ではポートレット・プロデューサと呼ばれています。

  1. デフォルト・サーバーがまだ実行されていない場合は、 「実行」「サーバー・インスタンスの起動」を選択して起動します。

  2. ポートレットをデプロイする前に、すぐにコンパイルしてテストします。アプリケーション・ナビゲータで、「Webコンテンツ」「Products」の下のview.jspを右クリックし、「実行」を選択します。ポートレットはコンパイルされ、ブラウザで図5-34のように表示されます。

    図5-34 規格に基づいたポートレットのテスト

    図5-34の説明が続きます
    「図5-34 規格に基づいたポートレットのテスト」の説明

  3. アプリケーション・ナビゲータの「ポートレット」「Webコンテンツ」「WEB-INF」の下で、web.xmlファイルを右クリックして、ポップアップ・メニューから「WARデプロイメント・プロファイルの作成」を選択します(図5-35)。

    図5-35 「WARデプロイメント・プロファイルの作成」メニュー・オプション

    図5-35の説明が続きます
    「図5-35 「WARデプロイメント・プロファイルの作成」メニュー・オプション」の説明

  4. 「デプロイメント・プロファイルの作成」ダイアログ・ボックスで、デプロイメント・プロファイルにProductsという名前を付け、「OK」をクリックします(図5-36)。

    図5-36 「デプロイメント・プロファイルの作成 -- WARファイル」ダイアログ・ボックス

    図5-36の説明が続きます
    「図5-36 「デプロイメント・プロファイルの作成 -- WARファイル」ダイアログ・ボックス」の説明

  5. 「WARデプロイメント・プロファイルのプロパティ」ダイアログ・ボックスの「一般」タブで、Webアプリケーションのコンテキスト・ルートの設定を探します。後で簡単に参照できるように、この名前をより論理的な名前に変更します。

    「J2EE Webコンテキスト・ルートを指定」オプションを選択し、図5-37のようにフィールドにProductsと入力します。

    図5-37 WARデプロイメント・プロファイルのプロパティ -- コンテキスト・ルートの設定

    図5-37の説明が続きます
    「図5-37 WARデプロイメント・プロファイルのプロパティ -- コンテキスト・ルートの設定」の説明

  6. 「OK」をクリックしてプロパティの更新を終了し、「プロジェクト・プロパティ」ダイアログ・ボックスで「OK」をクリックして、WARデプロイメント・プロファイルの作成を終了します。

  7. Oracle WebCenterには、統合WLSサーバーへの独自のデフォルト接続が含まれています。リソース・パレットのIDE接続の下で、「IntegratedWLSConnection」という接続が表示されます(図5-38)。

    図5-38 リソース・パレットの「IntegratedWLSConnection」

    図5-38の説明が続きます
    「図5-38 リソース・パレットの「IntegratedWLSConnection」」の説明

  8. これで、規格に基づいたポートレットをデプロイする準備が整いました。アプリケーション・ナビゲータで、「Portlets」プロジェクトを右クリックし、ポップアップ・メニューから「デプロイ」「Products」「IntegratedWLSConnection」を選択します。

  9. 「デプロイメント・タイプの選択」ダイアログ・ボックスが表示された場合、デフォルト・オプションをそのままにして、「OK」をクリックします(図5-39)。

    図5-39 デプロイメント・タイプの選択

    図5-39の説明が続きます
    「図5-39 デプロイメント・タイプの選択」の説明

    ビジュアル・エディタ(「設計」ビュー)の下にある「デプロイ」ログで「---- デプロイが終了 ---- {0}」のメッセージがあるか調べることができます。

  10. ブラウザに移動し、ポートレットのデプロイメントが行われたかどうかを確認します。ブラウザに次のURLを入力します。

    http://localhost:7101/Products/info
    

    図5-40に示すように、WSRPプロデューサ・テスト・ページが表示されます。

    図5-40 WSRPプロデューサ・テスト・ページ

    図5-40の説明が続きます
    「図5-40 WSRPプロデューサ・テスト・ページ」の説明

  11. WSRPのバージョン1または2のどちらのWSDLを使用するかを選択できます。通常、可能な場合は最新バージョンを使用することをお薦めします。ポートレットがWSRP 1.0準拠コンシューマ(Oracle Portalなど)で消費される場合、WSRP 1.0を選択できます。

    「WSRP v2 WSDL」をクリックしてこのWSDLのXMLを表示します(図5-41)。

  12. 図5-41 ポートレットをWebサービスとして記述するWSDL

    ポートレットをWebサービスとして記述するWSDL
    「図5-41 ポートレットをWebサービスとして記述するWSDL」の説明

デプロイしたポートレットが、Webサービスとして公開されています。ブラウザに表示されているのは、このWebサービスを記述するWeb Services Description Language(WSDL)です。これで、ポートレットがデプロイされ、実行中となったので、このポートレットにポートレットを消費するアプリケーションを追加できます。次の手順では、チュートリアル・アプリケーションにプロデューサを登録して、このポートレットをMyPageに追加します。

手順5: 規格に基づいたポートレットのアプリケーションへの登録

ポートレットをデプロイしたので、プロデューサをチュートリアル・アプリケーションに登録して、ページに追加できます。

プロデューサをMyTutorialApplicationに登録するには、次のようにします。

  1. アプリケーション・ナビゲータで、リストから「MyTutorialApplication」を選択し、カスタムWebCenterアプリケーションに戻ります(図5-42)。

    図5-42 アプリケーション・ナビゲータ・リストの「MyTutorialApplication」

    図5-42の説明が続きます
    「図5-42 アプリケーション・ナビゲータ・リストの「MyTutorialApplication」」の説明

  2. リソース・パレットでフォルダ・アイコンをクリックして、ポップアップ・メニューから「接続の作成」「WSRPプロデューサ」を選択します。

  3. 「プロデューサ名の指定」ページで「リソース・パレット」が選択されていることを確認して、プロデューサの名前(ProductsWSRPProducerなど)を入力し、「次へ」をクリックします(図5-43)。

    図5-43 WSRPポートレット・プロデューサの登録 -- プロデューサ名の指定

    図5-43の説明が続きます
    「図5-43 WSRPポートレット・プロデューサの登録 -- プロデューサ名の指定」の説明

  4. 「接続詳細の指定」ページの「WSDL URL」フィールドに、WSDLのURLを入力します(通常はバージョン2を使用します)。

    http://localhost:7101/Products/portlets/wsrp2?WSDL
    

    図5-44 WSRPポートレット・プロデューサの登録 -- 接続詳細の指定

    図5-44の説明が続きます
    「図5-44 WSRPポートレット・プロデューサの登録 -- 接続詳細の指定」の説明

  5. デフォルト・サーバーがローカルにインストールされているため、プロキシは必要ありません。「次へ」をクリックして、WSRPプロデューサへの接続を作成します。

  6. 残りのデフォルト設定はそのままにして、ウィザードを終了します。「登録の詳細」ページで、「終了」をクリックします。登録の終了を知らせる登録のダイアログ・ボックスが表示されます。

  7. リソース・パレットの「IDE接続」で、「WSRPプロデューサ」ノードを開き、「ProductDetailsWSRPProducer」ノードを開きます。図5-45は、ここでのProductsポートレットを示しています。

    図5-45 リソース・パレットのProductsポートレット

    図5-45の説明が続きます
    「図5-45 リソース・パレットのProductsポートレット」の説明

プロデューサをアプリケーションに登録したので、ページにポートレットを追加してテストします。

手順6: 規格に基づいたポートレットのアプリケーションでのテスト

ポートレットをテストするには、ポートレットをMyPage.jspxに追加してページを実行し、ポートレットが予想どおりに表示されるかどうかを確認します。

  1. MyTutorialApplicationで、MyPage.jspxがまだ開いていない場合は、アプリケーション・ナビゲータで(「ViewController」「Webコンテンツ」の下)ページ名を見つけてダブルクリックします。

  2. 「構造」ウィンドウで、「second」ファセットに移動し、「Page Customizable」「Layout Customizable」「contentA」の順に開き、図5-46のように、「Panel Customizable」を見つけます。


    注意:

    前述のように、「構造」ウィンドウで押しピンを使用すれば、現在のビューを固定できます。この手順のために、「設計」ビューで「MyPage」をクリックして、押しピンが固定の位置(押された状態)になっていることを確認する必要があります。

    図5-46 Productsポートレットを追加する「Panel Customizable」

    図5-46の説明が続きます
    「図5-46 Productsポートレットを追加する「Panel Customizable」」の説明

  3. リソース・パレットからProductsポートレットをこの「Panel Customizable」にドラッグ・アンド・ドロップします。

  4. ページを実行して、ポートレットが実行時にどのように表示されるかを確認します。これには数秒かかることがあります。

    まだこのポートレットを別のポートレットとワイヤリングしていないため、異なるオプションの選択や「詳細の表示」ボタンはまだ機能しません。2番目のポートレットを作成し、それをこのポートレットにワイヤリングします。図5-47は、実行時のProductsポートレットです。

    図5-47 ブラウザ・ウィンドウに表示されたProductsポートレット

    ブラウザに表示されたMyJavaPortlet
    「図5-47 ブラウザ・ウィンドウに表示されたProductsポートレット」の説明

手順7: 事前構成済ポートレット・プロデューサの登録

このチュートリアルでは、OmniPortletという事前構成済ポートレット・プロデューサを使用します。これは、統合WLS(WebLogic)サーバーに事前にデプロイされており、デフォルト・サーバーとも呼びます。先に進む前に、第2章「チュートリアルの準備」の手順を実行したことを確認します。

ポートレット・プロデューサを登録するには、次のようにします。

  1. デフォルト・サーバーが稼働していることを確認します。

  2. デフォルト・サーバー上で実行されているOmniPortletプロデューサのURLを見つけるには、「ヘルプ」WebCenter Preconfigured Server READMEを選択します。このREADMEファイルでは、デフォルト・サーバーに事前にデプロイされたポートレットを使用するために必要なすべての情報と、サーバーのログイン資格証明が示されます。

  3. READMEファイルで、「Preconfigured Portlet Producers」の下、さらに「PortalTools Portlet Producers」の下で、「OmniPortlet Producer」をクリックします。

  4. ブラウザには、OmniPortletのプロデューサ・テスト・ページが表示されます。ロケーション・バーからURLをコピーします。URLは次のようになります。

    http://localhost:7101/portalTools/omniPortlet/providers/omniPortlet
    

    このURLをブラウザに入力すると、OmniPortletのプロデューサ・テスト・ページが表示されます(図5-48)。

    図5-48 OmniPortletのプロデューサ・テスト・ページ

    図5-48の説明が続きます
    「図5-48 OmniPortletのプロデューサ・テスト・ページ」の説明

  5. リソース・パレットで検索ツールバーの隣にある「新規」アイコンをクリックして、「接続の作成」を選択し、次に「Oracle PDK-Javaプロデューサ」を選択します(図5-49)。

    図5-49 Oracle PDK-Javaプロデューサの登録

    図5-49の説明が続きます
    「図5-49 Oracle PDK-Javaプロデューサの登録」の説明

  6. Oracle PDK-Javaポートレット・プロデューサの登録ウィザードのステップ1で、このポートレット・プロデューサをすべてのアプリケーションで使用できるようにします。「リソース・パレット」を選択します。

  7. 「プロデューサ登録名」フィールドにOmniProducerと入力します(図5-50)。

    図5-50 OmniPortletプロデューサの名前の指定

    図5-50の説明が続きます
    「図5-50 OmniPortletプロデューサの名前の指定」の説明

  8. 「次へ」をクリックします。

  9. 先にコピーしたこのOmniPortletのプロデューサ・テスト・ページのURLを「URLエンドポイント」フィールドに入力します(図5-51)。

    図5-51 OmniPortletプロデューサの接続詳細の指定

    図5-51の説明が続きます
    「図5-51 OmniPortletプロデューサの接続詳細の指定」の説明

  10. 「次へ」をクリックします。

  11. 「登録の詳細」ページで、「終了」をクリックします。Oracle JDeveloperがプロデューサを登録していることを示すメッセージが表示されます。

    リソース・パレットでのポートレット・プロデューサの登録を選択したため、図5-52に示すように、新しいポートレット・プロデューサがリソース・パレットの「IDE接続」リストに表示されます。

    図5-52 「IDE接続」リストの「OmniProducer」

    図5-52の説明が続きます
    「図5-52 「IDE接続」リストの「OmniProducer」」の説明

手順8: ページへのOmniPortletの追加

Oracle WebCenter Frameworkで使用できるポートレット・タイプの1つがOmniPortletです。このポートレットは、そのまま使用できる形で提供されており、デフォルト・サーバー上で事前に構成されています。様々なデフォルト・レイアウトやデータ・ソースを使用して、素早くポートレットを作成できます。

図5-53は、OmniPortletを使用して構築できるサンプル・ポートレットを示しています。このポートレットには、データベースに格納されている項目が、ローカルに格納されているイメージとして表示されます。このポートレットを「手順1: 規格に基づいたJSR 168 Javaポートレットの作成」で作成したポートレットとワイヤリングすると、ユーザーは、アプリケーション内のこれらのイメージをクリックして、それらの項目の詳細を知ることができます。

図5-53 実行時のOmniPortlet

図5-53の説明が続きます
「図5-53 実行時のOmniPortlet」の説明

このOmniPortletを使用する前に、データベースにサンプル・スキーマを追加して、第2章「チュートリアルの準備」の説明に従ってデフォルト・サーバーを起動したことを確認します。また、「手順7: 事前構成済ポートレット・プロデューサの登録」の説明に従ってOmniPortletプロデューサを登録したことを確認します。

  1. Oracle JDeveloperで、「MyTutorialApplication」が開いていることを確認します。

  2. アプリケーション・ナビゲータで、「MyPage.jspx」が「設計」ビューにあることを確認します。アプリケーションが閉じられている場合は、アプリケーション・ナビゲータでページ名をダブルクリックすれば開きます。

  3. 「構造」ウィンドウの「second」ファセットで、ドキュメント・サービスとタグ・サービスを追加した「Panel Customizable」を探します。


    注意:

    前述のように、「構造」ウィンドウで押しピンを使用すれば、現在のビューを固定できます。この手順のために、「設計」ビューで「MyPage」をクリックして、押しピンが固定の位置(押された状態)になっていることを確認する必要があります。

  4. 図5-54のように、「Layout Customizable facets」を開き、次に「contentB」を開いて「Panel Customizable」(規格に基づいたJSR 168 JavaポートレットをcontentAに追加した場所)を表示します。

    図5-54 「contentB」の「Panel Customizable」

    図5-54の説明が続きます
    「図5-54 「contentB」の「Panel Customizable」」の説明

  5. リソース・パレットの「IDE接続」の下で、「Oracle PDK-Javaプロデューサ」「OmniProducer」「OmniPortlet」に移動します(図5-55)。

    図5-55 リソース・パレットの「OmniPortlet」

    図5-55の説明が続きます
    「図5-55 リソース・パレットの「OmniPortlet」」の説明

  6. 「OmniPortlet」を、「構造」ウィンドウで、ページの「contentB」の下の「Panel Customizable」にドラッグ・アンド・ドロップします。図5-56に示すように、ページの「設計」ビューにOmniPortletが表示されます。エラー・メッセージが表示された場合、デフォルト・サーバーを起動したことを確認し、再度実行します。

    OmniPortlet使用に関するトラブルシューティングのヒントの詳細は、『Oracle Fusion Middleware Oracle WebCenterのための開発者ガイド』を参照してください。

    図5-56 設計時のMyPage上のOmniPortletインスタンス

    図5-56の説明が続きます
    「図5-56 設計時のMyPage上のOmniPortletインスタンス」の説明

  7. ページにOmniPortletを追加したので、そのコンテンツをカスタマイズしましょう。

    ブラウザにページを実行します。

    図5-57は、ブラウザに表示されたMyPage上のOmniPortletを示しています。

    図5-57 実行時の未定義のOmniPortlet

    図5-57の説明が続きます
    「図5-57 実行時の未定義のOmniPortlet」の説明

手順9: 実行時のOmniPortletの定義

この項では、第2章「チュートリアルの準備」でアプリケーションに追加したデータベース・スキーマからの情報とイメージが表示されるように、OmniPortletをカスタマイズします。

OmniPortletは事前構成済ポートレットであるため、それをアプリケーションに追加して、実行時にカスタマイズすればよいだけです。ポートレットをページに配置し、ブラウザでページを実行したので、このポートレットのレイアウトとコンテンツをカスタマイズします。

  1. ポートレットの右上隅にある矢印をクリックし、「カスタマイズ」を選択してOmniPortletウィザードを起動します(図5-59)。

    図5-58 OmniPortletのリンクのカスタマイズ

    図5-58の説明が続きます
    「図5-58 OmniPortletのリンクのカスタマイズ」の説明

  2. 「データ型」ページで、データベースのスキーマからデータを取得できるように「SQL」を選択して、「次へ」をクリックします。この時点で、データベースにスキーマを追加したこと(第2章「チュートリアルの準備」)と、アプリケーション・リソースにイメージを追加したこと(第3章「カスタマイズ可能ページを含むWebCenterアプリケーションの作成」)を確認します。追加されていないと、ポートレットではサンプル・チュートリアル・データを取得できません。

    SQLと自分のデータベースを熟知している場合、いつでも独自のサンプル・データを使用できますが、この後のイメージと手順が必ずしも読者にとって的確なものになるとはかぎりません。

  3. 「データソース」ページで、SQL文を定義し、スキーマをインストールしたデータベースへの接続を設定できます。

    「文」ボックスに、例5-7のコードを入力します。文のパラメータは、このポートレットを「手順5: 規格に基づいたポートレットのアプリケーションへの登録」で追加したProductsポートレットとワイヤリングするときに使用されます。


    注意:

    このテキストのコードの書式設定が機能しない場合は、C:\TutorialContent\Portlets\OmniPortlet_SQL_Statement.txtファイルを開き、そこからコードをコピーして貼り付けてください。

    例5-7 OmniPortletのSQL文

    SELECT product_name name
    , cost_price our_price
    , cost_price * 1.3 retail_price
    , cost_price * 0.3 savings
    , external_url image_url
    , category_description
    , supplier_name
    FROM category_translations, products_base, suppliers
        WHERE products_base.category_id = category_translations.category_id
        AND products_base.supplier_id = suppliers.supplier_id
        AND products_base.product_id = nvl('##Param1##',0)
    

    注意:

    この文のローカルホストの参照に注目します。これは、第2章「チュートリアルの準備」で登録したOmniPortletプロデューサを参照しています。「テスト」ボタンをクリックしても、文によって返されるものを確認できます。

  4. 「接続」の下の「接続の編集」をクリックします。

  5. 接続名と、データベースの接続情報を入力します。スキーマのユーザー名はfod、パスワードはfusionです。たとえば、Oracle XEデータベースをローカルで使用している場合、ページは図5-59のように表示されます。

    図5-59 OmniPortletの接続情報

    図5-59の説明が続きます
    「図5-59 OmniPortletの接続情報」の説明

  6. 「テスト」をクリックして、接続情報が正しいことを確認します。図5-60は、テスト成功のメッセージを示しています。

    図5-60 正常な接続を示すメッセージ

    図5-60の説明が続きます
    「図5-60 正常な接続を示すメッセージ」の説明

  7. 「閉じる」をクリックし、「OK」をクリックして接続の作成を終了します。

  8. 「ポートレット・パラメータ」の下で、Param1から12までの「デフォルト値」を設定します。こうすることで、SQL文内のパラメータのデフォルト値が指定されます。

    図5-61は、SQLのソース・ページを示しています。

    図5-61 SQLのソース・ページ

    図5-61の説明が続きます
    「図5-61 SQLのソース・ページ」の説明


    注意:

    第3章「カスタマイズ可能ページを含むWebCenterアプリケーションの作成」で説明したように、ViewControllerプロジェクトに「images」フォルダがない場合、SQL文で参照されるイメージは表示されません。「手順2: アプリケーションへのイメージ・ファイルの追加」に戻って、手順に従い、ここでイメージを追加できますが、OmniPortletで新規フォルダが認識されるように、アプリケーションをブラウザで再び実行する必要があります。

  9. 「バインド変数の表示」ボタンの隣にある「テスト」をクリックして、SQL文と接続を検証します。

    図5-62 「テスト」ボタン

    図5-62の説明が続きます
    「図5-62 「テスト」ボタン」の説明

    文に基づいた行を返すポップアップ・ウィンドウが表示されます。返された行がない場合、SQL文、接続およびポートレット・パラメータを検証してください。

    図5-63 SQL文のテストの結果

    図5-63の説明が続きます
    「図5-63 SQL文のテストの結果」の説明

  10. 「次へ」をクリックします。

  11. 「フィルタ」ページで、「次へ」をクリックします。

  12. 「表示」ページで、「タイトル」フィールドにポートレットの名前としてProduct Informationなどを入力します。

  13. このポートレットには、任意のデフォルト・レイアウトを選択できます。ただし、ポートレットのルック・アンド・フィールを微調整できるHTMLレイアウトであることを確かめます。

    図5-64に示すように、「レイアウト・スタイル」で「HTML」を選択して、「次へ」をクリックします。

    図5-64 「表示」ページ

    図5-64の説明が続きます
    「図5-64 「表示」ページ」の説明

  14. 「レイアウト」ページで、HTMLで入力するテンプレートのフォームに注目します。ここで、ポートレットのレイアウトを変更するには、ヘッダー、本文およびフッターのフィールドを更新します。OmniPortletで提供されるデフォルト・レイアウトを使用できますが、独自のHTMLレイアウトを順を追って作成しましょう。

    「クイック・スタート」リストで「フィールドのクリア」を選択し、「適用」をクリックします。こうすると、既存のHTMLコードがレイアウト・テンプレートから削除されます。

  15. 「繰返しセクション」に例5-8のHTMLを入力して、データの書式を設定する表を作成します。


    注意:

    このテキストのコードの書式設定が機能しない場合は、C:\TutorialContent\Portlets\OmniPortlet_HTML_Layout.txtファイルを開き、そこからコードをコピーして貼り付けてください。

    例5-8 OmniPortlet HTMLレイアウトのコード

    <table>
     <tr>
      <td>
       <font class="PortletHeading1">##NAME##</font>
       <img src="##IMAGE_URL##"
            title="##NAME## - ##CATEGORY_DESCRIPTION## by ##SUPPLIER_NAME##"></img>
      </td>
      <td>
       <table>
        <tr class="PortletText2">
         <td>
          Product supplied by
          <font class="PortletHeading3">
           ##SUPPLIER_NAME##
          </font>
         </td>
        </tr>
        <tr class="PortletText2">
         <td>
          List price: $##RETAIL_PRICE##
         </td>
        </tr>
        <tr class="PortletHeading2">
         <td>
          Our price: $##OUR_PRICE##
         </td>
        </tr>
        <tr class="PortletText2">
         <td>
          You save: $##SAVINGS##
         </td>
        </tr>
        <tr class="PortletText2">
         <td>
          <font class="PortletHeading2">Availability:</font>
          In Stock. Ships from and sold by
          <font class="PortletHeading2">FusionOnline.com</font>
          . Gift-wrap available.
         </td>
        </tr>
        <tr>
         <td>&nbsp;</td>
        </tr>
       </table>
      </td>
     </tr>
     <tr class="PortletText1">
      <td colspan="2">Want it delivered Thursday? Order it in the next 22 hours and
                      45 minutes, and choose One-Day Shipping at checkout.</td>
     </tr>
    </table>
    

    レイアウト・ページは、図5-65のように表示されます。

    図5-65 HTMLのレイアウト・ページ

    図5-65の説明が続きます
    「図5-65 HTMLのレイアウト・ページ」の説明

  16. 「終了」をクリックします。図5-66は、ブラウザに表示されたOmniPortletを示しています。

    図5-66 実行時のOmniPortletの完成品

    図5-66の説明が続きます
    「図5-66 実行時のOmniPortletの完成品」の説明

これで2つのポートレットを作成したので、これらをワイヤリングします。

手順10: 規格に基づいたポートレットとOmniPortletのワイヤリング

Productsという規格に基づいたポートレットのコードを追加したとき、productIdというパラメータも含めました。Productsポートレットで異なるオプションを選択すると、アプリケーションではこのパラメータをOmniPortletに送信し、特定の製品の詳細をその製品の識別番号とともに表示できるようにします。

ここで、2つのパラメータを互いにマップし、Productsポートレットでオプションを選択すると、OmniPortletの情報がそれに応じて更新されるようにする必要があります。

ポートレットをワイヤリングするには、次のようにします。

  1. Oracle JDeveloperで、「MyTutorialApplication」が開いていることを確認します。

  2. アプリケーション・ナビゲータで、MyPage.jspxページのページ定義ファイルを開きます。ファイルを開くには、アプリケーション・ナビゲータでページ定義ファイル自体を開くか、またはページをダブルクリックして「ページ定義に移動」を選択します。

  3. 「構造」ウィンドウで、押しピンを使用して、現在のビューを固定します。「設計」ビューでMyPageのページ定義が選択されていることを確認し、次に「構造」ウィンドウで、押しピンをクリックして、固定の位置(押した状態)になるようにします。

  4. MyPagePageDef.xml(ページ定義)ファイルの「構造」ウィンドウで、「OmniPortlet1_1」「parameters」を開き、図5-67のように、ポートレット変数Param1を選択します。

    図5-67 「構造」ウィンドウのOmniPortlet変数

    図5-67の説明が続きます
    「図5-67 「構造」ウィンドウのOmniPortlet変数」の説明

  5. 変数を選択しているときに、プロパティ・インスペクタでその変数のプロパティを表示できます。

    図5-68のように、「pageVariable」プロパティを「Products1_1_productId」に設定します。

    図5-68 デフォルト値の設定

    図5-68の説明が続きます
    「図5-68 デフォルト値の設定」の説明

  6. マスター・ポートレットの値が変更されたときはいつでも、詳細ポートレット(OmniPortlet)がリフレッシュされるようにする必要があります。それには、詳細ポートレットに部分トリガーを追加します。ビジュアル・エディタの上部にある「MyPage.jspx」タブをクリックして、フォーカスを移します。

  7. 「設計」ビューでページ上の「OmniPortlet」を選択します。

    図5-69 「設計」ビューのMyPage上のOmniPortlet

    図5-69の説明が続きます
    「図5-69 「設計」ビューのMyPage上のOmniPortlet」の説明

  8. OmniPortletのプロパティ・インスペクタでは、「共通」の下で、「PartialTriggers」の隣の矢印をクリックして、「編集」を選択します(図5-70)。

    図5-70 OmniPortletのPartialTriggersプロパティの編集

    図5-70の説明が続きます
    「図5-70 OmniPortletのPartialTriggersプロパティの編集」の説明

  9. 「プロパティの編集: PartialTriggers」ダイアログ・ボックスでは、OmniPortletのポートレットIDが自動的に選択されます。「Panel Customizable」の下の「facet (contentA)」にあるProductsポートレットのポートレットIDを探します(図5-71)。

    図5-71 ProductsポートレットのポートレットIDの検索

    図5-71の説明が続きます
    「図5-71 ProductsポートレットのポートレットIDの検索」の説明

  10. ポートレットID(この場合は「portlet - portlet1」)を選択し、右向きの矢印をクリックして「選択済」リストに移動してから、「OK」をクリックします(図5-72)。

    図5-72 ProductsポートレットのポートレットIDの選択

    図5-72の説明が続きます
    「図5-72 ProductsポートレットのポートレットIDの選択」の説明

  11. ポートレット・パレメータのワイヤリングを行ったので、それらが実行時にどのように動作するかを調べます。

    「MyPage.jspx」をブラウザで実行します。次の手順では、JSR 168(Products)ポートレットとOmniPortletが実行時にどのように相互作用するかをテストします。

手順11: ポートレット間の相互作用のテスト

実行時のポートレットをテストします。

  1. Productsポートレットで、オプション(「iPod Speakers」など)を選択し、「詳細の表示」をクリックします。

  2. OmniPortletでは、ポートレットが更新されて、iPodスピーカーについての情報が表示されていることに注目してください(図5-73)。

    図5-73 ポートレット間の相互作用のテスト

    図5-73の説明が続きます
    「図5-73 ポートレット間の相互作用のテスト」の説明

図5-74は、ブラウザに表示されたMyPageを示しています。

図5-74 実行時のMyPage

図5-74の説明が続きます
「図5-74 実行時のMyPage」の説明

おめでとうございます。これで、このレッスンは終わりです。2つのポートレットを作成し、それらが互いに通信できるようになりました。次の第6章「結び」に進み、このチュートリアルで学習したことを復習してください。この章には、使用した機能についての追加情報もあります。