86
PDK-Java による Web ポートレット 開発ガイド Creation Date: Apr. 19, 2001 Last Update: Nov. 16, 2001 Version: 1.1

PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

PDK-Java によるWeb ポートレット 開発ガイド

Creation Date: Apr. 19, 2001Last Update: Nov. 16, 2001Version: 1.1

Page 2: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

4

Agenda

Oracle9iAS Portal とポートレットOracle9iAS Portal アーキテクチャWeb ポートレットと PDK-JavaPDK-Java アーキテクチャWeb ポートレットの実装例キャッシュの利用

スケーラブルな構成

Page 3: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

5

Oracle9iAS Portal

1つのポータル・ページから、イントラネット/インターネット上の様々なアプリケーションや

サービスにアクセス

EIP (Enterprise Information Portal) を簡単に構築可能

Oracle9iASの1コンポーネント

Page 4: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

6

WebDB から Oracle9iAS Portal へ

機能WebDB

R2.x

セルフ・サービスパブリッシング

WebDB サイト

DBアプリケーションの構築

コンポーネント

PortalR3.x

コンテンツ領域

アプリケーション

パーソナライズされたポータル

NewN/A

Page 5: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

7

ポートレット

ポータル・ページを構成するコンポーネント– Web サイト / Webアプリケーションへのアクセスの一元化

– コンテンツのパブリッシング

– 動的データ・サービスの統合

ポートレットの2つのタイプ– 組込みポートレット

– カスタム・ポートレット

Page 6: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

8

ポートレット・プロバイダ

1つ以上のポートレットを管理するコンテナプロバイダを Portal に登録すると、ポートレットが利用可能に

Portal は、プロバイダを介してポートレットと通信

プロバイダ

ポートレット

ポートレット

Oracle9iASPortal

Page 7: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

9

組込みポートレット (1)

Portal アプリケーション・ポートレット– フォーム、レポート、チャートなどの Portal アプリケーションを、ポートレットとして公開可能

Page 8: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

10

組込みポートレット (2)

Portal コンテンツ領域ポートレット– コンテンツ領域のフォルダに含まれるコンテンツやリンクを、ポートレットとして公開可能

Page 9: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

11

カスタム・ポートレット

データベース・ポートレット

– ストアド・プロシージャとして実装

– PL/SQL (または Java)– Portal ノード (DB) 上で動作

Web ポートレット– SOAP / HTTP を用いて Portal と通信– 任意のノードで動作させることが可能

– 任意の言語で実装できる

– PDK-Java を利用すれば、実装が簡単

Page 10: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

12

ポートレットのモード (1)

表示モード (共有スクリーン・モード)– Portal ページの一部として表示されるコンテンツ詳細モード (全画面モード)– ポートレットのタイトルのリンクからアクセス

ヘルプ・モード

– 「ヘルプ」リンク

情報モード– 「情報」リンク

詳細モード ヘルプ・モード 情報モード編集モード

Page 11: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

13

ポートレットのモード (2)

編集モード

– 「カスタマイズ」リンク

デフォルト編集モード– 「ページのカスタマイズ」 → 「デフォルトの編集」

– ページ管理者のみアクセス可能

Page 12: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

14

ポートレットのモード (3)

プレビュー・モード

– 「ポートレットの追加」ダイアログで表示される

– ページ編集権限を持つユーザのみアクセス可能

Page 13: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

15

Agenda

Oracle9iAS Portal とポートレットOracle9iAS Portal アーキテクチャWeb ポートレットと PDK-JavaPDK-Java アーキテクチャWeb ポートレットの実装例キャッシュの利用

スケーラブルな構成

Page 14: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

16

Oracle9iAS Portal アーキテクチャ

HTTP Net8ModPL/SQL

ModJserv

ParallelPage

Engine(s)

OracleHTTPServer

ModPL/SQL

ModJserv

ParallelPage

Engine(s)

OracleHTTPServer

Oracle H

TTP Server

mod_plsql

mod_ jserv

ParallelPage

Engine

Portal リポジトリ

Portal ノード

組込みプロバイダ

DBLink

Oracle DB

HTTP

