Oracle® Fusion Middleware Oracle WebCenter PortalおよびOracle JDeveloperでのポータルの開発 11gリリース1 (11.1.1.9.0) E49666-05 |
|
![]() 前 |
![]() 次 |
この章では、動的なページレット開発を容易にする有用なツールと機能のコレクションを提供するOracle WebCenter Portalのページレット・プロデューサ(旧Oracle WebCenter Ensemble)について説明します。
この章には次の項が含まれます。
この項では、ページレット・プロデューサの概念と機能の概要について説明します。ページレット・プロデューサの使用方法と、その基になるアーキテクチャおよびコンポーネントについて説明し、重要な概念を紹介します。
この項の内容は、次のとおりです。
ページレットは、再使用可能なユーザー・インタフェース・コンポーネントです。任意のHTMLフラグメントをページレットにできますが、ページレット開発者は、パラメータ化された構成可能なページレットを記述し、その他のページレットと動的にやりとりし、ユーザー入力に応答するようにすることもできます。ページレットは、ポータルや他のWebアプリケーション内など、どのWebページでも実行できます。ページレットを使用すれば、他のWeb環境でプラットフォーム固有のポートレットを公開できます。
ページレット・プロデューサは、動的ページレットの開発を容易にする有用なツールと機能のコレクションを提供し、新しい方法で使用できるようにすることで既存のWebインフラストラクチャの投資を活用できるようにします。ページレット・プロデューサによって、次のものを利用できます。
デフォルトで統合APIやポートレットを公開しないアプリケーションのWeb UI
WSRP (JSR-168またはJSR-286)、JPDK、CSP、WebPartsなどの標準ポートレット
また、Web UIをWebCenter Portal、WebCenter SitesまたはほとんどのHTMLページで使用できるようになり、さらに、ページレット・プロデューサ・リソースに対するロールベースのアクセス制御や、HTMLマークアップの解析、クリッピング、挿入およびイベント処理(ページレット間の通信)によるWebリソースのリバース・プロキシも可能になります。
ページレット・プロデューサでは、次のものが提供されます。
既存のWeb UIを利用し、それをページレットというポータブル・コンポーネントとして再利用するためのツール
ポートレットの標準をサポートしない非標準または非コンプライアンス・コンテナおよびコンポーネントを統合するための代替手段。たとえば、次の操作が可能です。
ポートレットを公開しないWebアプリケーションから機能を取得します。
既存のWSRP、JPDKまたはContent Syndication Protocol (CSP)ポートレットを非ポータル設定で使用できるようにします。
HTMLマークアップを変更するためのインジェクタとパーサー
ページレット間の通信およびイベント処理用のJavaScriptフレームワーク
この項では、ページレット・プロデューサのアーキテクチャと主要コンポーネントについて説明します。
この項には次のサブセクションが含まれます:
図62-1は、ページレット・プロデューサのコンポーネントとそれらの相互作用の概念図を示しています。また、図62-1には、ページレット・リクエストがページレット・プロデューサ内でどのように処理されるかも反映されています。リクエストは、受信リクエストをリソースにマップするプロキシ・サーブレットによって受信されます。次に、リクエストは認証されます。リクエストされたリソースにユーザーがアクセスできる場合、ページレットの処理は、バックエンド・システムからHTMLマークアップをリクエストすることによって開始されます。受信したマークアップは、定義済のクリッパやパーサーなどを使用して変更されます。
図62-2は、コンポーネントの相互作用を異なる見方で示しています。
A: ページレット・プロデューサ・アプリケーションがJ2EEアプリケーション・サーバー上で実行されます。ページレット・プロデューサにはWebCenterスキーマは必要ありませんが、MDSインスタンス(通常はWebCenterと共有されている)は必要です。
B: ユーザーがページレットを含むWebCenter Portalページをコールします。
C: WebCenter Portalによってページが返され、さらにページレットをレンダリングするためのページレット・プロデューサをコールするJavaScriptが返されます。
D: JavaScriptによってページレット・プロデューサへのレンダリング・コールが行われます。
E: ページレット・プロデューサでは、外部(E1)または内部(E2) WebアプリケーションをHTMLコンテンツのソースとしてコールできます。ページレット・プロデューサによってコンテンツが変換され(つまりURLがリライトされ)、ページに挿入できるようブラウザに返されます。ページレット・プロデューサ自体には、外部から(つまり、DMZ内で)アクセスできます。
ページレット・プロデューサの使用時に役立つ主要概念は、次のとおりです。
リソースは、スタンドアロンのWebアプリケーション、ページレット・プロデューサ、OpenSocialコンテナなど、ページレット・プロデューサ内のアプリケーションを登録するために使用する主要オブジェクトです。リソースを作成すると、プロキシによる外部URLへの内部アプリケーションのマップ、認証の管理およびアプリケーションの変換が可能になります。Webアプリケーションをページレット・プロデューサ・リソースとして登録すると、次のことが可能になります。
内部Webアプリケーションの外部アドレスへのプロキシ
プロキシ・レベルとリソース・レベルの両方における認証の管理
URLのリライトなど、プロキシされたWebアプリケーションの変換
リソースの作成の詳細は、第62.3.1項「リソースの作成」を参照してください。
ページレットは、ページレット・プロデューサを通じてアクセスするWebページのサブコンポーネントであり、プロキシされた任意のアプリケーションに挿入できます。マークアップを返すページレット・プロデューサ・リソース上のアプリケーションは、ページレットとして登録でき、その後、ポータルやFrameworkアプリケーション、あるいはその他のWebアプリケーションに表示することが可能です。
任意のHTMLフラグメントをページレットにできます。ページレット開発者は、パラメータ化された構成可能なページレットを作成し、非同期JavascriptおよびXML (AJAX)パターンを使用して、その他のページレットと動的にやり取りしたり、ユーザー入力に応答できます。
ページレットの作成の詳細は、第62.3.2項「ページレットの作成」を参照してください。
ページレット・プロデューサの登録は動的です。既存のプロデューサに対する追加および更新は、すぐに実行できます。ほとんどの場合、ポータルやFrameworkアプリケーションまたは管理対象サーバーを再起動する必要はありません。
ページレット・プロデューサ・コンソールは、ページレット・プロデューサ・デプロイメント内の様々なオブジェクトを作成および管理するために使用する、ブラウザベースの管理ツールです。このコンソールから、リソースとしてのWebアプリケーションの登録、ページレットの作成、プロキシおよび変換設定の管理などを行うことができます。
ページレット・プロデューサ・コンソールには、任意のWebブラウザからアクセスできます。URLは次のとおりです。
http://<host>:<port>/pagelets/admin
ページレット・プロデューサ・コンソールは、次の場所からアクセシビリティ・モードで起動することもできます。
http://<host>:<port>/pagelets/admin/accessible
実行中、ページレット・プロデューサ・コンソールには、WebCenter Portalの「共有アセット」タブからアクセスすることもできます。
注意: ページレット・プロデューサ・コンソールでは、標準管理言語とオランダ語のみがサポートされます。ブラウザの言語をこれ以外の言語に構成した場合は、現在のサーバー用に定義された言語に戻ります。 |
ページレット・プロデューサ・コンソールを使用したページレット・プロデューサの構成とオブジェクトの作成の詳細は、第62.2項「ページレット・プロデューサ設定の構成」および第62.3項「ページレット・プロデューサ・オブジェクトの作成」を参照してください。ページレット・プロデューサ・コンソールを使用したプロデューサの登録とページレット・データの移行の詳細は、『Oracle WebCenter Portalの管理』の「ページレット・プロデューサの管理」の章を参照してください。
HTTPは通常WebページのコンテンツとXMLをサーバーとクライアント間で送信するために使用されるプロトコルです。Content Syndication Protocol (CSP)は、HTTPを拡張したオープン標準であるHTTP 1.1に基づく、プラットフォームに依存しないプロトコルで、ページレット・プロデューサと外部CSPリソース間の通信構文を定義します。
外部リソースのサービスは、CSPを使用してページレット・プロデューサと通信します。たとえば、ブラウザがページをリクエストすると、ページレット・プロデューサが各外部リソースに対する同時リクエストを作成し、ページからページレット・コンテンツを取得します。外部リソースは、現在のユーザーのプリファレンスをページレット・プロデューサから送信されたCSPヘッダーから読み取り、適切なHTMLを戻します。ページレット・プロデューサはHTMLをページ・マークアップに挿入します。イメージ・サービスに格納されたイメージは、ブラウザによって取得、表示されます。
この項には次のサブセクションが含まれます:
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サーバー間でやりとりされるすべてのヘッダーを表示できます(第62.6.3項「ページレットのデバッグ」を参照)。HTTPは、SSLとともに使用され、セキュアなコンテンツを提供します。また、シングル・サインオン(SSO)でもBasic認証用のHTTPヘッダーが使用されます。
Content Syndication Protocol (CSP)は、HTTPを拡張し、ページレット・プロデューサと外部CSPリソース(具体的にはOracle WebCenter Interactionポートレット)間で設定を渡すための専用ヘッダーを定義します。CSPでは、これらのサービスがHTTPを使用して設定を通信および変更する方法の概略を記述します。CSPプロトコルの最新バージョンは1.4で、次の場所から入手できます。
http://docs.oracle.com/cd/E13158_01/alui/wci/docs103/devguide/references/CSP1.4.pdf
システムとユーザー構成変数(表62-1を参照)の通信に使用されるカスタムCSPヘッダーは、ページレットでも使用できます。
表62-1 ページレット・プロデューサのヘッダー
ヘッダー名 | 説明 |
---|---|
ユーザーID |
現在ログインしているユーザーのユーザーID。この値は、セッションの有効期限を判別するときに使用できます。UserID=2の場合、デフォルトの'Guest'ユーザーがログインして、その他のユーザーのセッションはすべて終了します。 |
ユーザー名 |
ログインしているユーザーの名前。ユーザー名は、表示のパーソナライズやフォーム・フィールドの事前指定に使用できます。 |
イメージ・サービスのURL |
ページレット・プロデューサのユーザー実装での、イメージ・サービスの仮想ルート・ディレクトリのURL。この場所は、サービスで使用されるすべての静的イメージに使用する必要があります。 |
スタイルシートのURL |
現在のユーザーのスタイルシートのURL。ページレット・プロデューサの実装ごとに、UIがカスタマイズされます。一部のポータルでは、ユーザーはスタイルシートの中から選択できます。これらのスタイルを使用すると、ページレットが、現在のユーザーによるページレット・プロデューサの実装スタイルで表示されます。 |
ページレットID |
現在のリソース(ページレット)のID、および現在のページレットのインスタンスID。この値は、HTMLフォームおよびクライアント側JavaScript機能の名前に追加し、ページ上のフォームや機能の一意の名前を確保して名前の競合を回避するために役立ちます。 |
ホスト・ページのURL |
ページレットをホストするページのURL。設定の構成後にユーザーを正しいページに戻すために、プリファレンス・ページにはこのURLが必要です。この値を使用して、単一のページレットで様々なページに各種コンテンツを表示できるようにすることもできます。 |
ページレット・プロデューサはプロキシ・サーバーとして動作し、クライアント・コンピュータと外部リソース間のトランザクションを仲介します。この構成は通常、それ以外の方法では外部リソースにアクセスできない可能性のあるクライアントに対するコンテンツとして使用されますが、これは、ポリシーの使用も含めて、クライアントに対して追加のセキュリティ制約を課するために使用することもできます。プロキシでは外部リソースは表示されず、コンテンツはプロキシ・サーバーから直接送られてくるように見えます。
このアーキテクチャにより、ページレット・プロデューサはコンテンツの単一アクセス・ポイントとなり、外部リソースがプライベート・ネットワークやファイアウォールの内側に存在できるようになります。ページレット・プロデューサが外部リソースに接続できるかぎり、ユーザーはコンテンツに直接アクセスできない場合でも、そのコンテンツを表示できます。ブラウザにとっては、ページレット・プロデューサは外部リソースのコンテンツのソースであるように見えます。
ユーザーがサービスとやり取りする際、プロキシで行われたURLへのリクエストはすべて、ページレット・プロデューサを通して自動的に再ルーティングされます。ユーザーにとって、コンテンツはページレット・プロデューサから送信されてくるように見えます。外部リソースは不明のバックエンド・システムです。
この構成には多くのメリットがあります。サービスに最も役に立つメリットは次のとおりです。
動的な機能とパーソナライズ: ページレット・プロデューサは、ページレットからのリクエストをインターセプトするため、MDS、リクエストまたはレスポンスからの情報を使用して、レスポンスを動的に変更することが可能になります。
セキュリティ: サービスを使用すると、ユーザーはパブリックに使用できないコンテンツにアクセスできます。特定のURLをプロキシの構成に含めることにより、保護されたサーバーに格納されているファイルが使用可能になります。
警告 プロキシは強力な機能であるため、不適切に構成された場合はセキュリティを著しく低下させます。保護されていないプライベート・コンテンツをホストしている外部リソースに直接アクセスできるようにすると、危険なセキュリティ・ギャップが生じる可能性があります。 |
パフォーマンス: ページレット・プロデューサはプロキシ・コンテンツをキャッシュし、エンド・ユーザーに対するレスポンス時間を短縮し、外部リソースのパフォーマンスを向上させます。プロキシはHTMLなどのコンテンツに対しては効率的に機能しますが、静的イメージなどのバイナリ・データには通常は適していません。イメージは変換する必要がないため、大きなイメージをプロキシすると、パフォーマンスに悪影響を与える可能性があります。これが、イメージ・サービスを使用してプロキシ経由での静的イメージのルーティングを避ける必要がある1つの理由です。
プロキシされる他のCSPまたはWebリソースのURLはすべて、「プロキシしないホスト」フィールドに指定されていないかぎり、デフォルトでプロキシされます。プロキシの構成の詳細は、第62.2.3項「プロキシ設定の構成」を参照してください。
プロキシを使用するサービスを実装する場合は、次の警告とベスト・プラクティスに留意してください。
URL変換: ページレット・プロデューサは、プロキシされるURLを正確に開くため、コードを変換する必要があります。ページレット・プロデューサは、レスポンスを送信する前に、HTMLを解析し、「HTTPプロキシ・サーバーURL」フィールドの接頭辞を含むURLを探します(第62.2.3項「プロキシ設定の構成」を参照)。ページレット・プロデューサは、レスポンスをクライアントに返す前に、プロキシするURLを変換します。関連するURLは、正しい場所を指すように変換されます。
スクリプト制限: URLを動的に作成するJavaScript構成は、コンテンツがすでに変換された後に実行されるため、問題を起こすことがあります。VBScriptはプロキシによって変換されません。使用しているコードがプロキシを認識するかぎり、動的スクリプトとVBScriptを引き続き使用できます。パーサーとWebインジェクタを使用して、URLのリライトに対するターゲット・コントロールを実装できます。パーサーとWebインジェクタの詳細は、第62.6.2項「実行時のページレット機能の変更」を参照してください。
URLエンコーディング: 予期しない変換を防ぐために、URLであるヘッダーをすべてエンコードすることはベスト・プラクティスです。JSPでは、書き込まれたURLをすべてエンコードします。コードによってページ本体にURLが書き込まれる場合は(たとえば、プリファレンス・ページへのリンクなど)、そのコードをエンコードする必要があります。標準のJavaサーブレット・コマンド、response.encodeURL()
は優先される方法ですが、URLEncoder.encode(url)
も使用できます。.NETフレームワークでは、HttpUtility.URLEncode
クラスによって必要な機能が提供されます。.NETでは、リダイレクトURLをエンコードする必要はありません。これは、バックエンドで自動的に処理されます。
『Oracle Fusion Middleware Oracle WebCenterインストレーション・ガイド』の手順に従って、WebCenter Portalをインストールします。WebCenter Contentサーバー、ディスカッション・サーバー、ページレット・プロデューサを含むすべての依存コンポーネントもインストールされていて、構成済であることを確認します。
デフォルトでは、サービス・プロデューサは、WebCenter Portalドメイン内のWC_Portlet
管理対象サーバーに自動的にデプロイされます。WC_Portlet
管理対象サーバーがインストール時に作成されなかったか、サービス・プロデューサを別途実行する要件がある場合、カスタムのサービス・プロデューサ・テンプレートを使用してWC_CustomServicesProducer
管理対象サーバーを作成できます。この管理対象サーバーには、WebCenter Portal、アクティビティおよびMDSスキーマにアクセスするために、Oracle WebCenterサービス・プロデューサ・コンポーネントと事前構成済のJDBCデータ・ソースが含まれています。詳細は、ドメイン・テンプレート・リファレンスのOracle WebCenter Portalのカスタム・サービス・プロデューサ・テンプレートに関する項を参照してください。
この項では、すべてのページレット・プロデューサ・リソースに影響を与える重要な構成設定、およびページレット・プロデューサ・コンソールの「設定」ページを使用してそれらを設定する方法について説明します。ページレット・プロデューサ・コンソールの概要は、第62.1.2.3項「ページレット・プロデューサ・コンソール」を参照してください。
「設定」セクションには次のページが含まれています。
WCIリソースを消費するには、CSPログイン・トークンが必要であり、そのログイン・トークンをページレット・プロデューサからCSPポートレットに伝播するには、データ・ソースが必要です。ページレット・プロデューサによって生成されたログイン・トークンは、ユーザー・アイデンティティを伝播し、受信リクエストを検証するために、すべてのリモート・ポートレットに送信されます。データ・ソースを構成するには、『Oracle WebLogic Server JDBCデータ・ソースの構成と管理』のJDBCデータ・ソースの構成に関する項の手順に従います。データ・ソースにはwcidb
という名前を付ける必要があります。
「ロギング」ページでは、ページレット・プロデューサ・コンポーネントのロギング・レベルを設定できます。
任意のコンポーネントのロギングを有効にするには、次のいずれかのロギング・レベルを選択します。
重度
警告
情報
構成
普通
詳細
最も詳細
ロギング・メッセージは、管理対象サーバーのログ・ファイル内で確認できます。Oracle WebLogic Serverの場合、この場所はdomain_home
/servers/
managed server name/managed server name
.log
およびmanaged server name
-diagnostic.log
です。
「プロキシ」ページでは、プロキシしないURLのリストを定義し、必要に応じてHTTPプロキシのURL、ユーザー名およびパスワードを設定できます。
プロキシ設定を変更したら、ページレット・プロデューサを再起動する必要があります。
注意: デプロイメント環境内の外部接続にHTTPプロキシが必要な場合、サーバーの初回起動時に接続エラーが報告されます。これらのエラーは環境の問題を示しているのではなく、一部の外部OpenSocialライブラリをリモートでロードできないことを示しています。エラーを解決するには、前述の説明に従ってプロキシ設定を構成し、サーバーを再起動します。 |
Oracle WebLogic Serverデプロイメントに関する注意 「プロキシ」ページで入力したHTTPプロキシ・サーバーURLは、ページレット・プロデューサをホストするサーバーで実行されているすべてのアプリケーションに適用されます(Oracle WebLogic Serverでは、この設定はWC_Portlet 管理対象サーバーで実行されているすべてのアプリケーションに適用されます)。Oracle WebLogic Serverユーザーは、特にこの設定に注意し、WLS管理サーバー・ホストとすべてのクラスタ化された管理対象サーバーが「プロキシしないホスト」リストに含まれていることを確認する必要があります。 |
「プロキシ」ページには、次の設定が含まれます。
「プロキシしないホスト」フィールドでは、プロキシしないURLのリストをセミコロンで区切って定義できます(ワイルドカードを使用できます)。Oracle WebLogic Serverデプロイメントの場合は、WLS管理サーバー・ホストとすべてのクラスタ化された管理対象サーバーをこのリストに含めてください。
「HTTPプロキシ・サーバーのパスワード」フィールドでは、プロキシ・サーバーのパスワードを設定できます。
「HTTPプロキシ・サーバーURL」フィールドでは、プロキシ・サーバーのURLを定義できます。
「HTTPプロキシ・サーバーのユーザー名」フィールドでは、プロキシ・サーバーへのアクセスに使用するユーザー名を定義できます。
「変換」ページでは、資格証明ボールト・プロバイダへのパスを入力したり、ページレット・プロデューサのセキュア・ポートとセキュアでないポートを構成できます。このページでは、変換前および変換後のコンテンツをログに記録するかどうかを選択することもできます。
「変換」ページには、次のフィールドが含まれます。
「資格証明ボールト・プラグインのパス」フィールドでは、プラグインが格納されている資格証明ボールトへのパスを定義できます。
「セキュアでないポート」フィールドでは、ページレット・プロデューサのセキュアでないポートを定義できます。
注意: 「セキュアでないポート」のデフォルトは8889です。ページレット・プロデューサを異なるポートにデプロイした場合、このエントリを変更し、サーバーを再起動します。 |
「セキュア・ポート」では、ページレット・プロデューサのセキュアでないポートを定義できます。
「変換のトレース」オプションを選択すると、変換前および変換後のコンテンツに対するロギングがオンになります。このオプションはデバッグに役立ちますが、本番環境ではオンにしないことをお薦めします。
CSPは、HTTP 1.1のオープン標準に基づく、プラットフォームに依存しないプロトコルです。CSPは、ページレット・プロデューサと外部リソース間の通信構文を定義します。また、カスタム・ヘッダーを定義し、サービスがHTTPを使用して設定を通信および変更する方法の概略を記述します。
「CSP」ページでは、Oracle WebCenter Interaction資格証明マッパー、SOAP APIサービスおよびイメージ・サービスを構成できます。
注意: Oracle WebCenter Interactionがデプロイメント内に存在しない場合、このページは無視される可能性があります。これらの設定は、Oracle WebCenter Interaction用に記述されたCSPポートレットとの後方互換性を維持するために使用されます。 |
「Kerberos」ページは、Kerberos構成ファイル(java.security.krb5.conf
およびjava.security.auth.login.conf
)へのパスを定義するために使用します。これら2つの構成ファイルは、Kerberosサービス・チケットの取得場所をHTTPClientに指示するようKerberosレルムとKDCを構成するために必要です。
「OpenSocial」ページでは、OpenSocialガジェットを使用するようページレット・プロデューサを構成できます。
「OpenSocial」ページには、次の設定が含まれます。
「キャッシュ」オプションでは、OpenSocialガジェットに対してページレット・プロデューサの内部キャッシュを有効にできます。
「コンテキスト」フィールドでは、ページレット・プロデューサのデプロイ先となるコンテキストを定義します。この値は、OpenSocialコンテナによって変更を要求されないかぎり、デフォルト設定(pagelets)のまま残してください。コンテキストの変更の詳細は、『Oracle WebCenter Portalの管理』の異なるコンテキストへのページレット・プロデューサの再デプロイに関する項を参照してください。
「デバッグ」オプションでは、OpenSocialガジェットに対してデバッグを有効に(JavaScriptの不明瞭化を無効に)できます。
「ホスト」フィールドには、ページレット・プロデューサ・ホストの完全修飾ドメイン名を含める必要があります。この値は、環境から自動的に取得されます。取得されない場合は、サーバーを再起動して正しい構成設定を取得します。「コンテキスト」の設定と同様、この値は、OpenSocialコンテナによって変更を要求されないかぎり、デフォルトのまま残してください。
「SSL」オプションでは、OpenSocialガジェットに対してSSLを有効にできます。
注意: OpenSocialガジェットをインポートする前に、セキュア(HTTPS)およびセキュアでない(HTTP)ポートも構成する必要があります。これらの設定の詳細は、第62.2.4項「変換設定の構成」を参照してください。 |
この項では、リソース、ページレット、Webインジェクタ、パーサー、ホストされたファイルなど、ページレット・プロデューサ・デプロイメント内の様々なオブジェクトを作成および構成する方法について説明します。
第62.1.2.3項「ページレット・プロデューサ・コンソール」で説明したように、ページレット・プロデューサ・コンソールは、ページレット・プロデューサ・デプロイメント内の様々なオブジェクトを作成および管理するために使用する、ブラウザベースの管理ツールです。この項では、オブジェクトの各タイプに必要な設定について説明します。
リソースは、ページレット・プロデューサに登録されたアプリケーションです。アプリケーションをリソースとして登録すると、プロキシによる外部URLへの内部アプリケーションのマップ、認証の管理およびアプリケーション機能の変換が可能になります。
新しいリソースを作成するには、次の手順を使用します。
ページレット・プロデューサ・コンソールのナビゲータで、ドロップダウン・リストから「リソース」オプションを選択します。
いずれかの既存のリソースをクリックし、ナビゲーション・ツールバーの「作成」アイコンをクリックします。(このボタンは、作成可能なオブジェクト・タイプを選択した場合のみ有効になります。)
「プロデューサ・タイプの選択」ダイアログ・ボックスで、リソースをプロキシするよう構成するプロデューサのタイプをドロップダウン・リストから選択します。
Web: すべての標準Webアプリケーション
CSP: CSPポートレット・プロバイダ・アプリケーション(Oracle WebCenter Interactionとともに使用)
WSRP/JPDK: WSRPまたはOracle JPDKポートレット・プロデューサ(このタイプのリソースを作成する前に、『Oracle WebCenter Portalの管理』の「ページレット・プロデューサの管理」の章の説明に従って、関連するプロデューサを登録してください)。
OpenSocial: OpenSocialコンテナ
「OK」をクリックします。<new>というエントリがリソースのリストに追加されます。この新しいリソースには、選択したプロデューサのタイプに必要な構成ページが含まれます。
ページレット・プロデューサ・コンソールでリソースを構成します。必要な構成ページは、プロデューサのタイプによって異なります。任意の時点で変更を保存するには、ナビゲーション・ツールバーの「保存」アイコンをクリックします。
リソースを定義したら、そのリソース内のページレットやその他のオブジェクトを作成します。詳細は、次の項を参照してください。
この項では、WebおよびCSPリソースの構成方法について説明します。
この項には次のサブセクションが含まれます:
この項では、ページレット・プロデューサのインストール時に作成されるwelcome_resourceを例として使用します。
「全般」ページ(図62-9を参照)では、リソースの基本情報を入力できます。
リソースの名前を入力します。
リソースの説明を入力します(オプション)。
「ソースURL」フィールドに、プロキシするWebアプリケーション・リソースの場所を示すURLを入力します。たとえば、http://internalServer/foo/
です。
注意: ADF Webアプリケーションをリソースとして構成する場合、ソースURLをhttp:// hostname:portnumber /context-root/ よりも詳細に指定することはできません。 |
デフォルトでは、ページレット・プロデューサは、エラー・メッセージを返すまで30秒間リソースへの接続を試行します。この値を変更するには、新しいソースのタイムアウトを秒単位で入力します。
「宛先URL」フィールドに、リソースへのアクセスに使用する相対パスを入力します。このパスは、ページレット・プロデューサをホストするサーバー上にあるリソースのURLを作成するために使用します。
動的HTMLを有効にするには、「DHTMLリライト」を選択します。このオプションでは、サーバーから返される元のHTMLに含まれず、DHTMLによって追加されるURLがサポートされます。ほとんどの場合、このオプションを有効にする必要があります。
非同期Ajaxコールを通じたDHTMLのリライトを有効にするには、「非同期リライト」を選択します。
デフォルトでは、CSPログイン・トークンは、プロキシされるリソースに渡されません。この機能を有効にするには、「CSPログイン・トークンの送信」を選択します。「CSP」ページはCSPリソースにのみ使用できます。
「ポリシー」ページ(図62-10を参照)では、リソースへのアクセスをWebCenter Portal内の特定のロールに制限できます。
ページレット・プロデューサをホストするJ2EEコンテナ(Oracle WebLogic Serverなど)では、現在のユーザーに関連付けられたロールのメンバーシップを確立する必要があります。「ポリシー」ページでは、1つのリソースに複数のロールを指定でき、ユーザーは指定されたいずれかのロールのメンバーである場合、アクセスを許可されます。そうでない場合、ユーザーはJ2EEコンテナによって委任された適切な認証ページに移動し、必要な資格証明を確立します。リストにロールが入力されていない場合、匿名アクセスが許可され、そのリソースは匿名リソースと呼ばれます。
注意: このページで入力するロール名は、J2EEコンテナ(Oracle WebLogic Serverなど)内に作成されているロール名と一致する必要があります。 |
自動ログイン機能を使用すると、ページレット・プロデューサから自動的に資格証明をアプリケーションに提供できるようになります。「自動ログイン」ページ(図62-11)では、リソースにアクセスするすべてのユーザーの認証情報を構成できます。
図62-11 ページレット・プロデューサ・コンソール: 「リソース」 - 「自動ログイン」ページ
次の項では、認証の資格証明マッピングを構成する方法について説明します。
第62.3.1.1.5項「自動ログインの構成: フォーム・ログイン」では、HTMLフォームによる認証が必要なリソースの自動ログインを構成する方法について説明します。
第62.3.1.1.6項「自動ログインの構成: 基本ログインとNTLMログイン」では、基本認証とNTLMによる認証が必要なリソースの自動ログインを構成する方法について説明します。
第62.3.1.1.7項「自動ログインの構成: Kerberosログイン」では、Kerberosによる認証が必要なリソースの自動ログインを構成する方法について説明します。
第62.3.1.1.8項「自動ログインの構成: 認証のソース」では、静的、ユーザー・プロファイルおよび資格証明ボールトの認証フィールドに使用するソースについて説明します。
この項では、HTMLフォームによる認証が必要なリソースの自動ログインを構成する方法について説明します。
リソースの「自動ログイン」ページで、「フォーム・ログイン」セクションを開きます(図62-12)。
ログイン・ページは、URLや正規表現によって識別できます。「ログイン・フォームの識別」セクションで、次のいずれかのオプションを選択します。
ログイン・フォームの場所が静的URLである場合、「URL」を選択し、「値」フィールドにURLを入力します。ページ上の「フォーム・フィールドの自動検出」を選択するか、次の手順4の説明に従って、それらのフィールドを手動で入力できます。
ログイン・フォームが動的である場合、「RegEx」を選択し、ボックスに正規表現パターンを入力します。
ログイン・フォームのアクションを設定します。「フォームの送信場所」セクションで、次のいずれかのオプションを選択します。
ログイン・フォームのアクションが静的URLである場合、「URL」を選択し、ボックスにURLを入力します。フォーム送信のアクションをPOSTまたはGETから選択します。
ログイン・フォームが動的である場合、「RegEx」を選択し、ボックスに正規表現パターンを入力します。
フィールドをフォームから認証フィールドのソースにマップするには、前述の説明に従って「ログイン・フォームの識別」セクションの「フォーム・フィールドの自動検出」をクリックするか、次のプロセスを使用して、それらのフィールドを手動で入力します。
「作成」をクリックして、新しい行を「フォーム・フィールド」リストに追加します。
HTMLフォーム入力の名前を「フィールド名」ボックスに入力します。
「ソース」および「値」プロパティを構成する方法の詳細は、第62.3.1.1.8項「自動ログインの構成: 認証のソース」を参照してください。
注意: 重要なフィールドは、資格証明ボールト(「ユーザー・ボールト」または「保護」)を使用して安全に格納する必要があります。 |
フィールドのマッピングを削除するには、「削除」をクリックします。
ログアウト・ページとログイン・エラー・ページは、URLや正規表現によっても識別できます。「ログアウト・ページID」および「ログイン・エラー・ページの識別」セクションで、次のいずれかのオプションを選択します。
ページの場所が静的URLである場合、「URL」を選択し、表示されたフィールドにURLを入力します。
ページが動的である場合、「RegEx」を選択し、表示されたフィールドに正規表現パターンを入力します。
この項では、基本認証またはNTLMによる認証が必要なリソースの自動ログインを構成する方法について説明します。
リソースの「自動ログイン」ページで、「基本ログイン」または「NTLMログイン」セクションを開きます。
注意: 基本認証では、パスワードがプレーン・テキストとして送信されるため、本番システムでは使用しないでください。また、基になるトランスポートとしてHTTPSを使用することを強くお薦めします。 |
「ユーザー名」および「パスワード」セクションで、適切な認証のソースを選択し、必要に応じて値を入力します。これらのプロパティを構成する方法の詳細は、第62.3.1.1.8項「自動ログインの構成: 認証のソース」を参照してください。
この項では、Kerberosを使用した認証が必要なリソースの自動ログインを構成する方法について説明します。基本的なKerberos設定の定義の詳細は、第62.2項「ページレット・プロデューサ設定の構成」を参照してください。
リソースの「自動ログイン」ページで、「Kerberosログイン」セクションを開きます。
「ユーザー名」および「パスワード」セクションで、適切な認証のソースを選択し、必要に応じて値を入力します。これらのプロパティを構成する方法の詳細は、次の第62.3.1.1.8項「自動ログインの構成: 認証のソース」を参照してください。
「SPN」フィールドに、Kerberosアカウントのサービス・プリンシパル名(SPN)を、http://
hostname_with_kerberos
の形式で入力します。(Kerberos認証サービスでSPNを使用してサービスを認証するには、そのサービス・インスタンスがログオンに使用するアカウント・オブジェクトに、SPNを登録する必要があります。)
認証のソースによって、ログイン・フィールドのソースが定義されます。表62-2は、各認証フィールドのソースの値について説明しています。
表62-2 ページレット・プロデューサの認証のソース
フィールド | 説明 |
---|---|
非保護 |
指定した認証情報を、リソースにアクセスするすべてのユーザーに使用します。表示されたフィールドに静的な値を入力します。 |
保護 |
ページレット・プロデューサ管理コンソールで管理者によって入力されたフィールド値を使用します。値は資格証明ボールトに格納され、認証されていない(匿名)ユーザーを含むすべてのユーザー間で共有されます。フィールド・キーは自動生成され、読取り専用フィールドとして管理コンソールに表示されます。 |
ユーザー・ボールト |
リソースへの初回アクセス時に、ユーザーに資格証明を要求します。提供された資格証明は暗号化され、資格証明ボールトに格納されます。その後、リソースへのアクセスは、格納された資格証明を使用して認証されます。フィールド・キーは自動生成され、読取り専用フィールドとして管理コンソールに表示されます。2番目のフィールドには、使用する資格証明ボールトの名前を入力するか、サーバー・ボールトを使用する場合はエントリを「default」のまま残します。 注意: |
生成済 |
(フォーム・ログインのみ)バックエンド・サーバーのレスポンスに含まれるマークアップからフィールド値を取得します。 |
「ヘッダー」ページ(図62-13を参照)では、ページレット・プロデューサによって提供されるHTTPから削除するリクエストおよびレスポンス・ヘッダーを選択できます。
一部のヘッダー要素は、バックエンド・アプリケーションに渡さないようにしてください。たとえば、委任された(サード・パーティSSO)認証を使用したときに、SSOシステムによって挿入されるいくつかのヘッダーは、バックエンド・アプリケーションに渡さないようにする必要があります。そのようなヘッダーが渡されると、バックエンド・アプリケーションの機能が妨げられる場合があります。
次のヘッダーはデフォルトで削除されます。
リクエスト・ヘッダー | レスポンス・ヘッダー |
---|---|
- Cache-Control
- Connection - Cookie - Host - Max-Forwards - Pragma - Proxy-Connection - Proxy-Authorization - TE - Trailer - Transfer-Encoding - Upgrade |
- Max-Forwards
- Proxy-Authenticate - Proxy-Connection - Set-Cookie - Trailer - Transfer-Encoding - Upgrade |
Content-Lengthヘッダーは、常に暗黙的に削除されます。これは、プロキシ操作中にコンテンツを操作すると、ほとんどの場合、無効な長さのコンテンツがレンダリングされるためです。
ヘッダーをリストに追加するには、「作成」をクリックし、表示されたフィールドにヘッダー名を入力します。
WebまたはCSPリソースを定義したら、ページレットやその他のオブジェクトを作成できます。詳細は、次の項を参照してください。
この項では、WSRPまたはOracle JPDKポートレット・プロデューサに基づいてWSRP/JPDKリソースを構成する方法について説明します。
注意: WSRPまたはOracle JPDKポートレット・プロデューサに基づいてリソースを作成するには、『Oracle WebCenter Portalの管理』の「ページレット・プロデューサの管理」の章の説明に従って、そのプロデューサを登録する必要があります。 |
この項には次のサブセクションが含まれます:
「全般」ページでは、WSRPまたはJPDKリソースの基本情報を入力できます。
「ポートレット・プロデューサ」ドロップダウン・リストから、ポートレット・プロデューサのタイプを選択します。このリストには、『Oracle WebCenter Portalの管理』の「ページレット・プロデューサの管理」の章の説明に従って登録したプロデューサが移入されます。
リソースの名前を入力します。
リソースの説明を入力します(オプション)。
「ポリシー」ページでは、リソースへのアクセスをOracle WebCenter Portal内の特定のロールに制限できます。
ページレット・プロデューサをホストするJ2EEコンテナ(Oracle WebLogic Serverなど)では、現在のユーザーに関連付けられたロールのメンバーシップを確立する必要があります。「ポリシー」ページでは、1つのリソースに複数のロールを指定でき、ユーザーは指定されたいずれかのロールのメンバーである場合、アクセスを許可されます。そうでない場合、ユーザーはJ2EEコンテナによって委任された適切な認証ページに移動し、必要な資格証明を確立します。リストにロールが入力されていない場合、匿名アクセスが許可され、そのリソースは匿名リソースと呼ばれます。
注意: このページで入力するロール名は、J2EEコンテナ(Oracle WebLogic Serverなど)内に作成されているロール名と一致する必要があります。 |
WSRPまたはJPDKリソースを定義したら、ページレットやWebインジェクタを作成できます。詳細は、次の各項を参照してください。
この項では、OpenSocialガジェット・プロデューサに基づいてOpenSocialリソースを構成する方法について説明します。
注意: OpenSocialリソースを作成する前に、ページレット・プロデューサをOpenSocialとともに使用するよう構成します。詳細は、第62.2.7項「OpenSocial設定の構成」を参照してください。 |
「全般」ページでは、リソースの基本情報を入力できます。
リソースの名前を入力します。
リソースの説明を入力します(オプション)。
「ポリシー」ページでは、リソースへのアクセスをOracle WebCenter Portal内の特定のロールに制限できます。
ページレット・プロデューサをホストするJ2EEコンテナ(Oracle WebLogic Serverなど)では、現在のユーザーに関連付けられたロールのメンバーシップを確立する必要があります。「ポリシー」ページでは、1つのリソースに複数のロールを指定でき、ユーザーは指定されたいずれかのロールのメンバーである場合、アクセスを許可されます。そうでない場合、ユーザーはJ2EEコンテナによって委任された適切な認証ページに移動し、必要な資格証明を確立します。リストにロールが入力されていない場合、匿名アクセスが許可され、そのリソースは匿名リソースと呼ばれます。
注意: このページで入力するロール名は、J2EEコンテナ(Oracle WebLogic Serverなど)内に作成されているロール名と一致する必要があります。 |
OpenSocialリソースを定義したら、ページレットやファイルを作成できます。詳細は、次の項を参照してください。
ページレット・コレクションには、リソースに関連付けられたページレットがリストされます。新しいページレットを作成するには、ページレット・プロデューサ・コンソール内で使用するリソースの下にある「ページレット」セクションを選択し、ツールバーの「作成」アイコンをクリックします。<new>というページレットがリストに追加されます。既存のページレットを変更するには、そのページレット名をクリックします。
この項には次のサブセクションが含まれます:
ページレットの名前と、そのページレットを関連付けるライブラリの名前を入力します。(ページレット・ライブラリは、関連するページレットをユーザー定義によってグループ化する方法の1つです。)ページレットの説明を入力します(オプション)。
WebおよびCSPページレットの場合、ページレットへのパスを「URL接尾辞」フィールドに入力します(リソースに対して入力したソースURLの接頭辞は含めない)。「URL接尾辞」を空白のまま残した場合、リソース全体がページレットと見なされます。
WSRPまたはOracle JPDKポートレットに基づくページレットの場合、ページレットの基になるポートレットを「ポートレット」ドロップダウン・リストから選択します。このリストには、親リソースに関連付けられたWSRPまたはOracle JPDKポートレット・プロデューサ上のポートレットが移入されます。ポートレットに関連付けられたすべてのパブリック・パラメータは、自動的にページレット・パラメータとしてインポートされます。WSRPおよびOracle JPDKポートレットのサポートの詳細は、第62.4項「WSRPおよびOracle JPDKポートレットに対するページレット・クロムの使用」を参照してください。
OpenSocialガジェットに基づくページレットの場合、ガジェットXMLスキーマの場所を「ガジェットURL」フィールドに入力します。「ガジェット・メタデータのインポート」ボタンをクリックして、次の情報をXMLスキーマからインポートします。
ガジェット名: この値は、「全般」ページの「説明」フィールドにインポートされます。
ガジェットのユーザー・プリファレンス: 「パラメータの構成」ページのページレット・パラメータに、ガジェットのユーザー・プリファレンスが移入されます。
OpenSocialガジェットのサポートの詳細は、第62.5項「OpenSocialガジェットの使用」を参照してください。
ページレットへのアクセスをブロックするには、「無効」を選択します。ページレットがいずれかのページに含まれている場合、単純なエラー・メッセージが表示されます。
「プリファレンス」ページ(図62-14を参照)では、ページレットに必要なすべてのプリファレンス・ページ(「グローバル」、「カスタマイズ」または「パーソナライズ」)の相対URLを入力します。リソースに対して入力したソースURLの接頭辞は含めないでください。(前述のように、ユーザー・プリファレンスを含むOpenSocialガジェットに対しては、デフォルト・エントリが作成されます。このエントリは変更しないでください。)
「プリファレンス」ページは、WSRPまたはOracle JPDKベースのページレットでは使用されません。
図62-14 ページレット・プロデューサ・コンソール: 「ページレット」 - 「プリファレンス」ページ
ページレット・パラメータを使用すると、データをページレットに渡すことができます。パラメータによって、次のように、名前/値ペアがページレット・アプリケーションに渡されます。
「パラメータ」ページ(図62-15を参照)で、ページレットに渡すパラメータを入力します。
パラメータを追加するには、「作成」をクリックします。
パラメータの名前を入力します。
パラメータがページレットに必要な場合、「必須」チェック・ボックスを選択します。
適切なデータ型を文字列または数値から選択します。
説明を入力します(オプション)。
図62-15 ページレット・プロデューサ・コンソール: 「ページレット」 - 「パラメータ」ページ
クリッピングを使用すると、プロキシされたアプリケーションに含まれる大きいWebページの一部をクリップして、ページレットを作成できます。たとえば、ニュースのWebページには、最新の主な項目をリストするボックスが含まれている場合があります。そのボックスに含まれるHTMLを識別することによって、主な項目のみをクリップし、ニュースWebページのサブセットをページレットとして提供できます。
クリッパを作成するには、ページレットの下にある「クリップ」セクションを選択し、ツールバーの「作成」アイコンをクリックします。2つの構成ページを含む新しいクリッパが作成されます。
「全般」ページでは、クリッパの名前を入力できます。
「コンテンツ」ページ(図62-16を参照)では、クリッパのコンテンツを定義できます。
図62-16 ページレット・プロデューサ・コンソール: 「クリップ」 - 「コンテンツ」ページ
グラフィカル・ツールを使用してページ・コンテンツを選択するには、「クリッパの起動」をクリックします。
クリップするセクションが記述されたHTMLタグ属性を指定するには、「クリッパの詳細設定」セクション(図62-17)を開き、タグ名と関連属性を入力します。
クリッパを使用する際には、次の点に注意してください。
バックエンド・リソースにHTTPS経由でアクセスする場合は、ページレット・プロデューサ・コンソールにもセキュア・ポート経由でアクセスしてください。
クリップのソースをログイン・フォームまたはその他の認証フォームによって保護する場合は、第62.3.1.1.4項「自動ログインの構成」の説明に従って、親リソースの自動ログインを構成してください。また、ボールトを使用して資格証明の値(第62.3.1.1.8項「自動ログインの構成: 認証のソース」を参照)を格納する場合は、クリッパを使用する前に、それらの資格証明を取得してください。
クリッパで問題が発生した場合は、ブラウザが構成済のページレットURLをリダイレクトなしでロードできることを確認してください。必要に応じて、ブラウザがすべてのリダイレクトに従った後で最終的にロードするURLを反映するよう、ページレットの接尾辞を変更します。
ホストされたファイルを使用して上書きされたイメージとコードはクリップできません。(ホストされたファイルの詳細は、第62.3.5項「ホストされたファイルの作成」を参照してください。)
グラフィカル・クリッパが使用できない場合(たとえば、ページIDが無効な場合)、拡張クリッパを使用して、ページ・リージョンを正規表現でクリップに定義します。
「ドキュメント」ページ(図62-18を参照)では、JavaScriptまたはREST APIを使用してページレットおよびプリファレンス・エディタにアクセスするためのサンプル・コードを表示できます。
図62-18 ページレット・プロデューサ・コンソール: 「ページレット」 - 「ドキュメント」ページ
Webインジェクタは、プロキシされているリソース・ページの指定の場所にコンテンツを挿入します。コンテンツには、HTML、CSS、JavaScriptおよびページレット宣言などのテキストを指定できます。ページから不要なコンテンツを削除するために空のインジェクタを使用することもできます。インジェクタをOpenSocialリソース用に作成することはできません。
Webインジェクタを作成するには、使用するリソースの下にある「インジェクタ」セクションを選択し、ツールバーの「作成」アイコンをクリックします。<new>という新しいインジェクタがリストに追加されます。その後、次の項の説明に従い、「全般」および「コンテンツ」構成ページを使用して、インジェクタを構成できます。
「全般」ページ(図62-19を参照)では、インジェクタの基本設定を構成できます。
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ガジェット・プロデューサ用に作成することはできません。
カスタム・パーサーを作成するには、使用するリソースの下にある「パーサー」セクションを選択し、ツールバーの「作成」アイコンをクリックして、パーサーの「全般」ページ(図62-20を参照)を表示します。
パーサーの名前を入力します。
「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
"
。
ページレット・プロデューサでは、あらゆるタイプのコンテンツ(HTML、JavaScript、CSSなど)をホストし、仮想URLの場所でそのファイルを提供できます。ホストされたファイルは、様々な目的で使用できます。
ファイルをアップロードし、元のファイルと同じURLを使用するようそれらを構成することによって、プロキシされたアプリケーション内のコンテンツと機能を上書きします。
インジェクタ内のホストされたファイルを使用して、プロキシされたアプリケーションにイメージやコンテンツを挿入します。
ページレット・ファイルをページレット・プロデューサ・サーバー上でホストします。
ファイルをアップロードするには、使用するリソースの下にある「ファイル」セクションを選択し、ツールバーの「作成」アイコンをクリックします。
「全般」ページ(図62-21を参照)で、「名前」フィールドにファイルへの相対パスを入力します。先行スラッシュ("/")を使用しないでください。ナビゲータのファイル・コレクションのディレクトリ構造は、ファイルのパスに一致するように更新されます。
ファイルのMIMEタイプを入力します。
「コンテンツ」ページで、ファイルへのパスを入力するか、「参照」をクリックしてそのファイルに移動します。
「アップロード」をクリックして、ファイルをページレット・プロデューサ・サーバーにアップロードします。テキストまたはHTMLをMIMEタイプとして入力した場合、「コンテンツ」ページ上のエディタを使用して、ファイル・コンテンツを入力または編集することもできます。(このエディタはテキストまたはHTMLファイルの場合のみ使用できます。)イメージ・タイプをMIMEタイプとして入力した場合、アップロードしたイメージが「コンテンツ」ページに表示されます。
注意: ページレット・プロデューサにアップロードするテキスト・ファイル(テキスト/プレーン)は、UTF-8として保存する必要があります。 |
ナビゲータ・ツールバーの保存アイコンをクリックします。
アップロードしたファイルはインジェクタおよびページレット内で使用でき、次のURLに配置されます。http://<host_name>:<port_number>/pagelets/<resourcename>/<filepath>
たとえば、ファイルをwelcome_resourceの下にアップロードし、入力したファイル名がimages/myimage.jpgである場合、ページレット・プロデューサ・サーバー上のホストされたファイルへのパスは、次のようになります。http://<host_name>:<port_number>/pagelets/welcome_resource/images/myimage.jpg
ホストされたファイルを使用する際には、次の点に注意してください。
ホストされたファイル機能は、大きいファイルには使用しないでください。
OpenSocialガジェットXMLファイルをホストする場合は、このファイルを匿名リソース(セキュリティ・ポリシーなし)の下に配置する必要があります。そこに配置しないと、ガジェットが正常に機能しません。
ホストされたファイルは、WSRPまたはOracle JPDKポートレット・プロデューサに対して作成できません。
ページレット・プロデューサを使用すると、WSRPおよびOracle JPDKポートレットを表示して任意のWebアプリケーションで使用できるようになります。この項では、ページレット・クロムを使用して、実行時にWSRPやOracle JPDKポートレットでマークアップを変更する方法について説明します。WSRPまたはOracle JPDKポートレット・プロデューサに接続するためのページレット・プロデューサの構成の詳細は、『Oracle WebCenter Portalの管理』の「ページレット・プロデューサの管理」の章を参照してください。
ページレット・クロム・テンプレートは次の各方法を指定するHTMLファイルです。
ポートレット・マークアップのスタイル・レンダリング方法
ポートレット・タイトルの表示方法
モード切替えオプションのレンダリング方法
デフォルトのクロム・テンプレートには、ポートレット名と、異なるモードへの切替えが可能なドロップダウン・メニューが表示されます。ドロップダウン・メニューは、基礎となるポートレットによりサポートされるすべての標準モードが動的に移入されます。テンプレートは、次の予約済トークン(表62-3を参照)を使用して主要なポートレット要素を特定していますが、これらは実行時にページレット・プロデューサによって置き換えられます。
表62-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アプリケーションのクラスパスでホストする必要があります。外部イメージ・サーバーを使用するようにページレット・プロデューサを構成した場合は、 |
クロム・テンプレートを実装するには、それをパラメータとしてページレット注入URL (RESTまたはJavaScript)に追加します。ページレット注入URLの詳細は、第62.7.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ガジェットをサポートするには、まず第62.2.7項「OpenSocial設定の構成」の説明に従って、OpenSocialコンテナを定義する必要があります。
ページレット・プロデューサでは、OAuthを除く、標準のOpenSocial APIのほとんどをサポートしています。完全なOpenSocial APIリファレンス・ドキュメントは、次の場所から入手できます。
http://docs.opensocial.org/display/OSD/Specs
ページレット・プロデューサでは、OpenSocial APIを使用した、ガジェットによるプリファレンスの保存、WebCenter Portalプロファイルと接続情報の取得およびユーザーのアクティビティ・ストリームへのアクセスが可能です。
この項には次のサブセクションが含まれます:
ガジェットからユーザーレベルのデータ(プリファレンスやピープル・コネクション)をリクエストするには、エンド・ユーザーのIDを確立する必要があります。いずれかのOpenSocialガジェットから、サーバーにあるユーザーレベルのデータにアクセスする必要がある場合、ページレット・プロデューサ・コンソールで、親OpenSocialリソースのセキュリティ・ポリシーを構成する必要があります(第62.3.1.3.2項「ポリシー設定の構成」を参照)。ユーザーがOpenSocialガゼットに初めてアクセスすると、ログイン・ページが表示されます。初回ログイン後は、OpenSocialガゼットに対する後続のリクエストで確立されたユーザーIDが使用されます。
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 WebCenter Portalの管理』の「ページレット・プロデューサの管理」の章の説明に従い、WebCenterDSデータ・ソースのターゲットとしてWC_Portlet
サーバーを手動で指定する必要があります。
注意: OpenSocial APIをプロファイルや接続情報の更新に使用することはできません。 |
サポートされているユーザー・プロファイルのフィールドを表62-4に示します。
表62-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を使用してユーザーのアクティビティ・ストリームを操作できます。次の操作がサポートされています。
アクティビティの取得
アクティビティの作成
次の操作はサポートされていません。
アクティビティの更新
アクティビティの削除
サポートされているアクティビティ・ストリームのフィールドを表62-5に示します。
表62-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/Specs
次の例は説明のために簡略化されています。OpenSocialガジェットをサポートするには、まず第62.2.7項「OpenSocial設定の構成」の説明に従って、OpenSocialコンテナを定義する必要があります。
ページレット・プロデューサ・コンソールを使用して新しいリソースを作成し、タイプに「OpenSocial」を選択します。必要に応じてURLおよびポリシーを定義します。新しいリソースを保存します。
ページレット・プロデューサ・コンソールを使用して、新しいページレットを作成し、「ガジェットURL」フィールドにガジェットXMLスキーマの場所を入力します。
ガジェット名およびガジェットに定義されたすべてのプリファレンスをインポートするには、「ガジェット・メタデータのインポート」ボタンをクリックします。いずれかのプリファレンスが編集可能な場合、ページレット・プロデューサは、インポートされたプリファレンスを使用してプリファレンス・エディタを作成します。
生成されたプリファレンス・エディタを構成またはカスタマイズするには、「ページレット・パラメータ」ページに移動します。
「ドキュメント」ページに移動し、JavaScriptまたはREST APIを使用してページレットおよびプリファレンス・エディタにアクセスするためのサンプル・コードを確認します。
新しいページレットを保存します。
次の例は説明のために簡略化されています。OpenSocialガジェットをサポートするには、まず第62.2.7項「OpenSocial設定の構成」の説明に従って、OpenSocialコンテナを定義する必要があります。
ページレット・プロデューサ・コンソールを使用して新しいリソースを作成し、タイプに「OpenSocial」を選択します。必要に応じてURLおよびポリシーを定義します。新しいリソースを保存します。
ガジェット・ファイルを作成またはアップロードします。
注意: OpenSocialガジェットXMLファイルをホストする場合は、このファイルを匿名リソース(セキュリティ・ポリシーなし)の下に配置する必要があります。そこに配置しないと、ガジェットが正常に機能しません。 |
匿名リソースの下の「ファイル」セクションを選択し、ツールバーの「作成」アイコンをクリックします。
「一般」ページで、「名前」フィールドにファイルへの相対パスを入力します。先行スラッシュ("/")を使用しないでください。たとえば、「gadgets/activities.xml」です。任意のパスと名前を使用できます。パスは、ページレット・プロデューサがファイルの処理に使用する仮想URLです。ナビゲータのファイル・コレクションの仮想ディレクトリ構造は、ファイルのパスに一致するように更新されます。
ガジェット・ファイルをアップロードまたは作成するには、「コンテンツ」ページに進みます。
ガジェット・ファイルをアップロードするには、ファイルへのパスを入力するか「参照」ボタンをクリックしてファイルに移動し、「アップロード」ボタンをクリックし、ページレット・プロデューサ・サーバーにファイルをアップロードします。
ガジェット・ファイルを作成するには、「コンテンツ」ページでエディタを使用してコンテンツを入力したり編集します。
ナビゲータ・ツールバーの保存アイコンをクリックします。
ガジェットで必要なその他のファイル(JavaScript、イメージなど)を、リソースの「ファイル」セクションで作成またはアップロードします。ガジェット・コードのパスに一致するファイルのパスを定義します。たとえば、ガジェットがjsというサブフォルダのJavaScriptファイルを使用する場合は、ファイル(gadgets/js/activities.jsなど)をアップロードする際に「名前」フィールドにディレクトリを指定します。
ページレット・プロデューサ・コンソールを使用して、新しいページレットを作成し、「ガジェットURL」フィールドに(ステップ2で作成またはアップロードした)ガジェットのXMLスキーマの相対パスを入力します。ローカル・ファイルの場合は、これはファイル・オブジェクトの「名前」フィールドに定義されているパスと同じになります(gadgets/activities.xmlなど)。
ガジェット名およびガジェットに定義されたすべてのプリファレンスをインポートするには、「ガジェット・メタデータのインポート」ボタンをクリックします。いずれかのプリファレンスが編集可能な場合、ページレット・プロデューサは、インポートされたプリファレンスを使用してプリファレンス・エディタを作成します。
「ドキュメント」ページに移動し、JavaScriptまたはREST APIを使用してページレットおよびプリファレンス・エディタにアクセスするためのサンプル・コードを確認します。
新しいページレットを保存します。
この項では、ページレット・プロデューサを使用したページレットの構築について詳しく説明します。アダプティブ・ページレットのスクリプティング・フレームワークを使用する方法、ページレットとリソースのセキュリティ設定を構成してユーザーの認証を管理する方法、カスタムWebインジェクタおよびパーサーを使用して実行時にページレット機能を変更する方法、デバッグ用の拡張ロギング・トレースにアクセスする方法などを紹介します。
この項には次のサブセクションが含まれます:
アダプティブ・ページレットのスクリプティング・フレームワークは、サービスをCSPページレットとプロキシされたページに提供するクライアント側JavaScriptライブラリです。この項では、スクリプティング・フレームワークを使用して動的機能をページレットに実装する方法について説明します。
注意: CSP (およびアダプティブ・ページレットのスクリプティング・フレームワーク)は、WCIとその前のPlumtree Portalにのみ適用されます。WebCenter PortalではWebCenter Portalはサポートされません。 |
この項には次のサブセクションが含まれます:
クラスとメソッドの完全リストについては、JSPortlet APIのドキュメントを参照してください。アダプティブ・ページレットの追加情報は、第62.6.1.5項「アダプティブ・ページレットの開発のヒント」を参照してください。
この項では、アダプティブ・ページレットのスクリプティング・フレームワークを、通常XMLとしてエンコードされる、構造化されたHTTPのクライアント側レスポンス・ハンドラとして使用する方法について説明します。
ごく一部のユーザー・インタフェースのみを変更する必要がある場合、一部の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
は、ページレベルのイベントにアクセスできるページレットを指定します。完全なリストについては、第62.6.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>
スクリプティング・フレームワークでは、次のページレベルのイベントに自動的にアクセスできます。
表62-6 ページレベルのイベント
イベント | トリガー時期: |
---|---|
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>
この項では、ブラウザレベルの変数が同一ページ上にない場合でも、その変数を格納してページレット間で共有する方法について説明します。たとえば、1つのページレットにユーザーが入力した値は、別のユーザーが取得できます。スクリプティング・フレームワークは仲介として機能するため、セッション・プリファレンスを使用すると、すべてのページレットで共通セッションに格納されているすべての値にアクセスできます。
ページレットはプリファレンスを使用して相互に通信できますが、プリファレンスにアクセスするには通常、データベースへのラウンドトリップが必要です。セッション・プリファレンスは、クライアント・ブラウザ内でユーザーのセッションの設定を保存および共有する手段を提供します。「マスター/ディテール」デザイン・パターンは、セッション・プリファレンスの最も基本的な使用方法です。このデザイン・パターンでは、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はすべてプロキシする必要があります。
アダプティブ・ページレットのスクリプティング・フレームワークを使用している場合は、サポートをチェックします。コンポーネントが存在するかどうかを判断するコードを組み込むことをお薦めします。理想的には、ページレットでいずれの状況も処理できる必要があります。最も簡単な解決方法は、スクリプティング・フレームワークがサポートされていない場合にユーザーに警告を行う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)が送信されます。
この項では、カスタム・インジェクタおよびパーサーを使用して、実行時にページレット機能を変更する方法について説明します。
この項には次のサブセクションが含まれます:
Webインジェクタは、プロキシされているリソース・ページの指定の場所にコンテンツを挿入します。コンテンツには、HTML、CSS、JavaScriptおよびページレット宣言などのテキストを指定できます。ページから不要なコンテンツを削除するために空のインジェクタを使用することもできます。インジェクタをOpenSocialリソース用に作成することはできません。単純なHTMLコンテンツの注入についてはユース・ケースが限られていますが、ページレットのHTMLマークアップを直接変更するJavaScriptを注入することもできます。Webインジェクタの作成の詳細は、第62.3.3項「Webインジェクタの作成」を参照してください。
カスタム・パーサーを使用すると、コンテンツを解析し、URLを検索するための組込みのロジックを補足したり変更できます。組込みのパーサーがURLの識別やURLとしてリライトしてはいけないセクションの識別に失敗した場合は、カスタム・パーサーを使用してデフォルトの動作を変更できます。パーサーは、WSRPやOracle JPDKポートレット・プロデューサまたはOpenSocialガジェット・プロデューサ用に作成することはできません。カスタム・パーサーの作成の詳細は、第62.3.4項「カスタム・パーサーの作成」を参照してください。
この項では、ページレットのデバッグに拡張ロギング・トレースを使用する方法について説明します。ロギングは、ページレット・プロデューサ・コンソールの「設定」セクションで構成され、ここで、ページレット・プロデューサの各コンポーネントについて様々なレベルのロギングを定義できます。詳細は、第62.2項「ページレット・プロデューサ設定の構成」を参照してください。
この項には次のサブセクションが含まれます:
ページレット・プロデューサによって送受信されたHTTPリクエストとレスポンスを表示するには、「ログ設定」ページで「HTTP」コンポーネントを「最も詳細」に設定します。例62-1、例62-2、例62-3および例62-4のトレースは、テスト環境から取得したものです。
例62-1 ページレット・プロデューサによって受信されたHTTPリクエスト
URL: http://example.com:7001/pagelets/bidwiki/includes/js/ajax.js METHOD: GET SESSION ID: GdYGNJzMhxy1CJBMVTX8xTNq32GmLXYNY9VqFBcdprFnhcyQtzdp!1377086614!1305769149498 HEADERS: Host: example.com Connection: keep-alive Referer: http://example.com: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 2012 07:00:06 GMT COOKIES: JSESSIONID: GdYGNJzMhxy1CJBMVTX8xTNq32GmLXYNY9VqFBcdprFnhcyQtzdp!1377086614
例62-2 ページレット・プロデューサにより送信されたHTTPレスポンス
URL: http://example.com: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://example.com:7001/pagelets/bidwiki/download/ resources/leftnav_bg.jpg);*/ /*background-repeat: repeat-y;*/ background-color: #F0F0F0; /*border-bottom:1px solid #F0F0F0;*/ } ...
例62-3 ページレット・プロデューサから送信されたHTTPリクエスト
URL: http://xmlns.oracle.com/includes/js/ajax.js METHOD: GET HEADERS: CSP-Ensemble-REST-API: http://example.com:7001/pagelets X-Client-IP: example.com 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 2012 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://example.com: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,...
例62-4 ページレット・プロデューサによって受信された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コンポーネントを「最も詳細」に設定します。これらのトレースの目的は、変換の様々な段階でレスポンス・コンテンツをログに記録して、それらを比較したり、異なる変換の結果を表示できるようにすることです。例62-5および例62-6のトレース例は、テスト環境から取得したものです。
例62-5 未変換のマークアップ
Original request: URL: http://example.com:7001/pagelets/bidwiki/styles/main-action.css METHOD: GET SESSION ID: GdYGNJzMhxy1CJBMVTX8xTNq32GmLXYNY9VqFBcdprFnhcyQtzdp!1377086614!1305769149498 HEADERS: Host: example.com:7001 Connection: keep-alive Referer: http://example.com: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; }
例62-6 変換済のマークアップ(トランスフォーマ・クラスによって変換)
Transformed by: class com.plumtree.server.impl.portlet.transformers.CSSTurboParser Original request: URL: http://example.com: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://example.com: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; }
この項では、ページレットをJDeveloperのJSFページ、Webページおよびポータル・ページに追加する方法について説明します。ページレットを任意のWebアプリケーションに追加する前に、『Oracle WebCenter Portalの管理』のポータル、テンプレート、アセットおよび拡張機能のデプロイに関する項の説明に従って、ページレット・プロデューサでリソースとページレットをデプロイして構成する必要があります。
この項には次のサブセクションが含まれます:
Oracle JDeveloperを使用すると、JSFページにページレットをドラッグ・アンド・ドロップできます。この項では、ページレット・プロデューサをFrameworkアプリケーションに登録し、ページレットをJSFページに追加し、ブラウザでページを表示してページレットをテストします。
この項には次のサブセクションが含まれます:
ページレットをJSFページに追加する前に、ページレット・プロデューサをアプリケーションに登録する必要があります。ページレット・プロデューサは次の2つの方法で登録できます。
特定のアプリケーションにプロデューサを登録。デフォルトでは、「アプリケーション・リソース」パネル下に接続を作成する「新規ページレット・プロデューサ」ダイアログで、「IDE接続」オプションが選択されています。
「リソース・パレット」を使用してプロデューサを登録。このオプションを使用すると、プロデューサのページレットを複数のアプリケーションで使用できます。「リソース・パレット」で使用可能なページレットは、ページ上にドロップすることにより、任意のPortal Frameworkアプリケーションに追加できます。「リソース・パレット」からページレットを追加する際、まだ登録されていない場合には、そのプロデューサはアプリケーションに登録されます。アプリケーション・ナビゲータの「アプリケーション・リソース」パネルに、「リソース・パレット」からプロデューサ接続全体をドラッグ・アンド・ドロップすることもできます。これにより、プロデューサがアプリケーションに登録されます。または、「リソース・パレット」でプロデューサを右クリックし、コンテキスト・メニューから「アプリケーションに追加」を選択してプロデューサを現在開いているアプリケーションに登録します
Oracle JDeveloperを使用してページレット・プロデューサを登録するには:
アプリケーション・ナビゲータの「アプリケーション・リソース」パネルで、「接続」を右クリックして「接続の作成」を選択し、「ページレット・プロデューサ」を選択します。
「ページレット・プロデューサ」ダイアログの「名前」フィールドに、意味のわかりやすいプロデューサ名を入力します。たとえば、myPageletProducer
です。
「URL」フィールドに、ページレット・プロデューサのURLをhttp://
hostname:portnumber
/pagelets
の形式で入力します。
「OK」をクリックします。図62-28に示すように、ページレット・プロデューサは、「アプリケーション・リソース」パネルの「接続」ディレクトリの「ページレット・プロデューサ」ディレクトリの下に作成されます。
ページレットをページに追加するには:
JDeveloperで、JSFページがまだ開いていない場合は、そのページを「デザイン・ビュー」で開きます。
「アプリケーション・リソース」パネルまたは「リソース・パレット」の「IDEリソース」パネルに進みます。「ページレット・プロデューサ」で、プロデューサを開いてそのコンテンツを表示します。
プロデューサのコンテンツから、JSFページにページレットをドロップします。
このページレットでIFRAMEを有効化する場合は、「ページレットのページへの追加」ダイアログの「IFrameの使用」セクションで「はい」を選択します。
IFrame高さフィールドでは、必要な高さをピクセルで指定するか、空白のままにします。高さを「auto」と指定して、自動サイズ変更を使用することもできます。(このオプションを使用するには、プロジェクトにIFrameサイズ変更ページを追加する必要があります。詳細は、第62.7.2.3項「IFrameへの自動サイズ変更の使用」を参照してください。)「OK」をクリックします。
「タスク・フロー・バインディングの編集」ダイアログでは、入力パラメータがデフォルトで指定されています。必要に応じて任意のパラメータを変更し、「OK」をクリックします。
ページを保存します。「構造」ウィンドウでは、ページは図62-29のように表示されます。
アプリケーション・ナビゲータの「プロジェクト」で該当のJSFページを右クリックし、「実行」を選択します。
ログイン・ページが表示される場合は、ユーザー名とパスワードを入力しページレットを表示できるようにします。図62-30に、ブラウザ・ウィンドウでのページレットのサンプルを示します。
ページレットの保護の詳細は、『Oracle WebCenter Portalの管理』のOracle Single Sign-On (OSSO)の構成に関する項を参照してください。
ページレットをデプロイすると、JavaScriptまたはRESTを使用してページレットをプロキシされたページやプロキシされていないページのどちらにも挿入できます。
この項には次のサブセクションが含まれます:
第62.7.2.1項「JavaScriptを使用したページレットの挿入」: ページレット・プロデューサを使用すると、簡単なJavaScript機能を使用してページレットをプロキシされていないページに挿入できます。
第62.7.2.2項「RESTを使用したページレットへのアクセス」: ページレット・プロデューサREST APIを使用すると、リモートWebサービスでリソースやページレットの情報をページレット・プロデューサから取得し、ページレットをプロキシされたページやプロキシされていないページのどちらにも挿入できます。
第62.7.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, 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
のようになります。省略または空白のままにすると、ページレット・コンテンツがインラインにレンダリングされます。
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
関数を使用すると、ユーザーがこの機能をサポートするページレットに個人プリファレンスと共有プリファレンスを設定できるようにするプリファレンス・エディタを追加できます。この機能は、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またはその他のサード・パーティ・ポータルのポートレット・プロバイダとして動作できるようにします。詳細は、第62.7.2.2.1項「ページレット挿入API」を参照してください。
リモートWebサービスで、リソースとページレットに関する情報をページレット・プロデューサから取得できます。詳細は、第62.7.2.2.2項「データ取得API」を参照してください。
ページレット注入URLは、リモート・ポートレットの場所を指定するためにポータルで使用できます(この方法でページレットをポートレットとして使用できます)。また、挿入URLを、HTMLページでIFrameタグのソース属性として使用することもできます。
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を自動的にサイズ変更できます。詳細は、第62.7.2.3項「IFrameへの自動サイズ変更の使用」を参照してください。 | 100% |
ifheight | IFrameの高さを設定します。パーセント'%'またはピクセル'px'で指定できます。例: ifheight=500px。'auto'に設定すると、コンテンツの幅に収まるようにIFrameを自動的にサイズ変更できます。詳細は、第62.7.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エラーはページ全体を消費します。このモードは、ページレット・プロデューサが親ページを制御する場合にのみ使用可能です。
inline-refresh: オプション。有効な値はtrue
またはfalse (デフォルト)
です。inline-refresh
オプションをtrue
に設定した場合、ページレット・プロデューサは、ページレット・マークアップをページに埋め込むためにiFrameを使用しません。ユーザーがページレットと相互作用するときに、マークアップがインラインで更新されるため、inline-refreshという名前が付いています。これを行うために、ページレット・プロデューサは、かわりにJavaScriptメソッド・コールを使用するようページレット・マークアップ内のURLをリライトします。つまり、ユーザーがリンクをクリックするか、フォーム・リクエストをバックエンドに送信すると、この処理がブラウザ上でJavaScriptによって実行され、その後レスポンスが動的に挿入されます。
inline-refresh
オプションは、HTMLマークアップが比較的単純な場合、適切に機能します。ページレットで、ADFタスク・フローなどの機能豊富なUIが公開される場合、inline-refresh
は適切に機能しないか、単純に中断が発生する可能性があります。このため、inline-refresh
オプションはデフォルトでfalse
に設定されています(つまり、ページレット・マークアップがiFrame内に挿入されます)。
次の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 に設定されます。この機能により、ページレットの取得で手順が追加されます。csapi パラメータは、後続のコールでtrue に設定され、IFrameコンテンツを取得して必須のCSAPIコンテンツがIFrameに格納されるようにします(これが当てはまらない場合は、ページレット・コードはIFrameの外に格納されているCSAPIスクリプトにアクセスできないため、JavaScript解決エラーが返されます)。 |
<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: リモート・アプリケーションを使用してページレット・プロデューサからページレット・データを取得できます。(例62-7「すべてのページレット」および例62-8「ライブラリおよび名前別ページレット」を参照してください。)
リソースAPI: リモート・アプリケーションを使用してページレット・プロデューサからリソース・データを取得できます。(例62-9「すべてのリソース」および例62-10「名前別リソース」を参照してください。)
すべてのリクエストの基本のURLは、 http://
host:port
/pagelets/restservice/pageletproducer/
です。
例62-7 すべてのページレット
http://host:port/pagelets/restservice/pageletproducer/pagelets/ http://host:port/pagelets/restservice/pageletproducer/pagelets/?format=xml
例62-8 ライブラリおよび名前別ページレット
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>
コンポーザを使用すると、ページレットをポータル・ページに追加できます。デフォルトでは、ページレットは「リソース・カタログ」の「マッシュアップ」フォルダに表示されます。ページレットをページに追加するには、「リソース・カタログ」のページレットに移動して選択します。
リソースをポータル内のページに追加する方法の詳細は、『Oracle WebCenter Portalの使用』のページ上のリソース・カタログ・コンポーネントの使用に関する項を参照してください。
ページレットをページ内で構成するには、該当のページを編集モードで表示し、ページレットの「編集」アイコン(スパナ)をクリックします。「コンポーネント・プロパティ」ダイアログの「ページレット・プロパティ」タブでは、ページレット・パラメータとIFrameオプションを定義できます。
この項では、例と高度なトピックをいくつか示します。
この項では、ページレット・プロデューサを使用してWebページをプロキシする方法について簡単に説明します。ここでは、単純な静的Webページ「Hello World」をプロキシし、そのページから1つのセクションを切り取ってページレットとして提供することにより、後からそのページレットをWebCenter PortalやWebCenter Interactionで独自のアプリケーション・ページに挿入できるようにします。
この項には次のサブセクションが含まれます:
この例では、ページレット・プロデューサ・サーバーがhttp://pageletserver.company.com:8889/pagelets/
で実行されているものとします。
まず、そのページレット・プロデューサが稼働しているかどうかを確認します。
これを行うには、単純にそのURL (http://pageletserver.company.com:8889/pagelets/
)にアクセスします。図62-32は、返される結果を示しています。
次のURLを使用して、ページレット・プロデューサの管理画面にアクセスします。
http://pageletserver.company.com:8889/pagelets/admin
プロキシ・サーバーを経由してインターネットに接続する場合は、ページレット・プロデューサ設定でプロキシを構成する必要があります。
ナビゲータ・ペインの「移動先」ドロップダウン・リストで、「設定」を選択します。
「プロキシ」をクリックします。
図62-34に示すように、プロキシ・サーバーの構成を入力します。
まず、Webページのリソースを作成する必要があります。これにより、ページレット・プロデューサに、Webページのすべてのサブパスをプロキシする必要があることが通知されます。また、Webページのプロキシ方法に関する共通ルールの設定が可能になり、ページレットのコンテナが提供されます。
ナビゲータ・ペインの「移動先」ドロップダウン・リストから、「リソース」を選択します。
いずれかの既存のリソースをクリックします(welcome_resource
など)。
「選択したタイプの作成」をクリックします。
「プロデューサ・タイプの選択」ダイアログから「Web」を選択し、「OK」をクリックします。
リソースを作成したら、ナビゲーション・ペインの「全般」ノードをクリックし、次の値を指定します(図62-35を参照)。
名前: AppServer
ソースURL: http://appserver.company.com:1234/
宛先URL: /appserver/
「保存」をクリックします。
リソースを作成すると、WebページにURL http://pageletserver.company.com:8889/pagelets/appserver/helloworld/
からアクセスできるようになります。
元のWebページ・アドレスのソースURLは、ページレット・プロデューサのURL (http://pageletserver.company.com:8889/pagelets
)と宛先URL
を組み合せたものに置き換えられます。
次はHello Worldページレットを作成します。
「リソース」ノードの下にある「ページレット」ノードを開きます。
「選択したタイプの作成」をクリックします。
新しく作成したページレットの「全般」ノードをクリックし、次の値を指定します(図62-37を参照)。
名前: Hello_World
ライブラリ: MyLib
ライブラリは、論理グループ化に使用します。ポータルでは、ライブラリの値を使用して、ページレットをそれぞれのUIにグループ化します。たとえば、ページレットをWebCenter Portalポータルに追加すると、「ライブラリ」の下に個々のページレットがリストされます。
URL接尾辞: helloworld/index.html
URL接尾辞は、Hello WorldページのHTMLの提供元です。
「保存」をクリックします。
ライブラリ名には任意の名前を指定でき、リソース名と一致している必要はありません。これはページレットの論理グループ化に使用されます。また、ページレットを複数のリソースから同じライブラリに含めたり、ページレットごとに新しいライブラリを作成できます。
ページレットを保存したら、次の場所からそのページレットにアクセスできます。
http://pageletserver.company.com:8889/pagelets/inject/v2/pagelet/MyLib/Hello_World
つまり、次のようになります。
http://pageletserver.company.com:8889/pagelets/inject/v2/pagelet/ + [Library] + [Name]
また、iFrameへのページレットの挿入をテストするために、ページレットの「ドキュメント」ノードをクリックし、「RESTを使用してページレットにアクセス」のURLを使用することもできます。
「ドキュメント」ページのURLをクリックすると、次のような画面が表示されます。
作成したページレットは、Webページ全体に表示されます。必要なのはHello Worldのセグメントのみであるため、次の手順に従って、そのセグメントをクリップする必要があります。
「Hello_World」ページレット・ノードの下にある「クリップ」をクリックします。
「選択したタイプの作成」をクリックします。
新しく作成するクリッパの名前を指定します(c1
など)。
クリッパの「コンテンツ」ノードをクリックし、「クリッパの起動」をクリックします。
ブラウザ・ウィンドウで、クリップする領域をマウスで選択します。
マウス・ボタンをクリックすると、ブラウザ・ウィンドウが非表示になり、クリッピング・パスが自動的に生成されます。
クリップされたページレットを保存し、もう一度「ドキュメント」ページからそのリンクにアクセスします。
これでページレットが適切にクリップされ、WebCenter Portalポータル内で使用できるようになりました(図62-41を参照)。
この項では、単純なHello WorldページレットをWebCenter Portal内で消費する方法の例を示します。先に進む前に、まず第62.8.1項「単純なページレットの作成(例)」の手順に従って、この例で使用するHello Worldページレットを作成します。
この項には次のサブセクションが含まれます:
新しく作成したページレットをWebCenter Portalから使用するには、まずページレット・プロデューサを登録する必要があります。
管理者としてWebCenter Portalにログインします。
「管理」をクリックします。
「構成」タブを開きます。
「サービス」をクリックします。
「ポートレット・プロデューサ」をクリックします。
「登録」をクリックします。
「ページレット・プロデューサ」を選択し、フィールドの値を次のように入力します。
プロデューサ名: MyPageletProducer
サーバーURL: http://pageletserver.company.com:8889/pagelets/
「テスト」をクリックし、接続が正しく構成されたことを確認します。
すべて成功した場合、「テストのステータス」ダイアログに、テスト接続が成功したことを示すメッセージが表示されます。
「OK」をクリックします。
これでページレット・プロデューサが登録されました。
この演習用に、ポータルを作成する必要があります。まず、WebCenter Portalにログインし、「ポータル・サイト」テンプレートを使用して、myportalというポータルを作成します。
管理者としてWebCenter Portalにログインします。
「ポータル・サイト」テンプレートを使用して、myportal
というポータルを作成します。
myportalポータルで、「アクション」アイコンをクリックし、「ページの編集」を選択します。
いずれかのポータル・フレーム内にある「コンテンツの追加」をクリックし、「マッシュアップ」を選択します。
「ページレット・プロデューサ」を選択します。
登録したページレット・プロデューサをクリックします。
Hello_Worldページレットを含むライブラリMyLibが表示されます。
「MyLib」をクリックし、「Hello_World」
ページレットを選択して、「追加」をクリックします。
「閉じる」をクリックします。
「保存」をクリックし、「閉じる」をクリックします。
これで、Hello Worldページレットがmyportal
ページに挿入されます。
この項では、単純なHello WorldページレットをWebCenter Interaction (WCI) 10.3.0以降で消費する方法の例を示します。先に進む前に、まず第62.8.1項「単純なページレットの作成(例)」の手順に従って、この例で使用するHello Worldページレットを作成します。
この項には次のサブセクションが含まれます:
新しく作成したページレットをWCIから使用するには、まずページレット・プロデューサを登録する必要があります。
管理者としてWCIにログインします。
「管理」をクリックします。
次の手順に従って、すべてのページレット・プロデューサ関連のオブジェクトを格納するフォルダを作成します。
「オブジェクトの作成」ドロップダウン・リストを開き、「管理フォルダ」を選択します。
「名前」
に「PageletProducer」と入力し、「OK」をクリックします。
新しく作成したPageletProducerフォルダをクリックします。
「オブジェクトの作成」ドロップダウンを開き、「リモート・サーバー」を選択します。
「ベースURL」フィールドに、http://pageletserver.company.com:8889/pagelets
と入力します(この例では、これがページレット・プロデューサのアドレスになります)。
「終了」をクリックします。
PageletProducer
フォルダを選択し、「名前を付けて保存」フィールドにPagelet Producer Remote Server
と入力します。
「保存」をクリックします。
これで、PageletProducerフォルダ内にページレット・プロデューサ・リモート・サーバー接続が作成されました。
この項では、Hello World Webサービスを作成します。
「オブジェクトの作成」ドロップダウンを開き、「Webサービス - リモート・ポートレット」を選択します。
「参照」をクリックし、ページレット・プロデューサ・リモート・サーバーを選択します。
「OK」をクリックします。
「ポートレットURL」フィールドの値を、次のように入力します。
inject/v2/portlet/MyLib/Hello_World?content-type=iframe&csapi=true&ifheight=300px
MyLib
はHello Worldページレットを含むライブラリで、Hello_World
はページレットの名前です。
「終了」をクリックします。
PageletProducer
フォルダを選択し、「名前を付けて保存」フィールドにHello World Web Service
と入力します。
「保存」をクリックします。
これで、Hello World Webサービスが作成されました。
この項では、Hello Worldポートレットを作成します。
「オブジェクトの作成」ドロップダウン・リストを開き、「ポートレット」を選択します。
「テンプレートまたはWebサービスの選択」ダイアログが表示されます(図62-49)。
テンプレートまたはWebサービスのリストから、「Hello World Web Service」
を選択し、「OK」をクリックします。
「ポートレット・タイプ/サイズ」で、使用するポートレット・タイプおよびサイズを選択し、「終了」をクリックします。
「PageletProducer」フォルダを選択します。
「名前を付けて保存」フィールドにHello World Portlet
と入力し、「保存」をクリックします。
これで、Hello Worldポートレットが作成されました。
ページレット・プロデューサの登録、ページレット・プロデューサWebサービスの設定およびHello Worldポートレットの作成が完了したので、次はそのポートレットをWCIのページ上で使用します。ここでは、説明を簡潔にするためにWCIホーム・ページを使用しますが、他のWCIページを使用することもできます。
WCIで、「マイ・ページ」→「ホーム・ページ」に移動します。
「ページの編集」をクリックし、「PageletProducer」
フォルダを開きます。
Hello Worldポートレットをクリックします。
「エディタを閉じる」をクリックします。
WCIのホーム・ページに挿入されたHello Worldページレットを次に示します。
この項は、既存のWSRPポートレットまたは、Oracle EBSなどのバックエンド・アプリケーションにより公開されるWeb UIの要素も含めて、Oracle WebCenter Sites 11gの各ページにコンテンツを統合する必要のある開発者を対象としています。開発者はOracle WebCenter SitesおよびOracle WebCenterページレット・プロデューサに精通しており、Webテクノロジを十分に理解している必要があります。
この項には次のサブセクションが含まれます:
ページレットとその関連リソースが構成されたら、JavaScriptまたはRESTを使用してそれをWebページに挿入できます。詳細は、第62.7.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
はページレット・プロデューサに構成されたライブラリとページレットを示しています。パラメータの詳細は、第62.7.2.2項「RESTを使用したページレットへのアクセス」を参照してください。
ページレットをよりシームレスに消費側ページに統合するには、コンテンツを収められるように動的にサイズ変更することによって、ページレットiFrameがよりインライン・マークアップらしく動作するように設定できます。この機能を有効にするには、サイトとページレット・プロデューサの両方でさらに構成を加える必要があります。
この項では、WebCenter Sitesに同梱されているAviSportsサンプル・サイトを使用します。このサイトに新しいアセットを追加するには、サイト管理ページにログインして、図62-51に示すように左側のナビゲーションで開発セクションを開きます。
まず、次の設定を使用して新しいテンプレートを作成します。
名前
名前: 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>
第62.8.7項「EBS11iを使用したページレットとしてのアプリケーションの消費」には、WebCenter SitesにサンプルのAviSportsサイトを一致させるためにEBS UIのスタイル変更に使用されるインジェクタの作業例が含まれています。
ページレット・プロデューサの中心的な目的は、バックエンド・アプリケーションをプロキシ設定することです。ページレット・プロデューサはブラウザとバックエンド・アプリケーションの仲介役として動作するため、アイデンティティ伝播を次の2つの部分に分ける必要があります。
ページレット・プロデューサは通常、図62-52に示すようなIFrameを使用して、WebコンテンツをWebCenter Sitesに挿入します。
コンテンツはIFrameとして注入されるため、ユーザーIDは、図62-53に示すようにサイト・コンテナとページレット・プロデューサ・コンテナの両方に設定されている必要があります。図62-53では、2つの認証スキーム間での共有が前提となっているユーザー・ディレクトリが省略されていることに注意してください。
ブラウザと2つのコンテナ間でアイデンティティを管理する理想的な方法は、図62-54に示すようにOracle Access Manager (OAM)を使用することです。図62-54では、2つの認証スキーム間での共有が前提となっているユーザー・ディレクトリが省略されていて、OAMアクセス・サーバーが除外されていることに注意してください。また、この構成は11g以前のバージョンではサポートされていないことにも注意してください。
WebCenter Sites11g用にOAMを設定する場合は、Oracle WebCenter Sitesでサポートするソフトウェアの構成の「Oracle Access Manager統合の設定」の章を参照してください。
OAMを設定する前に、サイトでページレット・プロデューサの統合をテストしておくと役立つ場合があります。OAMを使用しないと、ユーザーはページレット・プロデューサとサイトでそれぞれ別々に認証する必要があります(図62-53を参照)。この項では、ページレット・プロデューサでの個別認証の構成方法について説明します。
OAM SSOがページレット・プロデューサまたはサイトのどちらかに存在していない場合は、ページレット・プロデューサからログイン・フォームが表示されていることを確認して、図62-55に示す認証スキームをサポートする必要があります。
ページレット・プロデューサでログイン・フォームが表示されるようにするには:
ページレットへのアクセスを制限するJ2EEロールを特定するか、ページレット・プロデューサをホストしているJ2EEアプリケーション・サーバーに新しいロールを作成します。
この例では、デフォルトのWLSインストールに存在しているグローバルなWebLogic Server (WLS)の「匿名」J2EEロールを使用しています。
ページレット・プロデューサ管理コンソールにログインし、サイト内で表面化する必要のあるページレットが含まれているリソースに移動して、ステップ1で選択したロールを追加します。
ロールは、リソースの「ポリシー」ページで定義されます。
アイデンティティの確立方法は、次の各項で説明するようにアプリケーションのタイプによって異なります。
WSRPポートレットは、アイデンティティ伝播のためにWSSトークンを使用する必要があります。セキュリティ・トークンの構成方法の詳細は、『Oracle WebCenter Portalの管理』のページレット・プロデューサでのWSRPおよびOracle JPDKポートレット・プロデューサの登録に関する項と、第62.8.5項「WSRPポートレットのページレットとしての消費」を参照してください。
アイデンティティを必要とするOracle JPDKポートレットごとに、外部アプリケーションのログイン・フォームによって提供される情報に基づいて資格証明が渡されます。詳細は、『Oracle WebCenter Portalの管理』の外部アプリケーションの管理に関する項とOracle JPDKポートレット・プロデューサの登録に関する項を参照してください。
ページレット・プロデューサには「自動ログイン」という機能があり、この機能によってページレット・プロデューサはバックエンド・アプリケーションにより確立されたネイティブ認証メカニズムと相互作用できます。
バックエンド・アプリケーションにはそれぞれ独自の認証手段があるため、必要な資格証明を収集するには、ページレット・プロデューサで独自のログイン・プロンプトを開始する必要があります。ページレット・プロデューサのリソースは、資格証明を基本的な認証ヘッダー、NTLMトークンまたはKerberosトークンとしてバックエンド・アプリケーションに送信し、さらにフォーム・ベースの認証を(通常はセッションCookieを介して)管理するように構成できます。自動ログインの構成の詳細は、第62.3.1.1.4項「自動ログインの構成」を参照してください。
注意: 「ユーザー・ボールト」を使用するように「ユーザー名」フィールドと「パスワード」フィールドを設定して、バックエンド・アプリケーションへのアクセスに必要なユーザー自身の一意の資格証明を入力するプロンプトが各ユーザーに表示されるようにします。 |
バックエンド・アプリケーションに適切な自動ログイン設定を決定することは、かなり大変な場合があります。この作業では、リクエスト・ヘッダーの参照、リダイレクトの確認、マークアップ(ときには動的に生成されたもの)の調査が必要になります。この調査および構成プロセスは、自動ログインが必要なアプリケーションが複数存在する場合は、気の滅入るような作業になりかねません。したがって、Oracle Access Manager (OAM) SSOまたはOracle SSO (OSSO)が使用可能な場合は、バックエンド・アプリケーションを保護するためにこれらのシングル・サインオン・ソリューションの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をプロキシ設定しようとしないかぎり、すべて実行されます。この項の以降の部分では、サイト統合のコンテキストでこれが実行できる方法を詳しく説明します。
設定例
この例では、前述の図62-54に示すように、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ヘッダーを受信すると、適切なユーザー・プリンシパルを設定します(図62-57を参照)。図62-57では、2つの認証スキーム間での共有が前提となっているユーザー・ディレクトリが省略されていることに注意してください。また、OAMアクセス・サーバーも除外されています。
注意: WebGateをバイパスするようにページレット・プロデューサを設定するとシングル・サインオンが実行できますが、このソリューションはいつでも適用できるわけではありません。WebGateをホストしているOHSサーバーがバックエンド・アプリケーションのロード・バランシングも管理している場合は、WebGateをバイパスすることによってロード・バランシングもバイパスされます。アプリケーションへのトラフィックはすべて1つのサーバーにルーティングされます。この場合は、第62.8.4.3.6項「自動ログインとSSOによるアイデンティティ伝播の使用」で説明するように、自動ログイン用にページレット・プロデューサを構成することをお薦めします。 |
OAM WebGateのバイパス(第62.8.4.3.5項「OAMで保護されたバックエンド・アプリケーションへのアイデンティティの直接伝播の使用」で説明するとおり)が実行可能なオプションでない場合は、ページレット・プロデューサの自動ログイン機能を使用して資格証明を提供できます。バックエンド・アプリケーションごとに個別のログイン・フォームを使用する場合と異なり(第62.8.4.3.3項「自動ログインによるアイデンティティ伝播」を参照)、Oracle SSOソリューション(OAMまたはOSSO)のログイン・ページによる自動ログインを使用すると、自動ログインを1回だけ設定すればよく、構成手順はすべての実装で同じであるという利点があります。
OSSOによる自動ログインの設定手順については、第62.8.7.2項「自動ログイン」を参照してください。本番環境では、これらの手順はこのまま実行できますが、例外として「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 : 非保護または資格証明ボールト
ログイン・フォームの識別:
URL: %OSSO_HOST%/sso/jsp/login.jsp
フォーム送信場所:
URL: %OSSO_HOST/sso/auth - POST
フォーム・フィールド:
appctx: 生成済
locale: 生成済
password : 非保護または資格証明ボールト
site2pstoretoken: 生成済
ssousername: 非保護または資格証明ボールト
v: 生成済
ページレット・プロデューサではWebCenter共通コンシューマを統合しているため、WSRPポートレットやOracle JPDKポートレットをページレットとして公開して、WebCenter SitesやWSRPコンシューマを含まないその他のすべてのWebコンテナで使用できます。
WSRPポートレット・プロデューサは、Fusion Middleware Control、WLSTまたはページレット・プロデューサ管理コンソールを使用してページレット・プロデューサに登録できます。詳細は、『Oracle WebCenter Portalの管理』のページレット・プロデューサでのWSRPおよびOracle JPDKポートレット・プロデューサの登録に関する項を参照してください。登録が完了すると、WSRPプロデューサはページレット・プロデューサ管理コンソールにリソースとして表示され、WSRPエンドポイントに関連付けられたポートレットがリソースのページレット・コレクションにリストされます。
注意: 自動生成されたWSRPリソースとページレットは変更できません。変更可能なバージョンを作成するには、ページレット・プロデューサ管理コンソールで該当するリソースを選択して、「コピー」をクリックします。リソースのクローン・バージョンは編集可能であり、インジェクタなどの各種要素を追加してページレットの機能をカスタマイズできます。たとえば、カスタム・インジェクタを使用してCSSクラスを注入し、ポートレット・マークアップがページレットをホストするサイトのルック・アンド・フィールのように表示されるように変更することもできます。 |
ページレット・プロデューサに登録しているWSRPプロデューサで認証が必要な場合は、次の手順を実行する必要があります。
『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』のWSセキュリティの構成に関する項の説明に従って、ページレット・プロデューサとWSRPプロデューサ間にWSセキュリティを構成します。Javaキーストア(JKS)がWSRPプロデューサとページレット・プロデューサ間で適切に構成されていることを確認する必要があります。詳細は、『Oracle WebCenter Portalの管理』のWebCenterポータル・ドメイン・キーストアの設定に関する項を参照してください。
WSRPプロデューサの登録時に、「セキュリティ」セクションで適切な「トークン・プロファイル」を選択して、必要な構成情報を入力します。キーストアへのパスは絶対パスである必要があります。
ADFタスク・フローがホストされているページからそれを「クリッピング」することで、そのADFタスク・フローをページレット・プロデューサで消費できますが、この方法はお薦めできません。ADFページによって生成されたマークアップの複雑さや、他のタスク・フローまたはADFページ・パラメータへの潜在的な依存性を考慮すると、お薦めできる方法は、タスク・フローに基づいてWSRPポートレットを作成してから、そのポートレットをページレット・プロデューサで消費することです。この方法の利点の1つは、ADFタスク・フローのパラメータがポートレットのパラメータになってページレット・パラメータにマップ可能になり、情報をサイト・ページからタスク・フローに渡せるようになることです。ADFタスク・フローからポートレットを作成するステップ別の手順は、第58.2.3項「タスク・フローに基づくJSFポートレットの作成方法」を参照してください。
ADFタスク・フローがポートレットとして公開された後で、WLSドメインにある管理対象サーバー(たとえば、WebCenterドメイン上のWC_Portlet
サーバー)に新しいWSRPプロデューサをデプロイします。WSDL URLを情報ページ(http://%PRODUCER_HOST%/%APP_CONTEXT%/info
)から取得して、それをメモしておきます。新しいWSRPプロデューサをページレット・プロデューサに登録するには、『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またはFusion Middleware Controlを使用すると、署名の別名やキーストア・パスワードを指定できます。詳細は、『Oracle Fusion Middleware Oracle WebCenter Portal管理者ガイド』のWLSTを使用したキーストアの構成に関する項、またはFusion Middleware Controlを使用したキーストアの構成に関する項を参照してください。
注意: キーストア値を構成したら、JPS構成変更が選択されるようにするために、ページレット・プロデューサをホストしている管理対象サーバー(デフォルトではWC_Portlet )とWLS管理サーバーの両方を再起動する必要があります。 |
プロデューサの構成の第4項の手順では、発行者名の重要性は強調されていません。ここに入力される名前は、コンシューマにより送信された名前と一致する必要があります。Oracle JPSの場合、送信されたデフォルトの発行者IDはwww.oracle.com
です。
WLP WSRPプロデューサをページレット・プロデューサに登録するには、『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ポートレットを表現します。
注意: ポートレットへのユーザー・アイデンティティ伝播を可能にするには、第62.8.4.3項「ページレット・プロデューサからバックエンド・アプリケーションへのアイデンティティの伝播」の説明に従って、WLPとページレット・プロデューサの両方を構成する必要があります。(テスト目的の場合、または認証なしでアクセス可能なポートレット・コンテンツの場合は、「セキュリティ」の下にある「デフォルト・ユーザー」に有効なユーザー名を指定できます。) |
WLP WSRPポートレットをサイト内のページに追加するには、第62.8.4.1項「Oracle WebCenter Sitesへのページレットの追加」の手順に従います。ページレット・コンテンツをロードするIFrameのsrc
属性に使用するURLは、第62.7.2.2項「RESTを使用したページレットへのアクセス」の「ドキュメント」の項に記載されています。
自動生成されたWSRPリソースとページレットは変更できません。WLPポートレットのマークアップの変更、たとえば、カスタムCSSスタイルの注入によりポートレットUIのルック・アンド・フィールを変更するためにページレット・プロデューサの機能を使用するには、新しいバージョンのリソースを作成する必要があります。ページレット・プロデューサ管理コンソールでWLP WSRPプロデューサ用に作成されたリソースを選択し、「コピー」をクリックします。リソースのクローン・バージョンは変更可能であり、インジェクタなどの要素を追加してページレットの機能をカスタマイズできます。
WebCenter Portalには、WebCenter Sitesでユーザーのコラボレーションが容易に実行できるように、お知らせやドキュメントなどのサービスやツールが組み込まれています。これらのツールの概要は、『Oracle WebCenter Portalの使用』の「第IV部」および「第V部」を参照してください。
これらのサービスおよびツールをサイトで公開する場合のお薦めできる方法は、Oracle WebCenter Portal (11.1.1.6およびそれ以降)に組み込まれているサービス・プロデューサ・コンポーネントを利用して、関連するWSRPポートレットをページレット・プロデューサ内で消費することです。
次のポータル・ツールは、デフォルトではWSRPポートレットとして公開されています。
アクティビティ・ストリーム
ディスカッション・フォーラム
メール
投票マネージャ
ドキュメント・マネージャ
リスト
タグ・クラウド
ブログ
ワークリスト
投票
お知らせ
注意: 追加のツールを公開するには、サービス・プロデューサを新しいJSPXページに拡張し、そのページにタスクフローを追加します。 |
『Oracle Fusion Middleware Oracle WebCenterインストレーション・ガイド』の手順に従って、WebCenter Portalをインストールします。WebCenter Contentサーバー、ディスカッション・サーバー、ページレット・プロデューサを含むすべての依存コンポーネントもインストールされていて、構成済であることを確認します。詳細は、第62.1.3項「要件」を参照してください。
サイト駆動の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 WebCenter Portalの管理』の「SSOに関するディスカッション・サーバーの構成」の章を参照してください。
WebCenterサービスを公開するWSRPポートレットをページレット・プロデューサにインポートするには、Enterprise Manager、WLSTまたはページレット・プロデューサ管理コンソールを使用して、サービス・プロデューサをページレット・プロデューサにWSRPプロデューサとして登録するだけです。
図62-58では、ページレット・プロデューサ管理コンソールでのWSRPエンドポイントの登録例を示しています。詳細は、『Oracle WebCenter Portalの管理』のページレット・プロデューサでのWSRPおよびOracle JPDKポートレット・プロデューサの登録に関する項を参照してください。
このページの「セキュリティ」セクションの「トークン・プロファイル」は、サービス・プロデューサをサポートするために「WSS 1.0 SAML Token」に設定する必要があります。また、ページレット・プロデューサで設定されたサービス・プロデューサに対するリクエストに適切な実行タイムアウトを入力します(デフォルトは30秒)。
登録が完了すると、サービス・プロデューサはページレット・プロデューサ管理コンソールにリソースとして表示され、プロデューサによって公開されたすべてのWSRPポートレットがリソースのページレット・コレクションにリストされます。
WebCenterサービスを公開しているページレットはすべて、Oracle WebCenter Sitesへのページレットの追加に関する項で説明する手順に従って、WebCenter Sitesのページに追加できます。図62-59に、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の識別に失敗した場合は、カスタム・パーサーを使用してこの失敗を修正することができます。EBS 11i UIの場合、この手順は「拡張検索」でのポップアップ処理の修正に必要です。
EBSリソースの下で、次の設定を使用して新しいパーサーを作成します。
名前: popupRewriter(または任意の名前)
URLフィルタ: *.jsp*
基本パーサーの使用: オン
フラグメントの場所
var _jspDir='(.*?)';
(タイプ静的URL)
<frame .? src="(.?)
(タイプ静的URL)
図62-60にpopupRewriterの設定を示します。
インジェクタによって、プロキシ設定されているリソース・ページの指定された場所にコンテンツが挿入されます。コンテンツには、HTML、CSS、JavaScript、およびページレット宣言も含めて、任意のテキストが使用できます。空のインジェクタを使用して、不必要なコンテンツをページから削除することもできます。次のインジェクタはEBSページレットに対して作成されたものですが、その目的は、ユーザーが職責を選択するよう求められる最初のページで発生するページの継承をEBSページレットが行わないようにすることです。
EBSリソースの下で、次の設定を使用して新しいインジェクタを作成します。
一般
名前: frameBustDisabler
URLフィルタ: <none>
MIMEフィルタ: text/html
挿入位置: target=_top
を置換
コンテンツ: (テキスト)alt='
'
図62-61に、新しいインジェクタのパラメータ設定を示します。
よりシームレスに消費側ページに統合するには、コンテンツを収められるように動的にサイズ変更することによって、ページレットiFrameがよりインライン・コンテンツらしく動作するように構成できます。詳細は、このドキュメントのIFrameの自動サイズ変更の有効化に関する項を参照してください。
ページレットとして公開されたページ要素を抑止するオプションの1つとして、ページレット・プロデューサで使用可能なグラフィカル・クリッピングまたは正規表現ベースのクリッピングを使用してクリップを作成します。ただし、お薦めできる方法は、プロキシ設定されたページに注入されているカスタム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サイトのスタイル変更の実装方法を示しています。
注意: オーバーライドが適切に機能するためには、インジェクタによるスタイル定義がバックエンド・アプリケーションによって定義されたスタイルの後に置かれることが重要です。次の例では、コンテンツはページの<HEAD> セクションの終わりに注入されています。 |
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リソースには、図62-62に示すように、ページレット、カスタム・インジェクタ、およびカスタム・パーサーが含まれるようになりました。
ページレットをテストするには、「ドキュメント」ページを参照し、次に示すURLを使用して、「example.com」をローカル・ホストIDに置き換えます。
http://example.com:8889/pagelets/inject/v2/pagelet/ebs11/order_status?content-type=iframe&csapi=true&ifheight=300px
次のスクリーンショットは、iFrameのページレット・アクセス用のREST URLを使用してWebCenter SitesにあるサンプルのAviSportsサイトのページに埋め込まれたEBS 11i Order Informationの画面を示しています。
イメージが適切にレンダリングされない場合は、DHTMLリライトが有効になっていることを確認します。(DHTMLリライトの設定はリソースの「一般」ページにあります。)
ページレット・プロデューサは、次の機能を公開するOpenSocialコンテナです。
ユーザー(ピープル・コネクションを公開)
アクティビティ(アクティビティ・ストリームを公開)
アプリケーション・データ(ガジェットのパーソナライズをサポート)
Pub-Subメカニズム
ユーザーおよびアクティビティ機能には、WebCenter Portalが必要です。ユーザーおよびアクティビティ機能を使用するには、WebCenterDSのターゲットとして、WC_Portlet
管理対象サーバー(つまり、ページレット・プロデューサ)を指定します。アプリケーション・データに対して、ページレット・プロデューサでは、ユーザー、インスタンスおよびページレット・スコープのプリファレンスをサポートします。
次に例を示します。
ページレット・プロデューサを開き、新しいOpenSocialリソースを作成します。
必要に応じてURLとポリシーを定義します。
新しいページレットを作成し、外部ガジェットのURLを指定します。
例:
http://bayareacoder.com/gogo/localweather/localweather.xml
ガジェットXMLファイルを作成またはアップロードします(図62-65を参照)。
図62-65 ページレット・プロデューサ内のアクティビティJavaScriptおよびXMLオプション
「名前」フィールドに指定するパスは、ページレット・プロデューサがファイルの提供に使用する仮想URLであり、任意のパスまたは名前を使用できます。
新しいガジェットに必要な他のファイル(JavaScriptファイルやイメージなど)を作成またはアップロードしたら、作業は完了です。
この項では、HTMLマークアップを変更するためのJavaScriptを挿入し、インジェクタでSSLを使用する方法について説明します。
この項には次のサブセクションが含まれます:
HTMLマークアップの挿入や置換だけでは、可能性は限定されます。より有効な方法は、HTMLマークアップを直接変更する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>
SSLリソースを消費するには、次のものを含むHTTPS経由のページレット・プロデューサ接続が必要です。
WLSとページレット・プロデューサ間のセキュアなポート・マッピング
HTTPSを経由したコンテナへのアクセス
インジェクタでは、ページレット・プロデューサによってプロキシされるHTMLマークアップを、次のように変更できます。
URLパターン(リソース・スコープ)に基づきます。
MIMEタイプに基づきます。
場所(上部または下部)またはテキストの完全一致(前、後、置換)に基づきます。
コンテンツ・ページで挿入内容を定義します。
この項では、ページレット・プロデューサの自動ログイン機能を使用する方法、およびカスタム・パーサーを設計する方法について説明します。
この項には次のサブセクションが含まれます:
自動ログインを使用すると、ユーザー名およびパスワード資格証明をバックエンド・リソースに渡すことができます。これらは、次のいずれかのものとして渡すことができます。
静的な資格証明: すべてのユーザーに1つのセット
リソースへの初回アクセス時にユーザーから動的に取得し、セキュアな資格証明ボールトに格納
ユーザー・プロファイル(ユーザー名を取得して渡す)
自動ログインでサポートされる認証メカニズムは、次のとおりです。
基本ログイン
フォーム・ログイン(次の例で使用)
NTLMログイン
Kerberosログイン
図62-66の例と、次のコード・スニペットは、自動ログインを使用してログイン・ページをリダイレクトする方法を示しています。
次のコードは、図62-66の設定を反映しています。
<form action="wwv_flow.accept" method="post" name="wwv_flow" id="wwvFlowForm" autocomplete="off"> <input type="hidden" name="p_flow_id" value="53557" id="pFlowId" /> <input type="hidden" name="p_flow_step_id" value="101" id="pFlowStepId" /> <input type="hidden" name="p_instance" value="724836084846701" id="pInstance" /> <input type="hidden" name="p_page_submission_id" value="1431956852758801" id="pPageSubmissionId" /> <input type="hidden" name="p_request" value="" id="pRequest" /> <div id="login"> <div id="messages"></div> <div id="login-main"> <table id="myapp_layout_45149677586857064102" border="0" class="formlayout" summary="" role="presentation" datatable=0 > <tr><td align="right"><label for="P101_USERNAME" tabindex="999"><a class="optional-w-help" href="javascript:popupFieldHelp('45149677686365064111','724836084846701')"
tabindex="999"> User Name</a></label></td> <td colspan="1" rowspan="1" align="left"><input
type="hidden" name="p_arg_names" value="45149677686365064111" /><input type="text"
id="P101_USERNAME" name="p_t01" value="" size="20" maxlength="100" class="text_
field" /></td></tr><tr><td align="right"><label for="P101_PASSWORD"
tabindex="999"><a class="optional-w-help" href="javascript:popupFieldHelp('45149677888869064121','724836084846701')"
tabindex="999">Password</a></label></td> <td colspan="1" rowspan="1"
align="left"><input type="hidden" name="p_arg_names" value="45149677888869064121"/>
<input type="password" name="p_t02" size="20" maxlength="100" value="" id="P101_
PASSWORD" class="password" onkeypress="return submitEnter(this,event)" />
<input type="button" value="Login"onclick="myapp.submit('LOGIN');" id="P101_LOGIN" />
</td></tr> </table> Please refer to "Using Myapp" in the Myapp User's Guide for more information.</div>
</div> <input type="hidden" name="p_md5_checksum" value="" /><input type="hidden"
name="p_page_checksum" value="D95DBE8607E971820E98E93FC0EC064E" /></form>
パーサーを使用すると、URL解析の組込みロジックを拡張または変更できます。URLフィルタと正規表現を使用すると、ページ内でパーサーによって変更される部分を絞り込むことができます(図62-67)。
正規表現を使用すると、解析するHTMLフラグメントを指定できます。カッコで囲まれた最初のグループ化表現はフラグメントを識別し、残りの表現はそれを検索するためのコンテキストを提供します。プラガブル・パーサー・フレームワークを使用すると、プロキシが様々なタイプのコンテンツを、MIMEタイプ、HTTPヘッダーまたはURLに基づいてどのように認識するかを微調整できます。
この例では、Flashを動作させるために、ページ・マークアップ内の2つの場所にある3つのURLを変更する必要があります。
<embed src=" /i/flashchart/anychart_5/swf/OracleAnyChart.swf?
XMLFile=http://example.com/pls/myapp/myapp_
util.flash?p=53557:1:74175370346201:FLOW_FLASH_CHART5_R45192463162785599619_en" <param name="movie" value="/i/flashchart/anychart_5/swf/AnyChart.swf? XMLFile=http://example.com/pls/myapp/myapp_
util.flash?p=53557:1:74175370346201:FLOW_FLASH_CHART5_R45192463162785599619_en"
これを行うには、次の3つの正規表現(図62-67の「正規表現」の下)を使用します。
XMLFile=(.*?)"
param name="movie" value="(.*?\.swf)
embed src="(.*?\.swf)
リソースとページレットをトラブルシューティングする際には、次の一般的な構成エラーに注意してください。ページレット・プロデューサ設定の構成の詳細は、第62.2項「ページレット・プロデューサ設定の構成」を参照してください。
SSLを使用する場合、ページレット・プロデューサ設定の「変換」ページで、HTTP (セキュアでない)およびHTTPS (セキュア)ポートが適切に構成されていることを確認してください。
HTTPプロキシを必要とするネットワーク上の外部サイトをプロキシする場合、ページレット・プロデューサ設定の「プロキシ」ページで、プロキシURLを構成する必要があります。
デフォルトで作成されるlogin_resource
およびpagelet_api
リソースが存在し、適切に構成されていることを確認してください。
KDブラウザや他のCSPページレットをプロキシする場合、ページレット・プロデューサ設定の「CSP」ページで、イメージ・サービスのURLが絶対URLであることと、CSP SOAP APIのURLが正しく設定されていることを確認してください。
Sun Java仮想マシン(JVM)の制限により、ページレットでは、基になる証明書によってMD2署名アルゴリズムが使用される場合、HTTPSコンテンツを使用できません。
その他のトラブルシューティング情報を確認するには、ロギングを使用します。ページレット・プロデューサは、標準のOracle Diagnostic Loggingファシリティにメッセージのログを記録します。Oracle WebLogic Serverの場合、その場所はuser-projects/domains/<domain>/servers/ <server>/logs/<server>-diagnostic.log
です。ロギングの構成の詳細は、第62.2.2項「ロギング設定の構成」を参照してください。ページレットのデバッグの詳細は、『Oracle WebCenter PortalおよびOracle Jdeveloperでのポータルの開発』の「Oracle WebCenter Portalのページレット・プロデューサによるページレットの作成」の章を参照してください。