Oracle® Fusion Middleware Oracle WebCenter Portal開発者ガイド 11g リリース1 (11.1.1.7.0) B72084-02 |
|
![]() 前 |
![]() 次 |
ページレットは、再使用可能なユーザー・インタフェース・コンポーネントです。任意のHTMLフラグメントをページレットにできますが、ページレット開発者は、パラメータ化された構成可能なページレットを記述し、その他のページレットと動的にやりとりし、ユーザー入力に応答するようにすることもできます。ページレットは、ポートレットに似ていますが、ポートレットがポータル専用に設計されていることに対して、ページレットは、ポータルやその他のWebアプリケーションを含め、あらゆるWebページで実行できます。ページレットを使用すれば、他のWeb環境でプラットフォーム固有のポートレットを公開できます。
Oracle WebCenter Portalのページレット・プロデューサ(旧Oracle WebCenter Ensemble)は、動的なページレット開発を容易にする有用なツールと機能のコレクションを提供します。この章では、ページレット・プロデューサを使用したページレットの開発および構成の詳細について説明します。詳細は、「ページレット・プロデューサ」ブログ(https://blogs.oracle.com/ensemble/
)を参照してください。
第65.1項「サーバー通信とプロキシの概要」: この項では、ページレット・プロデューサがプロキシ・サーバーとして動作し、クライアント・コンピュータと外部リソースとの間のトランザクションを仲介(ブローカ)する方法について説明します。
第65.2項「Webアプリケーションでのページレットの使用」: この項では、WebCenter Portalでのページレットの使用方法について説明します。
第65.2.1項「Oracle JDeveloperでのJSFページへのページレットの追加」: この項では、Oracle JDeveloperを使用してページレットをJSFページにドラッグ・アンド・ドロップする方法について説明します。
第65.2.2項「Webページへのページレットの追加」: この項では、JavaScriptまたはRESTを使用して、ページレットをプロキシされたまたはプロキシされていないページに挿入する方法について説明します。
第65.2.3項「WebCenter Portal: Spacesでのページへのページレットの追加」: この項では、コンポーザを使用してページレットをスペースに追加する方法について説明します。
第65.3項「ページレット・プロデューサを使用したページレットの構築」: この項では、ページレット・プロデューサを使用したページレットの構築の詳細について説明します。
第65.3.1項「アダプティブ・ページレットのスクリプティング・フレームワークの使用」: この項では、アダプティブ・ページレットのスクリプティング・フレームワークを使用し、動的でインタラクティブな機能を備えた調整されたページを作成する方法について説明します。
第65.3.2項「ページレット・プロデューサの資格証明マッピングの使用」: この項では、ページレットおよびリソースのセキュリティ設定を構成し、ユーザーの認証を管理する方法について説明します。
第65.3.3項「実行時のページレット機能の変更」: この項では、カスタムのWebインジェクタとパーサーを使用して実行時にページレットの機能を変更する方法について説明します。
第65.3.4項「ページレットのデバッグ」: この項では、ページレットのデバッグ用の拡張ロギング・トレースにアクセスする方法について説明します。
第65.4項「WSRPおよびOracle JPDKポートレットの使用」: この項では、任意のWebアプリケーションで使用するために、ページレット・プロデューサを使用してWSRPおよびOracle JPDKポートレットを表示する方法について説明します。
第65.4.1項「ページレット・クロムの使用」: この項では、ページレット・クロムを使用して、実行時にWSRPやOracle JPDKポートレットでマークアップを変更する方法について説明します。
第65.5項「OpenSocialガジェットの使用」: この項では、ページレット・プロデューサによる標準のOpenSocial APIのサポートについて概説し、ガジェットを使用してプリファレンスを格納し、OpenSocial APIを使用してWebCenter Portalからユーザー情報を取得する方法について説明します。
第65.6項「ページレットを使用したポートレット、ADFタスクフロー、OracleアプリケーションからのマークアップのOracle WebCenter Sitesへの統合」: この項では、ページレットをOracle WebCenter Sitesでコンテンツ・ソースとして使用する方法を説明します。
ページレット・プロデューサはプロキシ・サーバーとして動作し、クライアント・コンピュータと外部リソース間のトランザクションを仲介(ブローカ)します。
外部リソースのサービスは、HTTP経由でページレット・プロデューサと通信します。たとえば、ブラウザがページをリクエストすると、ページレット・プロデューサが各外部リソースに対する同時リクエストを作成し、ページからページレット・コンテンツを取得します。外部リソースは、現在のユーザーのプリファレンスをページレット・プロデューサから送信されたHTTPヘッダーから読取り、適切なHTMLを戻します。ページレット・プロデューサはHTMLをページ・マークアップに挿入します。イメージ・サービスに格納されたイメージは、ブラウザによって取得、表示されます。
プロキシ・サーバーは、クライアント・コンピュータと別のサーバー間のトランザクションを仲立ちする仲介役として動作します。この構成は通常、それ以外の方法では外部リソースにアクセスできない可能性のあるクライアントに対するコンテンツとして使用されますが、これは、ポリシーの使用も含めて、クライアントに対して追加のセキュリティ制約を課するために使用できます。プロキシでは、外部リソースは表示されません。エンド・ユーザーにとって、コンテンツはプロキシ・サーバーから直接送られてくるように見えます。
このアーキテクチャにより、ページレット・プロデューサはコンテンツの単一アクセス・ポイントとなり、外部リソースがプライベート・ネットワークやファイアウォールの内側に存在できるようになります。ページレット・プロデューサが外部リソースに接続できるかぎり、ユーザーはコンテンツに直接アクセスできない場合でも、そのコンテンツを表示できます。ブラウザにとっては、ページレット・プロデューサは外部リソースのコンテンツのソースであるように見えます。
ユーザーがサービスと相互作用する際、プロキシで行われたURLへのリクエストはすべて、ページレット・プロデューサを通して自動的に再ルーティングされます。ユーザーにとって、コンテンツはページレット・プロデューサから送信されてくるように見えます。外部リソースは不明のバックエンド・システムです。
この構成には多くのメリットがあります。サービスに最も役に立つメリットは次のとおりです。
動的な機能とパーソナライズ: ページレット・プロデューサは、ページレットからリクエストをインターセプトします。これにより、MDSに格納されている情報をHTTPリクエストとレスポンスに組み込むことができます。
セキュリティ: サービスを使用すると、ユーザーはパブリックに使用できないコンテンツにアクセスできます。特定のURLをプロキシの構成に含めることにより、保護されたサーバーに格納されているファイルが使用可能になります。
注意: プロキシは強力な機能であるため、不適切に構成された場合はセキュリティを著しく低下させます。保護されていないプライベート・コンテンツをホストしている外部リソースに直接アクセスできるようにすると、危険なセキュリティ・ギャップが生じる可能性があります。 |
パフォーマンス: ページレット・プロデューサはプロキシ・コンテンツをキャッシュし、エンド・ユーザーに対するレスポンス時間を短縮し、外部リソースのパフォーマンスを向上します。プロキシはHTMLなどのコンテンツに対しては効率的に機能しますが、静的イメージなどのバイナリ・データには通常は適していません。イメージは変換する必要がないため、大きなイメージをプロキシすると、パフォーマンスに悪影響を与える可能性があります。これが、イメージ・サービスを使用してプロキシ経由での静的イメージのルーティングを避ける必要がある1つの理由です。
サービス用にプロキシする必要があるURLのコレクションは、リソース・エディタで構成されます。リソース用に構成された内部URL接頭辞を使用する、またはプロキシされた別のCSPやWebリソースを指すすべてのURLは、「URL再書きこみの有効化」の選択を解除しないかぎり、プロキシされます。
プロキシを使用するサービスを実装する場合は、次の警告とベスト・プラクティスに留意してください。
URL変換: ページレット・プロデューサは、プロキシされるURLを正確に開くため、コードを変換する必要があります。ページレット・プロデューサは、レスポンスを送信する前に、HTMLを解析し、関連するプロデューサ・リソース用に構成された内部URL接頭辞を使用するURLを探します。ページレット・プロデューサは、レスポンスをクライアントに返す前に、プロキシするURLを変換します。関連するURLは、正しい場所を指すように変換されます。
スクリプト制限: URLを動的に作成するJavaScript構成は、コンテンツがすでに変換された後に実行されるため、問題を起こすことがあります。VBScriptはプロキシによって変換されません。使用しているコードがプロキシを認識するかぎり、動的スクリプトとVBScriptを引き続き使用できます。パーサーとWebインジェクタを使用して、URLのリライトに対するターゲット・コントロールを実装できます。パーサーとWebインジェクタの構成方法の詳細は、『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』で「Oracle WebCenter Portalのページレット・プロデューサの管理」の章を参照してください。
URLエンコーディング: 予期しない変換を防ぐために、URLであるヘッダーをすべてエンコードすることはベスト・プラクティスです。JSPでは、書き込まれたURLをすべてエンコードします。コードによってページ本体にURLが書き込まれる場合は(たとえば、プリファレンス・ページへのリンクなど)、そのコードをエンコードする必要があります。標準のJavaサーブレット・コマンド、response.encodeURL()は優先される方法ですが、URLEncoder.encode(url)も使用できます。.NET Frameworkでは、HttpUtility.URLEncodeクラスによって必要な機能が提供されます。
すべてのページレットは、他のページレットと一緒に表示されるように設計されています。前の項で説明したように、ページレット・プロデューサはプロキシとして機能し、複数のアプリケーションのページレットを処理して組み合せ、様々な機能を持つ単一の統合されたページを作成します。
ページレットが返したコードはページレット・プロデューサ・サーバーによって解析され、ページを構成するHTMLマークアップに挿入されます。同じバックエンド・アプリケーションのページレットは、ページ内で互いにやりとりできます。
注意: .NETでは、リダイレクトURLをエンコードする必要はありません。これは、バックエンドで自動的に処理されます。 |
HTTPはWebページのコンテンツとXMLをサーバーとクライアント間で送信するためにもっぱら使用されるプロトコルです。CSPは、オープン標準であるHTTP 1.1に基づいたプラットフォームに依存しないプロトコルで、ページレット・プロデューサと外部CSPリソース間の通信構文を定義します。
HTTP通信は、リクエストとレスポンスで構成されます。リクエストとレスポンスは、基本的にはヘッダー内のメタデータの名前/値ペアのリストで、オプションでボディが付いています。ボディは、送信されているデータ(HTMLページまたはXMLファイル)です。ヘッダー内のメタデータは、リクエストまたはレスポンス自体の情報(コンテンツを表示する言語、ブラウザがコンテンツをキャッシュする期間など)です。リクエストとレスポンスには、それぞれ、次に概説される固有の情報が含まれています。HTTPの詳細は、RFC 2616を参照してください(http://www.faqs.org/rfcs/rfc2616.html
)。
クライアントはサーバーにHTTPリクエストを送信し、コンテンツを要求します。リクエスト・ボディは、POSTやPUTなど、サーバーにデータを送信するリクエストにのみ使用されます。
HTTPリクエストの形式:
[METHOD] [REQUEST-URI] HTTP/[VERSION] [fieldname1]: [field-value1] [fieldname2]: [field-value2] [request body, if any]
HTTPリクエストの例:
GET /index.html HTTP/1.1 Host: www.xmlns.oracle.com User-Agent: Mozilla/3.0 (compatible; Opera/3.0; Windows 95/NT4) Accept: */* Cookie: username=JoeSmith
サーバーは、ページ・コンテンツ、およびコンテンツのタイプ、ドキュメントの最終変更時期、サーバー・タイプなどの重要な詳細を含むHTTPレスポンスを返します。リクエストされたコンテンツが見つからない場合は、レスポンスにエラー・メッセージが含まれます。
HTTPレスポンスの形式:
HTTP/[VERSION] [CODE] [TEXT] [fieldname1]: [field-value1] [fieldname2]: [field-value2] [response body, if any (document content here)]
HTTPレスポンスの例:
HTTP/1.0 200 Found Last-modified: Thursday, 20-Nov-97 10:44:53 Content-length: 6372 Content-type: text/html <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 3.2 Final// EN'><HTML> ...followed by document content...
カスタムHTTPヘッダーを、特殊な情報を格納するように構成できます。
注意: ヘッダー・サイズ制限は、コードをホストしているサーバーによって制御されます。IIS/ASPの標準制限は60Kです。Javaアプリケーション・サーバーの場合は2Kから10Kまでです。これらの制限は通常、構成可能です。詳細は、使用しているサーバーのドキュメントを参照してください。 |
サービスからも、Set-CookieヘッダーやHTTP 1.1 Basic認証ヘッダーなどの標準のHTTPヘッダーにアクセスできます。HTTPをさらに調べる場合は、ロギングを使用して、ブラウザとWebサーバー間でやりとりされるすべてのヘッダーを表示できます(第65.3.4項「ページレットのデバッグ」を参照)。HTTPは、SSLとともに使用され、セキュアなコンテンツを提供します。また、シングル・サインオン(SSO)でもBasic認証用のHTTPヘッダーが使用されます。
CSPはHTTPを拡張し、固有ヘッダーを定義してページレット・プロデューサと外部CSPリソース(つまり、Oracle WebCenter Interactionポートレット)間で設定を受け渡しします。CSPでは、これらのサービスがHTTPを使用して設定を通信および変更する方法の概略を記述します。最新バージョンの1.4は次の場所で入手できます:http://download.oracle.com/docs/cd/E13158_01/alui/wci/docs103/devguide/references/CSP1.4.pdf
。
システムとユーザー構成変数の通信に使用されるカスタムCSPヘッダーは、ページレットでも使用できます。
表65-1 ページレット・プロデューサのヘッダー
ヘッダー名 | 説明 |
---|---|
ユーザーID |
現在ログインしているユーザーのユーザーID。この値は、セッションの有効期限を判別するときに使用できます。UserID=2の場合、デフォルトの'Guest'ユーザーがログインして、その他のユーザーのセッションはすべて終了します。 |
ユーザー名 |
ログインしているユーザーの名前。ユーザー名は、表示のパーソナライズやフォーム・フィールドの事前指定に使用できます。 |
イメージ・サービスのURL |
ページレット・プロデューサのユーザー実装での、イメージ・サービスの仮想ルート・ディレクトリのURL。この場所は、サービスで使用されるすべての静的イメージに使用する必要があります。 |
スタイルシートのURL |
現在のユーザーのスタイルシートのURL。ページレット・プロデューサの実装ごとに、UIはカスタマイズされます。一部のポータルでは、ユーザーはスタイルシートの中から選択できます。これらのスタイルを使用すると、ページレットが、現在のユーザーによるページレット・プロデューサの実装スタイルで表示されます。 |
ページレットID |
現在のリソース(ページレット)のID、および現在のページレットのインスタンスID。この値は、HTMLフォームおよびクライアント側JavaScript機能の名前に追加し、ページ上のフォームや機能の一意の名前を確保して名前の競合を回避するために役立ちます。 |
ホスト・ページのURL |
ページレットをホストするページのURL。設定の構成後にユーザーを正しいページに戻すために、プリファレンス・ページにはこのURLが必要です。この値を使用して、単一のページレットで様々なページに各種コンテンツを表示できるようにすることもできます。 |
この項では、ページレットをJDeveloperのJSFページ、WebページまたはWebCenter Portal: Spacesのページに追加する方法について説明します。ページレットを任意のWebアプリケーションに追加する前に、『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』で説明されているように、ページレット・プロデューサでリソースとページレットをデプロイして構成する必要があります。
この項には次のサブセクションが含まれます:
Oracle JDeveloperを使用すると、JSFページにページレットをドラッグ・アンド・ドロップできます。この項では、ページレット・プロデューサをWebCenter Portal: Frameworkアプリケーションに登録し、ページレットをJSFページに追加し、ブラウザでページを表示してページレットをテストします。
この項には次のサブセクションが含まれます:
ページレットをJSFページに追加する前に、ページレット・プロデューサをアプリケーションに登録する必要があります。ページレット・プロデューサは次の2つの方法で登録できます。
特定のアプリケーションにプロデューサを登録。デフォルトでは、「アプリケーション・リソース」パネル下に接続を作成する「新規Pagelet Producer」ダイアログで、「IDE接続」オプションが選択されています。
「リソース・パレット」を使用してプロデューサを登録。このオプションを使用すると、プロデューサのページレットを複数のアプリケーションで使用できます。「リソース・パレット」で使用可能なページレットは、ページ上にドロップすることにより、任意のFrameworkアプリケーションに追加できます。「リソース・パレット」からページレットを追加する際、まだ登録されていない場合には、そのプロデューサはアプリケーションに登録されます。アプリケーション・ナビゲータの「アプリケーション・リソース」パネルに、「リソース・パレット」からプロデューサ接続全体をドラッグ・アンド・ドロップすることもできます。これにより、プロデューサがアプリケーションに登録されます。または、「リソース・パレット」でプロデューサを右クリックし、コンテキスト・メニューから「アプリケーションに追加」を選択してプロデューサを現在開いているアプリケーションに登録します
Oracle JDeveloperを使用してページレット・プロデューサを登録するには:
アプリケーション・ナビゲータの「アプリケーション・リソース」パネルで、「接続」を右クリックして「接続の作成」を選択し、「ページレット・プロデューサ」を選択します。
「リソース・パレット」からの起動など、ウィザードを起動するその他の方法については、第1.6.2項「接続ウィザードにアクセスする方法」を参照してください。
「新規Pagelet Producer」ダイアログの「名前」フィールドに、意味のわかりやすいプロデューサ名を入力します。たとえば、myPageletProducer
と入力します。
「URL」フィールドに、ページレット・プロデューサのURLをhttp://
hostname:portnumber
/pagelets
の形式で入力します。
「OK」をクリックします。「アプリケーション・リソース」パネルでは、図65-1に示すように、「ページレット・プロデューサ」はConnectionsディレクトリのPagelet Producerディレクトリ下に作成されます。
ページレットをページに追加するには:
JDeveloperで、JSFページがまだ開いていない場合は、そのページを「デザイン・ビュー」で開きます。
「アプリケーション・リソース」パネルまたは「リソース・パレット」の「IDEリソース」パネルに進みます。「ページレット・プロデューサ」で、プロデューサを開いてそのコンテンツを表示します。
プロデューサのコンテンツから、JSFページにページレットをドロップします。
このページレットでIFRAMEを有効化する場合は、「ページレットのページへの追加」ダイアログの「IFrameの使用」セクションで「はい」を選択します。
IFrame高さフィールドでは、必要な高さをピクセルで指定するか、空白のままにします。高さを「auto」と指定して、自動サイズ変更を使用することもできます。(このオプションを使用するには、プロジェクトにIFrameサイズ変更ページを追加する必要があります。詳細は、第65.2.2.3項「IFrameへの自動サイズ変更の使用」を参照してください。)「OK」をクリックします。
「タスク・フロー・バインディングの編集」ダイアログでは、入力パラメータがデフォルトで指定されています。必要に応じて任意のパラメータを変更し、「OK」をクリックします。
ページを保存します。「構造」ウィンドウでは、ページは図65-2のように表示されます。
アプリケーション・ナビゲータの「プロジェクト」で該当のJSFページを右クリックし、「実行」を選択します。
ログイン・ページが表示される場合は、ユーザー名とパスワードを入力しページレットを表示できるようにします。図65-3に、ブラウザ・ウィンドウでのページレットのサンプルを示します。
ページレットの保護の詳細は、『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』のポリシーに関する項およびOracle Single Sign-On (OSSO)の構成に関する項を参照してください。
ページレットをデプロイすると、JavaScriptまたはRESTを使用してページレットをプロキシされたページやプロキシされていないページのどちらにも挿入できます。
この項には次のサブセクションが含まれます:
第65.2.2.1項「JavaScriptを使用したページレットの挿入」: ページレット・プロデューサを使用すると、簡単なJavaScript機能を使用してページレットをプロキシされていないページに挿入できます。
第65.2.2.2項「RESTを使用したページレットへのアクセス」: ページレット・プロデューサREST APIを使用すると、リモートWebサービスでリソースやページレットの情報をページレット・プロデューサから取得し、ページレットをプロキシされたページやプロキシされていないページのどちらにも注入できます。
第65.2.2.3項「IFrameへの自動サイズ変更の使用」: ページレット注入機能を使用すると、ページレットのコンテンツをカプセル化するIFrameのサイズを自動的に変更できます。
簡単なJavaScript機能を使用して、ページレットをプロキシされていないページに挿入できます。
この機能をアクティブにするには、次のHTMLスニペットをページの<HEAD>セクションに追加します。
<script type="text/javascript" src="http://proxy:port/pagelets/inject/v2/csapi"> </script>
このスクリプトを実行すると、すべてのCSAPIおよびページレット注入関数がページレットを表示するページに注入されます。注入されたセクションの1つには、次の関数があります。
function injectpagelet(library, name, iframe_options, payload, params, context_id, element_id, is_in_community, chrome, forward_params) { ... }
この関数は、ページレットをウィジェットとして親ページに注入します。メソッド・インタフェースでは、次のパラメータが使用されます。
library: 必須。注入するページレットのライブラリ名を表す文字列です。Unicode文字と数字のみ使用でき、スペースを含めることはできません。
name: 必須。注入するページレットの名前を表す文字列です。Unicode文字と数字のみ使用でき、スペースを含めることはできません。
iframe_options: ページレット・コンテンツの周囲にIFRAMEを使用するかどうかを指定します。IFRAMEオプションのサンプルは、iframe width=100% height=auto frameborder=0
のようになります。省略または空白のままにすると、ページレット・コンテンツがインラインにレンダリングされます。
payload: ページレット・リクエストで送信するXMLペイロード。
params: 問合せ文字列形式のページレット・パラメータ。たとえば、'param1=value1¶m2=value2¶m3=value3'
のようになります。
context_id: ページレット・インスタンスの外部識別子で、プリファレンスのスコープをページレット・プロデューサ・サーバーに設定するために使用されます。整数を指定する必要があります。
element_id: ページレット・コンテンツの注入先のHTML要素IDです。省略されたまたは空白のままの場合は、injectpagelet
コールが評価された場合に、document.write()
を使用してページレット・コンテンツが注入されます。
is_in_community: このページレットがコミュニティまたはグループ・ページのいずれにあるのかを指定します。値がtrue
に設定されている場合は、コミュニティIDヘッダーのcontext_id
がページレットに送信されます。デフォルトはfalse
です。
chrome: WSRP/JPDKページレット用に使用するChromeテンプレートの名前を指定します。Chromeが表示されないようにするには、値にnone
を指定します。
forward_params: 問合せ文字列引数を消費ページからバックエンド・サーバーに転送するかどうかを指定します。この機能を抑制するには、値false
を使用します。
注意: これらの引数は前後関係に依存しているため、所定の順番で指定する必要があります。特定の引数を指定せずに後続の引数を指定するには、指定しない引数を空の値('')で渡す必要があります。libraryおよびnameを除くすべての引数はオプションです。 |
このスクリプトによって、injectpagelet
関数への参照を含む、一意の名前を持つ新しい<div>
も作成されます。次に例をいくつか示します。
<div> <script type="text/javascript"> injectpagelet('library', 'name'); </script> </div>
<div> <script type="text/javascript"> injectpagelet('library', 'name', 'iframe', 'payload', 'param1=value1¶m2=value2¶m3=value3'); </script> </div>
<div> <script type="text/javascript"> injectpagelet('library', 'name', 'iframe width=100% height=200', 'payload'); </script> </div>
injecteditor
関数を使用すると、ユーザーがこの機能をサポートするページレットに個人プリファレンスと共有プリファレンスを設定できるようにするプリファレンス・エディタを追加できます。この機能は、Oracle WebCenter Portalのパーソナライズ機能とカスタマイズ機能に似ています。
injecteditor(library, name, type, iframe_options, context_id, element_id, is_in_community, chrome)
ここで:
library: 必須。注入するページレットのライブラリ名です。Unicode文字と数字のみ使用でき、スペースを含めることはできません。
name: 必須。注入するページレットの名前です。Unicode文字と数字のみ使用でき、スペースを含めることはできません。
type: エディタのタイプ。この引数では、値admin、pagelet、communityをサポートします。community引数の場合は、context_id
がコミュニティID CSPヘッダーのページレットに送信されます。
iframe_options: ページレット・エディタのコンテンツの周りにIFRAMEを使用するかどうかを指定します。IFRAMEオプションのサンプルは、iframe width=100% height=auto frameborder=0
のようになります。省略または空白のままにすると、エディタ・コンテンツがインラインにレンダリングされます。
context_id: ページレット・インスタンスの外部識別子で、プリファレンスのスコープをページレット・プロデューサ・サーバーに設定するために使用されます。整数を指定する必要があります。
element_id: ページレット・コンテンツの注入先のHTML要素IDです。省略または空白のままにすると、 injecteditor
コールが評価された場合に、document.write()
を使用してページレット・コンテンツが注入されます。
is_in_community: このページレットがコミュニティまたはグループ・ページのいずれにあるのかを指定します。値がtrue
に設定されている場合は、コミュニティIDヘッダーのcontext_id
がページレットに送信されます。デフォルトはfalse
です。
chrome: WSRP/JPDKページレット用に使用するChromeテンプレートの名前を指定します。Chromeが表示されないようにするには、値にnone
を指定します。
注意: これらの引数は前後関係に依存しているため、所定の順番で指定する必要があります。特定の引数を指定せずに後続の引数を指定するには、指定しない引数を空の値('')で渡す必要があります。libraryおよびnameを除くすべての引数はオプションです。 |
Representational State Transferを表すRESTは、HTTPを介してAPIを提供する簡単な手法です。RESTの基本原則は次のとおりです。
API URLは汎用的なメソッド・エンドポイントではなくリソースを指します。
リクエストでは、簡素化されたCRUDメソッドに標準のHTTP動詞を使用します。これは読取り専用APIで、GETリクエストのみを許可します。
すべてのリクエストは、取得したオブジェクト(ページレットまたはリソース)の完全表現を返します。
ページレット・プロデューサREST APIには、次の機能があります。
ページレットをプロキシ設定されていないページに注入して、「ページレット・プロデューサ」がOracle WebCenter Interaction、Oracle WebLogic Portal、またはその他のサードパーティ・ポータルのポートレット・プロバイダとして動作できるようにします。詳細は、第65.2.2.2.1項「ページレット注入API」を参照してください。
リモートWebサービスで、リソースとページレットに関する情報をページレット・プロデューサから取得できます。詳細は、第65.2.2.2.2項「データ取得API」を参照してください。
ページレット注入URLは、リモート・ポートレットの場所を指定するためにポータルで使用できます(この方法でページレットをポートレットとして使用できます)。また、注入URLを、HTMLページでIFrameタグのsrc属性として使用することもできます。
URLは次の形式を使用する必要があります。
http://
host:port
/pagelets/inject/v2/pagelet
/libraryname
/pageletname
?content-type=html
ここで、libraryname
およびpageletname
は、ページレット・プロデューサで構成されたライブラリとページレットを参照します。
注意: ページレット注入APIをOracle WebCenter InteractionでポートレットWebサービスのURLとして使用する場合は、URLのpageletをportletに切り替える必要があります。たとえば、前述のURLは次のようになります。
|
前述のコールに対する問合せ文字列引数は、ページレットが返される方法を定義します。次のパラメータが定義されます。
instanceid: オプション。ページレットのインスタンスIDで、ページ上のページレットを一意に識別し、ページレット間通信を容易にするために使用されます。ページに対して一意である必要があります。
context: オプション。ページレットのインスタンスの外部識別子で、ページレット・プロデューサ・サーバー上でのプリファレンスのスコーピングに使用されます。整数を指定する必要があります。
content-type: 戻り型。次の3つの型がサポートされています。
javascript: 注入可能なコードが返されます。
html: ページレット・マークアップがそれに関連付けられたPTPortletオブジェクトとともに返されます。
iframe: ページとの直接インラインを実行するかわりにIFrameにページレットのコンテンツを入力して、注入APIを再び指し示すIFrameを返します。IFrameは、一連の問合せ文字列パラメータを指定することによってスタイルを設定できます。
パラメータ | 説明 | デフォルト |
---|---|---|
ifwidth |
IFrameの幅を設定します。パーセント'%'またはピクセル'px'で指定できます。例: ifwidth=500px。'auto'に設定すると、コンテンツの幅に収まるようにIFrameを自動的にサイズ変更できます。詳細は、第65.2.2.3項「IFrameへの自動サイズ変更の使用」を参照してください。 |
100% |
ifheight |
IFrameの高さを設定します。パーセント'%'またはピクセル'px'で指定できます。例: ifheight=500px。'auto'に設定すると、コンテンツの幅に収まるようにIFrameを自動的にサイズ変更できます。詳細は、第65.2.2.3項「IFrameへの自動サイズ変更の使用」を参照してください。 |
デフォルトなし |
ifborder |
IFrameの境界を設定します。 |
none |
ifalign |
IFrame内の位置あわせ規則を設定します(ifalign=centerなど)。 |
デフォルトなし |
ifdesc |
IFrameの説明を設定します。 |
デフォルトなし |
ifmarginheight |
マージンの高さを設定します。パーセント(%)またはピクセル(px)単位で指定できます(ifmarginheight=500pxなど)。 |
デフォルトなし |
ifmarginwidth |
マージンの幅を設定します。 パーセント(%)またはピクセル(px)単位で指定できます(ifmarginwidth=500pxなど)。 |
デフォルトなし |
ifscrolling |
IFrameのスクロールバーを設定します。許容される値は、yes、no、autoです。 |
auto |
ifstyle |
IFrameのCSSスタイルを設定します |
デフォルトなし |
ifclass |
IFrameのCSSクラスを設定します。 |
デフォルトなし |
csapi: オプション。CSAPIをページレット・レスポンスに含めるかどうかを設定します(trueまたはfalse)。CSAPIの組込みはオプションですが、レスポンスに含まれるページレットは、ページレットがレンダリングされるページ上に存在するCSAPIライブラリに依存します。csapi=falseの場合は、CSAPIライブラリは親ページ(通常はHEADセクション)に含まれる必要があります。
onhtttperror:: オプション。ページレット・リクエストの結果として403、404またはその他のエラー・コードが発生する場合は、ページレット・プロデューサは、ユーザーに表示するためにエラー・コードとエラー・ページ自体をブラウザに転送できます。onhttperrorパラメータは次の値を受け入れます。
comment (デフォルト): ページレット・プロデューサは失敗したページレットのかわりにHTMLコメントを生成します(失敗したページレットは単に表示されないだけです)。
inline: ページレット・エラーはサーバー・エラー・ページとともにインラインに表示されます。この場合、ページレットは通常、ページに表示されます。
fullpage: httpエラーはページ全体を消費します。このモードは、ページレット・プロデューサが親ページを制御する場合にのみ使用可能です。
たとえば、次のURLは、samplesライブラリのlinkspageletを指します。
http://
host:port
/pagelets/inject/v2/pagelet/samples/linkspagelet?content-type=iframe&csapi=true&ifheight=123px&ifclass=myclass
このURLは、次のコードに似たマークアップになります。
注意: IFrameソースは元の注入APIを指しますが、今回、content-typeパラメータは |
<html> <head> </head> <body> <iframe frameborder="none" class="myclass" width="100%" height="123px" scrolling="auto" src="http://proxy:port/inject/v2/pagelet/samples/linkspagelet?asdg=asdfgas¶m=true&content-type=html&jswrap=false&csapi=true"> <html> <head> <script src="http://proxy:loginserverport/loginserver/ensemblestatic/imageserver/plumtree/common/private/js/jsutil/LATEST/PTUtil.js" type="text/javascript"> </script> <script src="http://proxy:loginserverport/loginserver/ensemblestatic/imageserver/plumtree/common/private/js/jsutil/LATEST/PTDateFormats.js" type="text/javascript"></script> <script src="http://proxy:loginserverport/loginserver/ensemblestatic/imageserver/plumtree/common/private/js/jsxml/LATEST/PTXML.js" type="text/javascript"></script> <script src="http://proxy:loginserverport/loginserver/ensemblestatic/imageserver/plumtree/common/private/js/jsportlet/LATEST/PTPortletServices.js" type="text/javascript"></script> </head> <body> <div id="pt-pagelet-content-1" class="pagelet-container" style="display: inline;"> <span xmlns:pt="http://www.xmlns.oracle.com/xmlschemas/ptui/"> Pagelet links: <br/> <a href="http://proxy:port/inject/RP_PID393219_I1/headpagelet1.html">The first pagelet</a> <br/> <a href="http://proxy:port/inject/RP_PID393219_I1/headpagelet2.html">The second pagelet</a> <br/> <a href="http://proxy:port/inject/RP_PID393219_I1/csapipagelet.html">The csapi pagelet</a> <br/> <a href="http://proxy:port/inject/RP_PID393219_I1/linkspagelet.html">This pagelet</a> <br/> </span> </div> </body> </html> </iframe> </body> </html>
ページレット・プロデューサからデータを取得するには、次の2つのREST APIが使用できます。
ページレットAPI: リモート・アプリケーションを使用してページレット・プロデューサからページレット・データを取得できます。(例65-1「すべてのページレット」および例65-2「ライブラリおよび名前別ページレット」を参照してください。)
リソースAPI: リモート・アプリケーションを使用してページレット・プロデューサからリソース・データを取得できます。(例65-3「すべてのリソース」および例65-4「名前別リソース」を参照してください。)
すべてのリクエストの基本のURLは、 http://
host:port
/pagelets/restservice/pageletproducer/
です。
例65-1 すべてのページレット
http://host:port/pagelets/restservice/pageletproducer/pagelets/ http://host:port/pagelets/restservice/pageletproducer/pagelets/?format=xml
例65-2 ライブラリおよび名前別ページレット
http://host:port/pagelets/restservice/pageletproducer/pagelet/libraryname/pageletname/ http://host:port/pagelets/restservice/pageletproducer/pagelet/libraryname/pageletname/?format=xml
ページレット・プロデューサ・ページレット注入APIは、ページレット・コンテンツをカプセル化するIFrameのサイズを自動的に変更できます。IFrameがストレッチして中のコンテンツに合うようにサイズ変更が行われます。この機能を使用するには、次の例に示すように、ifwidthおよびifheightパラメータをautoに設定する必要があります。
http://proxy:port/inject/v2/pagelet/samples/linkspagelet?content-type=iframe&csapi=true&ifheight=auto&ifwidth=auto&ifclass=myclass
さらに、この機能はコンシューマ・ページと同じドメイン上にある外部ページに依存します。このページは、内部非表示IFrameとしてページレットIFrameに格納されます。このページでは、サイズ設定情報を収集して親コンシューマ・ページに渡します。このページは、コンシューマ・ページと同じディレクトリにデプロイする必要があります。
次の例では、ロードの終了後に、ページレットIFrameのサイズが変更されます。初回ロード後に動的自動サイズ変更機能をユーザー対話型アクティビティに追加するには、マウスやキーボードのイベントについてイベント・リスナーをさらに追加するだけで済みます。
<html> <head> <title>Resizing Page</title> <script type="text/javascript"> function onLoad() { var params = window.location.search.substring( 1 ).split( '&' ); var height; var width; var iframe; for( var i = 0, l = params.length; i < l; ++i ) { var parts = params[i].split( '=' ); switch( parts[0] ) { case 'height': height = parseInt( parts[1] ); break; case 'width': width = parseInt( parts[1] ); break; case 'iframe': iframe = parts[1]; break; } } window.top.updateIFrame( iframe, height, width ); } if (window.addEventListener) { window.addEventListener("load", onLoad, false) } else if (window.attachEvent) { window.detachEvent("onload", onLoad) window.attachEvent("onload", onLoad) } else { window.onload=onLoad } </script> </head> <body> </body> </html>
WebCenter Portal: Spacesでは、コンポーザを使用してページレットをページに追加できます。デフォルトでは、ページレットは「リソース・カタログ」の「マッシュアップ」フォルダに表示されます。ページレットをページに追加するには、「リソース・カタログ」のページレットに移動して選択します。
Spacesでリソースをページに追加する方法の詳細は、『Oracle Fusion Middleware Oracle WebCenter Portal: Spacesユーザーズ・ガイド』のページへのリソース・カタログのコンポーネントの追加に関する項を参照してください。
ページレットをページ内で構成するには、該当のページを編集モードで表示し、ページレットの編集ボタン(スパナ・アイコン)をクリックします。「コンポーネント・プロパティ」ダイアログの「ページレット・プロパティ」タブでは、ページレット・パラメータとIFrameオプションを定義できます。
この項では、ページレット・プロデューサを使用してページレットを構築するための情報について説明します。
アダプティブ・ページレットのスクリプティング・フレームワークは、サービスをCSPページレットとプロキシされたページに提供するクライアント側JavaScriptライブラリです。この項では、スクリプティング・フレームワークを使用して動的機能をページレットに実装する方法について説明します。
第65.3.1.1項「構造化されたHTTPレスポンスの処理」: アダプティブ・ページレットのスクリプティング・フレームワークは、通常XMLとしてエンコードされる、構造化されたHTTPのクライアント側レスポンス・ハンドラとして使用できます。
第65.3.1.2項「イベント通知の使用」: ページレットは、ページがロードされたり、ブラウザのフォーカスが変更された場合など特定のイベントが発生すると応答できます。
第65.3.1.3項「インプレース更新の使用」: ページレットは、ページをリフレッシュすることなく、その内部コンテンツをリロードできます。
第65.3.1.4項「セッション・プリファレンスの使用」: ブラウザレベルの変数が同一ページ上にない場合でも、その変数を格納してページレット間で共有できます。たとえば、1つのページレットにユーザーが入力した値は、別のユーザーが取得できます。スクリプティング・フレームワークは仲介として機能するため、すべてのページレットで共通セッションに格納されているすべての値にアクセスできます。
クラスとメソッドの完全リストについては、JSPortlet APIのドキュメントを参照してください。
アダプティブ・ページレットの追加情報は、第65.3.1.5項「アダプティブ・ページレットの開発のヒント」を参照してください。
ごく一部のユーザー・インタフェースのみを変更する必要がある場合、一部のHTTPリクエストに応じて大量のHTMLを返すのは多くの場合費用がかかり非効率的な可能性があります。これは、より複雑なユーザー・インタフェースに特に当てはまります。このような場合は、レスポンスをXMLでエンコードできます。クライアント側レスポンス・ハンドラはXMLを解析し、そのレスポンスに基づいてユーザー・インタフェースを更新(またはその他の処理を実行)できます。構造化されたレスポンス設計パターンを使用して、HTTPリクエストの作成後にユーザー・インタフェースの小領域を再描画するか、単純なHTTP/URIタイプのWebサービスにページレットからアクセスします。次のコード例 (structuredresponse_portlet.html) では、新しいサイトの選択からRSSフィードにアクセスします。
<!-- jsxml includes --> <a id="imgServerHref" href="/images/plumtree" style="display:none"></a> <script type="text/javascript" src="/images/plumtree/common/private/js/PTLoader.js"></script> <script type="text/javascript"> var oImgServer = new Object(); oImgServer.location = document.getElementById('imgServerHref').href; var imageServerURL = document.getElementById('imgServerHref').href; var imageServerConnectionURL = oImgServer.location; new PTLoader(imageServerURL, imageServerConnectionURL).include('jsxml','en'); </script> <!-- jscontrols includes --> <link rel="stylesheet" type="text/css" href="/portal-remote-server/js/jscontrols/styles/css/PTMenu.css"/> <link rel="stylesheet" type="text/css" href="/portal-remote-server/js/jscontrols/styles/css/PTRichTextEditor.css"/> <script type="text/javascript" src="/portal-remote-server/js/jscontrols/strings/PTControls-en.js"></script> <script type="text/javascript" src="/portal-remote-server/js/jscontrols/PTControls.js"></script> <!-- Inline JS helper functions --> --> <script defer type="text/javascript" id="structured-response-portlet-A-script"> // Function that gets the RSS XML feed found at the specified url getRSSFeed = function(url) { // First clear out any existing rows in the table channelTable.clearRows(); // Force the transformer to fix up the url var oURL = new Object(); oURL.location = url; // Do the http get var get = new PTHTTPGETRequest(oURL.location, handleRSSResponse); get.invoke(); } // Function that handles the RSS XML response and updates the table based on the RSS items handleRSSResponse = function(response) { // Get the rss xml var xml = response.responseText; if (!xml || xml.indexOf('<?xml') == -1) { return; } // Parse into a dom, and get the channel node var xmlDOM = new PTXMLParser(xml); var rssNode = xmlDOM.selectSingleNode('rss'); var channelNode = rssNode.selectSingleNode('channel'); // Get the channel title and set the status bar text in the table var channelTitle = channelNode.selectSingleNode('title').getNodeValue(); channelTable.statusBarText = '<b>Loaded Channel</b>: ' + channelTitle; // Get channel item nodes var itemNodes = channelNode.selectNodes('item'); // Build table rows channelTable.rows = new Array(); for (var i=0; i<itemNodes.length; i++) { var itemNode = itemNodes[i]; // Get channel item properties var itemTitle = itemNode.selectSingleNode('title').getNodeValue(); var itemLink = itemNode.selectSingleNode('link').getNodeValue(); var itemDescription = itemNode.selectSingleNode('description').getNodeValue(); if (itemNode.selectSingleNode('author')) var itemAuthor = itemNode.selectSingleNode('author').getNodeValue(); if (itemNode.selectSingleNode('category')) var itemCategory = itemNode.selectSingleNode('category').getNodeValue(); if (itemNode.selectSingleNode('pubDate')) var itemPubDate = itemNode.selectSingleNode('pubDate').getNodeValue(); // Create a row and add it to the table var row = new PTRow(); row.parent = channelTable; row.id = i; row.uid = i; row.previewText = itemDescription; row.link = itemLink; row.columnValues[0] = new PTTextColumnValue(itemTitle); row.columnValues[1] = new PTTextColumnValue(itemCategory); row.columnValues[2] = new PTTextColumnValue(itemAuthor); row.columnValues[3] = new PTTextColumnValue(itemPubDate); channelTable.rows[channelTable.rows.length] = row; } // Redraw the table channelTable.draw(); } </script> <b>Select RSS Feed:</b> <a href="#" onclick="getRSSFeed('http://www.wired.com/news/feeds/rss2/0,2610,,00.xml'); return false;">Wired News</a> <a href="#" onclick="getRSSFeed('http://news.com.com/2547-1_3-0-5.xml'); return false;">CNET News.com</a> <a href="#" onclick="getRSSFeed('http://partners.userland.com/nytRss/nytHomepage.xml'); return false;">NY Times</a> <br><br> <!-- Set up a table control to display channel items --> <div id="channelTableContainer"></div> <script defer type="text/javascript"> var channelTable = new PTTableControl(); channelTable.locale = 'en_US'; channelTable.objName = 'channelTable'; channelTable.container = 'channelTableContainer'; channelTable.baseURL = '/imageserver/plumtree/common/private/portal-remote-server/js/jscontrols/1/'; channelTable.statusBarText = 'No RSS Feed Selected'; channelTable.rowDetailAction = new PTJavaScriptAction('window.open(\'${ROW.link}\');'); channelTable.columns[0] = new PTColumn(); channelTable.columns[0].name = 'Title'; channelTable.columns[0].width = '40%'; channelTable.columns[1] = new PTColumn(); channelTable.columns[1].name = 'Category'; channelTable.columns[1].width = '20%'; channelTable.columns[2] = new PTColumn(); channelTable.columns[2].name = 'Author'; channelTable.columns[2].width = '20%'; channelTable.columns[3] = new PTColumn(); channelTable.columns[3].name = 'Publication Date'; channelTable.columns[3].width = '20%'; channelTable.areColumnsResizable = true; channelTable.clientSortEnabled = true; channelTable.scrollHeight = 250; channelTable.init(); channelTable.draw(); </script> </div>
アダプティブ・ページレットのスクリプティング・フレームワークにより、ページレットでは、その他のページレットが生成したページレベルのイベントとカスタム・イベントの両方に応答できます。
スクリプティング・フレームワーク内のメソッドregisterForWindowEvent
およびregisterOnceForWindowEvent
は、ページレベルのイベントにアクセスできるページレットを指定します。完全なリストは、第65.3.1.2.1項「スクリプティング・フレームワークで使用するページレベルのイベント」を参照してください。これらのイベントの通知を登録するには、イベントの名前と、イベント発生時にコールする必要のあるメソッドの名前を渡します。ページレベルのイベントが発生すると、JavaScriptイベント・オブジェクトが引数としてイベント・ハンドラに渡されます。スクリプティング・フレームワークでは、ページレットはraiseEvent
およびregisterForEvent
を使用してカスタム・イベントを発生させ、応答することができます。ブロードキャスト/リスナー・デザイン・パターンは、セッション・プリファレンスを指定して通知サービスを使用する重要な例です。ユーザーはアイテムを選択するか、「ブロードキャスト」ページレットで別のアクションを実行できます。これによって、その他の「リスナー」ページレットのコンテンツが再作成されます。次の例では、ブロードキャスト・ページレットによって、テキスト・ボックスに数字を入力できるフォームが表示されます。
ユーザーがテキスト・ボックスに数値を入力すると、リスナー・ページレットの値が変更されます。最初のリスナー・ページレットには、ブロードキャスト・ページレットに入力した数値の平方根が表示されます。
2番目のリスナー・ページレットには、ブロードキャスト・ページレットに入力した数値の立方根が表示されます。
次の手順では、ページレットがどのように機能するのかについてまとめています。
ロード時に、各リスナー・ページレットは固有のインスタンス・メソッド(registerForEvent
)をコールし、onBroadcastUpdateタイプのイベントを登録します。
Enter numberテキスト・ボックスに発生するonkeyupイベントごとに、ブロードキャスト・ページレットはセッション・プリファレンスをこのテキスト・ボックスに入力された値に設定し、その固有のインスタンス・メソッド(raiseEvent
)をコールしてonBroadcastUpdateタイプのイベントを生成します。
onBroadcastUpdateイベントが発生したり、ページが再ロードされた場合は、各リスナー・ページレットがブロードキャスト・ページレットによって設定されたセッション・プリファレンスを取得し、プリファレンスの値に基づいて表示する新しい値を計算します。
ブロードキャスト・ページレット
<div style="padding:10px;" align="center"> <p><b>Enter number:</b> <input type="text" style="font-size:22px;font-weight:bold;text-align:center;" id="broadcast_prefName" value="4" size="7" onkeyup="broadcast_setPrefs(this.value)"></p> <br> </div> <script type="text/javascript"> function broadcast_setPrefs(val) { var prefName = 'broadcastNumber'; var prefValue = val; PTPortlet.setSessionPref(prefName,prefValue); var broadcastPortlet = PTPortlet.getPortletByGUID('{D9DFF3F4-EAE7-5478-0F4C-2DBD94444000}'); if (!broadcastPortlet) { broadcast_debug('Could not locate PTPortlet object which corresponds to <b>Broadcast Portlet</b> on page.'); return; } broadcast_debug('<b>Broadcast Portlet</b> raising onBroadcastUpdate event.'); broadcastPortlet.raiseEvent('onBroadcastUpdate',false); } function broadcast_debug(str) { if (window.PTDebugUtil) { PTDebugUtil.debug(str); } } </script>
リスナー・ページレット#1
<div style="padding:10px;" align="center"> <p><b>Square root:</b> <div style="height:21px;border:2px solid black;padding:2px;overflow:visible;font-size:14px;"id="listener1-swatch"> </div> </div> <script> function listener1_update() { var broadcastNumber = parseFloat(PTPortlet.getSessionPref('broadcastNumber')); if (isNaN(broadcastNumber)) { listener1_error('<b>Listener-1 Portlet</b> cannot parse number from session pref broadcastNumber'); return; } listener1_debug('<b>Listener-1 Portlet</b> computing square root of ' + broadcastNumber); var swatch = document.getElementById('listener1-swatch'); swatch.innerHTML = Math.sqrt(broadcastNumber); } function listener1_debug(str) { if (window.PTDebugUtil) { PTDebugUtil.debug(str); } } function listener1_error(str) { if (window.PTDebugUtil) { PTDebugUtil.error(str); } } function listener1_getPortlet() { var portletGUID = '{D9DFF3F4-EAE7-5478-0F4C-2DBDB4F4A000}'; var listener1Portlet = PTPortlet.getPortletByGUID(portletGUID); return listener1Portlet; } var listener1Portlet = listener1_getPortlet(); if (listener1Portlet) { listener1Portlet.registerForEvent('onBroadcastUpdate','listener1_update'); listener1_debug('<b>Listener-1 Portlet</b> registered refreshOnEvent for event onBroadcastUpdate'); listener1Portlet.registerForEvent('onload','listener1_update'); } </script>
リスナー・ページレット#2
<div style="padding:10px;" align="center"> <p><b>Cube root:</b> <div style="height:21px;border:2px solid black;padding:2px;overflow:visible;font-size:14px;"id="listener2-swatch"> </div> </div> <script> var listener2_oneThird = (1/3); function listener2_update() { var broadcastNumber = parseFloat(PTPortlet.getSessionPref('broadcastNumber')); if (isNaN(broadcastNumber)) { listener2_error('<b>Listener-2 Portlet</b> cannot parse number from session pref broadcastNumber'); return; } listener2_debug('<b>Listener-2 Portlet</b> computing square root of ' + broadcastNumber); var swatch = document.getElementById('listener2-swatch'); swatch.innerHTML = Math.pow(broadcastNumber,listener2_oneThird); } function listener2_debug(str) { if (window.PTDebugUtil) { PTDebugUtil.debug(str); } } function listener2_error(str) { if (window.PTDebugUtil) { PTDebugUtil.error(str); } } function listener2_getPortlet() { var portletGUID = '{D9DFF3F4-EAE7-5478-0F4C-2DBDCA1C7000}'; var listener2Portlet = PTPortlet.getPortletByGUID(portletGUID); return listener2Portlet; } var listener2Portlet = listener2_getPortlet(); if (listener2Portlet) { listener2Portlet.registerForEvent('onBroadcastUpdate','listener2_update'); listener2_debug('<b>Listener-2 Portlet</b> registered refreshOnEvent for event onBroadcastUpdate'); listener2Portlet.registerForEvent('onload','listener2_update'); } </script>
スクリプティング・フレームワークでは、次のページレベルのイベントに自動的にアクセスできます。
表65-2 ページレベルのイベント
イベント | トリガー時期: |
---|---|
onload |
ブラウザがページをロードした直後 |
onbeforeunload |
ページがアンロードされる(ブラウザ・ウィンドウが閉じるか別の場所に移動する)前 |
onunload |
ページがアンロードされる(ブラウザ・ウィンドウが閉じるか別の場所に移動する)直前 |
onactivate |
ページがアクティブ要素として設定された(フォーカスを取得した)とき |
onbeforeactivate |
ページがアクティブ要素として設定される(フォーカスを取得する)直前 |
ondeactivate |
アクティブ要素が現在のページから親ドキュメントの別のページに変更されたとき |
onfocus |
ページがフォーカスを取得したとき |
onblur |
ページがフォーカスを喪失したとき |
oncontrolselect |
ユーザーがページのコントロールをまさに選択するとき |
onresize |
ページのサイズをまさに変更するとき |
onresizestart |
ユーザーがコントロールの選択でページのディメンションの変更を開始したとき |
onresizeend |
ユーザーがコントロールの選択でページのディメンションの変更を終了したとき |
onhelp |
ブラウザがアクティブ・ウィンドウになっている状態でユーザーが[F1]キーを押したとき |
onerror |
ページのロード中にエラーが発生したとき |
onafterprint |
関連するドキュメントが印刷されたまたは印刷プレビューされた直後 |
ページ上の他のコンテンツに影響を与えずに、ページレット・コンテンツをインプレースでリフレッシュするには、スクリプティング・フレームワークを使用してインプレース更新を実装します。
ページレットの多くは時間に影響を受けるデータを表示します。場合によっては、ユーザーはページの残りの部分を変更またはリフレッシュすることなく、ページレット内のリンク間を移動できる必要があります。ページレット・コンテンツは、コマンドを使用する、リフレッシュ・アクションをイベントに関連付ける (refreshOnEvent
)、または設定した間隔でリフレッシュするようにページレットをプログラムする(setRefreshInterval
)ことでリフレッシュできます。スクリプティング・フレームワークにはまた、ページレットを開閉するためのメソッドも用意されています。次の単純な例では、リフレッシュ・ページレットに「ポートレットのリフレッシュ」ボタンが表示されます。このボタンをクリックすると、ページレットに表示される日時が更新されます。
インプレース更新は、ページレット・オブジェクト・インスタンスに対してrefresh()
メソッドをコールすることにより、実行されます。リフレッシュ時には、新しいURLがページレット内に表示されるように設定することもできます。(タイトル・バーはリフレッシュ時に変更できません。)
<div style="padding:10px;" align="center"> <p><button onclick="refresh_portlet()">Refresh Portlet</button></p> <p><b>Current time is:</b><br> <span id="refreshTimeSpan"></span></p> </div> <script type="text/javascript"> function refresh_portlet() { var refreshPortlet = PTPortlet.getPortletByID($PORTLET_ID$); if (!refreshPortlet) { refresh_debug('Could not locate PTPortlet object which corresponds to <b>Refresh Portlet</b> on page.'); return; } refresh_debug('<b>Refresh Portlet</b> calling refresh() method.'); refreshPortlet.refresh(); } function refresh_debug(str) { if (window.PTDebugUtil) { PTDebugUtil.debug(str); } } var t = new Date(); document.getElementById('refreshTimeSpan').innerHTML = t; </script>
クライアント・ブラウザ内に設定を保存して共有するには、セッション・プリファレンスを使用します。
ページレットはプリファレンスを使用して相互に通信できますが、プリファレンスにアクセスするには通常、データベースへのラウンドトリップが必要です。セッション・プリファレンスは、クライアント・ブラウザ内でユーザーのセッションの設定を保存および共有する手段を提供します。「マスター/ディテール」デザイン・パターンは、セッション・プリファレンスの最も基本的な使用方法です。このデザイン・パターンでは、2つのページレットの間で制御と表示が分割されます。たとえば、「マスター」ページレットではデータをリスト形式で要約し、「ディテール」ページレットではユーザーの選択に応じてデータ・アイテムごとにディテールを表示することができます。次の例では、マスター・ページレットによって、テキスト・ボックスに色コードを入力できるフォームが表示されます。
ユーザーが色コードをテキスト・ボックスに入力すると、ディテール・ページレットに表示されている色が変更されます。
マスター・ページレットの「色の入力」テキスト・ボックスでonkeyup
が発生するたびに、次の手順が実行されます。
マスター・ページレットのテキスト・ボックスの現在値を使用してセッション・プリファレンスが設定されます。
マスター・ページレットからディテール・ページレットの更新メソッドがコールされます。
ディテール・ページレットにより、セッション・プリファレンスから色の値が取得されます。
ディテール・ページレットの色見本領域が再描画され、新しい色の値が反映されます。
注意: 共有のセッション・プリファレンスは、ページレット・プロデューサ・コンソール内のページレットの「プリファレンス」ページから名前で指定する必要があります。指定しないと、プリファレンスはページレットに送信されません。 |
アダプティブ・ページレットのスクリプティング・フレームワークには、ページレット間の関係を解除し、共通のイベント・インタフェースを使用して通信するための簡単な方法が用意されています。
注意: 次の例は極度に簡略化されたもので、マスター・ページレットからディテール・ページレットのJavaScriptメソッドが直接コールされます。マスター・ページレットで、ディテール・ページレットが同一ページ上に実際に存在することを確認するためのなんらかの処置を講じないかぎり、マスターからディテールに対してコールすると、エラーが発生する可能性があります。 |
マスター・ページレット
<div style="padding:10px;" align="center"> <p><b>Enter color:</b> <input type="text" style="font-size:22px;font-weight:bold;text-align:center;" id="master_prefName" value="#FFFFFF" size="8" onkeyup="master_setPrefs(this.value)"></p><br> </div> <script type="text/javascript"> function master_setPrefs(val) { var prefName = 'masterColor'; var prefValue = val; PTPortlet.setSessionPref(prefName,prefValue); master_debug('<b>Master Portlet</b> called PTPortlet.setSessionPref(\'masterColor\',\'' + prefValue + '\').'); if (window.detail_update) { master_debug('<b>Master Portlet</b> calling detail_update().'); detail_update(); } else { master_debug('Could not locate portlet <b>Detail Portlet</b> on page.'); } } function master_debug(str) { if (window.PTDebugUtil) { PTDebugUtil.debug(str); } } </script>
ディテール・ページレット
<div style="padding:10px;" align="center"> <p><b>Color swatch</b> <div style="width:100px;height:100px;border:2px solid black;padding:2px;"id="detail-swatch"></div> <script> function detail_update() { var color = PTPortlet.getSessionPref('masterColor'); detail_debug('<b>Detail Portlet</b> received value="' + color + '" for PTPortlet.getSessionPref(\'masterColor\')'); var swatch = document.getElementById('detail-swatch'); if (swatch) { swatch.innerHTML = '<div style="background-color:' + color + ';width:100%;height:100%;"></div>'; } else { detail_debug('<b>Detail Portlet</b> cannot find \'detail-swatch\' DIV element.'); } } function detail_debug(str) { if (window.PTDebugUtil) { PTDebugUtil.debug(str); } } </script>
次のヒントは、アダプティブ・ページレットのスクリプティング・フレームワークを使用するほとんどのページレットに当てはまります。
すべてのフォームと関数に一意の名前を使用します。一意の名前と値の形成にページレットのGUIDを使用し、ページ上の他のコードと名前の衝突が発生しないようにします。
すべてのURLをプロキシします。コール元のページと異なるホスト/ポートを持つURLに対するリクエストを作成することはできません。JavaScriptを通じてリクエストされるURLはすべてプロキシする必要があります。詳細は、第65.3項「ページレット・プロデューサを使用したページレットの構築」を参照してください。
アダプティブ・ページレットのスクリプティング・フレームワークを使用している場合は、サポートをチェックします。コンポーネントが存在するかどうかを判断するコードを組み込むことをお薦めします。理想的には、ページレットでいずれの状況も処理できる必要があります。最も簡単な解決方法は、スクリプティング・フレームワークがサポートされていない場合にユーザーに警告を行うIf文を備えたコードを優先することです。
<script> if (PTPortlet == null) { if (document.PCC == null) { alert("This pagelet only works in portals that support the JSPortlet API . The pagelet will be displayed with severely reduced functionality. Contact your Administrator."); } } else { [scripting code here] } </script>
ウィンドウが閉じるときに、ページレットによって開かれたポップアップ・ウィンドウをすべて閉じます。onunload
イベントを使用してポップアップ・ウィンドウを閉じる場合に、スクリプティング・フレームワークを使用できます。
必要なすべてのJavaScriptを前もってページに追加しておきます。innerHTML
プロパティを使用してページに追加されたスクリプト・ブロック/インクルードは、ブラウザで処理されない場合があります。
Microsoft Internet Explorer: スクリプト・タグにdefer(遅延)属性を追加します。
Netscape: RegExpを使用してレスポンスを解析し、スクリプトを見つけて評価します。
JavaScript HTTPとプロキシされたHTTPで同じ認証資格証明を使用する必要があります。JavaScriptで仲介(ブローカ)されたHTTPリクエストからは、ゲートウェイ処理された正常なHTTPリクエストの作成時と同じ認証トークン(cookie)が送信されます。
ページレット・プロデューサでは、関連するリソースに定義された設定に基づいて、プロキシされた各アプリケーションの認証を管理します。
ページレット・プロデューサは外部の資格証明ストアへのカスタム・マッピングを作成するAPIを提供しているため、カスタム資格証明ソースに対してユーザーを認証できます。
IVendorCredentialMapper
インタフェースでは、アプリケーションで特定のユーザーのセカンダリ認証に必要な、適切な資格証明のセットを取得できるオブジェクトに対するページレット・プロデューサのインタフェースを定義します。このインタフェースを実装するには、次の手順に従います。
com.plumtree.runner.credentialmapper.IVendorCredentialMapper
インタフェースを実装するJavaクラスを作成します。
このインタフェースのgetCredential
メソッドとsetCredential
メソッドを資格証明ボールトにマップします。次の簡略化した例では、VConnector
という内部クラスを使用して、VConnector.getInstance(). getCredentialsForDomain
をコールしています。注意: この手順はベンダー固有のものです。資格証明ストアは別のサーバーにあることが多いため、おそらくネットワーク・ホップが含まれます。マッパーには一意の名前を付け、必要に応じてローカライズします。すべての必要な名前については、IVendorCredentialMapper APIのドキュメントを参照してください。
クラスをJARにコンパイルします。ビルド・プロセスは、ページレット・プロデューサの配布キットに付属するcommon.jar
にリンクする必要があります。
カスタム・ボールトをページレット・プロデューサにロードします。詳細は、『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』を参照してください。
ページレット・プロデューサ・サーバー(異なるサーバー上にある場合はproxyとadminuiの両方)を再起動します。カスタムの資格証明ボールトが、リソース・エディタの「資格証明マッピング」ページの資格証明ソースのリストに表示されます。
次の例は、説明を目的としているために簡略化されています。
package com.oracle.credentialvault; import com.oracle.connector.CredentialsSet; import com.oracle.connector.VConnector; import com.plumtree.runner.credentialmapper.Credential; import com.plumtree.runner.credentialmapper.IVendorCredentialMapper; public class OracleCredentialVault implements IVendorCredentialMapper { /* * Pagelet Producer will pass credential types as following: * Runner_*, where * is what the credential value type associated with this login * form in the adminui. For example, if the credential value type is * 'username' then "Runner_username" will be passed to the mapper. */ public Credential getCredential(String initiator, String credType)
{ System.out.println("OracleCredentialVault::getCredential, initiator: " + initiator + ", credType: " + credType); /* * Since this vault stores credentials per user and domain, we need to devise * a scheme to map Pagelet Producer's credential type to a domain. * One way to do this is to specify the credential type as something like: * "domain_type", which would translate to credTypes like: * Runner_domain.com_username and Runner_domain.com_password */ String username = initiator.toLowerCase(); // assume that the vault stores all usernames in lowercase String domain = "oracle.com"; //getDomain(credType); String type = credType; //getType(credType); CredentialsSet credSet = VConnector.getInstance().getCrededentialsForDomain(username, domain); if( credSet != null ) { System.out.println("OracleCredentialVault::getCredential, found vault set: " + credSet.toString() + ", returning type = " + type); return new Credential(credSet.getCredential(type)); } else { System.out.println("OracleCredentialVault::getCredential, found null vault set"); return null; } } public String getDescription(String userLocale) { return "Test mapper that mimics a mapper between Pagelet Producer and a credential vault that associates credentials with a username/domain relationship"; } public String getName() { return "OracleCredentialVault"; } public String getName(String userLocale) { return "OracleCredentialVault"; } public String getVendorName(String userLocale) { return "Oracle"; } public boolean setCredential(String initiator, Credential credential, String credType) { System.out.println("OracleCredentialVault::setCredential, initiator: " + initiator + ", credType: " + credType + ", Credential: " + credential.getCredentialValue()); String username = initiator.toLowerCase(); // assume that the vault stores all usernames in lowercase String domain = "oracle.com"; //getDomain(credType); String type = credType; //getType(credType); System.out.println("OracleCredentialVault::setCredential setting username: " + credential.getCredentialValue()); CredentialsSet userCredSet = VConnector.getInstance().getCrededentialsForDomain(username, domain); userCredSet.setCrededential(type, credential.getCredentialValue()); VConnector.getInstance().setCrededentialsForDomain(username, domain, userCredSet); return true; } public boolean supportsCredentialsEditing()
{ // We can set new credentials using this vault return true; } /* private String getDomain(String credType) { int dstart = credType.indexOf("_"); int dend = credType.indexOf("_", dstart+1); String domain = credType.substring(dstart+1, dend); System.out.println("TestMapper::getDomain, reading domain as: " + domain); return domain; } */ /* private String getType(String credType) { int dstart = credType.indexOf("_"); dstart = credType.indexOf("_", dstart+1); String type = credType.substring(dstart+1, credType.length()); System.out.println("TestMapper::getType, reading type as: " + type); return type; } */ /* private String doGetPropertyValue(String principal, String property) { return doGetPropertyValue(principal, property, ",", "="); } */ /* private String doGetPropertyValue(String principal, String property, String propDelim, String valueDelim) { int propertyindex = principal.toLowerCase().indexOf(property.toLowerCase()); String uname = null; if( propertyindex != -1) { // found a property occurence int beginIndex = propertyindex; int endIndex = principal.toLowerCase().indexOf(propDelim.toLowerCase(), beginIndex); String prop = null; if(endIndex != -1) { prop = principal.subSequence(beginIndex, endIndex).toString().trim(); } else { prop = principal.subSequence(beginIndex, principal.length()).toString().trim(); } if( prop != null ) { int valueIndex = prop.toLowerCase().indexOf(valueDelim); if(valueIndex != -1) { uname = prop.subSequence(valueIndex + valueDelim.length(), prop.length()).toString().trim(); } } } return uname; } */ }
資格証明マッピングを使用するためのリソースの構成の詳細は、『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』のページレット・プロデューサのリソースとページレットの作成に関する項を参照してください。
ページレット・プロデューサを使用すると、カスタムのインジェクタおよびパーサーを使用してページレットの機能を実行時に変更できます。
Webインジェクタは、プロキシされているリソース・ページの指定の場所にコンテンツを挿入します。コンテンツには、HTML、CSS、JavaScriptおよびページレット宣言などのテキストを指定できます。ページから不要なコンテンツを削除するために空のインジェクタを使用することもできます。インジェクタをOpenSocialリソース用に作成することはできません。単純なHTMLコンテンツの注入についてはユース・ケースが限られていますが、ページレットのHTMLマークアップを直接変更するJavaScriptを注入することもできます。
Webインジェクタを作成するには、使用するリソース下の「インジェクタ」セクションを選択し、ツールバーの「作成」アイコンをクリックします。
URLパターンを「URLフィルタ」フィールドに入力することにより、インジェクタをリソースのサブセットに適用できます。インジェクタは、「URLフィルタ」ボックスに指定されたテキストで始まるリソース内のURLにのみ適用されます。このボックスが空または/のみ指定されている場合は、インジェクタはリソース全体に適用されます。
インジェクタで特定の種類のコンテンツに制限するには、「MIMEフィルタ」ボックスにMIMEタイプのカンマ区切りリストを入力します。たとえば、text/htmlではインジェクタはHTMLコンテンツに制限され、一方、text/cssではCSSコンテンツにのみ制限されます。
リソースの出力のどこに注入するのかを定義します。
「先頭」はコンテンツをページの最初に配置します。このオプションは、ページレット宣言の注入には使用しないでください。
「最後」はページの最後にコンテンツを配置します。
「次より前」/「次より後」/「置換」の各オプションは、表示されたフィールドに指定されている一意の文字列に関連するページに配置します。「大文字/小文字を区別しない」を選択することにより、文字列の大/小文字を区別しないようにできます。
「囲みタグ」オプションは、一意の文字列を識別し、テキストと囲みタグの両方を次のページで指定されているコンテンツと置き換えます。
「コンテンツ」ページで注入するコンテンツを入力します。このコンテンツには、HTML、CSS、JavaScriptおよびページレット宣言などのテキストを指定できます。
たとえば、次のコードはページ上部に注入できます。この例では、ハンドラ関数をページ・ロード・イベントに登録し、(ヘッダーやフッターを検索および非表示にすることにより)ハンドラを使用してページ・マークアップを変更します。
<script type="text/javascript"> if (window.addEventListener) { window.addEventListener('load', hideHeaderFooter, false); } else if (document.attachEvent) { window.attachEvent('onload', hideHeaderFooter); } function hideHeaderFooter() { var header = null; // find the header table by class if (document.getElementsByClassName) { header = document.getElementsByClassName('page_header')[0]; } else { // for older versions of IE var tables = document.getElementsByTagName('table'); for (var table in tables) { if (table.class == 'page_header') { header = table; break; } } } if (header != null) { header.style.display = 'none'; } // now find and hide the footer (easier to find, since it has an id) var footer = document.getElementById('t23PageFooter'); if (footer != null) { footer.style.display = 'none'; } } </script>
カスタム・パーサーを使用すると、コンテンツを解析し、URLを検索するための組込みのロジックを補足したり変更できます。組込みのパーサーがURLの識別やURLとしてリライトしてはいけないセクションの識別に失敗した場合は、カスタム・パーサーを使用してデフォルトの動作を変更できます。パーサーは、WSRPやOracle JPDKポートレット・プロデューサまたはOpenSocialガジェット・プロデューサ用に作成することはできません。
カスタム・パーサーを作成するには、使用するリソース下で「パーサー」セクションを選択し、ツールバーの「作成」をクリックします。
パーサーの名前を入力します。
「URLフィルタ」ボックスにURLパターンを入力することにより、パーサーをリソースのサブセットに適用できます。パーサーは、「URLフィルタ」ボックスに指定されたテキストで始まるリソース内のURLにのみ適用されます。ボックスが空または/のみ指定されている場合は、パーサーはリソース全体に適用されます。
新しい解析ルールを追加するには、「作成」をクリックして新しい行を「フラグメントの場所」セクションに追加します。
「正規表現」欄に、変換するURLフラグメントを識別するための正規表現を入力します。最初のグループ化表現(かっこ内)はフラグメントを識別し、残りの表現はそれを検索するためのコンテキストを提供します。
「フラグメント・タイプ」から選択し、選択した場所を解析する方法を定義します。
「静的URL」はサーバー上で変換されます。
「動的URL」は、クライアント上でJavaScriptを使用して変換されます。
「HTMLフラグメント」および「JavaScriptフラグメント」タイプは、XMLなどの別のコンテンツ・タイプに埋め込まれるコンテンツに使用します。
「リライトなし」では、URLを検索しない場所を指定します。このオプションは、URLとして間違って識別されたマークアップのリライトを避けるために使用します。
ナビゲータ・ツールバーの保存アイコンをクリックします。
たとえば、正規表現XMLFile=(.*?)"
は、タグ内に次のように定義されたXMLファイルへのURLを識別します。<embed src="/i/flashchart/anychart_5/swf/OracleAnyChart.swf?>
XMLFile=http://apex.oracle.com/pls/apex/apex_util.flash?p=53557:1:74175370346201:FLOW_FLASH_CHART5_R45192463162785599619_en
"
。
ページレット・プロデューサには、ページレットのデバッグ用に拡張ロギング・トレースが組み込まれています。ロギングは、ページレット・プロデューサ・コンソールの「設定」セクションで構成され、ここで、ページレット・プロデューサの各コンポーネントについて様々なレベルのロギングを定義できます。(ページレット・プロデューサの構成設定の詳細は、『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』のOracle WebCenter Portalのページレット・プロデューサの管理に関する項を参照してください。)
ページレット・プロデューサは、標準のOracle Diagnostic Loggingファシリティにメッセージのログを記録します。Oracle WebLogic Serverでは、ログはuser-projects/domains/ <domain>/servers/<server>/logs/<server>-diagnostic.log
に格納されます。
ページレット・プロデューサによって送受信されたHTTPリクエストとレスポンスを表示するには、「ログ設定」ページで「HTTP」コンポーネントを「最も詳細」に設定します。次のトレースの例は、テスト環境から取得されたものです。
例65-5 ページレット・プロデューサによって受信されたHTTPリクエスト
URL: http://10.148.118.211:7001/pagelets/bidwiki/includes/js/ajax.js METHOD: GET SESSION ID: GdYGNJzMhxy1CJBMVTX8xTNq32GmLXYNY9VqFBcdprFnhcyQtzdp!1377086614!1305769149498 HEADERS: Host: 10.148.118.211:7001 Connection: keep-alive Referer: http://10.148.118.211:7001/pagelets/bidwiki/dashboard.action User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16 Accept: */* Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8,ru;q=0.6,it;q=0.4 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 If-None-Match: W/"736-1124953206000" If-Modified-Since: Thu, 25 Aug 2005 07:00:06 GMT COOKIES: JSESSIONID: GdYGNJzMhxy1CJBMVTX8xTNq32GmLXYNY9VqFBcdprFnhcyQtzdp!1377086614
例65-6 HTTPページレット・プロデューサにより送信されたレスポンス
URL: http://10.148.118.211:7001/pagelets/bidwiki/styles/main-action.css Response Code: 200 Reason: HEADERS: Date: Thu, 19 May 2011 01:39:14 GMT Content-Type: text/css;charset=UTF-8 Server: Apache-Coyote/1.1 BODY: .sidebar { /*background-image: url(http://10.148.118.211:7001/pagelets/bidwiki/download/ resources/leftnav_bg.jpg);*/ /*background-repeat: repeat-y;*/ background-color: #F0F0F0; /*border-bottom:1px solid #F0F0F0;*/ } ...
例65-7 ページレット・プロデューサから送信されたHTTPリクエスト
URL: http://xmlns.oracle.com/includes/js/ajax.js METHOD: GET HEADERS: CSP-Ensemble-REST-API: http://10.148.118.211:7001/pagelets X-Client-IP: 10.148.118.211 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16 CSP-Session-Username: weblogic Accept-Language: en-US,en;q=0.8,ru;q=0.6,it;q=0.4 CSP-Gateway-Type: Proxy PT-Proxy-Passes: 1 If-Modified-Since: Thu, 25 Aug 2005 07:00:06 GMT CSP-Protocol-Version: 1.4 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 Accept-Encoding: gzip,deflate,sdch Referer: http://10.148.118.211:7001/pagelets/bidwiki/dashboard.action If-None-Match: W/"736-1124953206000" Accept: */* CSP-Aggregation-Mode: Single PT-Proxy-instance0: {DECBB085-D891-72CF-2B75-005E7FE20000} CSP-Gateway-Specific-Config: PT-User-Name=weblogic,PT-Guest-User=0,...
例65-8 ページレット・プロデューサによって受信されたHTTPレスポンス
Original URI: http://xmlns.oracle.com/styles/main-action.css Effective URI: http://xmlns.oracle.com/styles/main-action.css Status Code: 200 Reason: OK Version: HTTP/1.1 HEADERS: Content-Type: text/css;charset=UTF-8 Content-Length: 29178 Server: Apache-Coyote/1.1 Date: Thu, 19 May 2011 01:39:14 GMT TRAILERS: BODY: body, p, td, table, tr, .bodytext, .stepfield { font-family: Verdana, arial, sans-serif; font-size: 11px; line-height: 16px; color: #000000; font-weight: normal; }
変換の前後にページレット・プロデューサによってプロキシされたコンテンツを表示するには、「ロギング設定」ページでTransformコンポーネントを「最も詳細」に設定します。これらのトレースの目的は、変換の様々な段階でレスポンス・コンテンツをログに記録して、それらを比較したり、異なる変換の結果を表示できるようにすることです。次のトレース例は、テスト環境から取得したものです。
例65-9 未変換のマークアップ
Original request: URL: http://10.148.118.211:7001/pagelets/bidwiki/styles/main-action.css METHOD: GET SESSION ID: GdYGNJzMhxy1CJBMVTX8xTNq32GmLXYNY9VqFBcdprFnhcyQtzdp!1377086614!1305769149498 HEADERS: Host: 10.148.118.211:7001 Connection: keep-alive Referer: http://10.148.118.211:7001/pagelets/bidwiki/dashboard.action User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16 Accept: text/css,*/*;q=0.1 Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8,ru;q=0.6,it;q=0.4 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 COOKIES: JSESSIONID: GdYGNJzMhxy1CJBMVTX8xTNq32GmLXYNY9VqFBcdprFnhcyQtzdp!1377086614 Untransformed content: body, p, td, table, tr, .bodytext, .stepfield { font-family: Verdana, arial, sans-serif; font-size: 11px; line-height: 16px; color: #000000; font-weight: normal; }
例65-10 変換済のマークアップ(トランスフォーマ・クラスによって変換)
Transformed by: class com.plumtree.server.impl.portlet.transformers.CSSTurboParser Original request: URL: http://10.148.118.211:7001/pagelets/bidwiki/styles/main-action.css METHOD: GET SESSION ID: GdYGNJzMhxy1CJBMVTX8xTNq32GmLXYNY9VqFBcdprFnhcyQtzdp!1377086614!1305769149498 HEADERS: Host: 10.148.118.211:7001 Connection: keep-alive Referer: http://10.148.118.211:7001/pagelets/bidwiki/dashboard.action User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16 Accept: text/css,*/*;q=0.1 Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8,ru;q=0.6,it;q=0.4 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 COOKIES: JSESSIONID: GdYGNJzMhxy1CJBMVTX8xTNq32GmLXYNY9VqFBcdprFnhcyQtzdp!1377086614 Transformed content: body, p, td, table, tr, .bodytext, .stepfield { font-family: Verdana, arial, sans-serif; font-size: 11px; line-height: 16px; color: #000000; font-weight: normal; }
ページレット・プロデューサを使用すると、WSRPおよびOracle JPDKポートレットを表示して任意のWebアプリケーションで使用できるようになります。WSRPまたはOracle JPDKポートレット・プロデューサに接続するためのページレット・プロデューサの構成の詳細は、『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』のOracle WebCenter Portalのページレット・プロデューサの管理に関する項を参照してください。次の第65.4.1項「ページレット・クロムの使用」で説明されているように、ページレット・プロデューサは、実行時にポートレット・マークアップを変更することもできます。
ページレット・クロムを使用すると、WSRPまたはJPDKポートレット・プロデューサからインポートされたポートレットを使用して作成されたページレットで実行時にマークアップを変更できます。
ページレット・クロム・テンプレートは次の各方法を指定するHTMLファイルです。
ポートレット・マークアップのスタイル・レンダリング方法
ポートレット・タイトルの表示方法
モード切替えオプションのレンダリング方法
デフォルトのクロム・テンプレートには、ポートレット名と、異なるモードへの切替えが可能なドロップダウン・メニューが表示されます。ドロップダウン・メニューは、基礎となるポートレットによりサポートされるすべての標準モードが動的に移入されます。テンプレートは、次の予約済トークンを使用して主要なポートレット要素を特定していますが、これらは実行時にページレット・プロデューサによって置き換えられます。
表65-3 ページレット・クロム・テンプレートのトークン
トークン | 説明 |
---|---|
$$PORTLET TITLE$$ |
ポートレット・タイトル |
$$REPEAT MENU ITEM$$ |
ナビゲーショナル・アイテムの繰返しセクションの始まりを示すために使用 |
$$END REPEAT MENU ITEM$$ |
ナビゲーショナル・アイテムの繰返しセクションの終わりを示すために使用 |
$$MENU ITEM URL$$ |
ナビゲーションURL(ポートレット・モードまたはウィンドウ状態の切替え用) |
$$MENU ITEM$$ |
ナビゲーショナル・アイテムの名前(Customizeなど)の表示 |
$$TOKEN$$ |
ページ上のページレット・インスタンスの一意の識別子 |
$$PORTLET CONTENT$$ |
ポートレット・コンテンツ |
pt://images |
imageserverのURLを示すために使用されるタグ |
次に、非常に単純なページレット・クロム・テンプレートの例を示します。
<script type="text/javascript"> function goto(url) { document.location = url; return false; } </script> <div style="border: 1px solid"> <span><b><!-- $$PORTLET TITLE$$ --></b></span> <span style="align: right"> Switch Mode: <select size="1" name="mode"> <!-- $$REPEAT MENU ITEM$$ --> <option onclick="goto('$$MENU ITEM URL$$')"><!-- $$MENU ITEM$$ --></option> <!-- $$END REPEAT MENU ITEM$$ --> </select> </span> </div> <!-- $$PORTLET CONTENT$$ -->
注意: ページレット・クロム・テンプレート・ファイルは、ページレット・プロデューサWebアプリケーションのclasspathでホストする必要があります。 外部イメージ・サーバーを使用するようにページレット・プロデューサを構成した場合は、ensemblestatic.war/imageserver/yahooからイメージ・サーバーにファイルをコピーしてデフォルトのクロム・テンプレートが正しくレンダリングされるようにします。 |
クロム・テンプレートを実装するには、それをパラメータとしてページレット注入URL (RESTまたはJavaScript)に追加します。ページレット注入URLの詳細は、第65.2.2項「Webページへのページレットの追加」を参照してください。次に例を示します。
REST: /inject/v2/pagelet/pagelet_lib/pagelet_name?chrome=mychrome.html
JavaScript: injectpagelet(library, name, iframe_options, payload, params, context_id, element_id, is_in_community, chrome)
クロム・パラメータの値として、クロム・テンプレートが含まれているファイルの名前、またはすべてのクロムを抑止してポートレット・マークアップのみを返す特別な予約値「none
」を指定できます。クロム・パラメータが省略された場合は、デフォルトのクロムがポートレット・マークアップとともに返されます。デフォルトのクロム・テンプレートでは、YUIメニュー・コントロールを使用してグラデーション・タイトル・バーとモード切替え用のDHTMLドロップダウン・メニューが表示されます。(ADFコンテンツが検出された場合は、デフォルトにより別のクロム・テンプレートが使用されます。このテンプレートはカスタム・テンプレートによってオーバーライドするか、chrome=chrometemplate.htmlを設定することによって標準のデフォルト・テンプレートでオーバーライドすることができます。)
ページレット・プロデューサ・サーバーからアクセス可能なOpenSocialガジェットは、ページレットとして登録して、ポータルなどのWebアプリケーションで使用できます。ページレット・プロデューサへのOpenSocialページレットの登録の詳細は、『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』のOracle WebCenter Portalのページレット・プロデューサの管理に関する項を参照してください。
ページレット・プロデューサでは、OAuthを除く、標準のOpenSocial APIのほとんどをサポートしています。完全なOpenSocial API参照ドキュメントは、http://docs.opensocial.org/display/OSD/Javascript+API+Documentation
で検索できます。
ページレット・プロデューサでは、OpenSocial APIを使用した、ガジェットによるプリファレンスの保存、WebCenter Portalプロファイルと接続情報の取得およびユーザーのアクティビティ・ストリームへのアクセスが可能です。これらの機能の使用方法の詳細は、後続の項を参照してください。
ガジェットからユーザーレベルのデータ(プリファレンスやピープル・コネクション)をリクエストするには、エンド・ユーザーのIDを確立する必要があります。任意のOpenSocialガゼットがサーバーのユーザーレベルのデータにアクセスする必要がある場合は、ページレット・プロデューサ・コンソールで親のOpenSocialリソースのセキュリティ・ポリシーを構成する必要があります。ユーザーがOpenSocialガゼットに初めてアクセスすると、ログイン・ページが表示されます。初回ログイン後は、OpenSocialガゼットに対する後続のリクエストで確立されたユーザーIDが使用されます。
ページレット・プロデューサ・リソースのセキュリティ・ポリシーの構成の詳細は、『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』の「ページレットの管理」の章を参照してください。
OpenSocialガゼットでは、ユーザー・プリファレンスを使用してコンテナでデータを格納できます。ユーザー・プリファレンスは、特定のユーザーにスコープ設定されますが、オプションで、appIdにスコープ設定することもできます(ガゼットappIdはページレットのコンテキストIDです)。OpenSocial gadget.Prefs APIを使用する場合は、ユーザー・プリファレンスはユーザーとページレット・インスタンスにスコープ設定されます。または、opensocial.DataRequest APIを使用して、他のページレットと共有可能なプリファレンスをユーザー・レベルで管理することもできます。
ページレットとして登録した場合は、ガゼットのユーザー・プリファレンスはページレット・プリファレンスとして処理されます。WebCenter Portalでは、たとえば、隠されていないユーザー・プリファレンスを、「パーソナライズ」ボタンを使用してエンド・ユーザーが編集できます。さらに、ユーザー間で共有されたプリファレンスをシミュレートするために、ページレット・パラメータを介してユーザー・プリファレンスを渡すことができます。ページレット・プリファレンスが設定されている場合は、対応するページレット・パラメータが常にオーバーライドされます(つまり、パーソナライズはカスタマイズに優先します)。
WebCenter Portalの外では、ガジェットがサポートするページレットに、プリファレンス・エディタにアクセスし、ガジェットを最大/最小化するためのガジェット・タイトルとボタンを表示する簡単なクロムが提供されます。値noneをページレット注入APIのクロム・パラメータに渡すことにより、クロムを抑止できます。プリファレンス・エディタのUIでは、次の4種類のユーザー・プリファレンスをすべてサポートしています。
string: テキスト・フィールドとしてレンダリング
bool: チェック・ボックスとしてレンダリング
enum: ドロップダウン・リストとしてレンダリング
list: テキスト・フィールドとしてレンダリング(値はパイプ「|」文字で区切る必要があります)
OpenSocialガジェットでは、標準のOpenSocial APIを介して現在のユーザーのプロファイル・データとピープル・コネクションを問合せできます。この機能を使用するには、『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』のOracle WebCenter Portalのページレット・プロデューサの管理に関する項の説明に従って、WebCenterDSデータ・ソースのターゲットをWC_Portletサーバーに設定する必要があります。
注意: OpenSocial APIをプロファイルや接続情報の更新に使用することはできません。 |
サポートされているユーザー・プロファイルのフィールドを次の表に示します。
表65-4 ユーザー・プロファイルのフィールド
OpenSocialフィールド | タイプ | 説明 |
---|---|---|
aboutme |
string |
個人に関する一般的な説明。 |
addresses |
Plural-Field <Address> |
個人の物理メーリング・アドレス。 |
appData |
Plural-Field <AppData> |
AppDataのキーと値のコレクションで、プリファレンスに使用。 |
birthday |
日付 |
個人の生年月日。値は有効な日付である必要があります。この個人の年齢がプライベートであるか、入力した年が使用不可能である場合は、年が0000に設定される場合があります。 |
emails |
Plural-Field <string> |
個人の電子メール・アドレス。 |
location |
string |
個人の物理的な住所。 |
name |
名前 |
個人の実名のコンポーネントを分解して書式設定したバージョン。 |
organizations |
Plural-Field <Organization> |
個人の現在や過去の組織的な所属。 |
phoneNumbers |
Plural-Field <string> |
個人の電話番号。このタイプに正当な標準値に加え、このフィールドでは、モバイル、ファックスおよびページャなどの追加の値を定義します。 |
photos |
Plural-Field <string> |
個人の写真のURL。値MUSTは、イメージが含まれているWebページではなく、実際のイメージ・ファイル(例: GIF、JPEG、またはPNGイメージ・ファイル)を指し示します。このフィールドは、このユーザーが撮影した任意の写真を送信するのではなく、連絡先を記述する際の表示に適した特別な連絡先プロファイルの写真を送信するために使用してください。 |
preferredUsername |
string |
ユーザー名を要求するサイトでの、この個人の優先ユーザー名(jsmarrまたはdaveman692など)。 |
status |
string |
個人のステータス、ヘッドラインまたは挨拶。 |
thumbnailUrl |
string |
文字列として指定された、個人の写真のサムネイルのURL。これは完全修飾URLである必要があります。 |
OpenSocialガジェットは、OpenSocial APIを使用してユーザーのアクティビティ・ストリームを操作できます。次の操作がサポートされています。
アクティビティの取得
アクティビティの作成
次の操作はサポートされていません。
アクティビティの更新
アクティビティの削除
サポートされているアクティビティ・ストリームのフィールドを次の表に示します。
表65-5 アクティビティ・ストリームのフィールド
OpenSocialフィールド | タイプ | 説明 |
---|---|---|
appId |
Object-Id |
アクティビティが関連付けられているアプリケーション。 |
body |
string |
アクティビティのオプションの拡張バージョン。本体には次のHTMLタグ、 <b> <i>、<a>、<span>のみを含めることもできますが、このフォーマットは無視できます。 |
externalId |
Object-Id |
投稿アプリケーションで生成されるオプションのID。 |
id |
Object-Id |
アクティビティに永続的に関連付けられているID。 |
postedTime |
string |
エポック以降にアクティビティが実行された時間(ミリ秒)。 |
priority |
数値 |
同じソースの別のアクティビティとの関連で、該当のアクティビティの相対的な優先度を表す0から1までの数値。 |
title |
string |
アクティビティのプライマリ・テキスト。タイトルには次のHTMLタグ、 <b> <i>、<a>、<span>のみを含めることもできますが、このフォーマットは無視できます。 |
userId |
Object-Id |
アクティビティの定義対象であるユーザーのID。 |
ページレット・プロデューサでは、OpenSocial PubSubガジェット間イベント・モデルをサポートしています。ガジェットでは、JavaScriptで任意の数のチャネル(単純な文字列名で定義)を通じてイベントを公開できます。受信が終了すると、ガジェットは、再びJavaScriptで任意の数のチャネルを通じてイベントの受信をサブスクライブし、イベントに応じて適切な処理を実行できます。
function connSelected(element) { var connId = element.id; var connName = element.lastChild.textContent; gadgets.pubsub.publish(channel, {id: connId, name: connName});
サポートされているイベント処理APIの完全なJavaScript参照は、http://docs.opensocial.org/display/OSD/Javascript+API+Documentation
を参照してください。また、http://docs.opensocial.org/display/OSD/Core-Gadget+-+PubSub
も参照してください。
次の例は説明のために簡略化されています。ページレット・プロデューサ・コンソールの設定の詳細は、『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』の「Oracle WebCenter Portalのページレット・プロデューサの管理」を参照してください。
ページレット・プロデューサ・コンソールを使用して新しいリソースを作成し、タイプに「OpenSocial」を選択します。必要に応じてURLおよびポリシーを定義します。新しいリソースを保存します。
ページレット・プロデューサ・コンソールを使用して、新しいページレットを作成し、「ガジェットURL」フィールドにガジェットXMLスキーマの場所を入力します。
ガジェット名およびガジェットに定義されたすべてのプリファレンスをインポートするには、「ガジェット・メタデータのインポート」ボタンをクリックします。いずれかのプリファレンスが編集可能な場合、ページレット・プロデューサは、インポートされたプリファレンスを使用してプリファレンス・エディタを作成します。
生成されたプリファレンス・エディタを構成またはカスタマイズするには、「ページレット・パラメータ」ページに移動します。
「ドキュメント」ページに移動し、JavaScriptまたはREST APIを使用してページレットおよびプリファレンス・エディタにアクセスするためのサンプル・コードを確認します。
新しいページレットを保存します。
次の例は説明のために簡略化されています。ページレット・プロデューサ・コンソールの設定の詳細は、『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』の「Oracle WebCenter Portalのページレット・プロデューサの管理」を参照してください。
ページレット・プロデューサ・コンソールを使用して新しいリソースを作成し、タイプに「OpenSocial」を選択します。必要に応じてURLおよびポリシーを定義します。新しいリソースを保存します。
ガジェット・ファイルを作成またはアップロードします。
注意: OpenSocialガジェットXMLファイルをホストする場合は、このファイルを匿名リソース(セキュリティ・ポリシーなし)の下に配置する必要があります。そこに配置しないと、ガジェットが正常に機能しません。 |
匿名リソースの下の「ファイル」セクションを選択し、ツールバーの「作成」アイコンをクリックします。
「一般」ページで、「名前」フィールドにファイルへの相対パスを入力します。先行スラッシュ("/")を使用しないでください。たとえば、「gadgets/activities.xml」です。任意のパスと名前を使用できます。パスは、ページレット・プロデューサがファイルの処理に使用する「仮想」URLです。ナビゲータのファイル・コレクションの仮想ディレクトリ構造は、ファイルのパスに一致するように更新されます。
ガジェット・ファイルをアップロードまたは作成するには、「コンテンツ」ページに進みます。
ガジェット・ファイルをアップロードするには、ファイルへのパスを入力するか「参照」ボタンをクリックしてファイルに移動し、「アップロード」ボタンをクリックし、ページレット・プロデューサ・サーバーにファイルをアップロードします。
ガジェット・ファイルを作成するには、「コンテンツ」ページでエディタを使用してコンテンツを入力したり編集します。
ナビゲータ・ツールバーの保存アイコンをクリックします。
ガジェットで必要なその他のファイル(JavaScript、イメージなど)を、リソースの「ファイル」セクションで作成またはアップロードします。ガジェット・コードのパスに一致するファイルのパスを定義します。たとえば、ガジェットがjsというサブフォルダのJavaScriptファイルを使用する場合は、ファイル(gadgets/js/activities.jsなど)をアップロードする際に「名前」フィールドにディレクトリを指定します。
ページレット・プロデューサ・コンソールを使用して、新しいページレットを作成し、「ガジェットURL」フィールドに(ステップ2で作成またはアップロードした)ガジェットのXMLスキーマの相対パスを入力します。ローカル・ファイルの場合は、これはファイル・オブジェクトの「名前」フィールドに定義されているパスと同じになります(gadgets/activities.xmlなど)。
ガジェット名およびガジェットに定義されたすべてのプリファレンスをインポートするには、「ガジェット・メタデータのインポート」ボタンをクリックします。いずれかのプリファレンスが編集可能な場合、ページレット・プロデューサは、インポートされたプリファレンスを使用してプリファレンス・エディタを作成します。
生成されたプリファレンス・エディタを構成またはカスタマイズするには、「ページレット・パラメータ」ページに移動します。
「ドキュメント」ページに移動し、JavaScriptまたはREST APIを使用してページレットおよびプリファレンス・エディタにアクセスするためのサンプル・コードを確認します。
新しいページレットを保存します。
この項は、既存のWSRPポートレットまたは、Oracle EBSなどのバックエンド・アプリケーションにより公開されるWeb UIの要素も含めて、Oracle WebCenter Sites 11gの各ページにコンテンツを統合する必要のある開発者を対象としています。開発者はOracle WebCenter SitesおよびOracle WebCenterページレット・プロデューサに精通しており、Webテクノロジを十分に理解している必要があります。
この項には次のサブセクションが含まれます:
ページレットとその関連リソースが構成されたら、JavaScriptまたはRESTを使用してそれをWebページに挿入できます。詳細は、第65.2.2項「Webページへのページレットの追加」を参照してください。
ここでは、コンテンツ・ソースとしてページレットにアクセスするためのREST URLを指定したIFrameを使用して、ページレットがOracle WebCenter Sites内のページ・テンプレートに直接追加されるアプローチを採用します。このためには、CSAPI JavaScriptライブラリ(必要な機能を親ページに追加します)と、ページレット・コンテンツをロードする実際のiFrameをロードするために、ページ・テンプレート・スクリプト・タグに次のように追加する必要があります。
<script type="text/javascript" src="http://%PAGELET_PRD_HOST%/pagelets/inject/v2/csapi"/> <iframe id="pt-pagelet-iframe-1" width="100%" frameborder="0" src="http://%PAGELET_PRD_HOST%/pagelets/inject/v2/pagelet/lib_name/pagelet_name?content-type=html&consumepage=true&ifheight=auto"></iframe>
ここで、lib_name
およびpagelet_name
はページレット・プロデューサに構成されたライブラリとページレットを示しています。パラメータの詳細は、第65.2.2.2項「RESTを使用したページレットへのアクセス」を参照してください。
ページレットをよりシームレスに消費側ページに統合するには、コンテンツを収められるように動的にサイズ変更することによって、ページレットiFrameがよりインライン・マークアップらしく動作するように設定できます。この機能を有効にするには、サイトとページレット・プロデューサの両方でさらに構成を加える必要があります。
この項では、WebCenter Sitesに同梱されているAviSportsサンプル・サイトを使用します。このサイトに新しいアセットを追加するには、サイト管理ページにログインして、次に示すように左側のナビゲーションで開発セクションを開きます。
まず、次の設定を使用して新しいテンプレートを作成します。
名前
名前: iFrameResizeRelay (または任意の名前)
アセット・タイプの場合: 様々なアセット・タイプに適用可能(タイプなし)
要素
使用方法: 要素はHTMLページ全体を定義し、外部からコール可能です。
要素記憶域パス/ファイル名: iframe-resize.html(または任意の名前)
要素ロジック:
<html> <head> <title>Resizing Page</title> <script type="text/javascript"> function onLoad() { var params = window.location.search.substring( 1 ).split( '&' ); var height; var width; var iframe; for( var i = 0, l = params.length; i < l; ++i ) { var parts = params[i].split( '=' ); switch( parts[0] ) { case 'height': height = parseInt( parts[1] ); break; case 'width': width = parseInt( parts[1] ); break; case 'iframe': iframe = parts[1]; break; } } window.top.updateIFrame( iframe, height, width ); } if (window.addEventListener) { window.addEventListener("load", onLoad, false); } else if (window.attachEvent) { window.detachEvent("onload", onLoad); window.attachEvent("onload", onLoad); } else { window.onload=onLoad; } </script> </head> <body> </body> </html>
サイト・エントリ
キャッシュ・ルール: キャッシュ済(デフォルト)
保存
SiteCatalogパラメータを%PAGENAME%
として記録(デフォルト名を使用した場合、これは<site_name>/iFrameResizeRelayになります)
新しいテンプレートには、次のようにアドレス可能です。
http://%SITES_HOST%/cs/Satellite?pagename=%PAGENAME%
このURLをメモしておきます。これは、ページレット用にインジェクタを構成するために使用します。
次に、ページレット・プロデューサ管理コンソールを使用して新しいインジェクタをページレットに追加することによって、iFrameサイズ変更機能を適用します。ページレットを開き、「インジェクタ」を選択して、次の設定で新しいインジェクタを作成します。
一般
名前: auto_resizer (または任意の名前)
URLフィルタ: <none>
MIMEフィルタ: text/html
挿入位置: </head>の前
コンテンツ: 「テキスト」(デフォルト)を選択し、次のJavaScriptをテキスト・エリアにコピーします。
次のJavaScript内のSITES_RESIZE_RELAY_PAGEを、前の手順で作成したテンプレートのURLに置き換えます。
<script type="text/javascript"> var SITES_RESIZE_RELAY_PAGE = "http://%SITES_HOST%/cs/Satellite?pagename=%PAGENAME%"; // CHANGE ME! if (window.addEventListener) { window.addEventListener("load", calculateSizeFixed, false); } else if (window.attachEvent) { window.attachEvent("onload", calculateSizeFixed); } else { window.onload=calculateSizeFixed; } function calculateSizeFixed() { var PTResizeIFrame = PTResizeIFrame || {}; if (PTPortalPage && PTPortalPage.portlets) { for (var i in PTPortalPage.portlets) { if ( PTPortalPage.portlets[i].id != "page") { PTResizeIFrame.pageletInstanceID = PTPortalPage.portlets[i].id; break; } } } else if (!PTResizeIFrame.pageletInstanceID) { PTResizeIFrame.pageletInstanceID = 1; } if (!PTResizeIFrame.pageletResizePage) { var match = window.location.search.match(/resizepage=[^&]*/); if (match != null && match.length > 0) PTResizeIFrame.pageletResizePage = unescape(match[0].substr("resizepage=".length)); else PTResizeIFrame.pageletResizePage = SITES_RESIZE_RELAY_PAGE; } var agent = navigator.userAgent; var ffversion = agent.indexOf("Firefox") >= 0 ? agent.substring(agent.indexOf("Firefox")).split("/")[1] : -1; var FFextraHeight = parseFloat(ffversion)>=0.1? 25 : 0; var scrollHeightExtra = 15; if (agent.indexOf('MSIE') > 0) { scrollHeightExtra = 35; } if (FFextraHeight > 0) scrollHeightExtra = FFextraHeight; var wrapper = document.getElementById( 'pt-inner-iframe-wrapper-' + PTResizeIFrame.pageletInstanceID); if (wrapper == null) wrapper = createRelayIFrame(PTResizeIFrame.pageletInstanceID); var iframe = document.getElementById( 'pt-inner-iframe-' + PTResizeIFrame.pageletInstanceID); var height = 0; var width = 0; var iframename = ''; if( (document.contentDocument) && (document.contentDocument.documentElement.offsetHeight) ) { height = document.contentDocument.documentElement.offsetHeight + FFextraHeight; } else if( (document.contentDocument) && (document.contentDocument.body.offsetHeight) ) { height = document.contentDocument.body.offsetHeight+FFextraHeight; } else if (document && document.documentElement.scrollHeight ) { height = document.documentElement.scrollHeight + scrollHeightExtra; } else if( document && document.body.scrollHeight ) { height = document.body.scrollHeight + scrollHeightExtra; } else { height = wrapper.offsetHeight; } width = wrapper.offsetWidth; iframename = 'pt-pagelet-iframe-' + PTResizeIFrame.pageletInstanceID; var qsSeparator = PTResizeIFrame.pageletResizePage.indexOf("?") >= 0 ? "&" : "?"; iframe.setAttribute("src", PTResizeIFrame.pageletResizePage + qsSeparator + 'height=' + height + '&' + 'width=' + width + '&' + 'iframe=' + iframename); } function createRelayIFrame(pageletInstanceId) { var wrapper = document.createElement("div"); wrapper.id = "pt-inner-iframe-wrapper-" + pageletInstanceId; var iframe = document.createElement("iframe"); iframe.id = "pt-inner-iframe-" + pageletInstanceId; iframe.setAttribute("height", 0); iframe.setAttribute("frameborder", 0); iframe.setAttribute("width", 0); wrapper.appendChild(iframe); document.body.appendChild(wrapper); return wrapper; } </script>
IFrame内でREST URLを使用して、サイトにあるページ・テンプレートにページレットを追加します。IFrameでは、IDパラメータにはページレットIFrameを識別する一意の番号を使用する必要があります(たとえば、「pt-pagelet-iframe-1」)。IFrame自動サイズ変更をサポートするために、次の問合せ文字列パラメータをページレットURLに追加する必要があります。
resizepage=http://%SITES_HOST%/cs/Satellite?pagename=%PAGENAME%
ifheight=auto
例:
<script type="text/javascript" src="http://%PAGELET_PRD_HOST%/pagelets/inject/v2/csapi"/> <iframe id="pt-pagelet-iframe-1" width="100%" frameborder="0" src="http://%PAGELET_PRD_HOST%/pagelets/inject/v2/pagelet/lib_name/pagelet_name?content-type=html& consumepage=true&resizepage=http://%SITES_HOST%/cs/Satellite?pagename=%PAGENAME%&ifheight=auto"> </iframe>
注意: 1ページに複数のページレットが存在する場合は、自動サイズ変更が適切に機能しないことがあります。これは、外部認証サーバーに対してフォーム自動ログインを必要とするページレットで発生することが知られています。この場合は自動サイズ変更用に構成できるページレットは1つだけであり、その他のページレットには静的なIFrameサイズ設定を使用する必要があります。 |
消費側WebCenter Sitesのページでページレットが見栄えよく収まるようにするには、インジェクタを使用して元のCSSをオーバーライドするスタイルを追加することもできます。オーバーライドが適切に機能するためには、インジェクタによるスタイル定義がバックエンド・アプリケーションによって定義されたスタイルの後に置かれることが重要です。次の例では、置換CSSを<HEAD>セクションの末尾に注入することで、これを処理しています。
ページレットのスタイルを変更するには、ページレット・プロデューサ管理コンソールを使用して新しいインジェクタをページレットに追加します。ページレットを開き、「インジェクタ」を選択して、次の設定で新しいインジェクタを作成します。
一般
名前: new_styles (または任意の名前)
URLフィルタ: <none>
MIMEフィルタ: text/html
インジェクタの場所: </head>の前
コンテンツ
Injector Location: Before </head>
第65.6.6項「ページレットとしてのアプリケーションの消費(EBS11iの使用例)」には、WebCenter SitesにサンプルのAviSportsサイトを一致させるためにEBS UIのスタイル変更に使用されるインジェクタの作業例が含まれています。
ページレット・プロデューサの中心的な目的は、バックエンド・アプリケーションをプロキシ設定することです。ページレット・プロデューサはブラウザとバックエンド・アプリケーションの「仲介役」として動作するため、アイデンティティ伝播を次の2つの部分に分ける必要があります。
ページレット・プロデューサは通常、図65-15に示すようなIFrameを使用して、WebコンテンツをWebCenter Sitesに注入します。
コンテンツはIFrameとして注入されるため、ユーザーIDは、図65-16に示すようにサイト・コンテナとページレット・プロデューサ・コンテナの両方に設定されている必要があります。図65-16では、2つの認証スキーム間での共有が前提となっているユーザー・ディレクトリが省略されていることに注意してください。
ブラウザと2つのコンテナ間でアイデンティティを管理する理想的な方法は、図65-17に示すようにOracle Access Manager (OAM)を使用することです。図65-17では、2つの認証スキーム間での共有が前提となっているユーザー・ディレクトリが省略されていて、OAMアクセス・サーバーが除外されていることに注意してください。また、この構成は11g以前のバージョンではサポートされていないことにも注意してください。
WebCenter Sites11g用にOAMを設定する場合は、『Oracle WebCenter Sitesでサポートするソフトウェアの構成』のOracle Access Manager統合の設定に関する章を参照してください。
OAMを設定する前に、サイトでページレット・プロデューサの統合をテストしておくと役立つ場合があります。OAMを使用しないと、ユーザーはページレット・プロデューサとサイトでそれぞれ別々に認証する必要があります(図65-16を参照)。この項では、ページレット・プロデューサでの個別認証の構成方法について説明します。
OAM SSOがページレット・プロデューサまたはサイトのどちらかに存在していない場合は、ページレット・プロデューサからログイン・フォームが表示されていることを確認して、図2に示す認証スキームをサポートする必要があります。ページレット・プロデューサでログイン・フォームが表示されるようにするには:
ページレットへのアクセスを制限するJ2EEロールを特定するか、ページレット・プロデューサをホストしているJ2EEアプリケーション・サーバーに新しいロールを作成します。
この例では、デフォルトのWLSインストールに存在しているグローバルなWebLogic Server (WLS)の「匿名」J2EEロールを使用しています。
ページレット・プロデューサ管理コンソールにログインし、サイト内で表面化する必要のあるページレットが含まれているリソースに移動して、ステップ1で選択したロールを追加します。
ロールは、リソースの「ポリシー」ページで定義されます。
アイデンティティの確立方法は、次の各項で説明するようにアプリケーションのタイプによって異なります。
WSRPポートレットは、アイデンティティ伝播のためにWSSトークンを使用する必要があります。セキュリティ・トークンの構成方法の詳細は、『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』のWSRPおよびOracle JPDKポートレット・プロデューサの登録に関する項と、第65.6.4項「WSRPポートレットをページレットとして消費」を参照してください。
アイデンティティを必要とするOracle JPDKポートレットごとに、外部アプリケーションのログイン・フォームによって提供される情報に基づいて資格証明が渡されます。詳細は、『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』の外部アプリケーションの管理に関する項とOracle JPDKポートレット・プロデューサの登録に関する項を参照してください。
ページレット・プロデューサには「自動ログイン」という機能があり、この機能によってページレット・プロデューサはバックエンド・アプリケーションにより確立された「ネイティブ」認証メカニズムと相互作用できます。
バックエンド・アプリケーションにはそれぞれ独自の認証手段があるため、必要な資格証明を収集するには、ページレット・プロデューサで独自のログイン・プロンプトを開始する必要があります。ページレット・プロデューサのリソースは、資格証明を基本的な認証ヘッダー、NTLMトークン、またはKerberosトークンとしてバックエンド・アプリケーションに送信し、さらにフォーム・ベースの認証を(通常はセッションCookieを介して)管理するように構成できます。詳細は、『Oracle Fusion Middleware for Oracle WebCenter Portal管理者ガイド』の自動ログインに関する項を参照してください。
注意: 「ユーザー・ボールト」を使用するように「ユーザー名」フィールドと「パスワード」フィールドを設定して、バックエンド・アプリケーションへのアクセスに必要なユーザー自身の一意の資格証明を入力するプロンプトが各ユーザーに表示されるようにします。 |
バックエンド・アプリケーションに適切な自動ログイン設定を決定することは、かなり大変な場合があります。この作業では、リクエスト・ヘッダーの参照、リダイレクトの確認、マークアップ(ときには動的に生成されたもの)の調査が必要になります。この調査および構成プロセスは、自動ログインが必要なアプリケーションが複数存在する場合は、気の滅入るような作業になりかねません。したがって、Oracle Access Manager (OAM) SSOまたはOracle SSO (OSSO)が使用可能な場合は、バックエンド・アプリケーションを保護するためにこれらのSSOソリューションの1つを使用することを強くお薦めします。
バックエンド・アプリケーションがOAMで保護されると、次のサブセクションで説明するように、次の2つの方法でページレット・プロデューサが資格証明を提供できるようになります。
OAM 11g WebGateは、OAMサーバーでユーザー資格証明のすべての検証を管理するOracle HTTP Server (OHS)で実行するApacheモジュールです。ユーザーの妥当性が確立されると、OHSがプロキシ設定しているアプリケーション・サーバー上のWebアプリケーションにOAM_REMOTE_USERヘッダーが送信されます。アプリケーション・サーバー上ではOAMアイデンティティ・アサーション・プロバイダが実行して、JAASユーザー・プリンシパル名をOAM_REMOTE_USERヘッダー値に設定します。
ページレット・プロデューサがOAM 11g WebGateで保護されると、OAM_REMOTE_USERヘッダーを受信します。これによってプロキシ設定されたWebアプリケーションもすべて、このヘッダーを受信します。プロキシ設定されているWebアプリケーションがOAMアイデンティティ・アサーション・プロバイダを持つアプリケーション・サーバーにインストールされている場合、OAMアイデンティティ・アサータはページレット・プロデューサから渡されたOAM_REMOTE_USERヘッダー値を使用してユーザー・プリンシパルを設定します。この操作は、ページレット・プロデューサが、保護されたWebアプリケーションに対してWebGateのURLをプロキシ設定しようとしないかぎり、すべて実行されます。この項の以降の部分では、サイト統合のコンテキストでこれが実行できる方法を詳しく説明します。
設定例
この例では、前述の図65-18に示すように、WebCenter Sitesとページレット・プロデューサの両方がOAM WebGateによって保護されていて、次のホストとポートがアプリケーションによって使用されることを前提としています。
OAM SSO WebGate: www.example.com:80
WebCenter Sites: sites_host:8080
WebCenterページレット・プロデューサ: pp_host:8889
バックエンド・アプリケーション: backendhost:8001
ブラウザから(WebGate経由で)表示されるバックエンド・アプリケーションの完全URL
http://www.example.com/backend/console
アプリケーション・サーバーから直接アクセスする場合のバックエンド・アプリケーションの完全URL(内部ネットワークのみで使用可能) http://backendhost:8001/console
バックエンド・アプリケーションへの直接URLを使用するようにページレット・プロデューサ・リソースを設定して、WebGateをバイパスします(つまり、http://backendhost:8001/console
)。
バックエンド・アプリケーションを直接コールするようにページレット・プロデューサを設定(WebGateをバイパス)することにより、ページレット・プロデューサで受信されるすべてのOAMセキュア・ヘッダーは、バックエンド・アプリケーションをホストしているアプリケーション・サーバー上のOAMアイデンティティ・アサーション・プロバイダに渡されます。バックエンド・アプリケーションをホストしているアプリケーション・サーバー上のOAMアイデンティティ・アサーション・プロバイダは、OAMヘッダーを受信すると、適切なユーザー・プリンシパルを設定します(図65-19を参照)。図65-19では、2つの認証スキーム間での共有が前提となっているユーザー・ディレクトリが省略されていることに注意してください。また、OAMアクセス・サーバーも除外されています。
注意: WebGateをバイパスするようにページレット・プロデューサを設定するとシングル・サインオンが実行できますが、このソリューションはいつでも適用できるわけではありません。WebGateをホストしているOHSサーバーがバックエンド・アプリケーションのロード・バランシングも管理している場合は、WebGateをバイパスすることによってロード・バランシングもバイパスされます。アプリケーションへのトラフィックはすべて1つのサーバーにルーティングされます。この場合は、第65.6.3.4.2項「自動ログインとSSOによるアイデンティティ伝播の使用」で説明するように、自動ログイン用にページレット・プロデューサを構成することをお薦めします。 |
OAM WebGateのバイパス(第65.6.3.4.1項「OAMで保護されたバックエンド・アプリケーションへのアイデンティティの直接伝播の使用」で説明するとおり)が実行可能なオプションでない場合は、ページレット・プロデューサの自動ログインを使用して資格証明を提供することができます。バックエンド・アプリケーションごとに個別のログイン・フォームを使用する場合と異なり(自動ログインによるアイデンティティ伝播の項を参照)、Oracle SSOソリューション(OAMまたはOSSO)のログイン・ページによる自動ログインを使用すると、自動ログインを1回だけ設定すればよく、構成手順はすべての実装で同じであるという利点があります。
OSSOでの自動ログインの設定手順は、このドキュメントの例1: E-Business Suite 11iの消費の自動ログインの構成に関する項で詳しく説明しています。本番環境では、これらの手順はこのまま実行できますが、例外として「ssousername」フィールドと「password form」フィールドを「ユーザー・ボールト」にリンクする必要があります。
OAMで保護されたバックエンド・アプリケーションも、このドキュメントの自動ログインの構成に関する項でOSSOに関して説明した手順に従って設定できますが、次の例外があります。
login form URLは設定済の場所(例: http://oam11g.mycompany.com:14100/oam/server/obrareq.cgi)です。
自動ログインのフォーム識別URLを設定するときに、固定位置引数の後の問合せ文字列を必ず削除してください。
form action URLは異なる値になりますが、静的な値である必要があります。OAM formを調べて、form action URLを決定します。
「username」フィールドと「password」フィールドの値が異なる場合があります。「OAM form」フィールドを調べて、これらの値を決定します。
次の生成された2つの値、「request_id」および「OAM_REQ」を含めます。
この項では、一般的なバックエンドSSOシナリオに対するページレット・プロデューサでの自動ログイン設定のクイック参照を示します。
ログイン・フォームの識別:
URL: http://%OAM_ROOT%/server/obrareq.cgi
フォーム送信場所:
URL: /oam/server/auth_cred_submit
フォーム・フィールド:
actionURL : 静的 : /oam/server/auth_cred_submit
request_id : 生成済
username : 静的または資格証明ボールト
OAM_REQ : 生成済
password : 静的または資格証明ボールト
ページレット・プロデューサではWebCenter Common Consumerを統合しているため、WSRPポートレットやOracle JPDKポートレットをページレットとして公開して、WebCenter Sitesまたは、WSRPコンシューマを含んでいないその他のすべてのWebコンテナで使用することができます。
WSRPポートレット・プロデューサは、Enterprise Manager、WLSTまたはページレット・プロデューサ管理コンソールを使用してページレット・プロデューサに登録できます。詳細は、『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』のページレット・プロデューサでのWSRPおよびOracle JPDKポートレット・プロデューサの登録に関する項を参照してください。登録が完了すると、WSRPプロデューサはページレット・プロデューサ管理コンソールにリソースとして表示され、WSRPエンドポイントに関連付けられたポートレットがリソースのページレット・コレクションにリストされます。
注意: 自動生成されたWSRPリソースとページレットは変更できません。変更可能なバージョンを作成するには、ページレット・プロデューサ管理コンソールで該当するリソースを選択して、「コピー」をクリックします。リソースのクローン・バージョンは編集可能であり、インジェクタなどの各種要素を追加してページレットの機能をカスタマイズできます。たとえば、カスタム・インジェクタを使用してCSSクラスを注入し、ポートレット・マークアップがページレットをホストするサイトのルック・アンド・フィールのように表示されるように変更することもできます。 |
ページレット・プロデューサに登録しているWSRPプロデューサで認証が必要な場合は、次の手順を実行する必要があります。
『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』のWSセキュリティの構成に関する項の説明に従って、ページレット・プロデューサとWSRPプロデューサ間にWSセキュリティを構成します。Javaキーストア(JKS)がWSRPプロデューサとページレット・プロデューサ間に適切に構成されていることを確認する必要があります。詳細は、WSセキュリティの構成の章のWebCenter Portalドメイン・キーストアの設定に関する項を参照してください。
WSRPプロデューサの登録時に、「セキュリティ」セクションで適切な「トークン・プロファイル」を選択して、必要な構成情報を入力します。キーストアへのパスは絶対パスである必要があります。
ADFタスクフローがホストされているページからそれを「クリッピング」することで、そのADFタスクフローをページレット・プロデューサで消費できますが、この方法はお薦めできません。ADFページによって生成されたマークアップの複雑さや、他のタスクフローまたはADFページ・パラメータへの潜在的な依存性を考慮すると、お薦めできる方法は、タスクフローに基づいてWSRPポートレットを作成してから、そのポートレットをページレット・プロデューサで消費することです。この方法の利点は、ADFタスクフローのパラメータがポートレットのパラメータになってページレット・パラメータにマップ可能になり、情報がサイト・ページからタスクフローに渡せるようになることです。ADFタスクフローからポートレットを作成するステップ別の手順は、第58.2.3項「タスクフローに基づくJSFポートレットの作成方法」を参照してください。
ADFタスクフローがポートレットとして公開された後で、WLSドメインにある管理対象サーバー(たとえば、WebCenterドメイン上のWC_Portlet
サーバー)に新しいWSRPプロデューサをデプロイします。WSDL URLを情報ページ(http://%PRODUCER_HOST%/%APP_CONTEXT%/info
)から取得して、それをメモしておきます。新しいWSRPプロデューサをページレット・プロデューサに登録するには、『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』のページレット・プロデューサでのWSRPおよびOracle JPDKポートレット・プロデューサの登録に関する項を参照してください。
Oracle WebLogic Portal (WLP)では、Javaポートレット、Java Server Facesポートレット、Java Server PageおよびHTMLポートレットなど、様々なポートレット・タイプをサポートしています(完全なリストは、『Oracle Fusion Middleware Portlet Oracle WebLogic Portal開発ガイド』のポートレット・タイプに関する項を参照してください)。リモート(プロキシ)ポートレットはWSRPポートレットであり、ページレット・プロデューサにWSRPプロデューサを登録することによって、そのままページレットとして公開できます。この項では、JSF、JSP、またはJavaポートレットなどのローカルWLPポートレットをサイトで使用するためにページレットとして公開する方法について説明します。
WLPは、Java、ページ・フロー、JSP、JSF、およびStrutsのポートレットを、必須WSRPインタフェース、オプションのインタフェース、およびいくつかの拡張インタフェースを含んだ「複合プロデューサ」として公開できます(詳細は、『Oracle Fusion Middleware Oracle WebLogic Portalフェデレーテッド・ポータル・ガイド』のWebLogic Portalプロデューサに関する項を参照してください)。その結果、ページレット・プロデューサはネイティブWLPポートレットをその他のすべてのWSRPポートレットとして消費できます。WLPとWebCenter共通コンシューマ間のWSRPの相互運用の構成とベスト・プラクティスについては、『Oracle Fusion Middleware Oracle WebLogic Portalフェデレーテッド・ポータル・ガイド』のOracle WebCenter PortalおよびOracle PortalとのWSRPの相互運用に関する項で説明しています。
注意: WLPポータルは、デフォルトではバージョン9.2以降、WSRPに対応しています。それ以前のバージョンでは、ポートレットのプロパティを編集し、「Offer as Remote」プロパティをtrueに設定する必要があります。 |
WebCenter共通コンシューマ(ページレット・プロデューサ)でWLPにより公開されたWSRPポートレットを消費するには、プロデューサとコンシューマの両方で構成する必要があります。
通常、WebLogic Portalによって公開されたWSRPポートレットを匿名ユーザーとして消費することはできないため、プロデューサとWebCenter共通コンシューマに対してWLP上でSAMLセキュリティを構成する必要がありますステップごとの手順は、『Oracle Fusion Middleware Oracle WebLogic Portalフェデレーテッド・ポータル・ガイド』のWebCenter Portal: フレームワーク・アプリケーション・コンシューマとWebLogic Portalプロデューサ間のSAMLセキュリティに関する項に記載しています。これらの手順は包括的であり、次の調整が加えられています。
プロデューサの構成の第5項で、WSRPコンシューマでのキーストア情報の構成の手順はJDeveloperで実行されます。この手順は、WebCenter共通コンシューマ(ページレット・プロデューサ)で完了する必要があります。署名用の別名とキーストア・パスワードは、WLSTまたはOracle Enterprise Managerを使用して指定できます。詳細は、『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』のWLSTを使用したキーストアの構成に関する項、またはFusion Middleware Controlを使用したキーストアの構成に関する項を参照してください。
注意: キーストア値を構成したら、JPS構成変更が選択されるようにするために、ページレット・プロデューサをホストしている管理対象サーバー(デフォルトではWC_Portlet)とWLS管理サーバーの両方を再起動する必要があります。 |
プロデューサの構成の第4項の手順では、発行者名の重要性は強調されていません。ここに入力される名前は、コンシューマにより送信された名前と一致する必要があります。Oracle JPSの場合、送信されたデフォルトの発行者IDはwww.oracle.com
です。
WLP WSRPプロデューサをページレット・プロデューサに登録するには、『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』のページレット・プロデューサでのWSRPおよびOracle JPDKポートレット・プロデューサの登録に関する項に説明する新しいWSRPプロデューサの作成と構成の標準的な手順に従ってください。次の設定が含まれていることを確認します。
WSDL URL:
http://%WLP_HOST%/%PORTAL_APP_NAME%/producer/wsrp-1.0/markup?WSDL
セキュリティ:
トークン・プロファイル: 「WSS 1.0 Token with Message Integrity」を選択
登録後、新しいページレット・プロデューサ・リソースが自動的に作成され、ページレットに移入されて、このWSRPエンドポイントに関連付けられたWLPポートレットを表現します。
注意: ポートレットへのユーザー・アイデンティティ伝播を可能にするには、第65.6.3項「ページレット・プロデューサからバックエンド・アプリケーションへのアイデンティティの伝播」の説明に従って、WLPとページレット・プロデューサの両方を構成する必要があります。(テスト目的の場合、または認証なしでアクセス可能なポートレット・コンテンツの場合は、「セキュリティ」下の「デフォルト・ユーザー」に有効なユーザー名を指定できます。) |
WLP WSRPポートレットをサイト内のページに追加するには、第65.6.1項「Oracle WebCenter Sitesへのページレットの追加」の手順に従います。ページレット・コンテンツをロードするIFrameのsrc
属性に使用するURLは、第65.2.2.2項「RESTを使用したページレットへのアクセス」の「ドキュメント」の項に記載されています。
自動生成されたWSRPリソースとページレットは変更できません。WLPポートレットのマークアップの変更、たとえば、カスタムCSSスタイルの注入によりポートレットUIのルック・アンド・フィールを変更するためにページレット・プロデューサの機能を使用するには、新しいバージョンのリソースを作成する必要があります。ページレット・プロデューサ管理コンソールでWLP WSRPプロデューサ用に作成されたリソースを選択し、「コピー」をクリックします。リソースのクローン・バージョンは変更可能であり、インジェクタなどの要素を追加してページレットの機能をカスタマイズできます。
WebCenter Portalには、WebCenter Sitesでユーザーのコラボレーションが容易に実行できるように、お知らせやドキュメントなどのツールが組み込まれています。これらのツールの概要は、『Oracle Fusion Middleware Oracle WebCenter Portal: Spacesユーザーズ・ガイド』のサービス: リンクを介したお知らせに関する項およびサービス: ワークリストを介したリストに関する項を参照してください。
これらのサービスをサイトで公開する場合のお薦めできる方法は、Oracle WebCenter Portal (11.1.1.6およびそれ以降)に組み込まれているサービス・プロデューサ・コンポーネントを利用して、関連するWSRPポートレットをページレット・プロデューサ内で消費することです。
次のポータル・ツールは、デフォルトではWSRPポートレットとして公開されています。
アクティビティ・ストリーム
ディスカッション・フォーラム
メール
投票マネージャ
ドキュメント・マネージャ
リスト
タグ・クラウド
ブログ
ワークリスト
投票
お知らせ
注意: 追加のツールを公開するには、サービス・プロデューサを新しいJSPXページに拡張し、そのページにタスクフローを追加します。 |
『Oracle Fusion Middleware Oracle WebCenterインストレーション・ガイド』の手順に従って、WebCenter Portalをインストールします。WebCenter Content、ディスカッション・サーバー、ページレット・プロデューサを含むすべての依存コンポーネントもインストールされていて、構成済であることを確認します。
デフォルトでは、サービス・プロデューサは、WebCenter Portalドメイン内のWC_Portlet
管理対象サーバーに自動的にデプロイされます。WC_Portlet
管理対象サーバーがインストール時に作成されなかったか、サービス・プロデューサを別途実行する要件がある場合、Oracle WebCenter Portal 11.1.1.6リリースで追加されたカスタムのサービス・プロデューサ・テンプレートを使用してWC_CustomServicesProducer
管理対象サーバーを作成できます。この管理対象サーバーには、ポータル、アクティビティ、およびMDSスキーマにアクセスするために、Oracle WebCenterサービス・プロデューサ・コンポーネントと事前構成済のJDBCデータ・ソースが含まれています。詳細は、『Oracle Fusion Middlewareドメイン・テンプレート・リファレンス』のOracle WebCenterカスタム・サービス・プロデューサのテンプレートに関する項を参照してください。
サイト駆動のWebサイトからWebCenter Portalサービスへのアクセスを可能にするには、次の2つの前提条件があります。
WebサイトとWebCenter Portal間に共通のユーザー・ベースを作成する
WebサイトからWebCenter Portalへのユーザー・アイデンティティ伝播を確立する
これらの前提条件については、以降のサブセクションで説明します。
共通ユーザー・ベースを作成するには、WebCenter SitesとすべてのWebCenter Portalコンポーネントで使用される共通のLDAPリポジトリを構成する必要があります。LDAPサーバーを選択する際、それがWebCenter Portalコンポーネントを実行するWebLogic Serverに準拠していることを確認します。
WLSでのセキュリティ構成時に、次の点を忘れないようにしてください。
「オーセンティケータ」の優先度を「SUFFICIENT」に設定します。
「制御フラグ」(カッコ内)と認証プロバイダの順序を次のように設定します。
OAM IDアサーション・プロバイダ: (REQUIRED)
LDAPオーセンティケータ: (SUFFICIENT)
デフォルトのオーセンティケータ: (SUFFICIENT)
デフォルトのアイデンティティ・アサーション・プロバイダ: (SUFFICIENT)
ユーザー・アイデンティティ伝播を確立するには、Oracle Access Manager (OAM)を使用してWebCenter SitesおよびWebCenter Portal用にSSOソリューションを構成することをお薦めします。
OAMを使用している場合は、ユーザー・プリンシパル名がORACLE_REMOTE_USERヘッダーに渡されるように構成されていることを確認します。ObSSOCookieとOAM_REMOTE_USERの両方が、WebLogic Server上のOAMアイデンティティ・アサーション・プロバイダでアクティブに設定されている必要があります。
GUID属性値を指定して、アイデンティティ・ストアで使用される値がLDAP認証プロバイダで構成された値と一致していることを確認します。この値は、jps-config.xmlファイル内で構成されます。
使用しているLDAPオーセンティケータのGUIDをjps-config.xmlファイルに設定します。
<serviceInstance provider="idstore.ldap.provider" name="idstore.ldap"> <property value="oracle.security.jps.wls.internal.idstore.WlsLdapIdStoreConfigProvider" name="idstore.config.provider"/> <property value="oracle.security.idm.providers.stdldap.JNDIPool" name="CONNECTION_POOL_CLASS"/> <property value="GUID=uuid" name="PROPERTY_ATTRIBUTE_MAPPING"/> </serviceInstance>
ディスカッションを使用するには、WebLogic Serverでオーセンティケータの順序付けを行う前に(デフォルトのオーセンティケータおよびデフォルトのアイデンティティ・アサーション・プロバイダを使用)、ディスカッション・サーバーをSSO用に構成します。WLSTを使用してディスカッション・サーバー用にSSOを構成することもできます。詳細は、『Oracle Fusion Middleware for Oracle WebCenter Portal管理者ガイド』のSSO用のディスカッション・サーバーの構成に関する項を参照してください。
WebCenterサービスを公開するWSRPポートレットをページレット・プロデューサにインポートするには、Enterprise Manager、WLSTまたはページレット・プロデューサ管理コンソールを使用して、サービス・プロデューサをページレット・プロデューサにWSRPプロデューサとして登録するだけです。
次のスクリーンショットでは、ページレット・プロデューサ管理コンソールでのWSRPエンドポイントの登録例を示しています。詳細は、『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』のページレット・プロデューサでのWSRPおよびOracle JPDKポートレット・プロデューサの登録に関する項を参照してください。
このページの「セキュリティ」セクションの「トークン・プロファイル」は、サービス・プロデューサをサポートするために「WSS 1.0 SAML Token」に設定する必要があります。また、ページレット・プロデューサで設定されたサービス・プロデューサに対するリクエストに適切な実行タイムアウトを入力します(デフォルトは30秒)。
登録が完了すると、サービス・プロデューサはページレット・プロデューサ管理コンソールにリソースとして表示され、プロデューサによって公開されたすべてのWSRPポートレットがリソースのページレット・コレクションにリストされます。
WebCenterサービスを公開しているページレットはすべて、Oracle WebCenter Sitesへのページレットの追加に関する項で説明する手順に従って、WebCenter Sitesのページに追加できます。図65-22に、WebCenter SitesにあるサンプルのAviSportsサイトのページに埋め込まれたドキュメント・マネージャ・サービスを示します。
注意: 自動生成されたWSRPリソースとページレット(サービス・プロデューサに関連付けられているものなど)は変更できません。インジェクタを追加したり、その他の変更を加えるには、編集可能なバージョンを作成する必要があります。ページレット・プロデューサ管理コンソールでリソースを選択し、「コピー」をクリックします。リソースのクローン・バージョンは編集可能であり、インジェクタなどの各種要素を追加してページレットの機能をカスタマイズできます。 |
この項では、Oracle E-Business Suite 11i Order InformationモジュールのUIをページレットとして消費する場合の詳細な手順を説明します。ここでは、自動ログイン、ナビゲーション抑止、スタイル変更、およびURLリライトについて説明します。
この例は、Oracle SSOで保護されているEBS 11iインスタンスを使用して作成されました。この例では、次の共通用語と変数を使用しています。
EBSホストの%EBS_HOST%:ルートURL(例: http://my-ebs.company.com:port/
)
OSSOホストの%OSSO_HOST%:ルートURL(例: http://sso.company.com:port/
)
この項には次のサブセクションが含まれます:
次の手順によって、ページレット・プロデューサ内の新しいEBSリソースに対して基本的なURLマッピングを設定します。
次の設定を使用して新しいWebリソースを作成します。
名前: EBS 11(または任意の名前)
ソースURL: %EBS_HOST%
UIで使用するURLと間違えられないようにするために、このURLはあまり具体的にしないようにしてください。
宛先のURL: /ebs11/(または任意のもの)
URLリライト: オン
DHTMLリライト: オン
「保存」をクリックします。
この手順では、EBSシステムがOSSOによって保護されていて、ページレット・プロデューサがSSOに参加するのではなく(WebサイトがSSOで保護されていない場合の一般的なシナリオ)、フォームAutologinを提供するように構成されることを前提としています。EBS資格証明はすべてのユーザー用に共有することも(テスト用に有効)、ページレット・プロデューサの資格証明ボールトにユーザー別に格納することもできます。
次の設定を使用して新しいWebリソースを作成します。
名前: OSSO(または任意の名前)
ソースURL: %OSSO_HOST%
宛先のURL: /osso/(または任意のもの)
URLリライト: オン
DHTMLリライト: オフ
「保存」をクリックします。
新規に作成されたOSSOリソースの下で、次のように「フォーム・ログイン」オプションを使用して「Autologin」を構成します。
ログイン・フォームの識別: URL - %OSSO_HOST%/sso/jsp/login.jsp
フォームの送信場所: URL - %OSSO_HOST/sso/auth - POST
フォーム・フィールド:
appctx: 生成済
locale: 生成済
password: 静的またはユーザー・ボールト
site2pstoretoken: 生成済
ssousername: 静的またはユーザー・ボールト
v: 生成済
「保存」をクリックします。
注意: ログイン・フォームのフィールド名は通常、バックエンド・リソースを保護しているログイン・ページのHTMLソースを調べることによって取得されます。 |
この手順では、ページレットをEBS Order Informationモジュールの順序ステータス・ページに関連付けます。新しいページレットを作成するには、作成したEBSリソースの下で「ページレット」セクションを選択して「作成」アイコンをクリックします。次の設定を使用して新しいページレットを作成します。
名前: order_status (または任意の名前)
ライブラリ: ebs11 (または任意のもの)
URL接尾辞: OA_HTML/RF.jsp?function_id=1005664&resp_id=22480&resp_appl_id=660&security_group_id=0&lang_code=US
インラインのリフレッシュ: オフ
構成済のページレットをテストするには、「ドキュメント」ページで、そのページレットにRESTリンク経由でアクセスします。ログインしなくても「Sales Order」ページが表示されます(ページレットでユーザー・ボールトを使用して資格証明を格納していて、そのページレットにはじめてアクセスする場合を除きます)。このページから「簡易検索」を使用て、ワイルドカード文字として'%'を使ってオーダーを検索できます。
ページレットの登録後に、プロキシ設定されたマークアップでのURLリライト関連の問題に対応するため、あるいは単にマークアップのスタイルを変更したり不必要な要素を非表示にするために、ページレットで追加機能(パーサー、インジェクタ、クリップなど)が必要になる場合があります。この項では、EBSでOrder InformationのUIを公開するサンプルのページレットに適用された修正構成について説明します。
ポップアップURLリライト用のプラガブル・パーサーの作成
パーサーを使用して、コンテンツを解析したり、リライトする必要のあるURLを検索するために、ビルトイン・ロジックを補足または変更することができますビルトイン・パーサーがURLの識別に失敗した場合は、カスタム・パーサーを使用してこの失敗を修正することができます。EBS 11i UIの場合、この手順は「拡張検索」でのポップアップ処理の修正に必要です。
EBSリソースの下で、次の設定を使用して新しいパーサーを作成します。
名前: popupRewriter(または任意の名前)
URLフィルタ: *.jsp*
基本パーサーの使用: オン
フラグメントの場所
var _jspDir='(.*?)';
(タイプ静的URL)
<frame .? src="(.?)
(タイプ静的URL)
図65-23にpopupRewriterの設定を示します。
フレーム・バストを無効化するインジェクタの作成
インジェクタによって、プロキシ設定されているリソース・ページの指定された場所にコンテンツが挿入されます。コンテンツには、HTML、CSS、JavaScript、およびページレット宣言も含めて、任意のテキストが使用できます。空のインジェクタを使用して、不必要なコンテンツをページから削除することもできます。次のインジェクタはEBSページレットに対して作成されたものですが、その目的は、ユーザーが職責を選択するよう求められる最初のページで発生するページの継承をEBSページレットが行わないようにすることです。
EBSリソースの下で、次の設定を使用して新しいインジェクタを作成します。
一般
名前: frameBustDisabler
URLフィルタ: <none>
MIMEフィルタ: text/html
挿入位置: target=_top
を置換
コンテンツ: (テキスト)alt='
'
図65-24に、新しいインジェクタのパラメータ設定を示します。
iFrameを自動サイズ変更するインジェクタの作成
よりシームレスに消費側ページに統合するには、コンテンツを収められるように動的にサイズ変更することによって、ページレットiFrameがよりインライン・コンテンツらしく動作するように構成できます。詳細は、このドキュメントのIFrameの自動サイズ変更の有効化に関する項を参照してください。
JavaScriptの注入によるクリッピングの設定
ページレットとして公開されたページ要素を抑止するオプションの1つとして、ページレット・プロデューサで使用可能なグラフィカル・クリッピングまたはRegExベースのクリッピングを使用してクリップを作成します。ただし、お薦めできる方法は、プロキシ設定されたページに注入されているカスタムJavaScriptを使用することです。この方法では、抑止する要素の識別ルールを動的に調節する必要性や、ページ上の複数要素の抑止ルールを調整する必要性に容易に適応できるため、より柔軟に対応できます。
カスタムJavaScriptは、プロキシ設定されたリソースにインジェクタを使用して追加できます。EBS 11i標準ヘッダーとナビゲーション要素を抑止するには、次のインジェクタ定義を使用して、ページのロード時に不必要な要素を非表示にするJavaScriptのスニペットを挿入します。(ページレット・プロデューサの標準クリッパ機能は、EBS Web UIが複雑であるため使用しません。)
EBSリソースの下で、次の設定を使用して新しいインジェクタを作成します。
一般
名前: nav_suppressor(または任意の名前)
URLフィルタ: <none>
MIMEフィルタ: text/html
挿入位置: </body>
の前
コンテンツ: (テキスト - 次のコンテンツをコピーおよび貼付け)
<script type="text/javascript"> // this script is injected into the page by ensemble // it hides header and footer tables at page load // register handler function to the page load event if (window.addEventListener) { window.addEventListener('load', hideHeaderFooter, false); } else if (document.attachEvent) { window.attachEvent('onload', hideHeaderFooter); } // this function does the actual hiding function hideHeaderFooter() { var form = document.forms[0]; if (typeof(form) == 'undefined') return; // main span is form's second child span var spansFound = 0; var mainSpan = null; for (var i = 0; i < form.childNodes.length; i++) { var child = form.childNodes[i]; if (child.tagName && child.tagName.toLowerCase() == 'span') { if (++spansFound == 2) { mainSpan = child; break; } } } if (typeof(mainSpan) != "undefined" && mainSpan != null) { for (var i = 0; i < mainSpan.childNodes.length; i++) { var child = mainSpan.childNodes[i]; if (child.tagName && child.tagName.toLowerCase() == 'table') { child.style.display = 'none'; } } } } // call this function directly hideHeaderFooter(); </script>
ページレットのスタイル変更用にインジェクタを作成
消費側のページでEBSページレットが見栄えよく収まるようにするには、インジェクタを使用して元のCSSをオーバーライドするスタイルを追加できます。
次のインジェクタ定義の例では、WebCenter SitesにおけるサンプルのAviSports Webサイトのスタイル変更の実装方法を示しています。
注意: オーバーライドが適切に機能するためには、インジェクタによるスタイル定義がバックエンド・アプリケーションによって定義されたスタイルの後に置かれることが重要です。次の例では、コンテンツはページの |
EBSリソースの下で、次の設定を使用して新しいインジェクタを作成します。
一般
名前: avisports_styles
URLフィルタ: <none>
MIMEフィルタ: text/html
挿入位置: </head>
の前
コンテンツ: (テキスト - 次のコンテンツをコピーおよび貼付け)
<style> * { font: 11px Arial,Helvetica,sans-serif; } body { background: url("http://sites-host:port/cs/avisports/images/BlueSliver.png") repeat-x scroll center bottom transparent; } .OraTableCellText, .x1l, .OraTableCellNumber, .x1n, .OraTableCellIconButton, .x1p, .OraTableCellSelect, .x55, .OraTableControlBarTop, .x1i, .OraTableControlBarBottom, .x1j { background-color: #eceef1; border-color: #0b2a55; } .OraTableColumnHeader, .x1r, .OraTableSortableColumnHeader, .x20, .OraTableSortableHeaderLink, .x23 { background-color: #0b2a55; border-color: #F7F7E7; color: #336699; } .OraTableHeaderLink, .x24, .OraTableColumnHeaderNumber, .x1s, .OraTableColumnHeaderIconButton, .x1t { background-color: #0b2a55; color: #ffffff; } .p_InContextBrandingText, .x2l, .OraHGridNavRowInactiveLink, .x3v, .OraNavBarInactiveLink, .x42, .OraBINavBarInactiveLink, .x7n, .OraBINavBarInactiveLink_small, .x7o { color: #000000; } .OraLink:link, .xd:link, .OraBreadCrumbs, .xh, .OraBulletedList a, .xj a, .OraLinkText, .x2v, .OraHGridNavRowActiveLink, .x3u, .OraNavBarActiveLink, .x41, .OraBINavBarActiveLink, .x7l, .OraBINavBarActiveLink_small, .x7m { color: #0b2a55; } .OraBreadCrumbs a, .xh a { color: #0b2a55; } </style>
ページレットのテスト
これでEBS11リソースには、図65-25に示すように、ページレット、カスタム・インジェクタ、およびカスタム・パーサーが含まれるようになりました。
ページレットをテストするには、「ドキュメント」ページを参照し、次に示すURLを使用して、「example.com」をローカル・ホストIDに置き換えます。
http://example.com:8889/pagelets/inject/v2/pagelet/ebs11/order_status?content-type=iframe&csapi=true&ifheight=300px
トラブルシューティング
イメージが適切にレンダリングされない場合は、DHTMLリライトが有効になっていることを確認します。(DHTMLリライトの設定はリソースの「一般」ページにあります。)
最終結果
次のスクリーンショットは、iFrameのページレット・アクセス用のREST URLを使用してWebCenter SitesにあるサンプルのAviSportsサイトのページに埋め込まれたEBS 11i Order Informationの画面を示しています。