Web サイト/ サービス

LoginServer OID

LDAPV3

Net8

PortalCache

HTTP

HTTPSOAP XML

データ・ソース

HTTP

カスタムWeb プロバイダ

カスタム DB プロバイダブラウザ

Web サイト/ サービス 任意の

プロトコル

Page 15: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

17

Portal ノード

Oracle8i DatabasePortal の PL/SQL パッケージおよびデータ

Portalリポジトリ (次ページ参照)組込み / DB ポートレットのストアド・プロシージャ

分散構成をとることも可能– 複数の Portal ノードで、負荷を分散

Portal リポジトリ

Portal ノード

組込みプロバイダ

カスタム DB プロバイダ

Page 16: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

18

Portal リポジトリ

メタ・データ、ユーザ・データ、関連プロシージャを格納– Portal ページ、スタイルの定義– パーソナライズ・データ

– コンテンツ領域、Portal アプリケーションの定義

– アクセス・コントロール

– Portal へのアクセス・ログ– …

Portal リポジトリ

Portal ノード

組込みプロバイダ

カスタム DB プロバイダ

Page 17: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

19

Portal Middle Tier

Oracle9i Application Server次のコンポーネントを利用– Oracle HTTP Server

mod_plsqlmod_jserv

– Apache JServParallel Page Engine

– Portal Cache(PL/SQLキャッシュ)

– Oracle9iAS Single Sign-On

Oracle H

TTP Server

mod_plsql

mod_ jserv

ParallelPage

Engine

PortalCache

Page 18: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

20

Parallel Page Engine

ステートレス ServletApache JServ 上で動作複数のポートレットとの通信を、並行して行う– Portal ノードの負荷を軽減

容易に、スケール・アウトが可能– 複数の Oracle9iAS ノード

Oracle H

TTP Server

mod_plsql

mod_ jserv

ParallelPage

Engine

PortalCache

Page 19: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

21

リクエスト・フロー

HTTPNet8

ModPL/SQL

ModJserv

ParallelPage

Engine(s)

OracleHTTPServer

ModPL/SQL

ModJserv

ParallelPage

Engine(s)

OracleHTTPServer

Oracle H

TTP Server

mod_plsql

mod_ jserv

ParallelPage

Engine

Portal リポジトリ

Portal ノード

組込みプロバイダ

DBLink

Oracle DB

HTTP

Web サイト/ サービス

LoginServer OID

LDAPV3

Net8

PortalCache

HTTP

HTTPSOAP XML

データ・ソース

HTTP

カスタムWeb プロバイダ

カスタム DB プロバイダブラウザ

Web サイト/ サービス 任意の

プロトコル

12

4 3

33

Page 20: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

22

リクエスト・フロー

1. ブラウザからのページ・リクエストを受信2. Portal リポジトリから、ページ定義を取得

– ページに含まれるポートレットの情報

– ページのレイアウト (HTML スケルトン)– 有効なキャッシュがある場合は、それを利用

3. すべてのポートレットに、並行してリクエスト– DB ポートレットは、PL/SQLプロシージャ・コール

(mod_plsql を経由する HTTP リクエスト)– Web ポートレットは、リモートのWeb サーバへの

HTTP リクエスト (PDK-Javaでは Servlet をコール)– 有効なキャッシュがある場合は、それを利用

Page 21: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

23

リクエスト・フロー

4. Portal ページ (HTML) の生成– ページ・レイアウトに、各ポートレットのコンテンツを組み込む

5. ブラウザに、ページを送信

Page 22: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

24

Portal Cache

ファイル・ベースのキャッシュ– mod_plsql の PL/SQL キャッシュ– Web Cache、Database Cache とは別のレベルのキャッシュ機能

キャッシュの対象

– ページ定義

– ポートレット・コンテンツ

– Portal ページ

Oracle H

TTP Server

mod_plsql

mod_ jserv

ParallelPage

Engine

PortalCache

Page 23: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

25

Portal Cache

キャッシュ・エントリの失効化

– 妥当性ベース

バージョン ID を用いて、キャッシュが有効かどうか、毎回確認

