Oracle® Fusion Middleware Oracle WebCenter PortalおよびOracle JDeveloperでのポータルの開発 11gリリース1 (11.1.1.8.3) E49666-03 |
|
![]() 前 |
![]() 次 |
この章では、Oracle PDK-Javaを使用したJavaポートレットの構築方法について説明します。Oracle PDK-Javaは、Javaポートレットを構築するためのOracle独自のテクノロジです。
この章の内容は、次のとおりです。
ヒント: 新規Javaポートレットを構築するには、JSR 286規格の使用を検討する必要があります。詳細は、第59章「JSR 286を使用した標準ベースのJavaポートレットの作成」を参照してください。 |
PDK-Javaは、一般的に必要なユーティリティを提供することでJavaポートレットを簡単に開発できるフレームワークを提供し、これまでの開発スキルや、JSP、サーブレット、静的HTMLページなどの既存アプリケーション・コンポーネントを活用できるようにします。また、WebCenter Portal Frameworkとプロデューサ間の通信の複雑さに直接対処する必要なしにポートレットを作成できます。
PDK-Javaのフレームワークは次の領域に分けられます。
プロデューサ・アダプタ: 開発者は、これにより、Webプロデューサとの通信用にWebCenter Portal Frameworkによって定義されたHTTP構文を使用しないで済むようになります。また、WebCenter Portal FrameworkとJava Webプロデューサ間で渡された情報を変換します。アダプタがない場合、プロデューサは、ポートレットの管理に加え、この情報を所定の言語でWebCenter Portal Frameworkに直接通信する必要があります。アダプタによって、Webプロデューサはポータル言語を理解する必要がなくなり、逆に、アダプタがない場合は、理解する必要が出てきます。
プロバイダ・インタフェースは、プロバイダ・アダプタとの統合にJava実装で必要となるAPI(関数)を定義します。プロデューサ・アダプタは、Portal Frameworkアプリケーションからのメッセージを受信して、プロデューサ・インタフェースへのコールに変換し、プロデューサのレスポンスをアプリケーションが理解できる書式に翻訳します。プロデューサ・インタフェースには、プロデューサが実装するメソッドを定義するためのJavaクラスのセットが含まれ、多くの場合、標準実装が用意されています。主なクラスには次のものがあります。
ProviderDefinition
(oracle.portal.provider.v2.ProviderDefinition
)
ProviderInstance
(oracle.portal.provider.v2.ProviderInstance
)
PortletDefinition
(oracle.portal.provider.v2.PortletDefinition
)
PortletInstance
(oracle.portal.provider.v2.PortletInstance
)
ParameterDefinition
(oracle.portal.provider.v2.ParameterDefinition
)
EventDefinition
(oracle.portal.provider.v2.EventDefinition
)
プロデューサ・ランタイムは、プロデューサ・インタフェースの仕様に準拠する基本実装です。プロデューサ・ランタイムには、個々のプロデューサ・インタフェースを実装するためのデフォルト・クラスのセットが含まれ、PDK-Javaに付属のレンダリング、パーソナライズおよびセキュリティのフレームワークを活用できるようにします。このようなクラスと関連フレームワークは、WebCenter Portal Frameworkリクエストの共通関数を実装し、プロデューサを構成するための宣言メカニズムを提供することで、プロデューサの開発を簡略化します。プロデューサ・ランタイムを使用すると、Portal Frameworkアプリケーションとの通信に必要なインフラストラクチャではなく、ポートレット自体に開発労力を集中できます。プロデューサ・ランタイムの標準動作が要件を満たさない場合に、特定の動作の拡張または変更を容易に行うことができます。主なクラスには次のものがあります。
DefaultProviderDefinition
(oracle.portal.provider.v2.DefaultProviderDefinition
)
DefaultProviderInstance
(oracle.portal.provider.v2.DefaultProviderInstance
)
DefaultPortletDefinition
(oracle.portal.provider.v2.DefaultPortletDefinition
)
DefaultPortletInstance
(oracle.portal.provider.v2.DefaultPortletInstance
)
PortletRenderer
(oracle.portal.provider.v2.render.PortletRenderer
)
PortletPersonalizationManager
(oracle.portal.provider.v2.personalize.PortletPersonalizationManager
)
PortletSecurityManager
(oracle.portal.provider.v1.http.DefaultSecurityManager
)
プロデューサ・ユーティリティは、ポートレットのレンダリングを簡略化するメソッドを提供します。このユーティリティには、有効なリンク(hrefs
)を構築するメソッド、ポートレットのコンテナ(ヘッダーを含む)をレンダリングするメソッド、ページ内で動作するHTMLフォームをレンダリングするメソッドおよびポートレット・キャッシュをサポートするメソッドが含まれています。
Oracle JPDKプロデューサは、デプロイ、定義およびアプリケーションとの通信に関し、XML、SOAP、HTTPまたはJava EEなどのオープン標準を使用します。WebCenter Portalは、Oracle JPDKプロデューサからポートレットを組み込み、HTTPを介してSOAPを使用し、コンシューマ・アプリケーションと通信します。
ポートレットを開発し、Oracle JPDKプロデューサを介して公開することには、次のような様々な利点があります。
ポートレットをリモートでデプロイできます
既存のWebアプリケーション・コードを利用してポートレットを作成できます
宣言によってプロデューサを指定できます
標準のJavaテクノロジ(サーブレットやJSPなど)を使用してポートレットを開発できます。
ポートレットをOracle JPDKプロデューサを使用して公開するには、ポートレットを管理し、SOAPを使用してWebCenter Portalと通信するプロデューサを最初に作成する必要があります。詳細は、第60.5項「PDK-Javaポートレットのデプロイ」を参照してください。
PDK-Javaの詳細は、次のOracle Fusion Middleware Oracle PDK-Java Java APIリファレンスを参照してください。
http://docs.oracle.com/cd/E23943_01/apirefs.1111/e10691/index.html?overview-summary.html
WebCenter Portalには、JDeveloperで使用できるウィザードが用意されており、PDK-Javaポートレットの初期フレームワークを短時間で簡単に作成できます。
この項の内容は、次のとおりです。
JDeveloperで「Oracle PDK-Javaポートレットの作成」ウィザードを使用すると、短時間で簡単にPDK-Javaポートレットを作成できます。実装するポートレットのモード、および各モードで使用する実装メソッド(JSP、HTTPサーブレット、JavaクラスまたはHTML)を選択できます。さらに、ウィザードによって、選択したモードごとに簡単な実装を作成します。
JDeveloperウィザードを使用して、PDK-Javaポートレットを作成するには:
JDeveloperで、ポートレットの作成先であるポートレット・プロデューサ・アプリケーションを開くか、新規ポートレット・プロデューサ・アプリケーションを作成します。
ポートレット・プロデューサ・アプリケーションの作成方法の詳細は、第57.4.1項「ポートレット・プロデューサ・アプリケーション」を参照してください。
注意: WebCenter Portal - ポートレット・プロデューサ・アプリケーション・テンプレートを使用せずに、ポートレット・プロデューサ・アプリケーションを作成する場合は、テクノロジ・スコープを構築する適切なポートレットをアプリケーションに手動で追加する必要があります。 WebCenter Portal - Frameworkアプリケーション・テンプレートを使用して構築されたアプリケーションは、ポートレット作成用にスコープ設定されていません。 |
ポートレットの作成先であるプロジェクト(「ポートレット」など)を右クリックし、「新規」を選択します。
注意: 既存のプロデューサでポートレットを作成するには、プロデューサの |
「新規ギャラリ」で「Web層」を開き、「ポートレット」、「Oracle PDK-Javaポートレット」の順に選択し、「OK」をクリックします。
「Oracle PDK-Javaポートレットの作成」ウィザードの「プロバイダの詳細」ページで、ポートレットを含める新規プロデューサの名前を入力します。この名前は、プロジェクト内で一意である必要があります。
ヒント: PDK-Javaでは、プロデューサではなく「プロバイダ」という用語を使用します。プロバイダは、プロデューサと同じです。 |
「デプロイメント・プロパティ・ファイルの生成」を選択します。
これによって、以下の2つの.properties
ファイルが自動的に生成されます。
serviceID
.properties
は、そのサービスIDを持つプロデューサのプロパティを定義します。サービスIDは、プロデューサ名と同じ値です。
_default.properties
は、デフォルトのプロパティ・ファイルです。プロデューサ・アプリケーションには複数のプロデューサがある場合があり、プロデューサごとに固有のサービスIDを持ちます。登録時に、サービスIDが定義されていない場合は、デフォルトのプロパティ・ファイルが使用されます。
「XMLエントリの生成」を選択します。
これによって、ウィザードによって生成されるものも含めて、プロデューサに属するポートレットの詳細を含むプロデューサ定義ファイル(provider.xml
)が自動的に生成されます。
「索引JSPの生成」を選択し、「次へ」をクリックします。
これによって、アプリケーション内に存在するプロデューサと、プロデューサのテスト・ページへのアクセスを簡単にするハイパーリンクをすべてリストしたindex.jsp
ファイルが自動的に生成されます。
「一般ポートレット情報」ページで、ポートレットの名前および表示名を入力します。
この名前は内部的に使用され、ユーザーには公開されません。表示名は、コンポーネント・パレットなどのポートレット選択リストでユーザーに対して表示されます。
この説明は、Portal Frameworkアプリケーションには実装されないため、ポートレットをOracle Portalなどの他のアプリケーションで使用する可能性がない場合は、このフィールドに値を入力する必要はありません。
タイムアウト間隔(秒)フィールドに、ポートレットのレンダリングに与える秒数を入力します。
「タイムアウト・メッセージ」フィールドに、ポートレットのレンダリングが指定したタイムアウト間隔を超えた場合に表示するメッセージを入力し、「次へ」をクリックします。
「ビュー・モード」ページの「ページの表示」で、「実装スタイル」ドロップダウン・リストからポートレットの共有画面モードで使用する実装スタイルを選択します。
ポートレットの共有画面モードをJavaServer Pageとして実装するには、「JSP」を選択します。「ファイル名」フィールドに、ウィザードで生成するファイルの名前を入力します。
ポートレットの共有画面モードをHTTPサーブレットとして実装するには、「HTTPサーブレット」を選択します。「パッケージ名」フィールドに、HTTPサーブレットを格納するパッケージの名前を入力します。「クラス名」フィールドに、ポートレットの共有画面モードとともに参照するJavaクラスを入力します。
ポートレットの共有画面モードをHTMLファイルとして実装するには、「HTMLファイル」を選択します。「ファイル名」フィールドに、ウィザードで生成するファイルの名前を入力します。「HTMLファイル」を選択すると、provider.xml
ファイルの<renderer>
要素内に、次のコードが追加されます。
<showPage class="oracle.portal.provider.v2.render.http.ResourceRenderer"> <resourcePath>provider_id/portlet_name/file.html</resourcePath> <contentType>content_type</contentType> <charSet>char_set</charSet> </showPage>
charSet
は、プロデューサがHTMLページのエンコードに使用する必要があるキャラクタ・セットを示します。デフォルトのキャラクタ・セットは、JDeveloperのプリファレンスによって決まります。別のキャラクタ・セットが必要な場合は、それに応じて、provider.xml
のこの要素を更新する必要があります。
ポートレットの共有画面モードをJavaクラスとして実装するには、「Javaクラス」を選択します。「パッケージ名」フィールドに、Javaクラスを含むパッケージの名前を入力します。「クラス名」フィールドに、Javaクラスの名前を入力します。
共有画面モードの詳細は、第57.4.2.1項「表示モード」を参照してください。
ポートレットに全画面モードを実装するには、「詳細ページの表示」を選択し、手順11の共有画面モードの説明に従って、実装スタイルを選択します。
ウィザードのこの時点で、「終了」をクリックし、残りのすべての設定にデフォルト値を使用することで、ポートレットをすぐに作成できます。
ポートレットにその他の詳細を指定するには、「次へ」をクリックし、残りの手順を実行します。
「カスタマイズ・モード」ページの「ページの編集」は、デフォルトで選択されています。ポートレットに編集モードを実装するには、手順11の共有画面モードの説明に従って、実装スタイルを選択します。編集モードを実装しない場合は、「ページの編集」を選択解除します。
編集モードの詳細は、第57.4.2.2項「編集モード」を参照してください。
ポートレットにデフォルト編集モードを実装するには、「デフォルト・ページの編集」を選択し、手順11の共有画面モードの説明に従って、実装スタイルを選択します。
デフォルト編集モードの詳細は、第57.4.2.3項「デフォルト編集モード」を参照してください。
「次へ」をクリックします。
「追加モード」ページで、ポートレットにヘルプ・モードを実装するには、「ヘルプ・ページ」を選択し、手順11の共有画面モードの説明に従って、実装スタイルを選択します。
ヘルプ・モードの詳細は、第57.4.2.4項「ヘルプ・モード」を参照してください。
ポートレットに情報モードを実装するには、「ページ情報」を選択し、手順11の共有画面モードの説明に従って、実装スタイルを選択します。
情報モードの詳細は、第57.4.2.5項「情報モード」を参照してください。
「次へ」をクリックします。
「パブリック・ポートレット・パラメータ」ページで、「追加」をクリックし、パブリック・パラメータをポートレットに追加します。
パラメータの表に新しい行が追加されます。行の各フィールドをダブルクリックして、パラメータの名前、表示名および説明を入力します。
さらにパブリック・パラメータを追加するには、この手順を繰り返します。完了したら、「次へ」をクリックします。
パブリック・ポートレット・パラメータにより、ポートレットは、格納されているページやそのページの他のポートレットと通信できるようになります。詳細は、第60.3.3項「パブリック・パラメータの実装方法」を参照してください。
Portal Frameworkアプリケーションでは、Oracle PDK-Javaイベントはサポートされていないため、「パブリック・ポートレット・イベント」ページで、「終了」をクリックします。
イベントの詳細は、Oracle Fusion Middleware Oracle Portal開発者ガイドを参照してください。
「Oracle PDK-Javaポートレットの作成」ウィザードを使用すると、JDeveloperでは、ポートレットのデフォルト実装を生成します。具体的には、次のファイルが作成されます。
選択した各ポートレット・モードのファイル(例、portletname
EditPage.jsp.
)。
provider.xml
: プロデューサ定義ファイルで、そのプロデューサに属するポートレットの詳細が含まれます。
web.xml
: アプリケーションのWebデプロイメント・ディスクリプタ・ファイルです。
weblogic.xml
: PDK-Java共有ライブラリを指定する共有ライブラリ定義が含まれます。
index.jsp
: JDeveloperで、テスト用に使用されます。
_default.properties
: デフォルトのプロパティ・ファイルです。
serviceID
.properties
: serviceIDで識別されるプロデューサのプロパティ・ファイルです。
ポートレットの正常なデプロイおよび実行には、これらのすべてのファイルが必要です(index.jsp.
は除きます)。
これらのすべてのファイルは、アプリケーション・ナビゲータで表示できます(図60-1)。
「Oracle PDK-Javaポートレットの作成」ウィザードを使用して初期ポートレット実装を構築すると、次の手順では、ポートレットのコンテンツおよび動作を制御するコードを作成します。
次のOracle Fusion Middleware Oracle PDK-Java Java APIリファレンスで、PDK-JavaのJavaDocリファレンスを参照してください。
http://docs.oracle.com/cd/E23943_01/apirefs.1111/e10691/index.html?overview-summary.html
この項の内容は、次のとおりです。
この項で参照される多数の例のソース・コードは、Portlet Developer's Kit (PDK)の一部として使用できます。
PDK-Javaを解凍すると、次の場所に例があります。
../pdk/jpdk/v2/src/oracle/portal/sample/v2/devguide
WebCenter Portalで使用するPDK-Javaポートレットを構築する場合、次の事項を考慮する必要があります。
ポートレットには、リクエストでポートレットによって明示的に追加されなかったURLの書式またはパラメータに依存するコードを含めないでください。
ポートレットのモードに関係なく、作成したポートレットがページ上で唯一のポートレットであると想定しないでください。たとえば、ポートレットが編集モードであっても、自分のポートレットがページ上の唯一のポートレットであるとは考えないでください。
簡単にリダイレクトするポートレット・モードを記述しないでください。リダイレクトは、ポートレットに対するポストの処理中、またはポートレットによって生成されたリンクをたどる間にのみ発行できます。
ポートレット・モードを追加するには、「Oracle PDK-Javaポートレットの作成」ウィザードの各ページで該当するボックスを選択します。ウィザードの使用の詳細は、第60.2.1項「PDK-Javaポートレットの作成方法」を参照してください。ウィザードで選択する各ポートレット・モードに対しては、基本スケルトンが作成されます。ポートレットの作成後にポートレット・モードを追加する場合は、provider.xml
の更新およびHTMLまたはJSPをJDeveloperで作成することにより実行できます。
RenderManager
を使用してポートレット・モードを実装する際の原則は、すべてのモードに対して同じです。
この項で使用されるPDK実行時クラスの詳細は、次のOracle Fusion Middleware Oracle PDK-Java Java APIリファレンスのJavaDocを参照してください。
http://docs.oracle.com/cd/E23943_01/apirefs.1111/e10691/index.html?overview-summary.html
ポートレット・モードを追加するには:
JDeveloperで、ポートレットを含むアプリケーションを開きます。
ポートレットを含むプロジェクトを開きます。
「Webコンテンツ」ノード、htdocsノード、プロデューサのノードの順に開きます。
ポートレットのノードを右クリックし、「新規」を選択します。
ヒント: ポートレットのノードは、Webコンテンツ > htdocs > プロバイダにあります。 |
「新規ギャラリ」で「Web層」を開き、「HTML」または「JSP」を選択し、「OK」をクリックします。
ポートレットに追加する各モードに対して、HTMLファイルまたはJSPを作成する必要があります。たとえば、ヘルプ・モードを実装するには、HTMLファイルを作成して、ヘルプ・コンテンツを提供する必要があります。
表示されたダイアログに、HTMLファイルのファイル名またはJSPを入力し、「OK」をクリックします。
ビジュアル・エディタで、ページのコンテンツを編集し、必要な機能を実装します。
たとえば、ヘルプ・モードの場合、次のHTMLを追加できます。
<p>This is the <i>Help</i> mode of your portlet!</p>
アプリケーション・ナビゲータで、ポートレットを所有するプロバイダのprovider.xml
ファイルを右クリックし、「開く」を選択します。
ヒント:
|
追加中のモードの該当するタグの値をtrue
に変更します。
たとえば、ヘルプ・モードを追加している場合、hasHelp
タグを次のように変更します。
<hasHelp>true</hasHelp>
これにより、そのモードへのリンクまたはアイコンをレンダリングする必要があることをPDKフレームワークに示します。
HTMLページ、またはそのモードに対して以前作成したJSPを指定するようにコードを追加します。
たとえば、ヘルプ・ページの場合、次のコードを追加します。
<helpPage>/htdocs/myprovider/myportlet/myHelpPage.html</helpPage>
変更内容を保存します。
PDK-JavaおよびWebCenter Portal Frameworkは、再利用可能で複雑なポートレットを簡単に作成できるように、パブリック・ポートレット・パラメータおよびプライベート・ポートレット・パラメータを提供しています。「Oracle PDK-Javaポートレットの作成」ウィザードでは、パラメータを使用するように設定されているポートレットを作成します。この機能によって、開発者はビジネス・ロジックをポートレットに追加するのみで、provider.xml
を変更する必要はありません。
「Oracle PDK-Javaポートレットの作成」ウィザードを使用すると、パブリック・パラメータによりポートレットを簡単に作成できます。プロデューサを登録し、ページ上にポートレットをドロップすると、ポートレットのパラメータがページの変数に自動的にリンクされます。
注意: 各ポートレットのデータは4Kに制限されています。パラメータ、イベント名、表示名および説明の各長さもすべてこの4Kの制限に対するカウント対象に含まれます。そのため、各ポートレットに対して必要以上の数のパラメータやイベントを使用しないこと、またはこれらの名前や説明を長くしないことが必要です。 |
パブリック・パラメータを使用してポートレットを作成するには:
JDeveloperで、ポートレットを含むアプリケーションを開きます。
ポートレットの作成先であるプロジェクトを右クリックし、「新規」を選択します。
注意: 既存のプロデューサでポートレットを作成するには、プロデューサの |
「新規ギャラリ」で「Web層」を開き、「ポートレット」、「Oracle PDK-Javaポートレット」の順に選択し、「OK」をクリックします。
「パブリック・ポートレット・パラメータ」ページが表示されるまで、「Oracle PDK-Javaポートレットの作成」ウィザードの手順を進めます。
ウィザードの使用に関する基本情報は、第60.2.1項「PDK-Javaポートレットの作成方法」を参照してください。
「パブリック・ポートレット・パラメータ」ページで、「追加」をクリックします。
パラメータの表に新しい行が追加されます。
パラメータの「名前」、「表示名」および「説明」フィールドのデフォルト値を、よりわかりやすい値に置換します。
必要に応じてパラメータを追加し、「終了」をクリックします。
アプリケーション・ナビゲータで、ポートレットを所有するプロバイダのprovider.xml
ファイルを右クリックし、「開く」を選択します。
provider.xml
ファイルは、「Webコンテンツ」→WEB-INF→「プロバイダ」→「プロバイダ」にあります。
ウィザードの「パブリック・ポートレット・パラメータ」ページで追加したパラメータのエントリが表示されます(例60-1)。
例60-1 provider.xmlのサンプル、パブリック・パラメータ
<?xml version = '1.0' encoding = 'UTF-8'?><?providerDefinition version="3.1"?> <provider class="oracle.portal.provider.v2.DefaultProviderDefinition"> <session>false</session> <passAllUrlParams>false</passAllUrlParams> <preferenceStore class= "oracle.portal.provider.v2.preference.FilePreferenceStore"> <name>prefStore1</name> <useHashing>true</useHashing> </preferenceStore> <portlet class="oracle.portal.provider.v2.DefaultPortletDefinition"> <id>1</id> <name>MyPortlet</name> <title>My Portlet</title> <description>My Portlet Description</description> <timeout>40</timeout> <showEditToPublic>false</showEditToPublic> <hasAbout>false</hasAbout> <showEdit>true</showEdit> <hasHelp>false</hasHelp> <showEditDefault>false</showEditDefault> <showDetails>false</showDetails> <inputParameter class= "oracle.portal.provider.v2.DefaultParameterDefinition"> <name>Parameter_01</name> <displayName>Parameter_01</displayName> <description>My first parameter</description> </inputParameter> <inputParameter class= "oracle.portal.provider.v2.DefaultParameterDefinition"> <name>Parameter_02</name> <displayName>Parameter_02</displayName> <description>My second parameter</description> </inputParameter> <inputParameter class= "oracle.portal.provider.v2.DefaultParameterDefinition"> <name>Parameter_03</name> <displayName>Parameter_03</displayName> </inputParameter> <renderer class="oracle.portal.provider.v2.render.RenderManager"> <renderContainer>true</renderContainer> <renderCustomize>true</renderCustomize> <autoRedirect>true</autoRedirect> <contentType>text/html</contentType> <showPage>/htdocs/myportlet/MyPortletShowPage.jsp</showPage> <editPage>/htdocs/myportlet/MyPortletEditPage.jsp</editPage> </renderer> <personalizationManager class= "oracle.portal.provider.v2.personalize.PrefStorePersonalizationManager"> <dataClass> oracle.portal.provider.v2.personalize.NameValuePersonalizationObject </dataClass> </personalizationManager> </portlet> </provider>
アプリケーション・ナビゲータで、ポートレットのportletname
ShowPage.jsp
を右クリックし、「開く」を選択します。
ファイルは、「Webコンテンツ」→htdocs→「プロバイダ」→「ポートレット」にあります。
ポートレットには、パラメータを取得するためのロジックが含まれます(図60-1)。
例60-2 ShowPage.jspのサンプル
<%@page contentType="text/html; charset=windows-1252" import="oracle.portal.provider.v2.render.PortletRenderRequest" import="oracle.portal.provider.v2.http.HttpCommonConstants" import="oracle.portal.provider.v2.ParameterDefinition" %> <% PortletRenderRequest pReq = (PortletRenderRequest) request.getAttribute(HttpCommonConstants.PORTLET_RENDER_REQUEST); %> <P>Hello <%= pReq.getUser().getName() %>.</P> <P>This is the <b><i>Show</i></b> render mode!</P> <% ParameterDefinition[] params = pReq.getPortletDefinition().getInputParameters(); %> <p>This portlet's input parameters are...</p> <table align="left" width="50%" ><tr><td><span class="PortletHeading1">Name</span></td><td><span class="PortletHeading1">Value</span></td></tr> <% String name = null; String value = null; String[] values = null; for (int i = 0; i < params.length; i++) { name = params[i].getName(); values = pReq.getParameterValues(name); if (values != null) { StringBuffer temp = new StringBuffer(); for (int j = 0; j < values.length; j++) { temp.append(values[j]); if (j + 1 != values.length) { temp.append(", "); } } value = temp.toString(); } else { value = "No values have been submitted yet."; } %> <tr> <td><span class="PortletText2"><%= name %></span></td> <td><span class="PortletText2"><%= value %></span></td> </tr> <% } %> </table>
ポートレットに、ユーザーが入力したパラメータ値を送信できるようにするロジックを追加します。
同じ手順を使用して、取得するパラメータ値を表示するだけの2番目のポートレットを作成します。
Portal Frameworkアプリケーションに、プロデューサを登録します。詳細は、第63.2.2項「WebCenter Portal FrameworkアプリケーションへのOracle PDK-Javaポートレット・プロデューサの登録」を参照してください。
2つのポートレットをアプリケーションのページに追加します。詳細は、第63.5項「ページへのポートレットの追加」を参照してください。
アプリケーション・ナビゲータの「構造」ウィンドウで、ページの要素を右クリックし、「ページ定義に移動」を選択します。
例60-3のようなページ定義が表示されます。ページ・レベルの変数とポートレット・レベルのパラメータに注意してください(太字で表示)。
例60-3 ページ定義ファイルのサンプル
<?xml version="1.0" encoding="UTF-8"?> <pageDefinition xmlns="http://xmlns.oracle.com/adfm/uimodel" version="10.1.3.38.90" id="untitled1PageDef" Package="view.pageDefs"> <executables> <variableIterator id="variables"> <variable Name="portlet1_Parameter_01" Type="java.lang.Object"/> <variable Name="portlet1_Parameter_02" Type="java.lang.Object"/> <variable Name="portlet1_Parameter_03" Type="java.lang.Object"/> </variableIterator> <portlet id="portlet1" portletInstance="/oracle/adf/portlet/PdkPortletProducer1_1153936627784 /applicationPortlets/Portlet1_abfc5a10_010c_1000_8003_82235f50d831" class="oracle.adf.model.portlet.binding.PortletBinding" xmlns="http://xmlns.oracle.com/portlet/bindings"> <parameters> <parameter name="Parameter_01" pageVariable="portlet1_Parameter_01"/> <parameter name="Parameter_02" pageVariable="portlet1_Parameter_02"/> <parameter name="Parameter_03" pageVariable="portlet1_Parameter_03"/> </parameters> </portlet> </executables> </pageDefinition>
アプリケーションを実行します。
最初のポートレットに値を入力すると、同じ値が2番目のポートレットに表示されます。
場合によっては、ポートレット・インスタンスのみが認識できるパラメータが必要なことがあります。これらのパラメータは、ページには関係がなく、ポートレットに対してのみ認識されるため、プライベート・パラメータとして知られています。プライベート・パラメータは、ポートレットのナビゲーション作成中に思いがけずに役に立つことがよくあります。たとえば、複数のページで構成されているポートレットがある場合、プライベート・パラメータを使用して、ポートレットの別のリソースにジャンプできます。
この項の内容は、次のとおりです。
プライベート・パラメータは、標準的なWebアプリケーションで情報をブラウザのリンクまたはフォームからサーバーに渡すために使用されます。サーバーはこれに対して処理を行い、適切なコンテンツを戻します。たとえば、ディクショナリWebサイトのユーザーがハリネズミに関する情報を求めると、サーバーに送信されるURLには、プライベート・パラメータが次のように追加されます。
http://dictionary.reference.com/search?q=Hedgehog
サーバーがページ全体のレンダリングを担当し、クライアントがサーバーと直接通信する場合、このURLのフォームは非常に役に立ちます。Portal Frameworkアプリケーションの場合、クライアントはポートレットと直接通信しません。かわりに、WebCenter Portal Frameworkが、クライアントとポートレットの間を仲介します。また、ほとんどのページには複数のポートレットがあるため、WebCenter Portal Frameworkは複数のポートレットと通信します。
たとえば、ページにシソーラス・ポートレットとディクショナリ・ポートレットという2つのポートレットがあるとします。これら2つのポートレットはq
をパラメータとして使用して、ユーザーによって実行された検索問合せを記録します。ユーザーがシソーラス・ポートレットを問い合せる場合、更新されたシソーラス・ポートレットがあるページを再リクエストするためのURLには、シソーラス・ポートレットのパラメータq
を含める必要があります。また、このシソーラス・パラメータは、このポートレットに対して同じ機能を実行するディクショナリ・ポートレット・パラメータ1とは区別する必要があります。
ポートレットが、次の基準を満たしていることを確認する必要があります。
ポートレット独自のパラメータがリンクおよびフォームに組み込まれるときにポートレットがこれらのパラメータを正しく修飾していること。
ポートレットに属さないパラメータをポートレットで変更しないこと。
次のAPIコールは、非修飾パラメータ名を修飾パラメータ名に変換します。
HttpPortletRendererUtil.portletParameter(HttpServletRequest request, String param);
HttpPortletRendererUtil
は、パッケージoracle.portal.provider.v2.render.http
に含まれています。
例:
qualParamQ = HttpPortletRendererUtil.portletParameter(r, "q");
受信リクエストからポートレット・パラメータの値をフェッチするには、次のAPIを使用します。
注意: このAPIは、受信リクエストから値をフェッチする前にパラメータ名を修飾パラメータ名に変換します。このため、この手順を実行する必要はありません。 |
PortletRenderRequest.getQualifiedParameter(String name)
PortletRenderRequest
は、パッケージoracle.portal.provider.v2.render
に含まれています。
例:
valueQ = r.getQualifiedParameter("q");
プライベート・パラメータに関するポートレットの役割には、ポートレットに属さないURLパラメータを妨害しないという側面もあります。このルールに準拠するために使用するユーティリティの詳細は、第60.3.4.3項「ポートレットのURLタイプを使用したリンクの構築」および第60.3.4.4項「ポートレットのURLタイプを使用したフォームの構築」を参照してください。
ポートレットが自身をレンダリングする場合、WebCenter Portal Frameworkではポートレットに様々なURLを渡し、ポートレットはそれらを使用してリンクをレンダリングします。これらのURLをフェッチし、操作して、リンク作成のタスクを簡略化できます。ポートレットに提供されるURLのリストは、次のとおりです。
PAGE_LINKは、ポートレット・インスタンスがあるページのURLです。このURLは、すべてのポートレット内リンクのベースとして使用します。ユーザーを同じポートレットの別のセクションにナビゲートするリンクをポートレットでレンダリングする場合、このナビゲーションは、PAGE_LINKを使用してパラメータ・セットとしてエンコードする必要があります。
DESIGN_LINK: ポートレットのパーソナライズ(編集モード)ページのURLです。ポートレットの編集モードおよびデフォルト編集モードは、ポートレットと同じページにはレンダリングされません。編集モードおよびデフォルト編集モードは、ブラウザ・ウィンドウ全体を占有します。ポートレットの編集モードおよびデフォルト編集モードは、必ずしもすべてのユーザーがアクセスできるわけではありません。これは、ポートレットがそのパーソナライズ・オプションを自由にレンダリングできる最小限の静的フレームワークです。このURLを使用するのは、「パーソナライズ」リンクをレンダリングする場合のみです。
BACK_LINKは、ポータルが自身をレンダリングする現行ページから戻る便利なポイントのURLです。たとえば、ポートレットがそのパーソナライズ・ページ(編集モード)をレンダリングする場合、このリンクは、ポートレットがあり、ユーザーがパーソナライズ・ページへナビゲートした元のページを参照します。そのため、このリンクは、保留中のアクションを受け入れる、または取り消すボタンにエンコードします。このURLは、ポートレットのデスクトップ・レンダリングでのみ役に立ちます(通常は編集またはデフォルト編集モード)。
ポートレットのURLタイプを使用してリンクを構築するには、ポートレットのレンダリング・コードの作成時にアクセスして使用する必要があります。リンクのURLをフェッチするには、PDK-Javaで次のAPIをコールします。
portletRenderRequest.getRenderContext().getPageURL() portletRenderRequest.getRenderContext().getEventURL() portletRenderRequest.getRenderContext().getDesignURL() portletRenderRequest.getRenderContext().getLoginServerURL() portletRenderRequest.getRenderContext().getBackURL()
ポートレットのナビゲーションでは、ページURLにポートレットのパラメータを追加(または更新)する必要があります。このタスクを実行するには、次のAPIを使用して適切なURLを構築します。
UrlUtils.constructLink( PortletRenderRequest pr, int linkType, -- UrlUtils.PAGE_LINK in this case NameValue[] params, boolean encodeParams, boolean replaceParams)
UrlUtils
は、oracle.portal.provider.v2.url
と呼ばれるパッケージに含まれています。実際には自分自身でページURLをフェッチすることはありません。かわりに、提供されているポートレットのURLタイプUrlUtils.PAGE_LINK
を使用します。
params
引数のパラメータ名は完全に修飾されている必要があります。また、パラメータが正しく修飾されている場合、適切なlinkType
を持つUrlUtils.constructLink
は、ポートレットに属さない他のURLパラメータを妨害しません。
UrlUtils.contructLink
の代替バージョンは、URLを受け入れて、それを、戻されるURLのベースとします。HTMLリンクが必要な場合、UrlUtils.constructHTMLLink
を使用して完全なアンカー要素を作成できます。
次のポートレット例であるThesaurusLink.jsp
では、パラメータq
を使用して、シソーラスで検索する単語を識別します。次に、見つかった関連単語についてのリンクが作成され、ユーザーはこのリンクをたどり、その新しい単語に影響するシソーラスを取得します。値q
を設定する初期の送信フォームの詳細は、第60.3.4.4項「ポートレットのURLタイプを使用したフォームの構築」の例を参照してください。
<% String paramNameQ = "q"; String qualParamNameQ = HttpPortletRendererUtil.portletParameter(paramNameQ); PortletRenderRequest pRequest = (PortletRenderRequest) request.getAttribute(HttpCommonConstants.PORTLET_RENDER_REQUEST); String paramValueQ = pRequest.getQualifiedParameter(paramNameQ); %> <!-- Output the HTML content --> <center> Words similar to <%= paramValueQ %> <br> Click the link to search for words related to that word. <br> <ul> <% String[] relatedWords = Thesaurus.getRelatedWords(paramValueQ); NameValue[] linkParams = new NameValue[1]; for (int i=0; i<=relatedWords.length; i++) { linkParams[0] = new NameValue( qualParamNameQ, relatedWords[i]); %> <li> <b> <%= relatedWords[i] %> </b> <%= UrlUtils.constructHTMLLink( pRequest, UrlUtils.PAGE_LINK, "(words related to " + relatedWords[i] + ")", "", linkParams, true, true)%> </li> <% } %> </ul> </center>
フォームでポートレット・パラメータを使用する方法は、リンクで使用する方法とほぼ同じです。次の2つの基本的ルールが同様に適用されます。
ポートレットのパラメータ名を修飾します。
受信URLのその他のパラメータは操作や削除はしません。
マークアップおよび動作の点では、フォームとリンクはかなり異なります。ただし、リンクの場合と同様、PDK-Javaにはこれら2つの基本ルールに準拠するためのユーティリティが含まれています。
ページ上のリンクにしてもフォーム要素の名前にしても、パラメータ名は単なる文字列です。そのため、ポートレットのパラメータ名を正しく修飾するためのコードは、第60.3.4.3項「ポートレットのURLタイプを使用したリンクの構築」に記載されているコードと同じです。
フォームは、URLのその他のパラメータは変更しないままにする必要があるという点でリンクとは異なります。マークアップでフォームを開くと、次のAPIを使用できます。
UrlUtils.htmlFormHiddenFields(pRequest,UrlUtils.PAGE_LINK, formName); UrlUtils.htmlFormHiddenFields(someURL);
この場合、formName = UrlUtils.htmlFormName(pRequest,null)
です。
注意: ページに複数のフォームがある可能性があるため、フォーム名は完全に修飾する必要があります。これは、ページ上のその他のポートレットと競合するのを避けるために、URLのパラメータとフォームの要素名に修飾が必要であるのと同様です。 |
htmlFormHiddenFields
ユーティリティは、HTMLの非表示フォーム要素をフォームに書き込みます。この場合、指定したURLの、ポートレットに属さないパラメータごとに1つのフォーム要素を書き込みます。
<INPUT TYPE="hidden" name="paramName" value="paramValue">
このため、ポートレットのパラメータをフォームに追加するのみでよいのです。
他に注意する必要があるのは、フォームの送信ターゲットを導出する方法です。多くの場合、送信ターゲットは現行のページです。
formTarget = UrlUtils.htmlFormActionLink(pRequest,UrlUtils.PAGE_LINK)
formTarget
の値には、HTMLフォームのアクション属性やSimpleForm
のターゲット属性を使用できます。メソッド名にHTMLが含まれている場合でも、実際にはURLを戻すのみであるため、これはモバイル・ポートレットでも使用できます。
次の例のフォームは、シソーラス・ポートレットの送信フォームをレンダリングします。このフォームの送信結果であるポートレットに関しては、第60.3.4.3項「ポートレットのURLタイプを使用したリンクの構築」の例を参照してください。
<% String paramNameSubmit = "submit"; String paramNameQ = "q"; String qualParamNameQ = HttpPortletRendererUtil.portletParameter(paramNameQ); String qualParamNameSubmit = HttpPortletRendererUtil.portletParameter(paramNameSubmit); PortletRenderRequest pRequest = (PortletRenderRequest) request.getAttribute(HttpCommonConstants.PORTLET_RENDER_REQUEST); String formName = UrlUtils.htmlFormName(pRequest,"query_form"); %> <!-- Output the HTML content --> <center> <b>Thesaurus</b> Enter the word you want to search for <form name="<%= formName %>" method="POST" action="<%= UrlUtils.htmlFormActionLink(pRequest,UrlUtils.PAGE_LINK) %>"> <%= UrlUtils.htmlFormHiddenFields(pRequest,UrlUtils.PAGE_LINK, formName)%> <table><tr><td> Word of interest: </td><td> <input type="text" size="20" name="<%= qualParamNameQ %>" value=""> </td></tr></table> <input type=submit name="<%= qualParamNameSubmit %>" Value="Search"> </form> </center>
ポートレット内でナビゲーションを実装する方法には、次の3つがあります。
プライベート・ポートレット・パラメータを使用して、レンダリングされるURLにナビゲーション情報を渡します。このURLに基づいて、ポートレット・コード内のブランチ・ロジックは、どのポートレットのセクションをレンダリングするのかを確認できます。このオプションは、第60.3.4.3項「ポートレットのURLタイプを使用したリンクの構築」および第60.3.4.4項「ポートレットのURLタイプを使用したフォームの構築」に示すシソーラス例を少し拡張したものです。基本的には、パラメータ値q
を使用してシソーラス検索操作を実行するのではなく、ポートレットがパラメータ値に基づいて分岐し、それに応じて別のコンテンツをレンダリングします。
前の項目と同じようにナビゲーション情報を渡します。ただし、PDK-Javaを使用してパラメータを解釈し、その値に基づいて分岐してください。このオプションでは、シソーラスの例を一部変更する必要があるため、この項の後半でその詳細を説明します。
セッション記憶域を使用してポートレットの状態およびプライベート・パラメータを記録し、明示的なナビゲーションではなくアクションを示します。ポートレットが含まれるページからユーザーが移動した際にポートレットを前の状態にリストアできるのは、この方法のみです。ユーザーがこのページから移動すると、すべてのプライベート・ポートレット・パラメータは失われ、セッション記憶域にある状態のみをリストアできます。ただし、その状態がセッション記憶域に格納されていることが前提です。このオプションを使用するには、セッション記憶域について理解し、これを実装する必要があります。セッション記憶域の実装の詳細は、第60.3.6項「セッション情報へのアクセス方法」を参照してください。
次のポートレット・コードは、PDK-Javaのサンプル・プロデューサのマルチページ例の一部です。
<portlet>
<id>11</id>
<name>Multipage</name>
<title>MultiPage Sample</title>
<shortTitle>MultiPage</shortTitle>
<description>
This portlet depicts switching between two screens all
in an application page.
</description>
<timeout>40</timeout>
<timeoutMessage>MultiPage Sample timed out</timeoutMessage>
<renderer class="oracle.portal.provider.v2.render.RenderManager">
<contentType>text/html</contentType>
<showPage>/htdocs/multipage/first.jsp</showPage>
<pageParameterName>next_page</pageParameterName>
</renderer>
</portlet>
注意:
|
シソーラスの例をこのパラメータで動作するように変更できます。特に、フォーム送信ポートレットをシソーラスの入力用(ポートレットの先頭ページ)として使用し、シソーラス内をさらにドリルダウンしていくためのリンクが含まれる結果ページにユーザーをナビゲートできます。次の例は、これらの変更内容を示します。
注意: 次の例は、このシソーラスの例のように、比較的簡単なケースの場合に最も役に立ちます。ウィザードの使用経験を積む必要があるなど、より込み入った必要性がある場合は、StrutsなどのMVCフレームワークを使用することを検討してください。Strutsアプリケーションからポートレットを構築する方法の詳細は、第60.6項「Strutsポートレットの作成」を参照してください。 |
ThesaurusForm.jsp
:
<% PortletRenderRequest pRequest = (PortletRenderRequest) request.getAttribute(HttpCommonConstants.PORTLET_RENDER_REQUEST); String paramNameSubmit = "submit"; String paramNameQ = "q"; String qualParamNameQ = HttpPortletRendererUtil.portletParameter(pRequest, paramNameQ); String qualParamNameSubmit = HttpPortletRendererUtil.portletParameter(pRequest, paramNameSubmit); String formName = UrlUtils.htmlFormName(pRequest,"query_form"); %> <!-- Output the HTML content --> <center> <b>Thesaurus</b> Enter the word you want to search for <form name="<%= formName %>" method="POST" action="<%= UrlUtils.htmlFormActionLink(pRequest,UrlUtils.PAGE_LINK) %>"> <%= UrlUtils.htmlFormHiddenFields(pRequest,UrlUtils.PAGE_LINK, formName) %> <%= UrlUtils.emitHiddenField( HttpPortletRendererUtil.portletParameter(request, "next_page"), "htdocs/path/ThesaurusLink.jsp" ) %> <table><tr><td> Word of interest: </td><td> <input type="text" size="20" name="<%= qualParamNameQ %>" value=""> </td></tr></table> <input type=submit name="<%= qualParamNameSubmit %>" Value="Search"> </form> </center>
ThesaurusLink.jsp
を指し示すためにnext_page
を明示的に設定する必要がありますので、その方法に留意してください。この方法でnext_page
を明示的に設定しない場合、このパラメータは、provider.xml
に登録されているリソース(ThesaurusForm.jsp
)にデフォルト設定されます。
ThesaurusLink.jsp
:
<% PortletRenderRequest pRequest = (PortletRenderRequest) request.getAttribute(HttpCommonConstants.PORTLET_RENDER_REQUEST); String paramNameQ = "q"; String paramNameNextPage = "next_page"; String qualParamNameQ = HttpPortletRendererUtil.portletParameter(pRequest, paramNameQ); String qualParamNameNextPage = HttpPortletRendererUtil.portletParameter(pRequest, paramNameNextPage); String paramValueQ = pRequest.getQualifiedParameter(paramNameQ); %> <!-- Output the HTML content --> <center> Words similar to <%= paramValueQ %> <br> Click the link to search for words related to that word. <br> <ul> <% Thesaurus t = new Thesaurus(); String[] relatedWords = t.getRelatedWords(paramValueQ); NameValue[] linkParams = new NameValue[2]; linkParams[0] = new NameValue( qualParamNameNextPage, "htdocs/path/ThesaurusLink.jsp"); for (int i=0; i<relatedWords.length; i++) { linkParams[1] = new NameValue( qualParamNameQ, relatedWords[i]); %> <li> <b> <%= relatedWords[i] %> </b> <%= UrlUtils.constructHTMLLink( pRequest, UrlUtils.PAGE_LINK, "(words related to " + relatedWords[i] + ")", "", linkParams, true, true)%> </li> <% } %> </ul> <a href="<%=XMLUtil.escapeXMLAttribute (pRequest.getRenderContext().getPageURL())%>"> Reset Portlet </a> </center>
プライベート・パラメータによるナビゲーションの実装では、制限を必要とするポートレット・リソースにユーザーが移動することを制限します。制限されたリソースへのナビゲーションを制御するには、ユーザーが移動できる受入れ可能リソースのwhitelistを作成します。ナビゲーションを制限するためのホワイトリストを作成しないと、ポートレットのリソースは、次のデフォルト・ルールに従ってアクセス可能になります。
サーブレット・ルート直下のパスはナビゲート可能です。たとえば、/index.jsp
はアクセス可能ですが、/WEB-INF/web.xml
にはアクセスできません。
htdocs
ディレクトリの下のパスはナビゲート可能です。たとえば、/htdocs/multipage/first.jsp
と/htdocs/lottery/lotto.jsp
はどちらもアクセス可能です。
このデフォルトの動作を変更するには、許容できるパス値をプロバイダ定義ファイルprovider.xml
に追加します。たとえば、pageParameterName
プライベート・パラメータに応じて、リクエストを他のページに転送するコントローラとして、JSPが使用されるポートレットがあるとします。例60-4のXMLの抜粋では、/htdocs/multiportlet
の下のリソースが表示されます。その他のリソースは、すべて制限されます。
例60-4 provider.xmlファイルからのホワイトリストの抜粋
<portlet class="oracle.portal.provider.v2.DefaultPortletDefinition">
<id>1</id>
<name>Multipage</name>
<title>A MultiPage Portlet</title>
...
<renderer class="oracle.portal.provider.v2.render.RenderManager">
<contentType>text/html</contentType>
<showPage>/htdocs/multiportlet/controller.jsp</showPage>
<pageParameterName>show_page</pageParameterName>
<allowedPath>/htdocs/multiportlet/*</allowedPath>
</renderer>
</portlet>
この機能のパターン一致ルールは、web.xml
ファイルのURLパターン一致と類似しています。この規則は次のとおりです。
定義されたパターンに一致する場合、リソース・パスは、ワイルドカードが使用されないかぎり、正解に一致する必要があります。
最初のワイルドカードはパス一致のためのもので、/
で始まり/*
で終わる文字列で構成されています。パスがこの文字列で始まるリソースは一致します。/htdocs/sub1/*
の<allowedPath>
値の場合、プライベート・パラメータの有効値には、/htdocs/sub1/file.jsp
と/htdocs/sub1/sub2/file2.jsp
が含まれます。
2番目のワイルドカードはタイプ一致のためのもので、*.
で始まりファイル拡張子で終わる文字列で構成されています。ページ・パラメータの有効値は、そのファイル拡張子で終わります。*.jsp
の<allowedPathvalue>
の場合、プライベート・パラメータの有効値には、/htdocs/sub1/file.jsp
と/htdocs/sub1/file2.jsp
が含まれます。
Javaポートレットを作成する場合、JNDIサービスを介してデプロイ固有のプロパティを設定し、これらの値をプロデューサ・コードから取得できるようにします。この方法により、プロデューサ・デプロイに任意のプロパティを指定し、プロデューサ・コード内の任意の場所からこのプロパティに簡単にアクセスできます。
JNDI変数を使用して、プロデューサのデプロイ後にプロデューサ・プロパティ値を変更できます。環境エントリはweb.xml.
で宣言する必要があります。また、デプロイメント・プランを使用してデプロイで更新できます。
PDK-Javaには、Java EEコンテナ内のプロデューサJNDI変数と非プロデューサJNDI変数の両方を取得できるユーティリティが用意されています。
この項の内容は、次のとおりです。
JNDI変数は、プロデューサのweb.xml
ファイルで宣言します。JNDI変数を宣言するための書式は、次のとおりです。
<env-entry> <env-entry-name>variableName</env-entry-name> <env-entry-type>variableType</env-entry-type> <env-entry-value>variableValue</env-entry-value> </env-entry>
env-entry-name
要素にはこの変数を識別する名前が含まれます。env-entry-type
にはこの変数の完全修飾されたJava型が含まれます。env-entry-value
にはこの変数のデフォルト値が含まれます。
この項の内容は、次のとおりです。
env-entry-type
要素では、Javaコードによって予期される、完全修飾Java型変数を指定する必要があります。JNDI変数で使用可能なJava型は、次のとおりです。
java.lang.Boolean
java.lang.String
java.lang.Integer
java.lang.Double
java.lang.Float
Java EEコンテナは、これらの型宣言を使用して指定された型のオブジェクトを自動的に構成し、コードで変数を取得する際に指定された値をオブジェクトに設定します。
PDK-Javaは、個々のプロデューサ・サービス・レベルまたはWebアプリケーション・レベルで設定可能な環境変数を定義します。同じWebアプリケーションにパッケージ化されている様々なプロデューサ・サービスやアプリケーション・コンポーネントの間で命名が競合しないようにするには、特定の命名規則を策定することをお薦めします。
注意:
|
例:
プロデューサ・サービス固有名の書式は、次のようにする必要があります。
company/component name/producer name/variable name
共有名の書式は、次のようにする必要があります。
company/component name/producer name/global
ここで:
company
: アプリケーションを所有する会社名です。
component name
: プロデューサが関連付けられているアプリケーションまたはコンポーネントの名前です。
producer name
: プロデューサのサービス名です。
variable name
: 変数自体の名前です。
これらの命名規則は、Javaパッケージに使用されている命名規則と似ています。この方法により、アプリケーションまたはアプリケーション・コンポーネントの間で名前が衝突する可能性を最小限に抑えることができます。PDK-Javaには、プロデューサのサービス名をサーブレットまたはJSPにハードコーディングせずにこの書式の変数を取得するためのユーティリティが用意されています。このサービス名は、プロデューサのWARファイルに定義しておくのみでよいのです。JNDI変数の取得の詳細は、第60.3.5.3項「JNDI変数の取得」を参照してください。
次の例は、プロデューサの変数名を示します。
oracle/portal/myProvider/myDeploymentProperty oracle/portal/myprovider/myProperties/myProperty
次の例は、プロデューサ以外の変数名を示します。
oracle/portal/myOtherProperty
プロデューサ・デプロイでは、JNDI変数の一部またはすべてに対して新しい値を設定できます。このタスクは、WLSのデプロイメント・プラン内で値を手動で設定することで実行できます。WLSコンソールを使用して、プロデューサ・デプロイメントに対するデプロイメント・プランを作成できます。
デプロイメント・プラン内で変数値を手動で設定するには:
WLSコンソールを使用してプロデューサ・デプロイメントに移動し、新規デプロイメント・プランを作成します(存在しない場合)。
デプロイメント・プランのXMLファイルを編集します。設定するデプロイのプロパティごとに、次の変数定義を<deployment-plan>
タグの直下に追加します。
<variable-definition> <variable> <name>jndi_var_def</name> <value>false</value> </variable> </variable-definition>
この変数定義を実際のJNDI変数に結び付けるには、WEB-INF/web.xml
モジュール・ディスクリプタ(oracle/portal/sample/rootDirectory
を例として使用します)の下の各プロパティに次の変数定義を追加します。
<module-descriptor external="false"> <root-element>web-app</root-element> <uri>WEB-INF/web.xml</uri> <variable-assignment> <name>jndi_var_def</name> <xpath>/web-app/env-entry/[env-entry-name="oracle/portal/sample/rootDirectory"]/env-entry-value</xpath> </variable-assignment> </module-descriptor>
ファイルを保存して閉じます。
プロデューサ・デプロイメントで「更新」を選択し、新規設定のデプロイメント・プランを有効にします。
JNDIは、標準Java EEテクノロジです。そのため、Java EE APIを使用してJNDI変数にアクセスできます。例:
String myVarName = "oracle/portal/myProvider/myVar"
String myVar = null;
try
{
InitialContext ic = new InitialContext();
myVar = (String)ic.lookup("java:env/" + myVarName);
}
catch(NamingException ne)
{
exception handling logic
}
基本的なJava EE API以外にも、PDK-Javaには、PDK自体によって定義および使用される変数値を取得するための単純なユーティリティ・クラスが用意されています。これらの変数は、第60.3.5.1.2項「変数の命名規則」で説明されている命名規則に準拠しており、その書式は次のとおりです。
oracle/portal/provider_service_name/variable_name oracle/portal/variable_name
これらのAPIを使用するには、provider_service_name
およびvariable_name
を指定するのみでよいのです。このユーティリティは、指定された情報に基づいて完全なJNDI変数名を構成し、前に示したものと類似のコードを使用して変数を参照し、変数値を戻します。
EnvLookup
クラス(oracle.portal.utils.EnvLookup
)には、2つのlookup()
メソッドがあります。一方はプロデューサ変数を取得し、他方は非プロデューサ変数を取得します。どちらのメソッドもjava.lang.Object
を戻します。これは、目的のJava型にキャストできます。
次のコード例では、プロデューサ変数を取得しています。
EnvLookup el = new EnvLookup(); String s = (String)el.lookup(myProviderName, myVariableName);
変数名の中のmyProviderName
は、プロデューサのサービス名です。myVariableName
は、プロデューサのサービス名の後ろに続く部分の変数名です。この例では、取得される変数の型がjava.lang.String
であると想定しています。
非プロデューサ変数を取得するには、同じコードを使用し、1つのパラメータ、変数名のみをlookup()
に渡します。また、この場合、接頭辞oracle/portal
は除きます。
EnvLookup el = new EnvLookup();Object o = el.lookup(myVariableName);
表60-1は、デフォルトでPDK-Javaに用意されているJNDI変数を示します。これらの変数を宣言しない場合、PDK-Javaは、元の場所(web.xml
およびデプロイ・プロパティ・ファイル)でこれらの値を検索します。
表60-1 PDK-JavaのJNDI変数
変数 | 説明 |
---|---|
oracle/portal/provider/provider_name/autoReload
|
ブール型の自動リロード・フラグ。デフォルト値はtrueです。 |
oracle/portal/provider/provider_name/definition
|
プロデューサの定義ファイルの場所。 |
oracle/portal/provider/global/log/logLevel |
ログ設定(0から8)。0はロギングなし、8は最大限のロギング。 |
oracle/portal/provider/provider_name/maxTimeDifference
|
プロデューサのHMAC時間差。 |
oracle/portal/provider/<service_name>/resourceUrlKey |
Parallel Page Engineによるリソースのプロキシ化の認証キー。詳細は、Oracle Fusion Middleware Oracle Portal管理者ガイドを参照してください。 |
oracle/portal/provider/provider_name/rootDirectory
|
プロデューサのパーソナライズの場所。デフォルト値はありません。 |
oracle/portal/provider/provider_name/sharedKey
|
HMAC共有キー。デフォルト値はありません。 |
oracle/portal/provider/provider_name/showTestPage
|
(非プロデューサ)プロデューサのテスト・ページにアクセス可能どうかを決定するブール型フラグ。デフォルト値はtrueです。 |
oracle/portal/provider/global/transportEnabled |
「デフォルトの編集」のパーソナライズをエクスポートおよびインポート可能かを決定するブール型フラグ。 |
ユーザーがページにアクセスすると、ページではパブリックの認証されていないセッションを開始し、リクエスト全体のセッションに関する情報を追跡します。ユーザーがログインすると、このセッションはログイン・ユーザーの認証済セッションとなります。このセッションは、次の場合に終了します。
ブラウザ・セッションが終了したとき(つまり、ユーザーがすべてのブラウザ・ウィンドウを閉じたとき)
ユーザーが明示的にログアウトしたとき
ユーザーのアイドル時間が設定時間を超えたためにセッションがタイムアウトしたとき
ポートレットをページに提供するプロデューサが、なんらかの特別な処理のためにコールされるように登録時に指定している場合、メタデータ生成の一環として、プロデューサすべてに連絡します。このコールにより、プロデューサは、ユーザー・セッションに基づいて処理を行い、必要に応じてプロデューサのアプリケーションのユーザーをログに記録し、プロデューサ・セッションを確立できるようになります。プロデューサの場合、このコールはinitSession
と呼ばれます。Web対応型アプリケーションのほとんどはCookieを使用してセッションを追跡するため、アプリケーションのプロデューサはCookieを戻すのにこのAPIコールを利用できます。
セッション・ストアを使用すると、ポータル・セッションの間存続する情報を保存および取得できます。この情報が有効で使用可能なのは、そのセッションの存続期間中のみです。セッション・ストアに格納するのは、一時情報のみです。アプリケーション開発者はこのセッション・ストアを使用して、現行のユーザー・セッションに関する情報を格納できます。セッション・ストアのデータは複数のポートレット間で共有できます。
格納する情報を複数のセッションにわたって存続させる必要がある場合は、セッション・ストアのかわりにプリファレンス・ストアに格納できます。一般的なセッション・ストアの適用例を次に示します。
ロードや演算にコストがかかるデータ(たとえば、検索結果)をキャッシュする場合。
ポートレットの現在の状態(たとえば、ポートレットに表示された検索結果の現在の範囲(ページ)やユーザーが実行したイベントの順序)をキャッシュする場合。
セッション記憶域を実装する前には、パフォーマンス・コストを慎重に検討する必要があります。ポートレットとプロデューサはリモートであるため、セッション・ストアに情報を作成して保持する操作は、少ない情報量であっても比較的コストがかかる可能性があります。このため、多数のユーザーが頻繁にアクセスするパブリック・ページについては、セッション記憶域の実装を避けた方がよい場合があります。
また、プロデューサでセッション・ストアを使用する場合は、メモリー内の状態情報を追跡するステートフル・アプリケーションを作成します。同様に、プリファレンス・ストアのファイル・システム実装を使用する場合も、ステートフルなアプリケーションを作成します。
スケーラビリティに重要な関心がある場合、ステートフルなアプリケーションは問題発生の原因となる可能性があります。ステートフルなアプリケーションは、使用している構成のロード・バランシングとフェイルオーバー・メカニズムに影響を与えることがあります。これは、複数の中間層をデプロイしても、状態を追跡するためには面倒なルーティング(同じノードが後続のリクエストを同じセッションで処理する)を実装する必要があるためです。このルーティングによって、ノードがクラッシュした場合に不均衡なロード・バランスやセッション・データの消失が発生し、フェイルオーバーに影響を与えることがあります。多くの開発者がステートレスなアプリケーションの構築を選ぶ理由の1つはここにあります。ただし、スケーラビリティが問題でない場合、ステートフルなアプリケーションによる問題は発生しません。
PDKフレームワークでは、セッションをProviderSession
オブジェクトを使用して表します。このオブジェクトはプロバイダ・インスタンスのinitSession
メソッドへのコールの際に確立されます。このオブジェクトは、ProviderUser
と関連付けられています。リクエスト間でデータを永続的に保持するには、ProviderSession
オブジェクトのsetAttribute
メソッドを使用してセッション・オブジェクトにデータを書き込む必要があります。このメソッドはjava.lang.Object
をjava.lang.String
にマップし、そのマッピングをセッション・オブジェクト内に格納します。String
は、その後、セッションがまだ有効である場合、後続のリクエスト中にObject
を取得するために使用できます。
次のような場合は、プロデューサ・セッションが無効になることがあります。
セッションがタイムアウトした場合
ProviderSession
上のinvalidate
メソッドがコールされた場合
サーブレット・コンテナを実行中のJVMプロセスが終了した場合
同じProviderInstance
に含まれるすべてのポートレットは、特定のProviderUser
に対して同じセッションを共有します。したがって、特定のポートレット・インスタンスに対して一意のデータは、セッション内の一意のString
にマップする必要があります。これは、PortletRendererUtil
クラス内のportletParameter
メソッドを使用して行います。このメソッドは、そのインスタンス用に生成された識別子を先頭に付けることで、提供されたString
パラメータまたは属性名をPortletInstance
に対して一意にします。戻されたインスタンス固有の名前を使用すると、セッションにポートレット・インスタンス・データを書き込むことができます。
PDKフレームワーク・クラスの詳細は、次のOracle Fusion Middleware Oracle PDK-Java Java APIリファレンスのJavaDocを参照してください。
http://docs.oracle.com/cd/E23943_01/apirefs.1111/e10691/index.html?overview-summary.html
この項の例では、共有画面モードでポートレットをレンダリングした回数をカウントするために、セッション記憶域を使用します。
セッション記憶域を実装するには:
ProviderSession
、PortletRendererUtil
およびHttpPortletRendererUtil
をインポートします。
プロデューサ・セッションを取得します。
Javaポートレット内からセッションにアクセスして、セッションの読取りと書込みを行います。
provider.xml
でsessionをtrueに設定します。
セッション記憶域のプロデューサを登録し、「ログイン頻度」を設定します。
次に、現行セッションでポートレットがレンダリングされた回数を表示するセッション・カウントをポートレットに追加する手順を説明します。
ウィザードを使用してポートレットを作成した後は、Oracle JDeveloperの「表示」ページのJSPを編集できます。次のクラスをインポートする必要があります。
<%@page contentType="text/html; charset=windows-1252" import="oracle.portal.provider.v2.render.PortletRenderRequest" import="oracle.portal.provider.v2.http.HttpCommonConstants" import="oracle.portal.provider.v2.ProviderSession" import="oracle.portal.provider.v2.render.PortletRendererUtil" import="oracle.portal.provider.v2.render.http.HttpPortletRendererUtil" %>
最初に有効なセッションをチェックし、次にカウントを増分して表示するコードを挿入します。セッションが有効で、以前に格納した値が存在する場合は、その値を表示し、カウントを増分して新しい値を格納します。セッションは有効だが以前に格納した値がない場合は、カウントを1に初期化し、その値を表示して格納します。また、このポートレットの一意の文字列キーを取得し、その文字列キーを配列で使用してセッションをカウントできます。セッション情報を受信しなかった場合は、ユーザーに対して、再度ログインが必要であることを示す情報を提供できます。
<% PortletRenderRequest pReq = (PortletRenderRequest) request.getAttribute(HttpCommonConstants.PORTLET_RENDER_REQUEST); ProviderSession pSession = pReq.getSession(); if (pSession != null) { String key = PortletRendererUtil.portletParameter(pReq, "count"); Integer i = (Integer)pSession.getAttribute(key); if (i == null) { i = new Integer(0); } i = new Integer(i.intValue()+1); pSession.setAttribute(key, i); %> <p>Render count in this session: <%=i%> </p> <% } else { %> <p>The session has become invalid</p> <br> Please log out and log in again. <% } %>
デフォルトでは、ウィザードでprovider.xml
のsessionをtrueに設定することはありません。プロデューサがポータルからセッション情報を受信するためには、このフラグを更新する必要があります。このタグをtrueに設定する必要があるのは、プロデューサまたはポートレットでセッション情報を使用する場合のみです。このフラグをtrueに設定すると、プロデューサ・コールに余分なロードが追加されます。
<provider class="oracle.portal.provider.v2.DefaultProviderDefinition">
<session>true</session>
プロデューサをセッション・サポートに登録します。ポートレットの登録方法の詳細は、第63.2.2項「WebCenter Portal FrameworkアプリケーションへのOracle PDK-Javaポートレット・プロデューサの登録」を参照してください。
Javaポートレットをページに追加していない場合は、ここで追加します。次のタスクを実行します。
プロデューサをリフレッシュして新しい変更内容を反映させます。
セッションがすでに無効の場合は、再度ログインします。
ポートレットの基本機能の設定が完了した後は、ポートレットのパフォーマンスに注目する必要があります。
キャッシュは、高度な動的コンテンツを含むWebサイトのパフォーマンスの向上に使用される一般的な手法です。JSR 286ポートレットでは、有効期限ベースおよび有効化ベースのキャッシュがサポートされています。
キャッシュの詳細は、第57.4.5項「ポートレット・パフォーマンス」を参照してください。
この項の内容は、次のとおりです。
でキャッシュ機能をプロデューサで使用するには、最初に、中間層キャッシュをアクティブにする必要があります。このキャッシュは、mod_plsql
(データベース・プロシージャおよびデータベース・プロデューサをHTTPでコールするOracle HTTP Serverプラグイン)で使用されるキャッシュと同じであるため、PL/SQLキャッシュと呼ばれます。
通常、キャッシュに関する構成詳細の責任は、管理者にあります。
有効期限ベースのキャッシュは、実装が簡単なキャッシュ・スキームであり、XMLプロデューサ定義内で宣言によってアクティブにできます。使用するManagedRenderer
の出力には、出力のキャッシュ時間(分)をそのpageExpires
プロパティに設定することによって、有効期限を設定できます。
有効期限ベースのキャッシュを追加するには:
「Oracle PDK-Javaポートレットの作成」ウィザードを使用してポートレットを構築(第60.2.1項「PDK-Javaポートレットの作成方法」を参照してください)した後で、provider.xml
ファイルを編集し、showPage
のpageExpires
プロパティ・タグを必要な値に設定します。たとえば、ポートレット出力を1分間キャッシュするには、pageExpires
を1
に設定します。
デフォルトでは、ウィザードによって、showPage
の圧縮された標準的なタグが生成されます。pageExpires
のサブタグを含めるには、タグを次のように拡張します。
<showPage class="oracle.portal.provider.v2.render.http.ResourceRenderer">
<resourcePath>/htdocs/mycacheportlet/MyCachePortletShowPage.jsp
</resourcePath>
<pageExpires>1</pageExpires>
</showPage>
JSPコードを表示ページに追加して、ポートレットが1分間キャッシュされることをテストします。ここでは、現在の時刻をJSPに追加します。
<%@page contentType="text/html; charset=windows-1252" import="oracle.portal.provider.v2.render.PortletRenderRequest" import="oracle.portal.provider.v2.http.HttpCommonConstants" import="java.util.Date" import="java.text.DateFormat" %> <% PortletRenderRequest pReq = (PortletRenderRequest) request.getAttribute(HttpCommonConstants.PORTLET_RENDER_REQUEST); DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG,pReq.getLocale()); String time = df.format(new Date()); %> <P>Hello <%=pReq.getUser().getName() %>.</P> <P>This is the <b><i>Edit</i></b> render mode!</P> <P>This information is correct as of <%=time%>.</P>
ポートレットを表示して、時間(秒を含む)が1分間で一定していることを確認します。時間が経過すると、ポートレットは最新の時刻を表示し、新しいキャッシュが設定されます。
有効化ベースのキャッシュの追加は多少複雑ですが、プロデューサに対するどのリクエストがキャッシュ・ヒットであるかを厳密に制御できます。ここでは、ポートレット内のデータが変更された場合のみキャッシュを更新する例を説明します。このアルゴリズムを実装するには、prepareResponse
メソッドをオーバーライドする必要があります。BaseManagedRenderer.prepareResponse
メソッドの署名は次のとおりです。
public boolean prepareResponse(PortletRenderRequest pr) throws PortletException, PortletNotFoundException
prepareResponse()
のバージョンで次の手順を実行します。
キャッシュされたバージョン識別子を取得します。この識別子は、HttpPortletRendererUtil.getCachedVersion()
メソッドをコールすることで、コンシューマによってレンダリング・リクエストに設定されます。
public static java.lang.String getCachedVersion (PortletRenderRequest request)
以前にキャッシュされたバージョンが有効であることをポートレットが検出した場合は、HttpPortletRendererUtil.useCachedVersion()
メソッドをコールして適切なヘッダーを設定する必要があります。また、RenderManager
に対しては、ポートレット本体をレンダリングするためにrenderBody()
をコールする必要がないことが指示されます。
public static void useCachedVersion(PortletRenderRequest request)
これ以外の場合は、HttpPortletRendererUtil.setCachedVersion()
を使用して、新規バージョンのポートレットを生成し、このポートレットがキャッシュされます。また、コンシューマに対しては、renderBody()
メソッドをコールして、ポートレットのコンテンツを再生成する必要があることが指示されます。
public static void setCachedVersion(PortletRenderRequest request, java.lang.String version, int level) throws java.lang.IllegalArgumentException
有効化ベースのキャッシュの場合、provider.xml
を更新する必要はありません。ポートレットを表示するには、ページをリフレッシュするか、ポートレットをページに追加してコンテンツを更新します。コンテンツが変更されている場合、ポートレットは新しいコンテンツを表示します。コンテンツが変更されていない場合は、キャッシュされたバージョンのポートレットが表示されます。
ポートレット永続ストアは、コンシューマ登録ハンドルおよびポートレット・プリファレンス・データを永続的に保持するために使用されます。PDK-Javaポートレット・プロデューサは、永続ストアの2つのタイプ(ファイルまたはデータベース)のいずれかを使用できます。永続ストアで使用されるデータベースは、JDBC対応である必要があります。
詳細は、第57.4.4項「ポートレットのパーソナライズとカスタマイズ」を参照してください。
この項の内容は、次のとおりです。
PDK-Javaプロデューサで使用される永続ストアのタイプは、provider.xml
ファイルのpreferenceStore
タグによって決まります。
表60-2に、preferenceStore
タグで使用される属性およびパラメータとその説明を示します。
表60-2 preferenceStoreタグの属性およびパラメータ
属性/パラメータ | 説明 |
---|---|
|
この必須属性は、ポートレット・プリファレンスの場所およびその他の詳細を定義するJavaクラスを指定します。たとえば、ファイルベースの永続ストアでは、次のクラスが使用されます。
データベースの永続ストアでは、次のクラスが使用されます。
OmniPortletでは、たとえば、次の独自のクラスが使用されます。
|
|
この必須パラメータは、永続ストアの名前を指定します。選択する任意の値を使用します。例:
<preferenceStore class="oracle.portal.provider.v2.preference.DBPreferenceStore">
<name>MyPDKProducerPreferenceStore</name>
</preferenceStore>
|
|
データベースの永続ストアのこの必須パラメータは、ポートレット永続ストアを含むスキーマと接続するJNDI接続を指定します。例:
<preferenceStore class="oracle.portal.provider.v2.preference.FCFDBPreferenceStore">
<name>MyPDKProducerPreferenceStore</name>
<connection>java:comp/env/jdbc/portletPrefs</connection>
</preferenceStore>
|
|
このオプション・パラメータは、ファイルベースの永続ストア・プリファレンスが格納されている場所を指定します。このパラメータが |
|
このオプション・パラメータは、ファイルベースの永続ストアを指定する際に使用され、 例: <preferenceStore class="oracle.portal.provider.v2.preference.FilePreferenceStore"> <name>PDKProducerPreferenceStore</name> <useHashing>true</useHashing> </preferenceStore> |
PDK-Javaには、DBPreferenceStore
およびFilePreferenceStore
の2つのPreferenceStore
実装があります。DBPreferenceStore
にはJDBC対応のリレーショナル・データベースを使用するデータが保存され、FilePreferenceStore
にはファイル・システムを使用するデータが保存されます。
Oracle PDK-Javaをインストールしている場合は、プリファレンス・ストア移行およびアップグレード・ユーティリティを使用して永続ストアに格納されている情報を管理できます。このユーティリティはpdkjava.jar
ファイルにあります。このツールは、WC_ORACLE_HOME
から実行する必要があります。
注意: このツールを実行して、 java -classpath WC_ORACLE_HOME\wlserver_10.3\server\lib\ojdbc6.jar; WC_ORACLE_HOME\jdeveloper\webcenter\modules\oracle.portlet.server_11.1.1\pdkjava.jar; WC_ORACLE_HOME\jdeveloper\webcenter\modules\oracle.portlet.server_11.1.1\ptlshare.jar oracle.portal.provider.v2.preference.MigrationTool |
移行ユーティリティの構文は次のとおりです。
java oracle.portal.provider.v2.preference.MigrationTool -mode [file | db | filetodb | filetofile | dbtofile | dbtodb] [-remap language | locale] [-countries iso_country_code] [-pref1UseHashing true | false] [-pref1Driver driver] {-pref1RootDirectory directory | -pref1User username -pref1Password password -pref1URL url} [-pref2UseHashing true | false] [-pref2Driver driver] {-pref2RootDirectory directory | -pref2User username -pref2Password password -pref2URL url} [-upfixwpi filename]
ここで
-mode
は、プリファレンス・ストア移行およびアップグレード・ユーティリティを実行するモードです。
filetodb
、filetofile
、dbtofile
またはdbtodb
は、移行モードで実行することを指定します。このモードの詳細は、第60.3.8.2.1項「移行モード」を参照してください。
file
またはdb
は、アップグレード・モードで実行することを指定します。このモードの詳細は、第60.3.8.2.2項「アップグレード・モード」を参照してください。
-remap
は、localePersonalizationLevel
(言語またはロケール)です。アップグレードまたは移行の一部としてlocalePersonalizationLevel
を変更する場合にのみ、このオプションを使用する必要があります。
-countries
は、ISO国コードの優先リストを指定します。優先リストは、様々な国に再マップされたプリファレンス間で衝突が生じた場合の優先順位を示します。-countries
は、-remap
オプションも指定した場合にのみ意味があります。
-pref1UseHashing
は、この操作のためにソースに対してハッシングを使用するかどうかを指定します。
-pref1Driver
は、ソース・データベースのドライバです。このパラメータを指定しない場合は、最も近似のドライバが使用されます。
-pref1RootDirectory
は、ソース・ファイル・システムのパスです(j2ee/home/applications/jpdk/jpdk/WEB-INF/providers/sample
など)。
-pref1User
は、ソース・データベースのユーザー名です。
-pref1Password
は、ソース・データベースのパスワードです。
-pref1URL
は、ソース・データベースへのURLです(jdbc:oracle:thin:@myserver.mydomain.com:1521:mysid
など)。
-pref2UseHashing
は、この操作のために宛先に対してハッシングを使用するかどうかを指定します。
-pref2Driver
は、宛先データベースのドライバです。このパラメータを指定しない場合は、最も近似のドライバが使用されます。
-pref2RootDirectory
は、宛先ファイル・システムのパスです(j2ee/home/applications/jpdk/jpdk/WEB-INF/providers/sample
など)。
-pref2User
は、宛先データベースのユーザー名です。
-pref2Password
は、宛先データベースのパスワードです。
-pref2URL
は、宛先データベースへのURLです(jdbc:oracle:thin:@myserver.mydomain.com:1521:mysid
など)。
-upfixwpi
は、操作のログ・ファイルを指定します。
この項には次のサブセクションが含まれます:
データをソース永続ストアからターゲット永続ストアにコピーするには、移行モードを使用します。このモードでユーティリティを実行すると、すべてのポートレット定義の永続ストアが更新されます。
表60-3では、ユーティリティを実行できる移行モードについて説明します。
表60-3 ユーティリティを実行するための移行モード
モード | 説明 |
---|---|
|
|
|
1つの |
|
|
|
1つの |
操作先がデータベースの場合、宛先のWebLogic ServerがWebCenter Portalポートレット・テンプレートを使用して作成されていること、および適切なスキーマがRCUを使用して作成されていることを確認する必要があります。詳細は、Oracle Fusion Middleware Oracle WebCenter Portalインストレーション・ガイドを参照してください。
移行モードを使用中の場合、-remap
オプションおよび-countries
オプションを使用して、データが移行中にアップグレードされるように指定することもできます。特に、これらのオプションを使用して、ロケール固有のプリファレンスが適切に再マップされていることを確認します。
ユーティリティで使用できるその他のオプションを使用して、アップグレードまたは移行プロセスに必要な永続ストアのプロパティを指定します。これらのオプションは、provider.xml
に指定した、永続ストア用に記述したタグに対応している必要があります。
接頭辞が-pref1
のプロパティは、ソース永続ストア(アップグレード・モードの場合は、唯一の永続ストア)のプロパティです。たとえば、-pref1UseHashing true -pref1RootDirectory j2ee/home/applications/jpdk/jpdk/WEB-INF/providers/sample
を指定すると、ソースのFilePreferenceStore
のuseHashing
プロパティとrootDirectory
プロパティが設定されます。
移行基本モードを選択した場合、接頭辞が-pref2
のプロパティは、ターゲット永続ストアのプロパティに対応します。たとえば、-pref2User portlet_prefs -pref2Password portlet_prefs -pref2URL jdbc:oracle:thin:@myserver.mydomain.com:1521:mysid
を指定すると、ターゲットのDBPreferenceStore
にデータベース接続の詳細が設定されます。
例60-5 PDK-Java移行ユーティリティ・コマンドライン、移行
java -classpath WC_ORACLE_HOME/webcenter/modules/oracle.portlet.server_11.1.1/pdkjava.jar; WC_ORACLE_HOME/webcenter/modules/oracle.portlet.server_11.1.1/ptlshare.jar; WC_ORACLE_HOME/ucm/shared/classes/ojdbc14.jar \ oracle.portal.provider.v2.preference.MigrationTool \ -mode dbtofile \ -pref1User portlet_prefs \ -pref1Password portlet_prefs \ -pref1URL jdbc:oracle:thin:@myserver.mydomain.com:1521:mysid \ -pref2RootDirectory /mydirectory/preferences
データを適切にアップグレードし、永続ストアで既存のロケール固有のプリファレンスを変更して、使用されているネーミングの書式がWebCenter Portalの現行バージョンおよび所定のlocalePersonalizationLevel
の設定に適合するようにするには、アップグレード・モードを使用します。
表60-4では、ユーティリティを実行できるアップグレード・モードについて説明します。
表60-4 ユーティリティを実行するためのアップグレード・モード
モード | 説明 |
---|---|
|
|
|
|
アップグレード・モードは、次のような場合に使用できます。
Oracle PDK 9.0.4.0.0以前からアップグレードして、既存のポートレットをデフォルトの言語設定localePersonalizationLevel
で使用する場合(旧リリースでは、デフォルトの設定はlocale
でした)。
Oracle Portal 9.0.2.0.0以前のリリースからアップグレードする場合で、localePersonalizationLevel
の設定がlocale
である既存のポートレットを使用する場合(Oracle Portalでは現在、一部のロケール名が変更されているため、既存のデータには再マッピングが必要なものもあります)。
既存のポートレットのlocalePersonalizationLevel
の設定をlocale
からlanguage
に変更する場合。またはその反対に変更する場合。
アップグレード・モードを使用する際、-remap
オプションを使用して、アップルグレードする目的のlocalePersonalizationLevel
(language
またはlocale
)を指定する必要があります。-countries
オプションを使用して、ISO国コードの優先リストを指定し、様々な国に対して再マップされたプリファレンス間で衝突が生じた場合の優先順位を指定することもできます。たとえば、コマンドで-remap language -countries GB,US
と指定すると、プリファレンス・ストアでアメリカ英語のプリファレンスとイギリス英語のプリファレンス(en_US
とen_GB
)が検出された場合、イギリス英語のプリファレンスが英語全体のプリファレンス(en
)として再マップされます。
例60-6 PDK-Java移行ユーティリティ・コマンドライン、アップグレード
java -classpath WC_ORACLE_HOME/webcenter/modules/oracle.portlet.server_11.1.1/pdkjava.jar: WC_ORACLE_HOME/webcenter/modules/oracle.portlet.server_11.1.1/ptlshare.jar:WC_ORACLE_HOME/ucm/shared/classes/ojdbc14.jar \ oracle.portal.provider.v2.preference.MigrationTool \ -mode file -remap language -countries GB,US -pref1UseHashing true -pref1RootDirectory j2ee/home/applications/jpdk/jpdk/WEB-INF/providers/sample
場合によっては、ポートレット・プロデューサを移動することがあります。たとえば、新規サーバーに移動する必要がある場合があります。
PDK-Javaポートレット・プロデューサを移動するには:
新規プロデューサをインストールします。
次のタスクのいずれかを実行して、元のプロデューサの永続ストアを新規プロデューサで使用できるようにします。
プリファレンス・ストア移行およびアップグレード・ユーティリティを使用して、永続ストアを移行します(詳細は、第60.3.8.2項「PDK-Javaプロデューサの永続ストアの移行」を参照してください)。または
新規プロデューサを構成して、元のプロデューサと同じ永続ストアを使用します。データベースの永続ストアを使用中の場合、WebLogic Serverデータ・ソースを元のプロデューサと同じデータベースに指定する必要があります。
Enterprise Manager Fusion Middleware ControlまたはWLSTコマンド(setWSRPProducerRegistration
またはsetPDKJavaProducerRegistration
)を使用して、プロデューサ登録のURLを更新します。
設計時にポートレット・プロデューサをエクスポートおよびインポートできます。詳細は、第59.3.14項「設計時にポートレット・プロデューサをエクスポートおよびインポートする方法」を参照してください。
ポートレットを本番環境にデプロイする前に、まず、期待通りに動作することを確認するためにテストすることを強くお薦めします。
この項の内容は、次のとおりです。
第60.4.1項「統合WebLogic ServerでのPDK-Javaポートレット・プロデューサ・アプリケーションのテスト方法」
第60.4.2項「統合WebLogic ServerでPDK-Javaポートレット・プロデューサ・アプリケーションをテストする場合の処理」
統合WebLogic Server (統合WLS)には、ポートレットを短時間で簡単にテストする方法が用意されています。このテスト方法では、JDeveloper内でアプリケーションを実行できるように事前に構成されているため、デプロイメント・プロファイルを作成する必要はありません。
PDK-Javaポートレットを統合WLSでテストするには:
JDeveloperで、テストするポートレットが属するポートレット・プロデューサ・アプリケーションを開きます。
ポートレット・プロジェクト(「ポートレット」など)を開きます。
「JSP」ページ(プロジェクト・フォルダのindex.jsp
など)を右クリックし、「実行」を選択します。index.jsp
を実行すると、アプリケーションを基準に名付けられた統合WLSのインスタンスで、ポートレット・プロデューサ・アプリケーションのパッケージ化およびデプロイがトリガーされます。
「IntegratedWebLogicServer - ログ」ウィンドウを確認し、デプロイの進行状況を監視します。ログには、アプリケーション・テスト・ページのURLが表示されます(図60-2)。URLの書式は、http://
host:port/application_name
-Portlets-context-root/index.jsp
です。
PDK-Javaアプリケーション・テスト・ページは、ブラウザ・ウィンドウで表示されます(図60-3)。
「サービス名」の下にあるリンクをクリックします。ブラウザが開き、図60-4に示すようなページが表示されます。このページのURLは、プロデューサを別のアプリケーションに登録する際に必要です。
または、次のようにURLを自分で構成できます。
http://host:port/context-root/providers/producer_name
ここで:
host
は、プロデューザがデプロイされているサーバーです。
port
はHTTPリスナー・ポートです。通常、7101
です。サーバーが起動すると、ポートがコンソールに表示されます。
context-root
は、先に指定したWebアプリケーションのコンテキスト・ルートで、「WARデプロイメント・プロファイルのプロパティ」の「一般」にあります。
producer_name
は、ポートレット・プロデューサの名前です。WARファイルには、複数のプロデューサが含まれていることがあるため、常にわかりやすいプロデューサ名にする必要があります。そうしないと、作成した最初のプロデューサをデフォルト・プロデューサとして取得することになります。デフォルト・プロデューサは、_default.properties
ファイルで定義されます。これは、プロジェクトの最初のプロデューサで作成されます。
このURLをブラウザに入力すると、図60-4に示すようなページが表示されます。
アプリケーションの実行中に、JDeveloperとブラウザを切り替え、アプリケーションを設計時に変更してその変更を保存し、ブラウザでテスト・ページをリフレッシュできます。
プロデューサが正常に実行している場合、プロデューサをアプリケーションに登録し、1つ以上のポートレットをページに追加して、それが正常に動作していることを確認する必要があります。プロデューサを登録することにより、そのプロデューサを探し、通信するために必要な情報をアプリケーションに提供します。プロデューサを登録すると、接続として表示され、プロデューサとそのポートレットは「アプリケーション・リソース」パネルの「接続」ノードまたは「リソース」パレットで使用できるようになります。
PDK-Javaポートレットのプロデューサを登録するには、第63.2.2項「WebCenter Portal FrameworkアプリケーションへのOracle PDK-Javaポートレット・プロデューサの登録」の手順に従います。
ポートレットをページに追加するには、第63.5項「ページへのポートレットの追加」の手順に従います。
統合WLSインスタンスを停止するには、「Run Manager」タブで、DefaultServerを選択し、赤い「停止」アイコンをクリックします。インスタンスが停止すると、アプリケーションはアンデプロイされ、使用できなくなります。
ヒント: 「IntegratedWebLogicServer - ログ」ウィンドウで、赤い「停止」アイコンをクリックするか、DefaultServerを選択しても、統合WLSインスタンスを停止できます。 |
PDK-Javaポートレットを統合WLSで実行すると、次のことが起こります。
PDK-Javaポートレットの構成ファイルが、WEB-INF
ディレクトリに追加されます。
web.xml
ファイルが、リスナーおよびサーバー・クラス、フィルタ、パラメータ、およびポートレット・プロデューサ・アプリケーションの正常な実行に必要なその他の構成で更新されます。
たとえば、ResourceServlet pdkresource、oracle.portlet.server.service.ContextFilter
フィルタなどです。これらの構成は、ポートレットの要件によって異なります。
PDK-Javaポートレットに必要なライブラリが、weblogic.xml
ファイルに追加されます(oracle.portlet-producer.jpdk
など)。
PDK-Javaポートレット・プロデューサ・アプリケーションを統合WLSインスタンスで実行する場合、インスタンスが停止すると、アプリケーションはアンデプロイされるため使用できなくなります。より安定したテスト・シナリオの場合、デフォルト・サーバーの実行中に常に使用できるように、ポートレット・プロデューサ・アプリケーションを統合WLSにデプロイできます。
このメソッドを選択する場合、最初にデプロイメント・プロファイルを作成する必要があります(第61.4項「WARデプロイメント・プロファイルの作成」を参照してください)。アプリケーションを統合WLSにデプロイすると、「デプロイメント構成」ダイアログが表示され、デプロイメント設定の構成およびカスタマイズができます。JDeveloperで事前作成されたファイル・システムMDSリポジトリが、「リポジトリ名」フィールドに表示されます。
統合WLSでのアプリケーションのデプロイおよび実行の詳細は、第7.2項「統合WebLogic ServerへのPortal Frameworkアプリケーションのデプロイ」を参照してください。
ポートレットのパーソナライズを実装した場合、「パーソナライズ」リンクは、認証されたユーザーのポートレットにのみ表示されます。そのため、ポートレットのパーソナライズ(「パーソナライズ」リンク)をテストするには、ポートレットを使用するアプリケーションに対して、なんらかのセキュリティを実装しておく必要があります。テストのためには、最も基本的な認証を構成すれば済みます。詳細は、第74.12項「ポートレット・パーソナライズをテストするための基本認証の構成」を参照してください。
ポートレット・プロデューサは、WebCenter Portalポートレット・プロデューサをサポートするために構成されているWebLogic管理対象サーバーにデプロイできます。デプロイの前に完了する必要がある前提条件のリストは、第61.1項「ポートレット・プロデューサのデプロイの概要」を参照してください。
PDK-Javaポートレット・プロデューサをデプロイするための最初の手順は、プロデューサとその関連付けられたファイルをパッケージ化する方法を示すWARデプロイメント・プロファイルを作成することです。詳細は、第61.4項「WARデプロイメント・プロファイルの作成」を参照してください。
PDK-JavaポートレットのみをEARファイルとしてデプロイするには、WARデプロイメント・プロファイルの作成後、アプリケーション全体をパッケージ化するEARデプロイメント・プロファイルも作成する必要があります。詳細は、第7.3.2.2項「デプロイメント・プロファイルの作成」を参照してください。
注意: EARデプロイメント・プロファイルを作成する際には、WARファイルがアプリケーションのEARファイルに含まれていることを確認します。 |
EARデプロイメント・プロファイルを作成すると、ポートレット・プロデューサを管理対象サーバーにデプロイできます。詳細は、第61.5項「WebLogic管理対象サーバーへのポートレット・プロデューサのデプロイ」を参照してください。
注意: PDK-Javaポートレット・プロデューサをデプロイする場合、プロデューサにはJSR 286ポートレットが含まれていないため、「デプロイメント・タイプの選択」ダイアログが表示されなくなります。 |
PDK-Javaポートレット・プロデューサをWebLogic管理対象サーバーにデプロイすると、構成設定(第60.4.2項「統合WebLogic ServerでPDK-Javaポートレット・プロデューサ・アプリケーションをテストする場合の処理」を参照してください)が設計時にアプリケーションのEARファイルに追加されます。
Oracle PDKには、Apache Strutsアプリケーションを統合するための拡張機能が含まれています。この項では、既存のStrutsアプリケーションからポートレットを作成する方法を説明します。また、その作成手順に従うと、Model-View-Controllerパラダイムを使用するポートレットも作成できます。この項で説明するPDK-Javaの拡張機能は、Apache Struts 1.1に準拠しています。
Strutsフレームワークを使用して、ポートレットの動作を拡張できます。たとえば、Strutsコントローラはポートレット内のページ・フローで使用できます。ポートレット・レンダラは、ポートレット・レンダリング・リクエストとStrutsサーブレット・リクエストとのブリッジとして使用されます。
次に示すコードは、プロデューサ定義ファイル(provider.xml
)の一部です。
... <renderContainer>true</renderContainer> <renderCustomize>true</renderCustomize> <autoRedirect>true</autoRedirect> <contentType>text/html</contentType> <showPage class="oracle.portal.provider.v2.render.http.StrutsRenderer"> <defaultAction>showCustomer.do</defaultAction> </showPage> </renderer> ...
StrutsポートレットのshowPage
には、次の2つの重要なコンポーネントが含まれています。
レンダー・クラス(oracle.portal.provider.v2.render.http.StrutsRenderer
)は、レンダリング・リクエストを受信し、Strutsアクション・サーブレットに転送します。
defaultAction
タグは、ポートレットが初めてコールされたときにデフォルトで使用するStrutsアクションを定義します。
PDK-Javaを使用すると、Strutsアプリケーションのビュー(ポートレット・ビュー)を簡単に開発できます。このビューによって、ポータル・スタイルを使用するStrutsポートレットでは整合性のとれたルック・アンド・フィールが維持され、エンド・ユーザーはポータル内でアプリケーションを使用できます。
Strutsポートレットを作成するには、デフォルトのStruts JSPタグの拡張であるPDK-Java Strutsタグを使用する必要があります。この開発プロセスは、スタンドアロンのStrutsアプリケーションを作成するプロセスに似ています。Strutsフレームワークを使用するプロデューサ・アプリケーションのポートレットの場合、Strutsコンポーネントは同じWebアプリケーションの一部である必要があります。
既存のStrutsアプリケーションの一部をポートレットとして公開するには、最初に、アプリケーションのポートレット・ビューとして機能する新規ビューを作成することをお薦めします。このビューでは、既存のオブジェクト(Actions
、ActionForm
など)とともに新しいマッピングとJSPを使用します。
注意: アプリケーションのポートレット・ビューを作成することをお薦めしますが、アプリケーションのStrutsタグをPDK-JavaのStrutsタグに置き換えることもできます。この方法を使用すると、アプリケーションをスタンドアロンStrutsとポートレットの両方として実行できます。 |
この例では、新規エントリをブログに追加できるポートレットを作成します。図60-5および図60-6は、ブログを送信してブログ・エントリを保存する方法を示しています。
prepareNewBlog
は、リクエストをenterNewBlog.jsp
ページにリダイレクトする単純な空のアクションです。このページには、新しいBlogを送信するためのフォームが表示されます。
struts-config.xml
で対応するエントリは次のとおりです。
<action path="/prepareNewBlog" scope="request" type="view.PrepareNewBlogAction" > <forward name="success" path="/view/enterNewBlog.jsp"/> </action> <action path="/saveNewBlog" name="blogForm" scope="request" type="view.SaveNewBlogAction" input"/view/enterNewBlog.jsp" > <forward name="success" path="/view/newBlogConfirmation.jsp"/> </action>
この項の内容は、次のとおりです。
新しいビューを作成するには、最初に、様々なアクションとリクエストをPortal固有のJSPにリダイレクトするActionMappings
(ページ・フロー)の新しいセットを作成します。
<action path="/portal/prepareNewBlog" scope="request" type="view.PrepareNewBlogAction" > <forward name="success" path="/view/portal/enterNewBlog.jsp"/> </action> <action path="/portal/saveNewBlog" name="blogForm" scope="request" type="view.SaveNewBlogAction" input="/view/enterNewBlog.jsp" > <forward name="success" path="/view/portal/newBlogConfirmation.jsp"/> </action>
変更するのはパス属性のみです。FormBean
アクションは、アプリケーションのビジネス・ロジックが変更されないようにします。
前述の手順で指定したように、アクションによってリクエストが新しいJSPに転送され、JSPでポートレットのコンテンツがレンダリングされます。新しいポートレット・ビューのJSPは、HTMLをスタンドアロン・ビューと共有できますが、ポートレットが次の条件を満たしていることを確認してください。
他のページと整合性のとれたルック・アンド・フィールを実現するスタイルが使用されていること。
HTMLの表のセルに格納できるHTMLコードが含まれていること(つまり、<html>
、<body>
および<frame>
タグ以外)。
Struts HTMLタグ・ライブラリのPDK-Javaバージョンを使用していること。これは、ポートレット・コンテキストで機能する適切な書式にURLをレンダリングします。
PDK Struts HTMLタグ・ライブラリには、ポートレット・マークアップで使用可能なStruts HTMLタグのバージョンがあります。
注意: Oracle PDKはOracle JDeveloperに登録できるため、Oracle JDeveloperのコンポーネント・パレットからタグを削除できます。詳細は、Oracle JDeveloperのオンライン・ヘルプで、JDeveloperでのカスタム・タグ・ライブラリの登録に関する項を参照してください。 |
Strutsポートレットは、手動または「Oracle PDK-Javaポートレットの作成」ウィザードを使用して作成できます。ウィザードでは明示的にStrutsサポートを提供していませんが、ウィザードを使用してStrutsポートレットを作成できます。
ポートレットを作成するには:
JDeveloperで、「Oracle PDK-Javaポートレット」ウィザードを開きます。
詳細は、第60.2.1項「PDK-Javaポートレットの作成方法」を参照してください。
「ページを表示」モードの場合、ウィザードの「ビュー・モード」ページで、「Javaクラス」の「実装スタイル」を選択します。
「パッケージ名」には、oracle.portal.provider.v2.render.http
と入力します。
「クラス名」には、StrutsRenderer
と入力します。これにより、ポートレットのレンダラ・クラスのスケルトンとしてStrutsRenderer
が生成されます。
StrutsRenderer
はPDKに含まれているため、この生成されたファイルは必要ありません。したがって、ウィザードが完了した後は、ウィザードで生成されたファイルを削除する必要があります。これを行うには、「システム・ナビゲータ」ウィンドウでファイルをクリックし、JDeveloperの「ファイル」メニューから「ディスクから削除」を選択します。
provider.xml
を編集して、次のプロパティを変更します。
プロデューサ・レベルで、次のタスクを実行します。
Strutsアプリケーションがセッションを使用する場合(たとえば、フォーム・シンクロナイザのトークン・メカニズムが使用されているか、または<actionInSession>
がtrueに設定されている場合)、セッション処理を有効にします。
<session>true</session>
ポートレット・レベルで、次のタスクを実行します。
ユーザーがコンテナ・ページを終了するたびに元のポートレット状態に戻るようにするには、StrutsアクションをStrutsコンテキストに保存するようにStrutsレンダラを構成します。
<actionInSession>true</actionInSession>
ユーザーがコンテナ・ページの外部から戻ると常にポートレットの先頭から開始するようにするには、Strutsアクションを保存しないでください。
<actionInSession>false</actionInSession>
この設定はデフォルトの動作です。
ポートレットがコールされたときに起動する最初のアクションを指定します。次のコードを使用します。
<showPage class="oracle.portal.provider.v2.render.http.StrutsRenderer"> <defaultAction>/portal/prepareNewBlog.do</defaultAction> </showPage>
アプリケーションで、ユーザーの情報、パーソナライズ、ローカライゼーションなど、環境固有のコードを追加する必要があります。これを行うために、コンテキストでのみコールでき、すべてのビジネス・ロジックを処理する新しいAction
クラスを作成できます。
ポートレットをコンシューマが使用する準備が完了すると、そのポートレットを登録してアクセス可能にする必要があります。PDK-Javaポートレットの登録方法の詳細は、第63.2.2項「WebCenter Portal FrameworkアプリケーションへのOracle PDK-Javaポートレット・プロデューサの登録」を参照してください。
この項では、PDK-Javaポートレットの作成およびテストの際に発生する可能性のある問題のトラブルシューティングに役立つ情報を提供します。
この項の内容は、次のとおりです。
問題
「新規ギャラリ」で、「Oracle PDK-Javaポートレット」オプションが表示されません。
原因
PDK-Javaポートレットを作成するアプリケーションは、WebCenter PortalのPortal Frameworkアプリケーション・テンプレートを使用して構築されているため、ポートレット作成用にスコープ設定されていません。
解決方法
ポートレット・プロデューサ・アプリケーションまたはポートレット作成用にスコープ設定されているアプリケーション(WebCenter PortalのPortal Frameworkアプリケーション・テンプレートを使用して構築されているアプリケーション以外のアプリケーション)でポートレットを作成します。
「新規ギャラリ」で、「すべてのテクノロジ」タブをクリックすると、アプリケーションのテクノロジ・スコープに関係なく、使用できるすべてのオプションがリストされます。
問題
「Oracle PDK-Javaポートレットの作成」ウィザードで、一部の機能(ポートレット・イベントまたはパブリック・レンダラ・パラメータなど)をポートレットに追加するためのオプションが表示されません。
原因
「Oracle PDK-Javaポートレットの作成」ウィザードでは、一部の機能をポートレットに追加するためのオプションが使用できません。
解決方法
「Oracle PDK-Javaポートレットの作成」ウィザードを使用してポートレットを作成後、ポートレットを編集して拡張機能を追加します。詳細は、第60.3項「PDK-Javaポートレットの開発」を参照してください。