14 ポートレットの消費
WebCenter Portalで、ポートレットを登録してポータル・ページに追加します。
この章の内容は次のとおりです。
ポートレットの消費の概要
WebCenter Portalでは、ポートレット・プロデューサをADFアプリケーションに登録することにより、ポートレットを消費できます。ADFアプリケーションでは、自分で構築したポートレットおよび(パッケージ・アプリケーションのベンダーなどの)サード・パーティから入手したポートレットを消費できます。
WebCenter Portalに加えて、他のADFアプリケーションでプロデューサ・アプリケーションを消費することもできます。これにより、ADFに基づく任意のアプリケーションでポートレットを使用できます。ポートレットを開発するユーザーは、ADFアプリケーションでJDeveloperを使用してこの機能をテストできます。
ポートレット・プロデューサは、次の2つの方法で登録できます。
-
ADFアプリケーションにポートレット・プロデューサを登録します。プロデューサを他のアプリケーションに登録しない場合は、このオプションを使用します。
-
「リソース・パレット」を使用してポートレット・プロデューサを登録します。このオプションは、複数のアプリケーションにそのプロデューサのポートレットを使用する場合に使用します。
「リソース・パレット」で使用可能なポートレットは、それをページ上にドロップするか、「アプリケーション・リソース」に追加することで、任意のアプリケーションに追加できます。アプリケーション・ナビゲータの「アプリケーション・リソース」パネルに、「リソース・パレット」からプロデューサ接続全体をドラッグ・アンド・ドロップすることもできます。これにより、プロデューサがアプリケーションに登録されます。かわりに、「リソース・パレット」でプロデューサを右クリックし、ポップアップ・メニューから「アプリケーションに追加」を選択して、現在開いているアプリケーションにプロデューサを登録できます。
JDeveloperは、WSRPプロデューサとOracle PDK-Javaプロデューサの両方を登録するためのウィザードを備えています。
ポートレットの消費に関連するオプションは数多くあります。たとえば、ポートレットをページに直接配置するか、コンポーザ・コンポーネント内にそれらをネストするかを選択できます。また、ポートレット・タグの多くの属性は調整でき、複数のポートレットを互いに連結することもできます。
WebCenter PortalへのWSRPポートレット・プロデューサの登録
WSRPポートレット・プロデューサを登録するときには、プロデューサの運用パラメータを表す基本情報を指定する必要があります。ポートレットを消費するアプリケーションは、プロデューサと通信したり、プロデューサを介してポートレットと通信するときに、この情報を使用します。
WebCenter Portalは、WSRP 1.0とWSRP 2.0のプロデューサをどちらもサポートします。WSRP 2.0標準では特に、ポートレット間の通信およびポートレット・カスタマイズのエクスポートおよびインポートがサポートされます。標準ベースのJSR 286ポートレットを構築しながら、WSRP 2.0のメリットを活用できます。
この項には次のトピックが含まれます:
JDeveloperを使用したWSRPポートレット・プロデューサの登録方法
JDeveloperを使用して、WSRPポートレット・プロデューサを登録できます。
WSRPポートレット・プロデューサの登録ウィザードは、WSRP 1.0および2.0の両方のプロデューサを登録するためのエントリ・ポイントです。登録に成功すると、接続を作成した場所に応じて、新しく登録されたプロデューサがJDeveloperでアプリケーション・ナビゲータの「アプリケーション・リソース」パネルか、「リソース・パレット」に表示されます。その後、プロデューサからポートレットを選択してアプリケーション(.jspx
)ページに配置できます。
注意:
Oracle WebLogic Portalによって提供されるプロデューサを登録し、そのポートレットでADFリッチ・コンポーネントを使用する場合、WSRP 2.0 WSDL URLを登録し、ポートレットが適切に機能するようにする必要があります。
また、WSRPポートレット・プロデューサの登録ウィザードを使用して、ポートレット化したJSFアプリケーションまたはポートレット化したADFタスク・フローであるJSFポートレットを登録します。JSFアプリケーションからポートレットを作成したら、ポートレットをWLSインスタンスにデプロイし、WSRPポートレット・プロデューサを登録する場合と同じようにそのJSFポートレット・プロデューサを登録できます。Oracle JSF Portlet Bridgeによって、JSFアプリケーションおよびタスク・フローがJSR 286ポートレットとして公開されます。
WSRPポートレット・プロデューサを登録するには:
注意:
WSRPポートレット・プロデューサの登録ウィザードで、「終了」をクリックした後に「取消」,をクリックしても、登録は取り消されません。
アプリケーションの定義済Java EEセキュリティ・ロールに対するプロデューサの宣言済ユーザー・カテゴリのマップ方法
web.xml
ファイルのプロパティを介して指定できます。
アプリケーション定義のJava EEセキュリティ・ロールでプロデューサが宣言したユーザー・カテゴリをマップするには:
WebCenter PortalへのOracle PDK-Javaポートレット・プロデューサの登録
登録に成功すると、接続を作成した場所に応じて、新しく登録されたプロデューサがJDeveloperでアプリケーション・ナビゲータの「アプリケーション・リソース」パネルか、「リソース・パレット」に表示されます。これで、アプリケーション(jspx)ページに配置するポートレットをプロデューサから選択できます。
注意:
Oracle PDK-Javaポートレット・プロデューサの登録ウィザードで、「終了」をクリックした後に「取消」をクリックしてもその登録は取り消されません。PDK-Javaポートレット・プロデューサを登録するには:
ポートレット・プロデューサの接続の管理
ポートレット・プロデューサを登録した後、登録設定を編集、接続をテスト、プロデューサをリフレッシュして最新のポートレットのリストを取得、またはポートレット・プロデューサへの接続を削除できます。
この項には次のトピックが含まれます:
ポートレット・プロデューサ登録設定の編集
WSRPポートレット・プロデューサの登録ウィザードと「PDK-Javaポートレット・プロデューサの登録」ウィザードではいずれも、プロデューサを登録したとき入力した値の多くをアクセスおよび修正できます。
ポートレット・プロデューサの登録設定を編集するには:
ポートレット・プロデューサのリフレッシュ
ヒント:
ポートレットがプロデューサから削除された場合は、必ず、ポートレットが配置されているすべてのアプリケーション・ページからそのポートレットを手動で削除してください。詳細は、ポートレット・プロデューサの削除を参照してください。
ポートレット・プロデューサをリフレッシュするには:
- Oracle JDeveloperを開きます。
- 「アプリケーション・ナビゲータ」で「アプリケーション・リソース」ノードを開きます。
- リフレッシュするプロデューサに移動し、右クリックして「プロデューサ登録のリフレッシュ」を選択します。
- 「ポートレット・プロデューサのリフレッシュ」ダイアログ・ボックスで、「はい」をクリックします
ポートレット・プロデューサの削除
注意:
プロデューサを削除すると、そのプロデューサに属するポートレットを消費するページには、ポートレットが使用できないことを示すエラー・メッセージが表示されます。同じ名前を使用してそのプロデューサを再登録するしても、ポートレットは依然として使用できません。
ポートレット・プロデューサを削除するには:
- Oracle JDeveloperを開きます。
- 「アプリケーション・ナビゲータ」で「アプリケーション・リソース」ノードを開きます。
- 削除するプロデューサに移動し、右クリックして「削除」を選択します。
- 「削除の確認」ダイアログで「はい」をクリックします
ページへのポートレットの追加
ページへのポートレットの配置は、「アプリケーション・リソース」パネルまたは「リソース・パレット」からポートレットをそのページにドラッグ・アンド・ドロップする簡単な操作で実行できます。
始める前に
ページ上にポートレットを配置するには、この簡単な操作を実行する前に実行する必要があるいくつかの準備ステップがあります。次のような内容が含まれます。
-
ADFアプリケーションの作成
-
ADFアプリケーション内のアプリケーション・ページの作成。
-
アプリケーションへのポートレットのプロデューサの登録。
-
消費しようとするポートレットの一部が、独自の認証を処理するアプリケーションに属していることがあります。このような場合は、アプリケーションを外部アプリケーションとして登録し、その提供元のポートレット・プロデューサに対して識別する必要があります。
-
消費しようとするポートレットの一部が、Secure Socket Layer (SSL)対応のプロデューサに属していることもあります。SSL対応プロデューサにアクセスしようとすると、セキュリティ・アラート・ダイアログが表示され、プロデューサの証明書を表示して信頼できる証明書リストに追加するように要求されることがあります。セキュリティ・アラート・ダイアログが表示されるのは、プロデューサが、広く受け入れられていない認証局によって発行されたセキュリティ証明書を使用する場合のみです。このようなプロデューサからのポートレットを消費するには、まず、プロデューサのセキュリティ証明書をキーストアに追加する必要があります。
この章の内容は次のとおりです。
ページへのポートレットの追加方法
ポートレットをページに追加するには、次の手順を実行します。
ページへのポートレットの追加時の処理
ポートレットをページに追加すると、ポートレット・タグ(adfp:portlet
またはadfph:portlet
)がページ・ソースに追加されます。これは、ポートレット・コンポーネントを表すタグです。このタグに含まれている属性を「プロパティ・インスペクタ」を使用するかページ・ソースで編集することで、そのポートレットの動作および外観をさらに制御できます。これらの属性の詳細は、ポートレット・タグの属性値の設定を参照してください。
使用するポートレット・タグのタイプは、次のものによって決まります。
-
プロジェクトが、リッチ・クライアント・コンポーネントのみに対して構成されている場合は、
adfp:portlet
タグが使用されます。 -
プロジェクトが、Trinidadコンポーネントのみに対して構成されている場合は、
adfph:portlet
タグが使用されます。 -
プロジェクトがリッチ・クライアントとTrinidadの両方のコンポーネントに対して構成されている場合、ダイアログが表示され、そこでどのポートレット・タグを使用するのかを選択できます。
-
プロジェクトが、リッチ・クライアントとTrinidadのどちらのコンポーネントに対しても構成されていない場合は、
adfp:portlet
タグが使用され、プロジェクトはリッチ・クライアント・コンポーネントに対して自動的に構成されます。
これは、ポートレットのルック・アンド・フィールが、ページ上の他のコンポーネントのものと一致するようにするためです。この場合、次の例に示すように、ポートレットはadfp:portlet
タグを使用して追加されます。
例14-1 ポートレットを含むリッチ・クライアント・ページ
<?xml version='1.0' encoding='US-ASCII'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:af="http://xmlns.oracle.com/adf/faces/rich"
xmlns:adfp="http://xmlns.oracle.com/adf/faces/portlet">
<jsp:directive.page contentType="text/html;charset=US-ASCII"/>
<f:view>
<af:document>
<af:form>
<adfp:portlet value="#{bindings.Portlet11_1}"
id="portlet1"
renderPortletInIFrame="true"/>
</af:form>
</af:document>
</f:view>
</jsp:root>
アップグレードされた10.1.3.2アプリケーションまたはTrinidadコンポーネントを含むアプリケーションを使用している場合は、リッチ・クライアント・コンポーネントではなく、HTMLコンポーネントがアプリケーションで使用されます。この場合、次の例に示すように、ポートレットをページにドラッグすると、adfph:portlet
タグが使用されます。
例14-2 ポートレットを含むTrinidadページ
<?xml version='1.0' encoding='US-ASCII'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:af="http://xmlns.oracle.com/adf/faces/rich"
xmlns:tr="http://myfaces.apache.org/trinidad"
xmlns:adfph="http://xmlns.oracle.com/adf/faces/portlet/html">
<jsp:directive.page contentType="text/html;charset=US-ASCII"/>
<f:view>
<tr:document title="Title 1">
<tr:form><adfph:portlet value="#{bindings.Portlet12_1}
"id="portlet1"/>
</tr:form>
</tr:document>
</f:view>
</jsp:root>
アプリケーション・ページに1つ以上のコンポーザ・コンポーネントが含まれている場合は、これがポートレットの配置場所に影響を与えることがあります。たとえば、「構造」パネルで、cust:panelCustomizable
タグを含むページに配置されているポートレットは、次の例のように配置されます。
例14-3 ポートレット・タグの階層配置
af:document
af:form
cust:panelCustomizable
adfp:portlet
注意:
ADF Facesリッチ・クライアント・コンポーネントとHTMLまたはTrinidadコンポーネントを同じページ上に混在させないことをお薦めします。そのようにすると、実行時に予期しない結果になることがあります。したがって、コンポーザHTMLコンポーネント内にリッチ・クライアント・ポートレットを配置したり、コンポーザ・リッチ・クライアント・コンポーネント内にHTMLポートレットを配置しないでください。
ポートレット間通信に関する必知事項
アプリケーションのインタラクティブ性を高める1つの方法として、関連するコンポーネントをリンクして、これらのコンテンツをコンテキストに即して同期させる方法があります。たとえば、1つのページに2つの株式ポートレットがあり、一方は株価のデータを提供し、もう一方は株式のヘッドライン・ニュース・アイテムを提供するとします。どちらのポートレットも株式ティッカ・シンボルに基づいているため、株価ポートレット内のティッカ・シンボルが変更されると、株式ヘッドライン・ポートレットはその変更を取り込んで、同じティッカ・シンボルに関連するヘッドラインを使用して自動的にリフレッシュする、という動作は筋が通っています。
JSR 286標準では、パブリック・レンダラ・パラメータが導入されており、それを使用してページ上のポートレットをリンクできます。「JSR 286ポートレットでのパブリック・レンダラ・パラメータの使用方法」を参照してください。
JSR 286標準では、ポートレット・イベントもサポートされています。ポートレット・イベントを使用すると、ページ上の任意の場所で発生するアクションに基づいてポートレットのコンテンツを制御できます。ポートレット・イベントは、ポートレットがそれ自体のイベントをトリガーすることでイベントに応答し、それがそのページ上の他のポートレットに影響を与えるようにカスケードできます。ポートレット・イベントは、ADFコンテキスト・イベントによって消費することもでき、コンテキスト・イベントはポートレットによって消費できます。これを使用して、ポートレットとタスク・フローをコンテキストに即してリンクできます。「JSR 286ポートレットでのポートレット・イベントの使用方法」を参照してください。
ページにポートレットを追加すると、ポートレット・バインディングがそのページ定義ファイルに追加されます。このポートレット・バインディングには、ポートレットが自動的にパラメータ変更やイベントをリスニングする必要があるかどうかを指定する属性が含まれます。
例14-4 ポートレット・バインディング
<portlet id="LotteryPortlet2_1"
portletInstance="oracle/adf/portlet/SamplePortlets/ap/Ei7default_03ba18be_012d_1000_8002_0ae8827e9493"
class="oracle.adf.model.portlet.binding.PortletBinding"
retainPortletHeaders="false"
listenForAutoDeliveredPortletEvents="true"
listenForAutoDeliveredParameterChanges="true"
xmlns="http://xmlns.oracle.com/portlet/bindings"/>
これらの属性をtrue
(デフォルト)に設定すると、そのポートレットでサポートされているものに一致する(つまり、同じQNameを持つ)、変更されたパラメータまたはページ上の任意の場所で発生したイベントによって、そのポートレットがそれに従って自動的に更新されることを意味します。さらに、ポートレットは、そのパラメータおよびイベントの別名を定義して、異なるQNameを持つパラメータおよびイベントと一致させることができます。
これらの属性をfalseに設定すると、このパラメータおよびイベントの自動リスニングを無効化できます。たとえば、ページに、同じポートレットの複数のインスタンスが含まれていて、それらは、異なるソースから値を取得する必要がある場合があります。パラメータおよびイベントの自動リスニングを無効化する場合、またはポートレットで、リンクに使用するものと一致しない名前を持つパラメータまたはイベントを定義する場合、ポートレット・ワイヤリングを手動で構成する必要があります。「JSR 286ポートレットでのパラメータとイベントの手動によるワイヤリング」を参照してください。
インライン・フレームに関する必知事項
ポートレットをページ上に直接レンダリングするほうが、インライン・フレーム(iframe
)にそれを配置するよりも優れたユーザー・エクスペリエンスを提供します。ただし、ポートレット・マークアップをインライン・フレーム内に組み込む必要が生じる場合もあります。renderPortletInIFrame
属性を使用して、ポートレットをインライン・フレーム内にレンダリングする必要があるかどうかを決定できます。
renderPortletInIFrame
属性のデフォルト設定はauto
です。これにより、インライン・フレームを必要とせずにOracle ADFページ内に適切にレンダリングされるように、ポートレット・コンシューマによって、可能な場合は必ずポートレット・マークアップのリライトが試みられるようになります。
ただし、次のような状況では、ポートレットはインライン・フレーム内にレンダリングされます。
-
パーサーが、マークアップを解析できないために例外をスローします。
-
ポートレット・コードに、マルチパート・フォーム・ポストが含まれています。
-
ポートレット・コードにファイル・アップロード要素が含まれています。
-
ポートレット開発者が、
portlet.xml
ファイルのcom.oracle.portlet.requireIFrame
コンテナ・ランタイム・オプションをtrueに設定することで、インライン・フレーム内にポートレットをレンダリングすることを明示的に要求しました。
注意:
Oracle JSF Portlet Bridgeを使用して作成されたポートレットは、JavaScriptの問題により直接Oracle ADFページにレンダリングするには複雑すぎるため、requireIFrame
コンテナ実行時オプションはtrueに設定されます。
場合によっては、ポートレット・コンシューマが、Oracle ADFページ内にポートレットを含めるように、ポートレット・マークアップおよびJavaScriptをリライトできないことがあります。このような場合は、ボタンが機能しなかったり、コンソールにJavaScriptエラーが表示されるなど、ポートレットが期待どおりに動作しないことがあります。その場合は、renderPortletInIFrame
属性をtrue
に設定し、ポートレットが常にインライン・フレーム内にレンダリングされるようにします。
renderPortletInIFrame
をtrueに設定する必要がある場合の例は、次のとおりです。
-
ポートレット・コードで、要素名がJavaScriptで動的に作成されます。
-
ポートレット・コードで、複数のフォームが使用されており、それらがJavaScriptで索引によって参照されます。
-
JavaScriptライブラリ・コードは、ポートレットないで要素を参照します。
ポートレットをインライン・フレーム内にレンダリングした場合、window.location
を操作すると予期しない結果が発生することがあります。ポートレットでwindow.location
を使用する場合は、ポートレットがインライン・フレーム内にレンダリングされる場合に対応できるだけの堅牢性がJavaScriptに備わっていることを確認してください。
アクセシビリティなどの理由により、ポートレットをインライン・フレーム内にレンダリングしないようにするには、renderPortletInIFrame
属性をfalse
に設定します。インライン・フレーム内にレンダリングされないポートレットからのHTMLマークアップは、Oracle ADFページ上の他のコンポーネントの障害となることがあります。
インライン・フレームの使用によるアクセシビリティへの影響の詳細は、WebCenter Portalのアクセシビリティ機能を参照してください。
ポートレットのサイズ設定に関する必知事項
ADF Facesコンポーネントは、それらの子を拡大することもしないこともできます。通常、子を拡大できるようにするには、その親に含まれる子が1つのみであることが必要です。コンポーネントでは、拡大することまたは拡大しないこともサポートされています。拡大がサポートされているコンポーネントを、子を拡大する親の内部に配置すると、その子のディメンションは親のディメンションによって決定されます。その子は、親によって拡大されると言い、親を満たすようにサイズ設定されます。
コンポーネントがその親によって拡大されない場合は、それはフロー・レイアウトになっていると言います。その場合、その親からそのサイズを取得しません。それは、それ自体のサイズを、その子から、またはページ・デザイナによって指定されたディメンション・スタイル設定から決定する必要があります。
portlet Facesコンポーネントでは、その親による拡大がサポートされています。それは、その子を明示的に拡大することはありません。
portletコンポーネントのサイズを決定する方法は、そのポートレットの親コンポーネントおよびportletコンポーネント自体で設定されている属性に応じて3つあります。
-
ポートレットがその親によって拡大される場合、そのサイズは親によってのみ決定されます。ポートレットは、ストレッチ・レイアウトになっています。
-
コンテンツの大きさは関係なく、それは、そのポートレットのサイズには関係ありません。コンテンツがそのポートレットよりも大きい場合、ユーザーがすべてのコンテンツを表示できるようにスクロールバーが表示されます。
-
ポートレットの高さが指定されている場合、それは無視され、拡大が優先されます。
-
これは、望ましいレイアウト方法であり、常に信頼できます。
-
ADF Facesタグ・ドキュメントでは、各コンポーネントがその子を拡大するかどうかが指定されています。
-
-
ポートレットが、その親によって拡大されず、明示的なサイズが設定されている場合、それらが使用されます。
-
これも、常に信頼でき、指定したとおりのサイズになります。
-
コンテンツがその指定されているサイズトよりも大きい場合、ユーザーがすべてのコンテンツを表示できるようにスクロールバーが表示されます。
-
サイズは固定され、そのコンテンツのサイズは考慮されません。
-
-
ポートレットが、その親によって拡大されず、明示的なサイズが設定されていない場合、ポートレットによってコンテンツに合せた自動サイズ設定が試みられます。
自動サイズ設定
ポートレットがフロー・レイアウトになっており、明示的なサイズが設定されていない場合、スクロールバーを使用せずにそのポートレット・コンテンツをすべて表示するのに適合する大きさになるようにポートレットのサイズの設定が試みられます。
ポートレットは、スクロールバーを使用せずにコンテンツを表示するために必要な領域の大きさをブラウザに問い合せ、それを使用してポートレットの高さを設定することで、これを実現します。具体的に言えば、インライン・フレーム・ウィンドウのscrollHeight
プロパティが調査されます。
これが、どの程度機能するのかは、ポートレットの中身に応じて異なります。レイアウトによっては、本来のサイズが自動サイズ設定に適しているものもあります。しかし、コンテンツを表示しないようにオーバーフローさせるものまたはスクロールバーを使用するものなど、ポートレット内のレイアウトおよびコンポーネントによって、それらのコンテンツのサイズが実質的に非表示になるものもあります。具体的に言えば、そのようなHTMLマークアップは、hidden
、auto
またはscroll
のオーバーフロー設定を持つHTML要素です。これは、その要素に適用されているインライン・スタイルまたはCSSスタイルの結果である場合もあります。
scrollHeight
は、コンテンツを適切に表示するために最小限必要な高さであるため、問題が生じます。たとえば、overflow="auto"
が設定されたdiv
要素がある場合、そのdiv
がコンテンツよりも小さいと、スクロールバーが使用されます。したがって、div
を表示するために必要な最小サイズを問い合せると、明示的な高さや最小の高さが設定されていない場合、答えは0になります。したがって、このdiv
のコンテンツは、それが明確な高さを持っている場合でも、そのコンテンツの全体的なスクロールの高さに関与しません。
ADFに関しては、これは、多くの場合、dimensionFrom="parent"が設定されているpanelStretchLayoutなど親からそれらのディメンションを取得すると期待されているコンポーネント、またはlayout="scroll".が設定されているpanelGroupLayoutなどそれらのコンテンツをスクロールするコンポーネントに関連しています。これらは、表示されないかスクロール可能なオーバーフローを持つ傾向にあるコンポーネントです。
ADF Facesレイアウト・モデルについて考えると、別の方法で問題を理解できます。ADF Facesのレイアウト・ガイドラインでは、親によって拡大されるコンポーネントとその中のフロー・レイアウト(通常、コンポーネントが固定の高さを持つかそれらのディメンションをそれらの子から取得するaf:panelGroupLayoutによって開始される)のアイランドからなる連鎖から始めることが示されています。ポートレットのルートに、親からディメンションを取得することを期待するコンポーネントの切れ目のない連鎖があるが、そのポートレット自体がフロー・レイアウトになっているためコンテンツからそのディメンションを決定することを期待する場合、袋小路になります。そのポートレットは、サイズについてその親からディメンションを取得することを期待しています。これに対する解決策は、ポートレットを拡大するか(つまり、それをフロー・レイアウト・アイランドから取り出す)、そのポートレットに高さを設定するか、そのポートレットのコンテンツ全体およびフロー・レイアウト・コンテンツのアイランドを作成することであることは明らかです。
コンテンツを自動サイズ設定できない場合、その高さは、デフォルトでFirefoxでは200pxに、Internet Explorerでは0pxになります。Internet Explorerが0であるのは、scrollHeight
で、min-height
CSSスタイル設定が正しく認識されないという不適切な動作が原因です。Firefoxの200pxの高さは、ポートレット化タスク・フローをレンダリングするリージョンに設定されているminheight
によるものです。これを回避するために、コンシューマでheight
またはmin-height
CSSを設定できます。
自動サイズ設定のベスト・プラクティス
コンテンツを自動サイズ設定するようにフロー・レイアウトでポートレットを使用する場合に最善の結果を得るには:
-
ポートレット・コンテンツを、子からディメンションを取得するコンポーネントからなる連鎖にします。
-
dimensionsFrom="children"
属性がサポートされているコンポーネント(たとえば、af:panelStretchLayout
)に対しては、それを使用し、それらがそれらの子からディメンションを取得するようにします。 -
panelGroupLayout
に対してlayout="scroll"
ではなくlayout="vertical"
を使用し、その子のサイズが、全体的な自動サイズ設定ディメンションに寄与するようにします。 -
コンポーネントのフロー・レイアウト連鎖からストレッチ・レイアウトに切り替える場合、子を拡大する最初のコンポーネントに明示的な高さを設定します。通常、これは
dimensionsFrom="parent"
を指定したpanelStretchLayout
を使用した場所になります。
最小化、リストアおよび移動に関する必知事項
開発環境のニーズに合せるために、Show Detail Frameおよびportletコンポーネントのアクション「最小化」、「リストア」および「移動」の動作は、設計時と実行時では異なります。設計時では、これらのアクションは特定の1つのWLSセッションでは維持されますが、セッション間では維持されません(セッションとは、WLSの開始から停止までの時間を意味します)。実行時では、これらのアクションは特定の1つのWLSセッションおよびセッション間の両方で維持されます。
この違いは、設計時におけるアプリケーション・ページの自動リセットを可能にするために取り入れられたものです。
実行時にセッション間で維持する必要がない場合は、アプリケーションのweb.xmlファイルに単純な変更を行うことでそれをオフにできます。アプリケーションのweb.xmlファイル内で、次のパラメータ設定を見つけます。
例14-5 アプリケーションのweb.xmlファイル内の永続性設定
<context-param>
<param-name>oracle.adf.view.faces.CHANGE_PERSISTENCE</param-name>
<param-value>oracle.adfinternal.view.faces.change.HybridChangeManager</param-value>
</context-param>
これを次の例のコードで置き換えます。
例14-6 アプリケーションのweb.xmlファイルでの実行時永続性の無効化
<context-param>
<param-name>oracle.adf.view.faces.CHANGE_PERSISTENCE</param-name>
<param-value>oracle.adf.view.faces.change.SessionChangeManager</param-value>
</context-param>
アプリケーションにセキュリティを実装すると、「最小化」、「リストア」、「移動」アクションはカスタマイズ権限を持つユーザーにのみ表示されます。これらのアクションは、パーソナライズ権限を持つユーザーには表示されません。カスタマイズ権限を持つユーザーは、設計時に次のステップを実行することにより、これらのアクションの効果をテストできます。
-
JDeveloperの統合WLS使用してアプリケーション・ページを実行します。
-
管理者としてログインします。
-
関連するアクション・コマンドを使用して、ポートレットの最小化、ポートレットの移動など自由に変更を行います。
-
いったんログアウトしてからユーザーとしてログインし、アクションの効果を確認します。
実行時の処理内容
ページ上にポートレットを配置したら、そのページを右クリックし、「実行」を選択します。これにより、ページが表示され、デフォルト・ブラウザでJDeveloperの統合WLSを使用してポートレットが実行されます。ポートレットによっては、追加の実行時構成が必要になることもあります。ポートレット全般の詳細は、ポートレットの概要を参照してください。
編集モード(ポートレット・ヘッダーで「パーソナライズ」アイコン(鉛筆アイコン)としてレンダリングされる)を備えたポートレットを実行する場合、認証されたユーザー(つまり、ログインしているユーザー)にのみ、「パーソナライズ」アイコンが表示されます。匿名ユーザーまたはパブリック・ユーザーには、ポートレットをパーソナライズするためのオプションは表示されません。ポートレットを消費するアプリケーションで、ユーザーがポートレットのビューをパーソナライズできるようにするには、あらかじめなんらかの形態のセキュリティを実装しておく必要があります。ポートレットおよびページを作成する開発者は、アプリケーションに完全なセキュリティ・モデルを作成せずに、ポートレットの「編集」モードをテストする必要があることがあります。セキュリティを追加してポートレットの「編集」モードのテストを有効化する方法の詳細。
注意:
実行時にページにポートレットを追加できるようにするには、設計時に少なくとも1つのポートレットをそのページに追加する必要があります。設計時にポートレットを追加すると、DataBindings.cpxファイルの<definitionFactories>要素に次のものが追加されます。
<factory nameSpace="http://xmlns.oracle.com/portlet/bindings"
className="oracle.adf.model.portlet.binding.PortletBindingDefFactoryImpl"/>
<dtfactory className="oracle.adfdtinternal.view.faces.portlet.PortletDefinitionDTFactory"/>
このエントリは、実行時のポートレットの消費を可能にするために必要です。
ポートレットでパラメータまたはイベントがサポートされており、パラメータおよびイベントの自動リスニングが有効化されている場合、サポートされているパラメータおよびイベント(または別名が付けられているパラメータおよびイベント)に対するすべての変更によって、ポートレットが自動的に更新されます。
外部アプリケーションに関連付けられているプロデューサからポートレットを実行する場合、ログイン情報を更新するためのリンクが表示されます。リンクをクリックすると、外部アプリケーション資格証明を入力するための資格証明プロビジョニング・ページが表示されます。有効な資格証明を指定すると、それに従ってポートレットによってコンテンツが表示されます。外部アプリケーションの詳細。
ポートレット・タグの属性値の設定
ページのソース・コード・ビューでは、各ポートレットは、adfp:portlet
タグ(またはadfph:portlet
タグ)で表示され、これには必須属性およびオプション属性のセットが含まれています。必須属性であるvalue
およびportletType
はフレームワークによって自動的に設定され、変更できません。オプション属性値は、ポートレットにその属性のサポートが組み込まれている場合に適用されます。たとえば、isAboutModeAvailable
をtrue
に設定できますが、ポートレットに情報モードが定義されていない場合、この属性設定はポートレットに影響を与えません。
ポートレットでは、スタイル関連属性のセットもサポートされています。
ポートレット・タグでは多数の属性を使用します。それらはJDeveloperのプロパティ・インスペクタを使用するか、タグの属性としてソース・コードで、設計時に設定できます。
この章の内容は次のとおりです。
プロパティ・インスペクタを使用してポートレット・タグに属性値を設定する方法
プロパティ・インスペクタを使用してポートレット・タグの属性値を設定するには:
ポートレット・タグの共通属性
次の表は、ポートレット・タグの共通属性について説明しています。
表14-1 ポートレット・タグの共通属性
属性 | 値 | 説明 |
---|---|---|
|
テキスト文字列次に例を示します。
|
ポートレットの一意識別子。この属性には、ページにそのポートレットを追加するときにデフォルトで一意の値が移入されます。 この値は、HTMLで許可される構文のサブセットに準拠している必要があります。
|
|
テキスト文字列次に例を示します。 title="Announcements" |
ポートレット・タイトル。これはポートレット・ヘッダーに表示されます。 ここで指定した値は、他のどの場所(たとえば、ポートレット・マークアップ内)に指定されているタイトルよりも優先されます。 ここで値を指定しない場合、ポートレットによりポートレットのマークアップからタイトルが抽出されます(レスポンス)。 ここでもポートレット・マークアップでも値を指定しない場合、ポートレットによりそのポートレット定義からそのタイトルが抽出されます。 注意: 設計時に値をtitle属性に指定すると、編集モードまたはデフォルト編集モードで実行時にタイトルに行われた変更は無視されます。 |
|
使用可能な領域をピクセルまたはパーセンテージで表した数値。
|
ポートレットを表示できる領域の幅です。
|
|
ピクセルで表された数値。次に例を示します。 height = 300px |
ポートレットを表示できる領域の高さです。
|
|
イメージのURI。次に例を示します。 icon="coffee.png" |
ポートレット・ヘッダーのポートレット・タイトルの左側に表示されるアイコンとして使用されるイメージの位置を指定するURI。このアイコンは、ポートレットの目的を示すため、ブランド力強化のため、コンテンツ・インジケータとして、またはその他の理由のために使用できます。 プロパティ・インスペクタで、フィールドの横にある「プロパティ・メニュー」アイコンをクリックし、「編集」を選択して、必要なイメージを選択します。 その値は、絶対URIであるか、現在のページまたはアプリケーション・コンテキスト・ルートを基準として解決可能なURIにする必要があります。前の例で指定したURIは、アプリケーション・コンテキスト・ルートで格納され、したがって、フルパスは必要ありません。 |
|
1つ以上のコンポーネントID。次に例を示します。 partialTriggers="_id1 _id2 componentID5" 空白でコンポーネントIDを区切ります。 |
部分更新をトリガーするコンポーネントのID。ポートレットは、指定されたトリガー・コンポーネントをリスニングします。トリガー・コンポーネントが更新のためのトリガー・イベントを受け取ると、ポートレットも自身の更新をリクエストします。 |
ポートレット・タグの外観属性
次の表は、ポートレット・タグの外観属性について説明しています。
表14-2 ポートレット・タグの外観属性
属性 | 値 | 説明 |
---|---|---|
|
デフォルト: |
ポートレットのデフォルトの状態。
|
|
デフォルト: |
ポートレット・モードが変更されると、ポートレットが配置されているページではなく、新しいページに新しいモードがレンダリングされるかどうか。
|
|
デフォルト: |
ポートレットがIFRAME内にレンダリングされるかどうか。
詳細は、インライン・フレームに関する必知事項を参照してください。 |
|
デフォルト: |
スクロール・バーが表示されるかどうか。
|
|
デフォルト: |
ポートレット・ヘッダーが表示されるかどうか。
|
|
デフォルト: |
ポートレットの周囲に影の装飾が表示されるかどうか。
|
|
デフォルト: |
ポートレットがレンダリングされるかどうか。
|
|
デフォルト: |
ポートレットによって使用されるスキンに適用されるスタイル・セレクタ。
これは、ページ上の各ポートレットに異なるルック・アンド・フィールを適用する手段を提供します。 |
|
テキスト文字列次に例を示します。
|
ポートレットの短い説明。 |
|
デフォルト: |
ポートレットのシード済相互作用が表示されるかどうか。
|
|
デフォルト: |
ポートレットの「アクション」メニューに「移動」コマンドを表示するかどうか。
設計時と実行時では「移動」コマンドの動作のしかたが異なります。詳細は、最小化、リストアおよび移動に関する必知事項を参照してください。 |
|
デフォルト: |
ポートレット・クロムに「削除」アイコンを表示するかどうか。
設計時と実行時では「削除」アイコンの動作のしかたが異なります。詳細は、最小化、リストアおよび移動に関する必知事項を参照してください。 注意: この属性は、 |
|
デフォルト: |
ポートレットの右下隅にあるサイズ変更ハンドルを表示するかどうか。
注意: この属性は、 |
|
デフォルト: |
ポートレット・クロムに「最小化」アイコンを表示するかどうか。
設計時と実行時では「最小化」アイコンの動作のしかたが異なります。詳細は、最小化、リストアおよび移動に関する必知事項を参照してください。 |
ポートレット・タグの動作属性
次の表は、ポートレット・タグの動作属性について説明しています。
表14-3 ポートレット・タグの動作属性
属性 | 値 | 説明 |
---|---|---|
|
1つ以上のコンポーネントID。次に例を示します。
空白でコンポーネントIDを区切ります。 |
部分更新をトリガーするコンポーネントのID。ポートレットは、指定されたトリガー・コンポーネントをリスニングします。トリガー・コンポーネントが更新のためのトリガー・イベントを受け取ると、ポートレットも自身の更新をリクエストします。 |
|
デフォルト: |
ページから、ポートレットが配置されているページを指すポートレット・リンク内のパラメータを使用できるようにするかどうか。
|
ポートレット・タグのポートレット・モード属性
ポートレット・モード属性は、編集モードへの切替えなど、モード切替えUIアクションのレンダリングを制御します。特定のモードでポートレットをレンダリングできるかどうかは、ポートレットでサポートされているモードおよびユーザー認可によって決まります。たとえば、isCustomizeModeAvailable
属性がtrueに設定されていても、そのアクションがポートレットでサポートされていなければ、この属性設定はポートレットに影響を与えません。
次の表に示すポートレット・モード属性は、true
またはfalse
に評価される値バインディング式です。
-
true
は、その名前のモードでポートレットをレンダリングできることを意味します。 -
false
は、その名前のモードでポートレットをレンダリングできないことを意味します。
表14-4 ポートレット・タグのポートレット・モード属性
属性 | 値 | 説明 |
---|---|---|
|
デフォルト: |
ポートレットの「アクション」メニューに ユーザーが「バージョン情報」を選択すると、ポートレットの情報モードが起動されます。 |
|
デフォルト: |
JSR 286ポートレットの「アクション」メニューに、 ユーザーが「構成」を選択すると、ポートレットの構成設定が開きます。 |
|
デフォルト: |
ポートレット・ヘッダーに「カスタマイズ」アイコンをレンダリングするかどうか。 サイト管理者は「カスタマイズ」を選択して、ポートレットのデフォルト個人情報データを編集します。 |
|
デフォルト: |
PDK-Javaポートレットの「アクション」メニューに、 ユーザーが「詳細」を選択すると、全画面モードでポートレットが開きます。 |
|
デフォルト: |
ポートレットの「アクション」メニューに「ヘルプ」コマンドをレンダリングするかどうか。 ユーザーが「ヘルプ」を選択すると、ポートレットの「ヘルプ」ページが開きます。 |
|
デフォルト: |
JSR 286ポートレットの「アクション」メニューに、 ユーザーが「印刷」を選択すると、ポートレットのプリンタ・フレンドリ・バージョンが表示されます。 |
|
デフォルト: |
ポートレットの「アクション」メニューに ユーザーが「リフレッシュ」を選択すると、ページ上の他のコンテンツに関係なくポートレットが再描画されます(これは、部分ページ・リフレッシュとも呼ばれます)。 |
|
デフォルト: |
ポートレット・ヘッダーに「パーソナライズ」アイコンをレンダリングするかどうか。 ユーザーは「パーソナライズ」を選択して、ポートレットの個人ビューを変更します。このモードは、規格に基づいたJavaポートレット(JSR 286)ウィザードで「編集」を選択する操作に相当します。 「パーソナライズ」アイコンは、認証を受けたユーザー(つまりログインしているユーザー)にのみ表示されます。パブリック・ユーザーまたは認証を持たないユーザーには表示されません。ユーザーがポートレットの表示をパーソナライズできるようにするには、なんらかのアプリケーション・セキュリティを実装する必要があります。 ポートレットを作成する開発者は、アプリケーション用の完全なセキュリティ・モデルを作成せずに「パーソナライズ」モードをテストする必要があります。 注意: 典型的なパーソナライズ設定は「ポートレット・タイトル」です。設計時にポートレット・タイトルを設定するには、 |
|
デフォルト: |
ポートレット・コンテンツのプレビューを有効化するかどうか。 このモードには、Frameworkアプリケーションで特定のアプリケーションはありませんが、Oracle Portal'のポートレット・リポジトリでは使用され、虫眼鏡アイコンとしてレンダリングされて、ユーザーはポートレットをプレビューするためにこれをクリックします。 |
ポートレット・タグのスタイル属性
次の表は、ポートレット・タグのスタイル属性について説明しています。
表14-5 ポートレット・タグのスタイル属性
属性 | 値 | 説明 |
---|---|---|
|
1つ以上のCSSスタイル。 これらは少なくともCSS 2.0に準拠し、次の形式をとる必要があります。
|
ポートレット・コンテンツに適用されるCSSスタイルです。 ここに入力する値は、inlineStyle属性で指定されているスタイル、CSSに含まれているものまたは特定のポートレット・インスタンス上のスキンより優先されます。 |
|
1つ以上のCSSスタイル。 これらは少なくともCSS 2.0に準拠し、次の形式をとる必要があります。
|
ポートレット全体に適用するCSSスタイル。 ここに入力した値は、特定のポートレット・インスタンスのCSSまたはスキンで指定されているスタイルより優先されます。 |
ポートレット・タグのバインディング属性
次の表は、ポートレット・タグのバインディング属性について説明しています。
表14-6 ポートレット・タグのバインディング属性
属性 | 値 | 説明 |
---|---|---|
|
マネージドBeanの名前。次に例を示します。
プロパティ・インスペクタで、フィールドの横にある「プロパティ・メニュー」アイコンをクリックし、「編集」を選択して、マネージドBeanを選択し、関連するマネージドBeanプロパティを指定します。 |
コンポーネント・インスタンスを格納するためのバインディング参照。バインディング参照によって、ポートレットのインスタンスがマネージドBeanプロパティにバインドされます。マネージドBeanはアプリケーションで使用されるJavaBeansで、JSFの |
ポートレット・タグのカスタマイズ属性
次の表は、ポートレット・タグのカスタマイズ属性について説明しています。
表14-7 ポートレット・タグのカスタマイズ属性
属性 | 値 | 説明 |
---|---|---|
|
デフォルト: |
ポートレット・タグの設計時カスタマイズがこのポートレットに対して可能かどうか。 |
|
テキスト文字列 |
テキスト文字列 |
ポートレット・タグのその他の属性
次の表は、ポートレット・タグのその他の属性について説明しています。
表14-8 ポートレット・タグのその他の属性
属性 | 値 | 説明 |
---|---|---|
|
デフォルト: |
ポートレット・コンテンツがIFRAME内にレンダリングされるときに作成される
|
JSR 286ポートレットでのパラメータとイベントの手動によるワイヤリング
ページに追加するポートレットで、そのコンテンツを動的に変更するために使用されるパラメータまたはイベントが定義される場合、多くの部分で、これは自動的に行われます。「ポートレット間通信に関する必知事項」を参照してください。
ただし、状況によっては、デフォルトのパラメータおよびイベントの自動リスニングをオフにする必要があるか、適切な別名に一致しないかそれらを定義しない名前を持つパラメータまたはイベントを持つポートレットを使用することもあります。そのような場合、ポートレット内のパラメータおよびイベントを手動でワイヤリングする必要があります。
この章の内容は次のとおりです。
パブリック・レンダラ・パラメータとポートレットの手動によるリンク方法
ページ上にポートレットを配置するときに、同じQNameを持つパブリック・レンダラ・パラメータはすべて自動的にリンクされます。たとえば、1つのポートレットが、myParam
という名前のパラメータに値を公開し、ページ上の2番目のポートレットが同じ名前を持つパラメータから値を受け入れる場合、2番目のポートレットは適切な値で自動的に更新されます。
ポートレット開発者がパラメータの別名を設定した場合、異なるQNameを持つパラメータを使用して、複数のポートレットを一緒にリンクすることもできます。
次の例では、パブリック・レンダラ・パラメータを使用して、異なる名前を持ち、別名を定義されていないパラメータを使用して2つのポートレット動作をリンクする方法を示しています。この例では、パブリック・レンダラ・パラメータの更新を可能にする汎用パラメータ・フォーム・ポートレットを取り上げて、どのようにして株価をレンダリングする株価ポートレットにそれをリンクして、パブリック・レンダラ・パラメータから株式記号を取得できるかを示します。
これらの2つのポートレットを同じページ上にドロップするときに、それらが自動的に互いにリンクされることはありません。これは、パラメータ・フォーム・ポートレットの汎用パラメータ名のいずれも、株価ポートレットのstocksymbol
パラメータに一致せず、株価ポートレットではパラメータ・フォーム・ポートレットの汎用パラメータ名に一致するstocksymbol
パラメータの別名が定義されていないためです。
パラメータを手動でリンクするには、次の2つの方法があります。
ページ変数を使用したパラメータの手動によるリンク
ポートレットがページ上にドロップされるときに、ポートレットによってサポートされているパラメータごとにページ変数が作成されます。私たちの例では、ページ変数は、パラメータ・フォーム・ポートレットに対して3つ、株価ポートレットに対して1つあります。
例14-7 ポートレット・パラメータに対して作成されるページ変数
<pageDefinition ...>
<parameters/>
<executables>
<variableIterator id="variables">
<variable Name="ParameterFormPortlet1_1_Parameter1"
Type="java.lang.Object"/>
<variable Name="ParameterFormPortlet1_1_Parameter2"
Type="java.lang.Object"/>
<variable Name="ParameterFormPortlet1_1_Parameter3"
Type="java.lang.Object"/>
<variable Name="StockPricePortlet1_1_stocksymbol"
Type="java.lang.Object"/>
</variableIterator>
<portlet id="ParameterFormPortlet1_1"
...>
<parameters>
<parameter name="Parameter1"
pageVariable="ParameterFormPortlet1_1_Parameter1"/>
<parameter name="Parameter2"
pageVariable="ParameterFormPortlet1_1_Parameter2"/>
<parameter name="Parameter3"
pageVariable="ParameterFormPortlet1_1_Parameter3"/>
</parameters>
<events>
<event eventType="ParametersChange"
name="ParameterFormPortlet1_1_Event"/>
</events>
</portlet>
<portlet id="StockPricePortlet1_1"
...>
<parameters>
<parameter name="stocksymbol"
pageVariable="StockPricePortlet1_1_stocksymbol"/>
</parameters>
<events>
<event eventType="ParametersChange"
name="StockPricePortlet1_1_Event"/>
</events>
</portlet>
</executables>
<bindings/>
</pageDefinition>
ポートレットをリンクするために、株価ポートレットが、パラメータ・フォーム・ポートレットに対して作成されるページ変数の1つからの値を使用するようにすることができます。
例14-8 ページ変数を使用したポートレット・パラメータのリンク
<portlet id="StockPricePortlet1_1"
...>
<parameters>
<parameter name="stocksymbol"
pageVariable="ParameterFormPortlet1_1_Parameter1"/>
</parameters>
<events>
<event eventType="ParametersChange"
name="StockPricePortlet1_1_Event"/>
</events>
</portlet>
ここで、パラメータ・フォーム・ポートレットの最初のパラメータ・フィールドに値を入力すると、対応するページ変数がそれと同じ値に設定され、それによって、株価ポートレットがその新しい値で更新されます。
ParametersChange ADFコンテキスト・イベントを使用したパラメータの手動によるリンク
パラメータおよびページ変数をサポートするポートレットをドロップすると(ページ変数を使用したパラメータの手動によるリンクを参照)、ADF ParametersChange
コンテキスト・イベントがそのポートレットに対して作成されます。このイベントは、そのポートレットのパラメータの値が変更されるとトリガーされます。このイベントのペイロードは、そのパラメータの新しい値です。このイベントを使用すると、ページ定義で最初のポートレットのイベントのペイロードを2番目のポートレットのパラメータにマップするイベント・マップを作成することによって別のポートレットのパラメータの値を設定できます。次の例は、このイベント・マップがどのようなものになるのかを示しています。
例14-9 ParametersChange ADFコンテキスト・イベントを使用するポートレット・パラメータのリンク
<eventMap xmlns="http://xmlns.oracle.com/adfm/contextualEvent">
<event name="ParameterFormPortlet1_1_Event">
<producer region="ParameterFormPortlet1_1">
<consumer handler="StockPricePortlet1_1">
<parameters>
<parameter name="stocksymbol">
value="${payLoad.Parameter1}"/>
</parameters>
</consumer>
</producer>
</event>
</eventMap>
パラメータ・フォーム・ポートレットの最初のパラメータ・フィールドに値を入力すると、ParametersChange
イベントがトリガーされます。このイベントのペイロードである新しいパラメータ値は、株価ポートレットに送信され、stocksymbol
パラメータの値を指定するために使用されます。
ポートレット・イベントとポートレットの手動によるリンク方法
次の例では、異なるポートレットに対して定義されているイベントの名前が一致しない場合に、ポートレット・イベントを使用して手動でポートレットをリンクする方法を示します。
ヒント:
この項の例を含むZIPファイルを次の場所からダウンロードできます。http://www.oracle.com/technetwork/middleware/webcenter/ps3-samples-176806.htmlこの例では、1つの会社の様々なオフイスの地理的な位置をリストした部門の位置ポートレットがあるとします。部門の位置ポートレットでは、特定の部門がポートレット内で選択されると、ポートレット・イベント(latLong)が発生します。
Googleマップを表示するマップ・ポートレットという別のポートレットがあります。マップ・ポートレットは、マップ上に表示する位置の判別に使用するポートレット・イベント(geolocation)をリスニングします。
この2つのポートレットが1つのページ上にドロップされている場合、マップ・ポートレットには、マップの表示に使用できる情報を提供するイベントが部門の位置ポートレットによって発生したことを知る方法がありません。この2つのポートレット間のリンクを作成するには、次の例に示すようにページ定義を編集して2つのイベントの間のマッピングを明示的に作成する必要があります。
例14-10 ページ定義における明示的なイベント・マッピング
<pageDefinition ...>
<parameters/>
<executables>
<variableIterator id="variables"/>
<portlet id="DepartmentLocations1_1"
...
<events>
<event name="latLong">
<portletevent namespace-uri="http://xmlns.oracle.com/portlet/EventSample"
localpart="latLong"/>
</event>
</events>
</portlet>
<portlet id="Map1_1"
...
<events>
<event name="geolocation">
<portletevent namespace-uri="http://xmlns.oracle.com/portlet/EventSample"
localpart="geolocation"/>
</event>
</events>
</portlet>
</executables>
<bindings/>
<eventMap xmlns="http://xmlns.oracle.com/adfm/contextualEvent">
<event name="{http://xmlns.oracle.com/portlet/EventSample}latLong">
<producer region="DepartmentLocations1_1">
<consumer handler="Map1_1.{http://xmlns.oracle.com/portlet/EventSample}geolocation"/>
</producer>
</event>
</eventMap>
</pageDefinition>
ポートレットのコピー
ポートレットをコピーする場合、ポートレットとそのコピーは同じアプリケーション内に置く必要があります。たとえば、ポートレットを、1つのアプリケーションの1つのページからそのアプリケーションの同じプロジェクト内の別のページにコピーしたり、同じページ上の1つの場所から別の場所にコピーできます。また、ターゲット・プロジェクトがポートレットを消費するように構成されている場合、同じアプリケーション内の1つのプロジェクトから別のプロジェクトにポートレットをコピーすることもできます。コピーは、おやじ・ポートレット・インスタンスへの参照であるため、ポートレット(オリジナルまたはコピー)のインスタンスに行ったカスタマイズまたはパーソナライズは、他のすべてのインスタンスに影響を与えます。
ポートレットのコピーは、ポートレット表示タグをコピーして貼り付けること以上のものです。これには、アプリケーション・ページのソースからのポートレット関連のエントリのコピーも含まれます。また、ページ定義ファイルからポートレット関連のエントリをコピーすることと、コピーされたポートレットのバインディングBean内から重複するポートレット・バインディング情報を削除したり、新しいメソッドを作成することも含まれる場合があります。
ポートレットをコピーする場合、ターゲット・ページはOracle ADF Facesページにする必要があります。ターゲット・ページ上に前から存在しているコードはすべて、それを反映する必要があります。このための操作は、非常に簡単です。JDeveloperによって新しいJSFページが作成されると、そのページには純粋なJSFタグが含まれます。Oracle ADF Facesコンポーネントを初めてページ上にドロップすると、自動的にタグがOracle ADF Facesタグに更新されます。たとえば、<html>
タグは<afh:html>
になり、<head>
タグと<title="title">
タグは<afh:head title="title">
になります。このように、ターゲット・ページをOracle ADF Facesページに確実に変換する簡単な方法は、ターゲット・ページ上にOracle ADF Facesコンポーネントを配置することです。これによって、必要なコード変換が自動的に実行されます。
この章の内容は次のとおりです。
アプリケーション・ページからのポートレットの削除
アプリケーション・ページからポートレットを削除する場合、そのポートレットにパラメータが含まれていれば、アプリケーション・ページのページ定義ファイルから、これらのパラメータに関連付けられたページ変数も削除する必要があります。
ポートレットとそれに関連するページ変数をページから削除するには:
ポートレットのトラブルシューティング
ポートレットのトラブルシューティング用診断ツール
コンシューマとプロデューサの両方で使用できる、ポートレットでの問題の識別および解決に役立つ一連のツールがあります。
ポートレットをレンダリングするときにポートレット・エラー・メッセージが表示される場合、またはポートレットが表示されるがそれと適切に対話できない場合、その問題を診断するために従う必要があるこれらのツールの一般的な使用ステップがあります。
この項には次のトピックが含まれます:
ポートレット・インスタンスの識別
ポートレット・エラーが発生した場合の最初のステップは、どのポートレット・プロデューサおよびポートレット・インスタンスが起動されているのかを特定することです。ブラウザからportletDebugShow()
JavaScriptを実行し、メイン・ポートレット・コンテンツ領域にこの情報を表示します。
ポートレット・インスタンスを識別するには:
-
ブラウザの場所フィールドに次のコマンドを入力します。
javascript:portletDebugShow()
ヒント:
Internet ExplorerおよびGoogle Chromeでは、このコマンドを場所フィールドに入力する必要があります。このコマンドをフィールドに貼り付けた場合、
javascript
の部分が削除されます。Firefox 6以上の場合、場所フィールドにJavaScriptを入力できません。このコマンドをJavaScriptコンソールに入力する必要があります。
-
スクリプトを実行すると、すべてのポートレットによって次の情報が表示されます。
-
プロデューサ名
-
ポートレット名
-
ポートレット・インスタンスID
-
実行コンテキストID (ECID)
ECIDは、ポートレット・リクエストを識別するために使用される一意のIDです。ECIDを使用して、Fusion Middleware Controlを使用して様々なコンシューマおよびプロデューサ・ログ・ファイルにわたるメッセージを関係付けます。同じECIDが、コンシューマからプロデューサに伝播されます。
注意:
破損しているポートレットは、2つのECIDを示します。1つはエラーが発生したリクエストに対するもの、1つはエラーが報告されたリクエストに対するものです。インライン・ポートレット(つまり、IFRAME内に表示されないポートレット)の場合、これらの2つのECIDは同じです。
IFRAMEポートレット(たとえば、Oracle JSF Portlet Bridgeポートレット)の場合、ECIDは異なります。これは、元の例外が発生したものより後のリクエストでエラーが報告されるためです。ログを確認するときは、どちらのECIDにも関連情報が含まれている可能性があるため、両方のECIDを調べます。
この情報を後続の診断ステップで使用して、問題の特定に役立てることができます。
注意:
ポートレット診断情報に表示されるECIDは、ポートレット・プロデューサに対して(ポートレット・コンシューマ・リソース・プロキシを使用して)行われた部分ページ・レンダリング・リクエストを反映していません。これらのリクエストによって、ポートレットが更新される場合がありますが、ポートレット診断情報にECIDは記録されません。これらのリクエスト中に発生するエラーは、プロデューサで記録され、コンシューマ上のポートレット・リソース・プロキシによって記録されますが、ポートレット診断情報で報告されるECID情報を使用して、関連するログ・エントリのECIDを判別するために役立てることはできません。
-
-
ポートレットのデバッグを終了したら、次のコマンドを入力して、ポートレット・デバッグ情報を非表示にします。
javascript:portletDebugHide()
ヒント:
Internet ExplorerおよびGoogle Chromeでは、このコマンドを場所フィールドに入力する必要があります。このコマンドをフィールドに貼り付けた場合、
javascript
の部分が削除されます。Firefox 6以上の場合、場所フィールドにJavaScriptを入力できません。このコマンドをJavaScriptコンソールに入力する必要があります。
ポートレット・コンシューマ・テスト・ページの調査
ポートレット・エラーの診断の次のステップでは、ポートレット・コンシューマ・テスト・ページ(図E-2に表示)にアクセスし、ポートレット・プロデューサを探して、必要に応じて、ポートレットを単独でテストします。
ポートレット・コンシューマ・テスト・ページには、次3つのタブがあります。
-
プロデューサ: このタブには、コンシューマ・アプリケーションに登録されているすべてのプロデューサがリストされます。1つのプロデューサを選択すると、そのプロデューサに関する具体的な情報が提供されます。
-
健全性チェック: このタブには、コンシューマ・アプリケーション開発者によって構成された、コンシューマ・アプリケーション内で実行できるポートレット・インスタンスと必須パラメータの事前定義済セットが含まれている場合があります。これらのポートレット内の障害はすべて、対応するプロデューサまたはポートレット、あるいはその両方での問題を示しています。
-
構成: このタブで、ポートレットの消費のためのコンシューマ構成エントリを識別できます。これらの値は、アプリケーション内に格納されているため変更できません。それらは参照目的でのみ表示されています。
ポートレット・コンシューマ・テスト・ページにアクセスした後、さらに診断ステップを実行できます。
この項では、ポートレット・コンシューマ・テスト・ページを使用してポートレットの問題を診断する方法について説明します。次のトピックが含まれています:
-
ポートレット・コンシューマ・テスト・ページへのアクセス
-
ポートレット・プロデューサを見つける
-
ポートレット・インスタンスを見つけて実行する
-
健全性チェックの実行
-
コンシューマ構成エントリのチェック
プロデューサ・テスト・ページの調査
コンシューマ・アプリケーションでエラーの原因を特定できない場合は、次のステップで「プロデューサ・テスト・ページ」(図E-5に表示)を使用してポートレット・プロデューサ・アプリケーションの潜在的な問題を特定します。
メイン・プロデューサ・テスト・ページへのアクセスはパブリックですが、各ポートレットのテスト・ページへのリンクには、基礎となっているページおよびタスク・フローに対する権限を付与されているユーザーのみがアクセスできます。
プロデューサ・テスト・ページには、次の5つのセクションがあります。
-
ポートレット
プロデューサ内のすべてのポートレットのリスト。Oracle JSF Portlet Bridgeポートレットの場合、各ポートレットは、サーブレットとしてそのポートレットを実行するための個別のリンクも提供します(これは、それらをポートレットとして実行するための前提条件です。ポートレットがサーブレットとして実行されない場合、それはポートレットとして実行できません)。
-
コンテナ構成
コンシューマ・プリファレンス情報が格納される場所に関する情報。
-
コンテナ・バージョン
ポートレット・プロデューサ・コンテナのバージョン番号。
-
WSDL URL
登録に使用するWeb Service Definition Language (WSDL)ドキュメントへのリンク。
-
SOAPモニター
WSRP SOAPモニターへのリンク。それによって、
Monitor
またはAdmin
ロールを持つユーザーは、コンシューマとプロデューサとの間のSOAPメッセージを追跡できます。
プロデューサ・テスト・ページにアクセスした後、さらに診断ステップを実行できます。
この項には次のトピックが含まれます:
プロデューサ・テスト・ページへのアクセス
プロデューサ・テスト・ページには、ポートレット・プロデューサに関する診断情報が表示されます。
プロデューサ・テスト・ページにアクセスするには:
-
ブラウザで、プロデューサ・テスト・ページのURLを入力します。
http://host:port/context-root/info
-
後続の項で説明するように、プロデューサ・テスト・ページで、さらに診断ステップを実行できます。
サーブレットとしてのJSFポートレットの実行
Oracle JSF Portlet Bridgeポートレット・プロデューサが適切に実行されていることを確認するには、最初に標準HTTPリクエストを介してプロデューサ・アプリケーションが適切に実行されていることを確認する必要があります。プロデューサによってポートレットとして公開されるアーティファクトが、サーブレットとして実行されていない場合、それらはポートレットとして実行されません。
JSFポートレットをサーブレットとして実行するには:
-
プロデューサ・テスト・ページで、ポートレットの横にある「サーブレットとして実行」リンクをクリックします。
-
そのポートレットは、基礎となっているページまたはタスク・フローをリクエストする標準HTTPを使用してコールされます。リクエストの結果は、新しいブラウザ・ウィンドウに表示されます。
結果のページまたはタスク・フローが適切にレンダリングされない場合、プロデューサ・アプリケーションに、ページまたはタスク・フローをポートレットとして実行する前に解決する必要がある問題があります。
-
ポートレットがパラメータを取る場合、「パラメータの表示」をクリックして、それらをリストし、値を指定します。「サーブレットとして実行」をクリックすると、ポートレット・コールにそのパラメータ値が含められます。
SOAPモニターの調査
SOAPモニターは、ポートレットをレンダリングするときのコンシューマとプロデューサとの間のSOAPリクエストへのアクセスを提供します。これは、通信レベルでの問題の診断にとても役立ちます。
SOAPモニターを調査するには:
-
プロデューサ・テスト・ページで、ページの下部にあるSOAPモニター・リンクをクリックします。
-
プロンプトが表示されたらユーザー名とパスワードを入力します。
注意:
SOAPモニターにアクセスするには、アイデンティティ管理システムの
Monitors
またはAdministrators
ロールのメンバーであることが必要です。 -
デフォルトでは、SOAPモニターは無効化されているため、そのページは空です。最初に、ページの最上部にある「有効化」リンクをクリックすることでモニターを有効化する必要があります。
-
ページは自動的にリフレッシュされないため、SOAPメッセージを表示するには、「リフレッシュ」リンクをクリックする必要があります。
-
障害が発生しているポートレットに対してリクエストを強制するには、そのポートレットの「ポートレット・コンシューマ・テスト・ページ: ポートレット」ページに移動し、「ポートレットのリフレッシュ」を選択します。
-
ポートレットがレンダリングされたか失敗したときに、SOAPモニターの「リフレッシュ」リンクをクリックし、取得されたリクエストを表示します。
-
これで、送信されたSOAPメッセージとそのレスポンスを調査して、問題の原因の絞込みを試みることができるようになりました。
注意:
ポートレットを再実行してSOAPモニターをリフレッシュした後に、メッセージがなにも表示されない場合、それは、プロデューサとコンシューマの間にセキュリティの問題がある可能性を示しています。プロデューサとコンシューマが通信するために適切なWS-Security設定が設定されていることを確認する必要があります。
ポートレット・ログ・ファイルの構成
ポートレットの問題をトラブルシューティングするには、ポートレット・ログハンドラおよびロガーを、ロギング構成ファイルlogging.xml
に追加すると便利です。
次の例は、ポートレット・ログハンドラとロガーの追加方法を示しています。この例では、コンシューマおよびプロデューサのアプリケーションが同じWebLogic Serverインスタンス上で実行されていると想定します。異なるインスタンスでコンシューマおよびプロデューサのアプリケーションを実行している場合は、それらを適切に分割する必要があります。
注意:
ファイルの終わりにログ・エントリを追加すると、シードされた設定がそれらによってオーバーライドされるようになります。
例: ポートレットの問題をトラブルシューティングするためのログ・ファイルの構成
<!-- NOTE: You need to change the path where the logfile is located --> <log_handlers> ... <!-- Portlet Consumer --> <log_handler name="portlet-consumer-handler" class="oracle.core.ojdl.logging.ODLHandlerFactory"> <property name="format" value="ODL-Text"/> <property name="path" value="/scratch/logs/portlet-consumer.log"/> </log_handler> <!-- Portlet Producer --> <log_handler name="portlet-producer-handler" class="oracle.core.ojdl.logging.ODLHandlerFactory"> <property name="format" value="ODL-Text"/> <property name="path" value="/scratch/logs/portlet-producer.log"/> </log_handler> <!-- Portlet Bridge --> <log_handler name="portlet-bridge-handler" class="oracle.core.ojdl.logging.ODLHandlerFactory"> <property name="format" value="ODL-Text"/> <property name="path" value="/scratch/logs/portlet-bridge.log"/> </log_handler> ... </log_handlers> <loggers> ... <!-- Portlet Consumer --> <logger name="oracle.portlet.client" level="FINEST" useParentHandlers="false"> <handler name="portlet-consumer-handler"/> </logger> <!-- Portlet Servers --> <logger name="com.bea.portlets" level="FINEST" useParentHandlers="false"> <handler name="portlet-producer-handler"/> </logger> <logger name="com.bea.netuix" level="FINEST" useParentHandlers="false"> <handler name="portlet-producer-handler"/> </logger> <logger name="com.bea.wsrp" level="FINEST" useParentHandlers="false"> <handler name="portlet-producer-handler"/> </logger> <logger name="oracle.portlet.producer" level="FINEST" useParentHandlers="false"> <handler name="portlet-producer-handler"/> </logger> <!-- Portlet Bridge --> <logger name="oracle.portlet.bridge" level="FINEST" useParentHandlers="false"> <handler name="portlet-bridge-handler"/> </logger> <logger name="oracle.portlet.server.bridge" level="FINEST" useParentHandlers="false"> <handler name="portlet-bridge-handler"/> </logger> ... </loggers>
ロギング構成ファイルは次の場所にあります。
DOMAIN_HOME/config/fmwconfig/servers/server/logging.xml
ログ・ファイル名も、logging.xml
で定義されます。デフォルトのログ・ファイル名は次のとおりです。
DOMAIN_HOME/servers/server/logs/server-diagnostic.log
ポートレットでのポートレット・コンシューマ・エラーの表示
メッセージ「ポートレット・コンシューマ・エラー」(図E-6に表示)は、通常、ポートレット・コンシューマ・アプリケーションのポートレット部分の操作でエラーが発生したことを示します。
問題
エラーは、ポートレット・コンシューマ・アプリケーションのポートレット部分の操作内で発生しました。つまり、エラーは、リモート・ポートレット・プロデューサ・アプリケーションには関係ありません。
解決策1
診断ログ・ファイルを調べて、例外の原因を判別します。
DebugErrorRenderer
が有効化されている場合、原因例外が、ログ・ファイルへのリンクとともにポートレット内に表示されます。本番モードで実行している場合は、コンシューマ側のログを参照してください。
エラー・メッセージが表示される原因となった例外が記録されています。可能な場合は、メッセージは、例外スタックの先頭でログに含められ、例外がどのポートレット・バインディングに対して発生したかを示します。次の例は、ポートレット・エラーに対して記録されるメッセージを示しています。
ポートレット・エラーに対して記録されるメッセージの例
<PortletRenderer> <setErrorState> An error has occured for Portlet Binding portlet1. oracle.portlet.client.container.PortletContentTypeException: Unexpected content type "null" in WSRPGetMarkup response. ...
スタック内の原因例外に特に注意してください。これが、元になっている実際の問題が何かを示している可能性があります。
原因は、内部エラーである可能性が高く、適切な対処方法は、Oracleサポートに連絡することです。
問題2
ポートレット・キューがフルのため、プールでは新しいリクエストを処理できません。これはポータルのロードが著しく重い場合に発生する可能性があります。ポートレット・キューがフルの場合、新しいポートレット・リクエストは処理されません。
これが問題の原因である場合は、診断ログに次の例で示すようなエラー・メッセージが含まれます。
ポートレット・キューがフルの際にロギングされるメッセージの例
Message oracle.portlet.client.container.PortletQueueFullException: Queue Full [cause=na submittedTasks=8,361 queuedTasks=20 queueFreeSpace=0 completedTasks=8,331 activeThreads=10 corePoolSize=10 keepAliveTime=9,223,372,036 largestPoolSize=10 maxPoolSize=10 poolSize=10 isShutdown=false isTerminated=false isTerminating=false]
解決策2
ポートレット・キュー・サイズは、adf-config.xml
内でparallelPoolSize
パラメータおよびparallelQueueSize
パラメータによって決定されます。
-
parallelPoolSize
は、タスクのパラレル実行のために使用するスレッド数を示します。デフォルト値は10
です。 -
parallelQueueSize
は、パラレル実行を待つタスクのキューのサイズを決定します。キュー・サイズに到達すると、タスクは拒否されます。デフォルト値は、20
です。
デフォルト値はほとんどのポータルに適しています。ただし、ポートレット・キューがフルになることが原因のエラーが繰り返し発生する場合、parallelQueueSize
パラメータの値を増やすことを検討する必要がある可能性があります。パフォーマンスを向上するためにも、parallelPoolSize
を増やし、オープンされるスレッド数を増やしてキューからのポートレット・リクエストを処理することも検討する必要がある可能性があります。
注意:
キューおよびプール・サイズを増やすことは慎重に、そして少しずつ行う必要があります。どちらかのパラメータの値が大きすぎると、ハードウェアのリソース使用量が増えて逆効果になる可能性がります。
ポートレットでのポートレット・タイムアウトの表示
ページのポートレットが表示されることが期待されている領域に「ポートレット・タイムアウト」が表示される場合(図E-7に示す)は、構成済の時間だけ、コンシューマはプロデューサのレスポンスを待機したが、その時間中にレスポンスがなかったか、レスポンスがその時間中に完了しなかったことを意味します。原因はいくつか考えられます。
問題1
プロデューサ・マシンがオーバーロードになっています。
解決策1
プロデューサ管理対象サーバー上の負荷を確認します(これを実行するために使用するツールは、プロデューサを実行しているオペレーティング・システムに応じて異なります)。負荷が高い場合、特定のプロセスがこの高い負荷の原因になっているかどうかと、そのようなプロセスを別のマシンで、またはビジーでない時間に実行できないか確認します。高負荷を引き起こしているプロセスがない場合、またはOracle WebLogic Serverが高負荷を引き起こしている場合で、かつ負荷が一貫して高い場合は、プロデューサ・ハードウェアが適切かどうか、またはアップグレードする(またはノードをさらにクラスタに追加する)必要があるかどうかを検討します。また、Oracle WebLogic Serverの構成を調整し、リクエスト・スレッド・プールのサイズを増やすことも検討します。詳細は、Oracle WebLogic Serverのドキュメントを参照してください。
問題2
ネットワークがオーバーロードになっている。つまり、コンシューマとプロデューサの間の通信に影響を与えているネットワークに関する問題があります。
解決策2
コンシューマ・マシンからプロデューサ・マシンにpingできることを確認します。ローカル・ブラウザでプロデューサのWSRPプロデューサ・テスト・ページにアクセスできることを確認します。これが機能する場合は、コンシューマ・マシンで実行されているブラウザからこの同じページにアクセスできることを確認します。これらのステップのいずれかで問題が発生し、なおかつマシンがオーバーロードになっていない場合は、ネットワークの問題である可能性があり、システム管理者による調査が必要です。
問題3
リクエスト・スレッドがハングする原因となっているプロデューサ・マシン上にデッドロック(またはスタック・スレッド)があります。
解決策3
これは、通常の操作中は発生しません。これが発生する場合は、通常、デッドロックが発生したポイントを示しているプロデューサのログ・ファイルにエラーがあります。これが、問題の診断に役立つ場合があります。場合によっては、Oracle WebLogic Serverの構成を変更することで、これを回避できる可能性があります。詳細は、Oracle WebLogic Serverのドキュメントを参照してください。
問題4
プロデューサ・アプリケーションの実行速度が(たとえば、大量のデータを処理しているために)遅くなっています。
解決策4
この場合、プロデューサ・アプリケーションは、大量のデータを処理しており、レスポンスの構築に時間がかかりすぎている可能性があります。そのアプリケーションで定期的に大量の情報を処理する場合は、プロデューサ・ハードウェアを追加または向上させるか、ポートレット・タイムアウト期間を増やす必要が生じることもあります。ポートレット・タイムアウトは、Enterprise ManagerまたはWLST setWSRPProducerConnection
コマンドを使用してコンシューマ・アプリケーションのプロデューサ接続で構成できます。さらに、アプリケーション内のすべてのプロデューサ接続の最小および最大のタイムアウトは、adf-config.xml
ファイルのポートレット・セクション内で構成できます。
問題5
プロデューサ・アプリケーションが、データベースなど別のリソースからのレスポンスを待機し、それに時間がかかりすぎます(たとえば、データベースがオーバーロードになっている場合)。
解決策5
問題のリソースが適切に機能していることを確認します。している場合は、解決策は解決策4と同じです。
問題6
ポートレット・タイムアウト値が、タイムアウト期間が短すぎるなど、不適切に構成されています。
解決策6
通常、ポートレットのタイムアウトは、プロデューサの登録で設定されます。これは、ポートレットがレスポンスするための時間を与えない値に設定されていることがあります。
また、adf-config.xml
ファイルのポートレット・セクションで、ポートレット・タイムアウトの最小、最大およびデフォルト値をアプリケーション全体にわたって構成できます。最大タイムアウトによって、ポートレット・プロデューサによって指定されるタイムアウトの上限が設定されるため、最大タイムアウトが短すぎると、プロデューサ接続で指定したタイムアウトが長い場合でも、予期しないポートレット・タイムアウト・エラーが発生することがあります。
ポートレットでのリモート・ポートレット通信エラーの表示
画面のセクションに「リモート・ポートレット通信エラー」メッセージが表示され(図E-8に表示)、その周りに他の空白領域がある場合、この領域にはポートレットが配置される予定でしたが、アプリケーションがこれに接続できていません。
問題1
プロデューサが停止しています。
解決策1
プロデューサ・アプリケーションが実行されていないか、それがデプロイされている管理対象サーバーが起動されていない可能性があります。この場合、起動する必要があります。ポートレット障害が発生した時点で試みていたタスクに基づいて起動する必要があるアプリケーションを特定します。
問題2
Webサービス・セキュリティが不適切に構成されています。
解決策2
Webサービス・セキュリティのトラブルシューティング・ステップは、使用しているセキュリティ・プロファイルのタイプ(たとえば、AuthN、SSLまたはMessage Security)に応じて異なります。
Webサービスのセキュリティに関するトラブルシューティングの詳細は、『Oracle Fusion Middleware Webサービスの管理』のhttps://www.oracle.com/pls/topic/lookup?ctx=en/middleware/webcenter/portal/12.2.1.4/develop&id=WSSEC1693の章を参照してください。
問題3
プロデューサ管理対象サーバーにアクセスできません。
解決策3
プロデューサは、介在するファイアウォールまたは不適切なルーティング・ルールのために、コンシューマ・アプリケーションからアクセスできない場所に配置されていることもあります。オラクル社のプロビジョニング・ソフトウェアによってインストールされた環境では、これは発生しませんが、次の場所に移動することで、コンシューマをホストしているマシンからプロデューサのWSDLエンドポイントにアクセスできることを確認してみる価値はあります。
http://host:port/context-root/portlets/wsrp2?WSDL
説明:
-
host
は、ポートレット・プロデューサがデプロイされているサーバーです -
port
は、サーバーがHTTPリクエストをリスニングするポートです -
context-root
は、プロデューサWebアプリケーションのコンテキスト・ルートです
次に例を示します。
http://portlets.example.com:9999/sample/portlets/wsrp2?WSDL
ポートレットでのリモート・ポートレット・エラーの表示
ポートレットで「リモート・ポートレット・エラー」が表示される場合、これはプロデューサがエラー・メッセージで応答したことを示しています。エラー・メッセージは、レスポンス・ドキュメント内のSOAPフォルト・メッセージの形式で返されます。プロデューサがエラーを返す理由はいくつかあります。これらのエラーを診断する最適な方法は、最初にコンシューマ診断ログ内の対応する例外スタック・トレースを見つけることです。このスタック・トレースは、プロデューサによって返されたフォルトの種類と、レスポンスに必要な詳細情報を示します。発生する可能性があるいくつかの障害は、後続の項でリストします。
問題1
OperationFailedException
。これは、最も一般的なタイプの「リモート・ポートレット・エラー」であり、プロデューサ・アプリケーション内で発生した未対応の例外に対する包括的なものです。
解決策1
OperationFailedException
を解決するには、コンシューマ診断ログで例外を調べます。これは、通常、最後のCaused by
例外としてフォルト・レスポンスをトリガーするプロデューサ・アプリケーションで発生した例外を示します。
問題2
InvalidRegistrationException
。このエラーは、コンシューマがプロデューサとの通信を試みる前に、そのプロデューサがコンシューマに適切に登録されていなかったことを示します。これは、コンシューマが登録した後に、プロデューサのプリファレンス・ストアが移動されたか削除された場合にも発生することがあります。
解決策2
最も可能性が高い原因は、プロビジョニング中の問題です。プロデューサ・アプリケーションのweb.xmlファイルの設定を調べて、例に示すエントリが存在することを確認します。
例14-11 web.xmlの永続ストア設定
<env-entry>
<env-entry-name>oracle/portal/wsrp/server/persistentStore</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>Consumer</env-entry-value>
</env-entry>
問題3
InvalidHandleException
。これは、コンシューマがプロデューサに、プロデューサが認識していないポートレット・インスタンスをレンダリングするか、それと対話するように求めたことを示しています。これは、ポートレットがそのページに追加された後に、なんらかの方法で、プロデューサのプリファレンス・ストアが壊れた場合にも発生することがあります。
解決策3
このエラーの原因として最も可能性が高いのは、プロビジョニング中の問題か、解決策2に示すようにweb.xml
ファイルのpersistentStore
設定の欠落てす。
問題4
AccessDeniedException
。これは、プロデューサ・アプリケーションによって、現在のユーザーが、問題のポートレットまたはタスク・フローへのアクセス権を持っていないと判断されたことを示します。
解決策4
これは、正当なエラー・メッセージであるか構成の問題を示しているかのいずれかの可能性があります。多くの場合、WebCenter Portalでは、ポートレット・リモート・エラーが表示されることなく、認可エラーは正常に処理されます。