"ETag" HTTP ヘッダを利用– 期限ベース

有効期限内は、無条件で使用

"Expires" HTTP ヘッダを利用

Oracle H

TTP Server

mod_plsql

mod_ jserv

ParallelPage

Engine

PortalCache

Page 24: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

26

Portal Cache

キャッシュ・レベル

– システム・レベル

キャッシュ・エントリを、全ユーザで共有

– ユーザ・レベル

ユーザごとに、個別のキャッシュ・エントリ

Oracle H

TTP Server

mod_plsql

mod_ jserv

ParallelPage

Engine

PortalCache

Page 25: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

27

Oracle9iAS Single Sign-On(Login Server)

Oracle9iAS のコンポーネントCookie を利用して、Web シングル・サインオンを実現

次のコンポーネントからなる– Oracle8i Database

PL/SQLパッケージおよびデータ (表)ユーザ名/パスワードを格納

– Oracle9iASmod_plsql

LoginServer OID

LDAPV3

Page 26: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

28

Oracle9iAS Single Sign-On(Login Server) –対象アプリケーションパートナ・アプリケーション– Login Serverの認証機能を利用して、認証を行う– SSO SDK を利用して開発– Portal も 1 パートナ・アプリケーション外部アプリケーション– 独自の認証機能を持つ (既存のWeb アプリケーションなど)

– Login Server 側に、外部アプリケーションのユーザ名/ パスワードを格納

– HTML フォームでログインするアプリケーションをサポート (BASIC 認証もサポート予定)

Page 27: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

29

Oracle9iAS Single Sign-On(Login Server)

LDAP サーバ Oracle Internet Directory (OID) との連携が可能– LDAPエントリのユーザ名/パスワードを利用

他のユーザ・リポジトリやSSO サーバとも連携可能

– 連携モジュールを作成

LoginServer OID

LDAPV3

Page 28: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

30

Agenda

Oracle9iAS Portal とポートレットOracle9iAS Portal アーキテクチャWeb ポートレットと PDK-JavaPDK-Java アーキテクチャWeb ポートレットの実装例キャッシュの利用

スケーラブルな構成

Page 29: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

31

Web ポートレットの実装方法

すべて独自に実装– Web対応の任意の言語で実装が可能

Perl、C、ASP …– 実装が難しい

PDK-Java (PDK Services for Java)– Javaによる実装– PDK-Java APIが、Portalとの通信を抽象化– Portal フレームワーク・サービスを利用可能

NLS、パーソナライズ、セッション・ストレージ、セッション・コンテキスト、セキュリティ、ロギング…

Page 30: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

32

Oracle Portal Development Kit (PDK)

ポートレット開発に役立つリソースを提供

ドキュメント、APIドキュメント、サンプル…– DB ポートレット (PL/SQL)– Web ポートレット (Java)

OTN、OTN-J で公開– http://otn.oracle.com/products/iportal/– http://portalstudio.oracle.com/– http://otn.oracle.co.jp/software/app_server/portal/p

ortal.html注) 日本オラクルがサポートするPDKは、OTN-Jで公開しているもののみ

Page 31: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

33

Page 32: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

34

PDK Services for Java (PDK-Java)

Java によるWeb ポートレット開発に利用ドキュメント、JavaDoc、サンプルコード…provider.jar ファイル– Java インタフェース– デフォルト実装クラス

– 関連クラス

Page 33: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

35

PDK-Java インストール

Portal が動作している 9iAS 以外のノードでも可Oracle JSP、Oracle XML Parser の設定を確認

– wrapper.classpath=<9iAS_Home>/xdk/lib/xmlparserv2.jar– wrapper.classpath=<9iAS_Home>/jsp/lib/ojsp.jar

jserv.properties に次のエントリを追加– wrapper.classpath=<PDK-Java_Home>/lib/provider.jar

(サンプルのWeb ポートレットをインストール)(Portal ページにポートレットを配置し、動作を確認)

Page 34: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

36

Agenda

Oracle9iAS Portal とポートレットOracle9iAS Portal アーキテクチャWeb ポートレットと PDK-JavaPDK-Java アーキテクチャWeb ポートレットの実装例キャッシュの利用

スケーラブルな構成

Page 35: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

37

PDK-Java アーキテクチャ

Portal からのリクエスト

Provider Adaptor

Provider

Portlet

Renderer Personalization Security

<provider><portlet>…</portlet><portlet>…</portlet></provider>

provider.xml

Page 36: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

38

Web プロバイダ・アダプタ

oracle.portal.provider.v1.http.HttpProviderServlet として動作PDK-Java で作成されたWeb プロバイダへのエントリ・ポイント

Portal とWeb プロバイダの間の通信を仲介Web プロバイダごとに、1つの Servlet インスタンス

Page 37: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

39

PDK-Java アーキテクチャ

Portal からのリクエスト

Provider Adaptor

Provider

Portlet

Renderer Personalization Security

<provider><portlet>…</portlet><portlet>…</portlet></provider>

provider.xml

Page 38: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

40

Web プロバイダ・インタフェース

5つの Java インタフェース– Provider– Portlet– PortletRenderer– PortletPersonalizationManager– PortletSecurityManager

Web プロバイダが Portal と正しく通信するために必要なメソッドを定義

開発者は、このインタフェースを実装したクラスを作成すればよい

Page 39: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

41

Web プロバイダ・ランタイム

Web プロバイダ・インタフェースのベース実装クラス

provider.xml ファイルに記述された、ポートレットの構成情報を利用 (宣言的)ベース実装クラスをそのまま利用可能

サブクラスの作成により、機能拡張も可能

Page 40: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

42

PDK-Java アーキテクチャ

Portal からのリクエスト

Provider Adaptor

DefaultProvider

DefaultPortlet

RenderManager

FilePersonalization

Manager

DefaultSecurityManager

<provider><portlet>…</portlet><portlet>…</portlet></provider>

provider.xml

Page 41: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

43

Provider インタフェース

oracle.portal.provider.v1.Provider1つ以上のポートレットを管理するプロバイダ次のメソッドを定義– register()、deregister()

プロバイダのPortalへの登録/削除時に実行– getPortlet()、getPortlets()

管理するポートレットを返す

– initSession()Portal とWeb プロバイダ間のセッション確立時に実行

– …

Page 42: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

44

DefaultProvider クラス

oracle.portal.provider.v1.http.DefaultProviderProvider インタフェースのベース実装クラスprovider.xml ファイルに、管理するポートレットの情報を指定

<provider class="oracle.portal.provider.v1.http.DefaultProvider"><portlet class="className"> ... </portlet>...<portlet class="className"> ... </portlet>

</provider>

Page 43: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

45

PDK-Java アーキテクチャ

Portal からのリクエスト

Provider Adaptor

DefaultProvider

DefaultPortlet

RenderManager

FilePersonalization

Manager

DefaultSecurityManager

<provider><portlet>…</portlet><portlet>…</portlet></provider>

provider.xml

Page 44: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

46

Portlet インタフェース

oracle.portal.provider.v1.Portlet単一のサービスを提供するポートレット

プロバイダを介して、Portal に公開されるポートレットの静的なメタデータを保持– getId()、getTitle()、getTimeout() …

3つのコントローラのコンテナ– getRenderer()– getPersonalizationManager()– getSecurityManager()

Page 45: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

47

DefaultPortlet クラス

oracle.portal.provider.v1.http.DefaultPortlet Portlet インタフェースのベース実装クラスprovider.xml に、ポートレットの構成情報を指定

<portlet class="oracle.portal.provider.v1.http.DefaultPortlet"><id>1</id><name>PortletName</name><title>Portlet Title</title>

<renderer class="className"> ... </renderer><personalizationManager class="className">

... </personalizationManager ><securityManager class="className"> ... </securityManager>

</portlet>

Page 46: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

48

PDK-Java アーキテクチャ

Portal からのリクエスト

Provider Adaptor

DefaultProvider

DefaultPortlet

RenderManager

FilePersonalization

Manager

DefaultSecurityManager

<provider><portlet>…</portlet><portlet>…</portlet></provider>

provider.xml

Page 47: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

49

PortletRenderer インタフェース

oracle.portal.provider.v1.PortletRendererポートレットのすべてのモードの描画を担当するコントローラ

3つのコントローラのうち、これだけが必須render() メソッドのみを定義

Page 48: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

50

RenderManager クラス

oracle.portal.provider.v1.RenderManagerPortletRenderer インタフェースのベース実装クラス

各モードごとに 、コンテンツを生成するManagedRenderer をプラグイン可能

<renderer class="oracle.portal.provider.v1.RenderManager"><showPage class="oracle.portal.provider.v1.http.JspRenderer">

<name>hello.jsp</name><appPath>/hello</appPath><appRoot>/htdocs/hello</appRoot>

</showPage><editPage> ... </editPage>...

</renderer>

Page 49: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

51

ManagedRenderer インタフェース

oracle.portal.provider.v1.ManagedRendererRenderManager にプラグインして利用個別のモードの描画を担当

次のメソッドを定義– prepareResponse()

キャッシュ・エントリが有効かどうか、判断

– renderBody()ポートレット・コンテンツの描画

– …

Page 50: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

52

XXXRenderer クラス

oracle.portal.provider.v1.XXXRendererManagedRenderer インタフェースのベース実装クラス

5つの実装クラス– FileRenderer 静的 HTML– JspRenderer JSP ページ– Servlet20Renderer Servlet クラス– JavaRenderer Java クラスのメソッド– JspValidateRenderer 妥当性ベースのキャッシュを

利用する JSP ページ

Page 51: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

53

PDK-Java アーキテクチャ

Portal からのリクエスト

Provider Adaptor

DefaultProvider

DefaultPortlet

RenderManager

FilePersonalization

Manager

DefaultSecurityManager

<provider><portlet>…</portlet><portlet>…</portlet></provider>

provider.xml

Page 52: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

54

PortletPersonalizationManager インタフェース

oracle.portal.provider.v1.PortletPersonalizationManager

ポートレットのパーソナライズ (カスタマイズ) を管理するコントローラ

次のメソッドを定義– create()、destroy()

カスタマイズ・データの作成 / 削除– read()、write()

カスタマイズ・データの読取り / 書込み– …

Page 53: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

55

FilePersonalizationManager クラス /DBPersonalizationManager2 クラス

oracle.portal.provider.v1.XXPersonalizationManagerPortletPersonalizationManager インタフェースのベース実装

パーソナライズ・データをファイル / DB に格納データを格納するオブジェクト・クラスも指定– PersonalizationObject インタフェースの実装クラス

<personalizationManagerclass="oracle.portal.provider.v1.FilePersonalizationManager"><dataClass>

oracle.portal.provider.v1.NameValuePersonalizationObject</dataClass>

</personalizationManager>

Page 54: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

56

PDK-Java アーキテクチャ

Portal からのリクエスト

Provider Adaptor

DefaultProvider

DefaultPortlet

RenderManager

FilePersonalization

Manager

DefaultSecurityManager

<provider><portlet>…</portlet><portlet>…</portlet></provider>

provider.xml

Page 55: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

57

PortletSecurityManager インタフェース

oracle.portal.provider.v1.PortletSecurityManagerポートレットへのアクセス・コントロールを担当するコントローラ

hasAccess() メソッドのみを定義– ポートレットへのアクセスの可否を返す

Page 56: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

58

DefaultSecurityManager クラス

oracle.portal.provider.v1.DefaultSecurityManagerPortletSecurityManager インタフェースのベース実装クラス

Portal ユーザの認証レベル (ログインしているかどうか) ベースのアクセス・コントロール

<securityManagerclass="oracle.portal.provider.v1.DefaultSecurityManager">

</securityManager>

Page 57: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

59

Agenda

Oracle9iAS Portal とポートレットOracle9iAS Portal アーキテクチャWeb ポートレットと PDK-JavaPDK-Java アーキテクチャWeb ポートレットの実装例キャッシュの利用

スケーラブルな構成

Page 58: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

60

Web ポートレット 実装例 (1)

PortletRenderer インタフェースを、独自に実装ベース実装クラス FilePersonalizationManager を利用

PortletSecurityManager インタフェースは、使用しない

DefaultProvider

DefaultPortlet

CustomRenderer

FilePersonalization

Manager

Page 59: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

61

provider.xml の設定

<provider class="oracle.portal.provider.v1.http.DefaultProvider"><portlet class="oracle.portal.provider.v1.http.DefaultPortlet"><id>1</id><name>SampleRenderer</name><title>SampleRenderer example</title><description>Rendererを実装するサンプルWebポートレット</description><showEdit>true</showEdit><showEditDefault>true</showEditDefault><showPreview>true</showPreview><showDetails>true</showDetails><hasHelp>true</hasHelp><hasAbout>true</hasAbout><renderer class="yourpackege.SampleRenderer" /><personalizationManager class="oracle.portal.provider.v1.FilePersonalizationManager" ><dataClass>oracle.portal.provider.v1.NameValuePersonalizationObject</dataClass>

</personalizationManager></portlet></provider>

Page 60: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

62

Render() メソッドの実装 (1)

PortletRenderer インタフェースの唯一のメソッドrender() を実装通常は、モードごとに個別のメソッドを定義し、個別のメソッド内でコンテンツを生成

Page 61: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

63

Render() メソッドの実装 (2)

public void render(PortletRenderRequest pr)throws PortletException, AccessControlException {//...switch ( pr.getMode() ) {case PortletRenderer.MODE_SHOW:renderShow(pr); break;case PortletRenderer.MODE_ABOUT:renderAbout(pr); break;case PortletRenderer.MODE_HELP:renderHelp(pr); break;

//...default:

throw new PortletException("Not supported");} // end of switch//...}

Page 62: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

64

各モードの実装

すべてのモードを実装する必要はない

必要なモードのみを実装

public void renderShow(PortletRenderRequest pr)throws IOException {PrintWriter out = pr.getWriter();out.println("<b>表示</b>モードです");}

public void renderAbout(PortletRenderRequest pr)throws IOException {PrintWriter out = pr.getWriter();out.println("<b>情報</b>モードです");}

Page 63: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

65

編集モードの実装 (1)

パーソナライズを可能にする場合に実装

パーソナライズ・データを扱うロジックが必要

– パーソナライズ・データを表示

– 「OK / Apply」ボタンが押されたときに、データを保存

Page 64: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

66

編集モードの実装 (2)

public void renderEdit(PortletRenderRequest pr)throws IOException, AccessControlException {PrintWriter out = pr.getWriter();//...NameValuePersonalizationObject data =(NameValuePersonalizationObject)PortletRendererUtil.getEditData(pr);

out.println("<p><table border=¥"0¥" cellspacing=¥"0¥">");out.println("<tr><td>Title:</td><td>");out.println("<input type=¥"text¥" size=¥"40¥" " +

"maxlength=¥"60¥" " + "name=¥"dr_title¥"" +" value=¥"" + data.getPortletTitle() + "¥" />");

out.println("</td></tr></table></p>");}

Page 65: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

67

編集モードの実装 (3)

protected void handleEditData(PortletRenderRequest pr)throws IOException, AccessControlException,

PortletException {String actionParam = retrieveActionParam(pr);String action = pr.getParameter(actionParam);

NameValuePersonalizationObject data =(NameValuePersonalizationObject)PortletRendererUtil.getEditData(pr);

data.setPortletTitle(pr.getParameter("dr_title“));PortletRendererUtil.submitEditData(pr, data);//...}

Page 66: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

68

Web ポートレット 実装例 (2)

デフォルトの RenderManager クラスを利用ポートレットの各モードのコンテンツは、JSP、HTML、Servlet、またはJavaクラスのメソッドで記述

DefaultProvider

DefaultPortlet

RenderManager

JSP HTML

Servlet Javaクラス

Page 67: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

69

provider.xml の設定

<provider class="oracle.portal.provider.v1.http.DefaultProvider"><portlet class="oracle.portal.provider.v1.http.DefaultPortlet"><id>2</id><name>SampleRenderManager</name><title> Sample RenderManager</title><description>RenderManagerを利用するサンプルWebポートレット</description><hasHelp>true</hasHelp><renderer class="oracle.portal.provider.v1.RenderManager" ><appPath>&virtualRoot;sample</appPath><appRoot>&physicalRoot;sample</appRoot><charSet>Shift_JIS</charSet><showPage>sample_show.jsp</showPage><helpPage>sample_help.html</helpPage><renderContainer>true</renderContainer>

</renderer></portlet></provider>

Page 68: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

70

各モードの実装

モードごとに、JSP、HTML、Servlet、またはJavaクラスのメソッドを使って、コンテンツを生成

<%@ page import = "oracle.portal.provider.v1.*,oracle.portal.provider.v1.http.*"

contentType="text/html; charset=Shift_JIS"%><%PortletRenderRequest pr = (PortletRenderRequest)request.getAttribute(HttpProvider.PORTLET_RENDER_REQUEST);

%><p>こんにちは、<%= pr.getUser().getName() %> さん</p>

Page 69: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

71

Web ポートレットの利点

Java による、オブジェクト指向 / コンポーネント指向の開発が可能

既存のプレゼンテーション・ロジックの再利用が可能– RenderManager クラスの利用

Java からアクセスできる、さまざまなリソースをポートレットにすることが可能

Web ポートレットは、スケール・アウトが容易

Page 70: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

72

Web ポートレット vs DB ポートレット

利用可能な Portal フレームワーク・サービスは、ほぼ同等– パーソナライズ、セッション・ストレージ、キャッシュ…

DB ポートレットを使うべきケース– データ集中型の処理が必要

Web ポートレットを使うべきケース– ネットワークベースのサービスを統合

– Java の柔軟性、拡張性を活用– ファイア・ウォールが存在する場合

Page 71: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

73

Agenda

Oracle9iAS Portal とポートレットOracle9iAS Portal アーキテクチャWeb ポートレットと PDK-JavaPDK-Java アーキテクチャWeb ポートレットの実装例キャッシュの利用

スケーラブルな構成

Page 72: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

74

パフォーマンス & スケーラビリティ

Oracle9iAS Portal は、負荷の高い処理が多い– 複数のポートレットへのリクエスト

– Portal ページの生成– …高いパフォーマンスを維持するためには…– Portal Cache の利用– 各ノードのスケール・アップ / スケール・アウト

Portal Middle Tier (Oracle9iAS)Portal ノード (Oracle8i Database)Web ポートレットが動作するノード (Oracle9iAS)

Page 73: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

75

キャッシュの利用 -宣言的方法

provider.xml で指定個別のモードごとに、<pageExpires> タグで有効期限 (分) を指定ベース実装クラス RenderManager /ManagedRenderer (または、そのサブクラス) を利用している場合のみ

期限ベースのキャッシュのみ

Page 74: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

76

期限ベースのキャッシュ - provider.xml<provider class="oracle.portal.provider.v1.http.DefaultProvider"><portlet class="oracle.portal.provider.v1.http.DefaultPortlet"><id>1</id><name>ExpiresSample</name><title>Expires Sample</title>

<renderer class="oracle.portal.provider.v1.RenderManager"><appPath>&virtualRoot;cache</appPath><appRoot>&physicalRoot;cache</appRoot><renderContainer>true</renderContainer><contentType>text/html</contentType><showPage class="oracle.portal.provider.v1.http.JspRenderer"><name>time.jsp</name><pageExpires>1</pageExpires></showPage>

</renderer></portlet></provider>

Page 75: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

77

キャッシュの利用 – プログラム的方法

JspValidateRenderer クラスを利用次の2つのメソッドを実装したサブクラスを作成– isValid()

リクエストのキャッシュのバージョンIDが有効かどうか– getNewVersion()

最新のコンテンツのバージョンIDを返す

ベース実装クラス RenderManager を利用している場合のみ

妥当性ベースのキャッシュのみ

Page 76: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

78

妥当性ベースのキャッシュ- JspValidateRenderer

public class SampleValidateRendererextends JspValidateRenderer {

protected SimpleDateFormat mFormatter= new SimpleDateFormat("mm");

public String getNewVersion(PortletRenderRequest prr) {Date t = new Date(System.currentTimeMillis());return mFormatter.format(t);}

public boolean isValid(PortletRenderRequest prr,String oldVersion) {

return getNewVersion(pr).equals(oldVersion);}}

Page 77: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

79

キャッシュの利用 – プログラム的方法

前述の方法が使えない場合は、ユーティリティ・メソッドを利用して、キャッシュ機能を実装– oracle.portal.provider.v1.http.

HttpPortletRendererUtil クラス

期限ベースのキャッシュ– setCacheExpires()

有効期限、キャッシュ・レベルを設定

Page 78: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

80

キャッシュの利用 – プログラム的方法

妥当性ベースのキャッシュ– getCachedVersion()

リクエストのキャッシュのバージョンIDを取得– getCachedLevel()

リクエストのキャッシュ・レベル (システム / ユーザ) を取得

– setCachedVersion()レスポンスのバージョンID、キャッシュ・レベルを設定

– useCachedVersion()Portal に、キャッシュ・エントリを使用することを指示

Page 79: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

81

妥当性ベースのキャッシュ –処理フロー

(1) Portalからのリクエストの、バージョンID、キャッシュ・レベルを取得

(2) (取得したキャッシュ・レベルの) 最新のコンテンツのバージョンIDと比較

(3-a) バージョンIDが同じ場合 :Portal にキャッシュ・エントリの使用を指示

(3-b) バージョンIDが異なる場合 :バージョンID、キャッシュ・レベルを設定してからコンテンツを生成

Page 80: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

82

Agenda

Oracle9iAS Portal とポートレットOracle9iAS Portal アーキテクチャWeb ポートレットと PDK-JavaPDK-Java アーキテクチャWeb ポートレットの実装例キャッシュの利用

スケーラブルな構成

Page 81: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

83

Portal Middle Tier のスケール・アウト

中間層のスケール・アウトにより、ステートレスServlet であるParallel Page Engine の負荷を分散– 複数の Oracle HTTP Server (OHS) プロセス– 複数の JServ インスタンス

OHS のロード・バランシング– ハードウェア・ロード・バランサ– ラウンド・ロビン DNS– Oracle9iAS Web Cache

JServ のロード・バランシング– mod_jserv

Page 82: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

84

Portal Middle Tier のスケール・アウト

HTTP

OracleHTTPServer

ブラウザ mod_jserv

ParallelPage

Engine

mod_jserv

ParallelPage

Engine

mod_jserv

ParallelPage

Engine

mod_jserv

ParallelPage

Engine

ロード・バランサ /RRDNS /

Web Cache

OracleHTTPServer

HTTP

AJP

Page 83: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

85

Portal ノードのスケール・アウト

Portalの分散構成– 相互にデータベース・リンクされている、複数のPortalノード

Portalノード 間で負荷を分散– Portal リポジトリ– DB ポートレット– コンテンツ領域

– …

Page 84: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

86

Oracle9iAS Portal アーキテクチャ

HTTP

Net8ModPL/SQL

ModJserv

ParallelPage

Engine(s)

OracleHTTPServer

ModPL/SQL

ModJserv

ParallelPage

Engine(s)

OracleHTTPServer

Oracle H

TTP Server

mod_plsql

mod_ jserv

ParallelPage

Engineブラウザ

DBLinkPortal リポジトリ

Portal ノード

組込みプロバイダ

カスタム DB プロバイダ

Portal ノード

Portal ノード

Page 85: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

87

Oracle.com Online Services

Oracle9iAS Portal を利用したサービスMy Oracle– http://my.oracle.com/– 個人向けのポータル・サービス

Oracle Portal Online– http://portal.oracle.com/– Oracle9iAS Portal のホスティング・サービス

Portal Community– http://portalstudio.oracle.com/– ポートレット開発者向けのポータル・サイト– PDK も公開

Page 86: PDK-Java による Web ポートレット開発ガイドotndnld.oracle.co.jp/products/portal/pdf/30/jpdk_dev...PDK Services for Java (PDK-Java) yJava によるWeb ポートレット開発に利用

88

my.oracle.com