このレッスンでは、2種類のポートレットの構築方法を学習します。Oracle JDeveloperのウィザードを使用して構築する規格に基づいたJSR 168 Javaポートレットと、実行時に段階的なウィザードを使用して構築するOmniPortletです。
ポートレットの作成後、それらをページに追加し、2つのポートレットを接続します。このレッスンの終わりまでに、規格に基づいたJSR 168 JavaポートレットとPDK-Javaポートレット(OmniPortlet)の構築とテストに必要なものをうまく処理できるようになります。2つのポートレットをワイヤリングすることもできます。その結果、一方のポートレットのリンクをクリックすると、もう一方のポートレットのコンテンツが動的に更新されます。
図5-1は、このレッスンの最後にページがどのように表示されるかを示しています。
このレッスンの手順は次のとおりです。
これらのポートレットはどちらも、第2章「チュートリアルの準備」でインストールしたチュートリアル・スキーマを使用します。また、データベース接続を必要とします。データベース接続は、第4章「アプリケーションへのWebCenter Web 2.0サービスの追加」でタグ・サービスに追加したときに作成しました。第4章の手順を完了していない場合は、ポートレットを構築する前に第4章の「手順5: タグ・サービス用のWebCenterスキーマへのデータベース接続の作成」の手順に従う必要があります。
Oracle WebCenter Frameworkを使用すれば、現在作成しているようなポータルまたはアプリケーションで使用できる規格に基づいたポートレットを迅速かつ簡単に構築できます。
注意: このポートレットを構築する手順は、使用している命名規則に依存するため、注意深く手順に従ってください。指定した名前を使用しないと、同じ結果にならない可能性があります。 |
この手順では、「ポートレット・プロデューサ」テンプレートに基づくアプリケーションを作成してから、規格に基づいたポートレットを構築します。その後、そのポートレットをチュートリアル・アプリケーションで消費します。図5-2は、MyTutorialApplication
での実行時のポートレットを示しています。
Oracle JDeveloperで、「ポートレット・プロデューサ・アプリケーション」テンプレート(図5-3)に基づいて新規アプリケーションを作成し、「OK」をクリックします。これには、「ファイル」→「新規」を選択し、新規ギャラリで「アプリケーション」→「ポートレット・プロデューサ・アプリケーション」を選択します。
ポートレット・プロデューサ・アプリケーションの作成ウィザードの「アプリケーション名」フィールドに、MyTutorialPortlet
と入力します。
デフォルトでは、「ディレクトリ」フィールドには、アプリケーションを置くディレクトリが表示されます(図5-4)。ディレクトリの場所は希望の場所に変更できますが、このチュートリアルではそのままにしてください。
「次へ」をクリックします。
ウィザードの「プロジェクト名」ページ(図5-5)で、デフォルト名の「Portlets」
をそのままにし、「次へ」をクリックします。
ウィザードの最後のページでは、Java設定を構成できます。ポートレット・プロデューサ・アプリケーションに含まれているデフォルト・パッケージは「portlet」
です(図5-6)。このチュートリアルでは、デフォルトのオプションをそのままにして、「終了」をクリックします。
アプリケーション・ナビゲータで、新しい「MyTutorialPortlet」
アプリケーションの下の「ポートレット」を右クリックし、「新規」を選択します(図5-7)。
「現在のプロジェクト・テクノロジ」タブをクリックします。
図5-8に示すように、「カテゴリ」リストで、「Web層」カテゴリを開き、「ポートレット」をクリックします。
作成できるポートレットは、次の2種類です。
Oracle PDK-Javaポートレット。PDK-Javaポートレットは、WebCenterアプリケーション、Oracle Portal、またはその他何種類かのOracle固有のソリューションで消費できます。Oracle PDK-Javaポートレットは、PDKにより提供されるAPIを使用して構築します。「手順7: 事前構成済ポートレット・プロデューサの登録」で登録するOmniPortletプロデューサは、Oracle PDK-Javaポートレットの1種です。
規格に基づいたJSR 168 Javaポートレット。Javaポートレットは、ポートレット規格をサポートするあらゆるベンダーのポータルで消費できます。このチュートリアルでは、規格に基づいたJSR 168 Javaポートレットを構築します。
「規格に基づいたJavaポートレット(JSR 168)」を選択し、「OK」をクリックします。
JSR 168 Javaポートレット・ウィザードが表示されます。ここではポートレット用のスケルトンを生成します。後から独自のロジックをポートレットに追加します。どのように行われるかを見てみましょう。
「一般ポートレット情報」ページの「名前」フィールドと「クラス」フィールドに、Products
と入力します。
注意: このポートレットを構築する手順は、使用している命名規則に依存するため、注意深く手順に従ってください。指定した名前を使用しないと、同じ結果にならない可能性があります。 |
「Oracle WSRP V2拡張機能を使用してポートレット間通信を可能にします」を選択します。このオプションを選択することにより、ポートレットでOracle WSRP 2.0拡張機能がサポートされるようになり、WSRP 2.0機能(ナビゲーション・パラメータなど)のために使用されるoracle-portlet.xml
ファイルが生成されます。これらのパラメータは後から、OmniPortletとこのポートレットが相互に通信できるようにするときに必要になります。図5-9は、「一般ポートレット情報」ページがこの時点でどのように表示されるかを示しています。
「次へ」をクリックします。
「追加ポートレット情報」ページは、デフォルト値のままでかまいません。あるいは、データベースの製品についていくつかの詳細を表示することがわかっているので、ポートレットを使用する人にポートレットに含まれているものがわかるように、表示名を変更することもできます。表5-1に従って、このページ上のフィールドを更新します。図5-10は、更新した結果の「追加ポートレット情報」ページを示しています。
表5-1 名前と属性の値
プロパティ | 値 |
---|---|
表示名 |
JDeveloperのコンポーネント・パレットに表示される名前。クラス名としてProductsを入力したため、このフィールドには自動的にその名前が移入されています。 |
ポートレット・タイトル |
ポートレット・ヘッダーに表示されるタイトル。クラス名としてProductsを入力したため、このフィールドには自動的にその名前が移入されています。 |
短いタイトル |
モバイル機器のポートレット・ヘッダーに表示されるタイトル。 デフォルト名のProductsのままにします。 |
説明 |
ポートレットの説明。このフィールドは、ポートレットをOracle Portal 10g環境で使用する場合のみ該当します。
|
キーワード |
「キーワード」には、ユーザーが検索中にページ、項目またはポートレットを見つけられるように、これらの追加情報が表示されます。キーワードはOracle WebCenter SuiteでもOracle Portal 10gでもサポートされていませんが、他のベンダーではサポートされます(デプロイメント環境を他のベンダーから取得した場合)。
|
「次へ」をクリックします。
「コンテンツ・タイプとポートレット・モード」ページで、text/htmlがデフォルトのコンテンツ・タイプになっていることに注意してください。これは、ポートレットがHTMLでエンコードされたテキストをサポートするということです。text/html
のデフォルトのポートレット・モードとして「view」と「edit」がリストされます。「view」はポートレット・モードとして常に使用可能です。「edit」モードを選択すると、ユーザーがポートレット・インスタンスをパーソナライズできるページが提供されます。
図5-11のような「実装メソッド」領域に注意してください。これらのコントロールによって、ポートレットにJSPを生成するかどうか、あるいは独自のカスタムJSPコードを使用するかどうかを指定できます。
このレッスンでは、デフォルトの選択をそのままにすることで、JSPを生成するようにJDeveloperに指示します。
「次へ」をクリックします。
ここで「終了」をクリックして基本のポートレットを作成することもできますが、続行して、このポートレットには他のオプションや設定を選択します。
「カスタマイズ・プリファレンスの指定」ページで、デフォルト値のままにして「次へ」 をクリックします(図5-12)。
ここではこのページについて何も変更しませんが、将来的に、このページを使用して、ポートレットの他のカスタマイズ・オプションを追加できます。たとえば、ポートレットがZip Code
パラメータを受け入れる場合、ユーザーがZip Codeラベルをパーソナライズできるようにします。この場合は、「追加」ボタンを使用して、Zip Codeラベルをパーソナライズ可能にします。
「セキュリティ・ロール」ページで、「次へ」をクリックします(図5-13)。「セキュリティ・ロール」ページを使用して、このポートレットに対して設定するアプリケーションのセキュリティ・ロールを指定します。
「キャッシュ・オプション」ページで、「次へ」をクリックします(図5-14)。
このページの設定によって、ポートレットの有効期限に基づいたキャッシュを定義できます。ここではキャッシュ条件は必要ありません。
「初期化パラメータ」ページで、「次へ」をクリックします(図5-15)。このポートレットでは、初期化パラメータは必要ありません。
「ポートレット・ナビゲーション・パラメータ」ページで、product ID
に基づいてナビゲーション・パラメータを作成します。
ナビゲーション・パラメータは、WSRP 2.0の機能です。このページでは規格に基づいたポートレットで消費される外部パラメータを指定でき、ページは、ウィザードの最初のページで「Oracle WSRP V2拡張機能を使用してポートレット間通信を可能にします」オプションを選択した場合にのみ表示されます。
「追加」をクリックします。
値をダブルクリックして、各値を次のように更新します。
名前: productId
ラベル: Product ID
ヒント: Enter Product ID
これらのナビゲーション・パラメータは後から「手順10: 規格に基づいたポートレットとOmniPortletのワイヤリング」で使用します。図5-16は、更新された「ポートレット・ナビゲーション・パラメータ」ページを示しています。
図5-16 JSR 168 Javaポートレットの作成 - ポートレット・ナビゲーション・パラメータ
「次へ」をクリックします。
ウィザードの最後のページ(ステップ9/9)で、「終了」をクリックします。
「終了」をクリックした後、アプリケーション・ナビゲータの「ポートレット」 プロジェクトの下に、新しく生成されたいくつかのファイルが表示されます。展開されたナビゲータは、図5-17のようになります。
「アプリケーション・ソース」の「portlet」と「portlet.resource」の下に、次の2つのJavaクラスがあることに注目してください。
「Products.java」は、ポートレット・コンテナにより起動されます。これには、ポートレット標準で必要なすべてのメソッドが含まれます。
「ProductsBundle.java」には、ポートレットの変換文字列がすべて含まれています。
「Webコンテンツ」の「Products」、「html」の下には次のものがあります。
edit.jsp: これには、「パーソナライズ」ダイアログ・ボックスへの移入に必要な情報が含まれます。
view.jsp: これは、ポートレットが他のコンポーネントとページを共有しているときに起動されます。
「Webコンテンツ」の下の「WEB-INF」に、次の3つのデプロイメント・ディスクリプタがあります。
oracle-portlet.xml: これには、インポート/エクスポートおよびポートレット間通信用のOracle拡張機能をサポートするための情報が含まれます。このファイルは、ウィザードのステップ1で「Oracle拡張機能を使用してWSRP V2のポートレット間通信を可能にします。」を選択したために表示されます。
portlet.xml: これにより、すべてのポートレット・リソース(JSR 168 Javaポートレット・ウィザードで入力した情報)が指定されます。
web.xml: これにより、Webアプリケーション・リソースが指定されます。
すべてのファイルを保存します。次の手順で、生成したばかりのすべてのポートレット情報を格納するJavaBeanを作成します。
この手順では、規格に基づいたポートレットの情報を格納するJavaBeanを作成します。
アプリケーション・ナビゲータで、「portlet」パッケージを右クリックし、「新規」を選択します。図5-18は、アプリケーション・ナビゲータでの「portlet」
パッケージを示しています。
新規ギャラリで「すべてのテクノロジ」タブをクリックします。
「カテゴリ」リストの「General」の下で、「Java」を選択し、「項目」リストから「Bean」を選択してから、「OK」をクリックします(図5-19)。
表示される「Beanの作成」ダイアログ・ボックスに次の情報を入力して新しいJavaBeanを設定します(図5-20)。
名前: ProductDetailsBean
パッケージ: portlet
拡張対象: java.lang.Object
これでportletパッケージにProductDetailsBean
という新しいBeanが作成されます。
「OK」をクリックします。新しいJavaBeanが「設計」ウィンドウに表示されます(図5-21)。
図5-22は、「構造」ウィンドウのJavaBeanを示しています。第3章「カスタマイズ可能ページを含むWebCenterアプリケーションの作成」で述べたように、「構造」ウィンドウで押しピンを使用すれば、現在のビューを固定および固定解除できます。「設計」ビューで「ProductDetails Bean」
を選択したことを確認し、押しピンを切り替えると、「構造」ウィンドウに「ProductDetails Bean」
が表示されます。
JavaBeanの設定が終わりました。それでは、ポートレットに必要な情報を追加しましょう。「構造」ウィンドウで、「ProductDetailsBean」を右クリックし、ポップアップ・メニューから「新規フィールド」を選択します。
「フィールドを作成」ダイアログ・ボックスの「名前」フィールドにproductId
と入力します。この名前は、データベース・スキーマの製品名を表します。
「タイプ」が「String」
に設定されていることを確認します。
「スコープ」が「private」に設定されていることを確認します(図5-24)。
「OK」をクリックします。新規フィールドがそのJavaBeanの「設計」ビューに表示されます(図5-25)。
今度は、ポートレットに表示する他の4つのフィールドを作成します。手順6〜10を実行して、次の名前で5つのフィールドを作成します。
productName
productPrice
imageURL
categoryDescription
supplierName
現在、JavaBeanの「設計」ビューには6つのフィールドがあります(図5-26)。
JavaBeanのフィールドを設定したので、アクセッサを生成します。
「構造」ウィンドウで、「ProductDetailsBean」を右クリックし、ポップアップ・メニューから「アクセッサの生成」を選択します。
「アクセッサの生成」ダイアログ・ボックスが表示されます(図5-27)。
「すべて選択」ボタンをクリックして、このBeanのために作成したすべてのフィールドを選択します(図5-28)。
「OK」をクリックすると、これらのフィールドのアクセッサが生成されます。例5-1に示すようなコードが、Oracle JDeveloperによって生成されます。
例5-1 ProductDetails JavaBean
package portlet; public class ProductDetailsBean { private String productId; private String productName; private String productPrice; private String imageURL; private String categoryDescription; private String supplierName; public ProductDetailsBean() { } public void setProductId(String productId) { this.productId = productId; } public void setProductName(String productName) { this.productName = productName; } public String getProductName() { return productName; } public void setProductPrice(String productPrice) { this.productPrice = productPrice; } public String getProductPrice() { return productPrice; } public void setImageURL(String imageURL) { this.imageURL = imageURL; } public String getImageURL() { return imageURL; } public void setCategoryDescription(String categoryDescription) { this.categoryDescription = categoryDescription; } public String getCategoryDescription() { return categoryDescription; } public void setSupplierName(String supplierName) { this.supplierName = supplierName; } public String getSupplierName() { return supplierName; } }
ProductsBean.java
というポートレット用のもう1つのJavaBeanを作成します。このBeanは製品リストを表し、ポートレットの実行時に表示されます。
JavaBeanを作成するには、アプリケーション・ナビゲータで「portlet」パッケージを右クリックし、ポップアップ・メニューから「新規」を選択して「Beanの作成」ダイアログを表示します(図5-29)。
「ソース」ビューでProductsBean.java
のコードを例5-2のコードに置き換えます。
注意: このテキストのコードの書式設定が機能しない場合は、C:\TutorialContent\Portlets\ProductsBeanJava.txt ファイルを開き、そこからコードをコピーして貼り付けてください。 |
例5-2 ProductsBean.javaのコード
package portlet; import java.util.ArrayList; public class ProductsBean { public static final String DEFAULT_PRODUCT_ID = "12"; private ArrayList<ProductDetailsBean> products = new ArrayList<ProductDetailsBean>(); public ProductsBean() { super(); } public void addProduct(ProductDetailsBean product) { products.add(product); } public ArrayList<ProductDetailsBean> getProducts() { return products; } }
Beanの「ソース」ビューは、図5-30のように表示されます。
すべてのファイルを保存します。
次の手順では、JavaBeanと、ポートレットで表示するデータを含むデータベース・スキーマとの接続を設定します。
データベースのデータにアクセスするためのJavaBeanを作成したら、Javaクラスにポートレット用のビジネス・ロジックを作成します。データベースへの接続が含まれるこのクラスは、接続を確立して、クラス・ファイルのSQL文を使用して情報の問合せを行います。規格に基づいたポートレットを作成するときは、手動でこのクラスを作成する必要があります。
アプリケーション・ナビゲータで、「portlet」パッケージを右クリックし、ポップアップ・メニューから「新規」を選択します。
新規ギャラリで「Java」をクリックし、「項目」リストから「Javaクラス」を選択します(図5-31)。
「OK」をクリックします。
「Javaクラスの作成」ダイアログ・ボックスの「名前」フィールドに図5-32のようにProductsService
と入力します。
このダイアログ・ボックスの残りのデフォルト値は、次の手順で上書きするため、そのままにしておき、「OK」をクリックします。
表示されるProductsService.java
ファイルで、自動生成されたコードをすべて、例5-3に示すコードに置き換えます。コードでは、サンプル・スキーマをインストールしたデータベースをローカルと仮定します。コードで、強調されているJDBC接続(jdbc:oracle:thin:@localhost:1521:xe
)を、データベースおよびチュートリアル(fod
)スキーマを指すように変更します。
注意: このテキストのコードの書式設定が機能しない場合は、C:\TutorialContent\Portlets\ProductsServiceJava.txt ファイルを開き、そこからコードをコピーして貼り付けてください。 |
例5-3 ProductsService.javaのコード
package portlet;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ProductsService {
public ProductsService() {
}
public ProductsBean getProducts() throws ClassNotFoundException {
Connection conn = getConnection();
ProductsBean products = new ProductsBean();
if (conn != null) {
try {
Statement stmt = conn.createStatement();
String query =
"SELECT DISTINCT product_id, product_name name, cost_price
price, 'http://localhost:7101/MyTutorialApplication/' || external_url image_url,
category_description, supplier_name " +
"FROM category_translations, products_base, suppliers" +
" WHERE products_base.category_id = category_
translations.category_id" +
" AND products_base.supplier_id = suppliers.supplier_id " +
" AND cost_price between 25 and 75 " +
" order by product_id";
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
ProductDetailsBean productDetails = new ProductDetailsBean();
productDetails.setProductId(rs.getString(1));
productDetails.setProductName(rs.getString(2));
productDetails.setProductPrice(rs.getString(3));
productDetails.setImageURL(rs.getString(4));
productDetails.setCategoryDescription(rs.getString(5));
productDetails.setSupplierName(rs.getString(6));
products.addProduct(productDetails);
}
conn.close();
} catch (SQLException sqle) {
System.out.println("======== Oracle Fusion Middleware Tutorial for
WebCenter Developers ======== ");
System.out.println("Database Connection established successfully
but encountered an error while working with the DB:" +
sqle);
System.out.println("=================================================
=========================== ");
} catch (Throwable t) {
System.out.println("======== Oracle Fusion Middleware Tutorial for
WebCenter Developers ======== ");
System.out.println("Error while trying to get Product Details: " +
t);
System.out.println("==================================================
========================== ");
}
}
return products;
}
public static Connection getConnection() throws ClassNotFoundException {
Connection conn = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn =
DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "fod",
"fusion");
} catch (SQLException sqle) {
conn = null;
System.out.println("======== Oracle Fusion Middleware Tutorial for
WebCenter Developers ======== ");
System.out.println("SQL error while trying to get connection to DB: " +
sqle);
System.out.println("=====================================================
======================= ");
} catch (Throwable t) {
conn = null;
System.out.println("======== Oracle Fusion Middleware Tutorial for
WebCenter Developers ======== ");
System.out.println("Error while trying to get the connection to DB: " +
t);
System.out.println("======================================================
====================== ");
}
return conn;
}
}
注意: このコードでは、view.jsp 、ProductsService およびProductsBean のパッケージ名とインポート文は、ポートレットに指定する名前、クラス名およびパッケージによって異なります。また、このコードでは、接続情報をチュートリアル(fod )スキーマを含むデータベースを指すように更新する必要があります。このポートレットで問題が発生した場合は、ビジュアル・エディタ(「設計」ビュー)の下にある「メッセージ」ログを調べて、このコードに入力した接続情報が正しいことを確認します。 |
ファイルを保存します。
ポートレットのview.jsp
ファイルをこのJavaクラスを使用するように更新するには、ポートレット・コードに戻り、パラメータ値を使用します。このパラメータ値は、図5-16でProductsポートレットに定義したproductId
ナビゲーション・パラメータです。
「Products.java」タブをクリックして、フォーカスを合せます。または、ファイルが開いていない場合、アプリケーション・ナビゲータで名前をダブルクリックします。
Products.java
ファイルで、生成されたポートレット・クラス・ファイルのProcessAction()
メソッドを、パラメータ値がポートレットからJava Beanに渡されるように更新する必要があります。これにより、入力したパラメータに応じて該当する製品が表示されるようになります。
Products.java
ファイルで、processAction()
メソッドを探します。例5-4は、Products.java
ファイルでメソッドが見つかったコードの部分を示しています。
例5-4 processAction()メソッドが含まれるProducts.javaファイルの最後のセクション
public void processAction(ActionRequest request, ActionResponse response) throws PortletException, IOException { // Determine which action. String okAction = request.getParameter(OK_ACTION); String applyAction = request.getParameter(APPLY_ACTION); if (okAction != null || applyAction != null) { // Save the preferences. PortletPreferences prefs = request.getPreferences(); String param = request.getParameter(PORTLETTITLE_KEY); prefs.setValues(PORTLETTITLE_KEY, buildValueArray(param)); prefs.store(); if (okAction != null) { response.setPortletMode(PortletMode.VIEW); response.setWindowState(WindowState.NORMAL); } } }
例5-4は、更新する必要のあるセクションを示しています。簡単にするために、Products.java
ファイルのコードすべてを、C:\TutorialContent\Portlets\ProductsJava.txt
ファイルのコードと置き換えてもかまいません。一方、例5-5は、更新されたセクションを示しています。
例5-5 Products.javaファイルの最後のセクションの更新
// Form field names public static final String PARAMETER1 = "productId"; public static final String FORM_PARAMETER1 = "form_Parameter1"; public static final String FORM_SUBMIT = "dosub"; // Portlet Modes public static final String MODE_NAME_PARAM = "mode"; public static final String MODE_VIEW = "view"; public void processAction(ActionRequest request, ActionResponse response) throws PortletException, IOException { // Determine what kind of action we have by examining the mode parameter boolean viewMode = MODE_VIEW.equals(request.getParameter(MODE_NAME_PARAM)); // Extract the form field parameter and pass it through as a portlet parameter String param1 = request.getParameter(FORM_PARAMETER1); if (param1 == null) { param1 = ProductsBean.DEFAULT_PRODUCT_ID; } if (viewMode) { // Set the new parameter values. These will be intepreted by the // container as navigational parameters as the names match the names of // the declared parameters. response.setRenderParameter(PARAMETER1, param1); } else { // Determine which action. String okAction = request.getParameter(OK_ACTION); String applyAction = request.getParameter(APPLY_ACTION); if (okAction != null || applyAction != null) { // Save the preferences. PortletPreferences prefs = request.getPreferences(); String param = request.getParameter(PORTLETTITLE_KEY); prefs.setValues(PORTLETTITLE_KEY, buildValueArray(param)); prefs.store(); if (okAction != null) { response.setPortletMode(PortletMode.VIEW); response.setWindowState(WindowState.NORMAL); } } } } }
これで、ポートレットを更新し、ポートレットがデータベースと通信できるようにするJavaクラスを作成しました。次に、ポートレットでそのJavaクラスを使用できるように、ポートレットのview.jsp
ファイルを更新します。
アプリケーション・ナビゲータで、「ポートレット」→「Webコンテンツ」→「Products」→「html」を選択して、view.jsp
ファイルを開きます(図5-33)。
「ソース」タブをクリックして、このページのコードを表示します。
「ソース」ビューのコードをすべて選択して、削除します。
view.jsp
の「ソース」ビューで例5-6のコードを入力します。
注意: このテキストのコードの書式設定が機能しない場合は、C:\TutorialContent\Portlets\ViewJSP.txt ファイルを開き、そこからコードをコピーして貼り付けてください。 |
例5-6 view.jspのコード
<%@ page contentType="text/html" pageEncoding="windows-1252" import="javax.portlet.*, java.util.*, portlet.ProductsBean, portlet.ProductDetailsBean, portlet.ProductsService, portlet.Products "%> <%@ taglib uri="http://java.sun.com/portlet" prefix="portlet"%> <!-- Include the Portlet render Response & Request objects --> <portlet:defineObjects/> <% // Get the list of products ProductsBean products = new ProductsService().getProducts(); ArrayList<ProductDetailsBean> productDetails = products.getProducts(); // "Portlet encode" the Action URL if running Portlet mode String actionURL = "view.jsp"; if (renderResponse != null) { actionURL = renderResponse.createActionURL().toString(); } // Extract the current portlet parameter value if running in Portlet mode String param1 = ""; if (renderRequest != null) { param1 = renderRequest.getParameter(Products.PARAMETER1); if (param1 == null) { param1 = ""; } } %> <form method="POST" action="<%= actionURL %>"> <table> <tr> <th>Select</th> <th>Product</th> <th>Product supplied by</th> <th>Our price</th> </tr> <% for (int i = 0; i < productDetails.size(); i++) { ProductDetailsBean productDetail = productDetails.get(i); %> <tr> <td align="center"> <!-- Set the Form parameter name to passed as a render parameter during processAction --> <input type="radio" name="<%= Products.FORM_PARAMETER1 %>" value="<%=productDetail.getProductId()%>" <%= param1.equals(productDetail.getProductId()) ? " checked='checked'" : "" %>/> </td> <td> <%=productDetail.getProductName()%> </td> <td> <%=productDetail.getSupplierName()%> </td> <td align="right"> $<%=productDetail.getProductPrice()%> </td> </tr> <% } %> <tr class="PortletText1"> <td> <input name="<%= Products.FORM_SUBMIT %>" type="submit" class="portlet-form-button" value="Show Details"></input> </td> <td colspan="3"> </td> </tr> </table> <!-- create a hidden parameter to note we're running in "view" mode --> <input type="hidden" name="<%= Products.MODE_NAME_PARAM %>" value="<%= Products.MODE_VIEW %>"/> </form>
view.jsp
を保存します。
データベースへの接続を確立して、新しいJavaBeanを使用するポートレットと、ポートレットの適切な製品情報を取得するJavaクラスを設定しました。これで、WARファイルにポートレットを含める準備ができました。WARはweb archiveの略語で、ポートレットのデプロイに必要なすべてのリソース、ポートレットおよびデプロイメント・ディスクリプタをまとめてパッケージ化したものです。
このレッスンでは、規格に基づいたポートレットを、ローカルのデフォルト・サーバー(統合WebLogicサーバー)にデプロイする方法を学習します。ポートレットをデプロイする場合、Java EEサーバー上で実行できるようにポートレットをパッケージ化します。Oracle Portalでは、これは要するにポートレット・プロバイダを作成することです。ポートレット・プロバイダは、WSRPの世界ではポートレット・プロデューサと呼ばれています。
デフォルト・サーバーがまだ実行されていない場合は、 「実行」→「サーバー・インスタンスの起動」を選択して起動します。
ポートレットをデプロイする前に、すぐにコンパイルしてテストします。アプリケーション・ナビゲータで、「Webコンテンツ」→「Products」の下のview.jspを右クリックし、「実行」を選択します。ポートレットはコンパイルされ、ブラウザで図5-34のように表示されます。
アプリケーション・ナビゲータの「ポートレット」、「Webコンテンツ」、「WEB-INF」の下で、web.xml
ファイルを右クリックして、ポップアップ・メニューから「WARデプロイメント・プロファイルの作成」を選択します(図5-35)。
「デプロイメント・プロファイルの作成」ダイアログ・ボックスで、デプロイメント・プロファイルにProducts
という名前を付け、「OK」をクリックします(図5-36)。
「WARデプロイメント・プロファイルのプロパティ」ダイアログ・ボックスの「一般」タブで、Webアプリケーションのコンテキスト・ルートの設定を探します。後で簡単に参照できるように、この名前をより論理的な名前に変更します。
「J2EE Webコンテキスト・ルートを指定」オプションを選択し、図5-37のようにフィールドにProducts
と入力します。
「OK」をクリックしてプロパティの更新を終了し、「プロジェクト・プロパティ」ダイアログ・ボックスで「OK」をクリックして、WARデプロイメント・プロファイルの作成を終了します。
Oracle WebCenterには、統合WLSサーバーへの独自のデフォルト接続が含まれています。リソース・パレットのIDE接続の下で、「IntegratedWLSConnection」という接続が表示されます(図5-38)。
これで、規格に基づいたポートレットをデプロイする準備が整いました。アプリケーション・ナビゲータで、「Portlets」プロジェクトを右クリックし、ポップアップ・メニューから「デプロイ」→「Products」→「IntegratedWLSConnection」を選択します。
「デプロイメント・タイプの選択」ダイアログ・ボックスが表示された場合、デフォルト・オプションをそのままにして、「OK」をクリックします(図5-39)。
ビジュアル・エディタ(「設計」ビュー)の下にある「デプロイ」ログで「---- デプロイが終了 ---- {0}」のメッセージがあるか調べることができます。
ブラウザに移動し、ポートレットのデプロイメントが行われたかどうかを確認します。ブラウザに次のURLを入力します。
http://localhost:7101/Products/info
図5-40に示すように、WSRPプロデューサ・テスト・ページが表示されます。
WSRPのバージョン1または2のどちらのWSDLを使用するかを選択できます。通常、可能な場合は最新バージョンを使用することをお薦めします。ポートレットがWSRP 1.0準拠コンシューマ(Oracle Portalなど)で消費される場合、WSRP 1.0を選択できます。
「WSRP v2 WSDL」をクリックしてこのWSDLのXMLを表示します(図5-41)。
デプロイしたポートレットが、Webサービスとして公開されています。ブラウザに表示されているのは、このWebサービスを記述するWeb Services Description Language(WSDL)です。これで、ポートレットがデプロイされ、実行中となったので、このポートレットにポートレットを消費するアプリケーションを追加できます。次の手順では、チュートリアル・アプリケーションにプロデューサを登録して、このポートレットをMyPage
に追加します。
ポートレットをデプロイしたので、プロデューサをチュートリアル・アプリケーションに登録して、ページに追加できます。
プロデューサをMyTutorialApplicationに登録するには、次のようにします。
アプリケーション・ナビゲータで、リストから「MyTutorialApplication」を選択し、カスタムWebCenterアプリケーションに戻ります(図5-42)。
図5-42 アプリケーション・ナビゲータ・リストの「MyTutorialApplication」
リソース・パレットでフォルダ・アイコンをクリックして、ポップアップ・メニューから「接続の作成」→「WSRPプロデューサ」を選択します。
「プロデューサ名の指定」ページで「リソース・パレット」が選択されていることを確認して、プロデューサの名前(ProductsWSRPProducer
など)を入力し、「次へ」をクリックします(図5-43)。
「接続詳細の指定」ページの「WSDL URL」フィールドに、WSDLのURLを入力します(通常はバージョン2を使用します)。
http://localhost:7101/Products/portlets/wsrp2?WSDL
デフォルト・サーバーがローカルにインストールされているため、プロキシは必要ありません。「次へ」をクリックして、WSRPプロデューサへの接続を作成します。
残りのデフォルト設定はそのままにして、ウィザードを終了します。「登録の詳細」ページで、「終了」をクリックします。登録の終了を知らせる登録のダイアログ・ボックスが表示されます。
リソース・パレットの「IDE接続」で、「WSRPプロデューサ」ノードを開き、「ProductDetailsWSRPProducer」ノードを開きます。図5-45は、ここでのProductsポートレットを示しています。
プロデューサをアプリケーションに登録したので、ページにポートレットを追加してテストします。
ポートレットをテストするには、ポートレットをMyPage.jspxに追加してページを実行し、ポートレットが予想どおりに表示されるかどうかを確認します。
MyTutorialApplicationで、MyPage.jspx
がまだ開いていない場合は、アプリケーション・ナビゲータで(「ViewController」の「Webコンテンツ」の下)ページ名を見つけてダブルクリックします。
「構造」ウィンドウで、「second」ファセットに移動し、「Page Customizable」→「Layout Customizable」→「contentA」の順に開き、図5-46のように、「Panel Customizable」を見つけます。
注意: 前述のように、「構造」ウィンドウで押しピンを使用すれば、現在のビューを固定できます。この手順のために、「設計」ビューで「MyPage」をクリックして、押しピンが固定の位置(押された状態)になっていることを確認する必要があります。 |
リソース・パレットからProductsポートレットをこの「Panel Customizable」にドラッグ・アンド・ドロップします。
ページを実行して、ポートレットが実行時にどのように表示されるかを確認します。これには数秒かかることがあります。
まだこのポートレットを別のポートレットとワイヤリングしていないため、異なるオプションの選択や「詳細の表示」ボタンはまだ機能しません。2番目のポートレットを作成し、それをこのポートレットにワイヤリングします。図5-47は、実行時のProductsポートレットです。
このチュートリアルでは、OmniPortletという事前構成済ポートレット・プロデューサを使用します。これは、統合WLS(WebLogic)サーバーに事前にデプロイされており、デフォルト・サーバーとも呼びます。先に進む前に、第2章「チュートリアルの準備」の手順を実行したことを確認します。
ポートレット・プロデューサを登録するには、次のようにします。
デフォルト・サーバーが稼働していることを確認します。
デフォルト・サーバー上で実行されているOmniPortletプロデューサのURLを見つけるには、「ヘルプ」→WebCenter Preconfigured Server READMEを選択します。このREADMEファイルでは、デフォルト・サーバーに事前にデプロイされたポートレットを使用するために必要なすべての情報と、サーバーのログイン資格証明が示されます。
READMEファイルで、「Preconfigured Portlet Producers」の下、さらに「PortalTools Portlet Producers」の下で、「OmniPortlet Producer」をクリックします。
ブラウザには、OmniPortletのプロデューサ・テスト・ページが表示されます。ロケーション・バーからURLをコピーします。URLは次のようになります。
http://localhost:7101/portalTools/omniPortlet/providers/omniPortlet
このURLをブラウザに入力すると、OmniPortletのプロデューサ・テスト・ページが表示されます(図5-48)。
リソース・パレットで検索ツールバーの隣にある「新規」アイコンをクリックして、「接続の作成」を選択し、次に「Oracle PDK-Javaプロデューサ」を選択します(図5-49)。
Oracle PDK-Javaポートレット・プロデューサの登録ウィザードのステップ1で、このポートレット・プロデューサをすべてのアプリケーションで使用できるようにします。「リソース・パレット」を選択します。
「プロデューサ登録名」フィールドにOmniProducer
と入力します(図5-50)。
「次へ」をクリックします。
先にコピーしたこのOmniPortletのプロデューサ・テスト・ページのURLを「URLエンドポイント」フィールドに入力します(図5-51)。
「次へ」をクリックします。
「登録の詳細」ページで、「終了」をクリックします。Oracle JDeveloperがプロデューサを登録していることを示すメッセージが表示されます。
リソース・パレットでのポートレット・プロデューサの登録を選択したため、図5-52に示すように、新しいポートレット・プロデューサがリソース・パレットの「IDE接続」リストに表示されます。
Oracle WebCenter Frameworkで使用できるポートレット・タイプの1つがOmniPortletです。このポートレットは、そのまま使用できる形で提供されており、デフォルト・サーバー上で事前に構成されています。様々なデフォルト・レイアウトやデータ・ソースを使用して、素早くポートレットを作成できます。
図5-53は、OmniPortletを使用して構築できるサンプル・ポートレットを示しています。このポートレットには、データベースに格納されている項目が、ローカルに格納されているイメージとして表示されます。このポートレットを「手順1: 規格に基づいたJSR 168 Javaポートレットの作成」で作成したポートレットとワイヤリングすると、ユーザーは、アプリケーション内のこれらのイメージをクリックして、それらの項目の詳細を知ることができます。
このOmniPortletを使用する前に、データベースにサンプル・スキーマを追加して、第2章「チュートリアルの準備」の説明に従ってデフォルト・サーバーを起動したことを確認します。また、「手順7: 事前構成済ポートレット・プロデューサの登録」の説明に従ってOmniPortletプロデューサを登録したことを確認します。
Oracle JDeveloperで、「MyTutorialApplication」が開いていることを確認します。
アプリケーション・ナビゲータで、「MyPage.jspx」
が「設計」ビューにあることを確認します。アプリケーションが閉じられている場合は、アプリケーション・ナビゲータでページ名をダブルクリックすれば開きます。
「構造」ウィンドウの「second」ファセットで、ドキュメント・サービスとタグ・サービスを追加した「Panel Customizable」を探します。
注意: 前述のように、「構造」ウィンドウで押しピンを使用すれば、現在のビューを固定できます。この手順のために、「設計」ビューで「MyPage」をクリックして、押しピンが固定の位置(押された状態)になっていることを確認する必要があります。 |
図5-54のように、「Layout Customizable facets」を開き、次に「contentB」
を開いて「Panel Customizable」(規格に基づいたJSR 168 JavaポートレットをcontentA
に追加した場所)を表示します。
リソース・パレットの「IDE接続」の下で、「Oracle PDK-Javaプロデューサ」→「OmniProducer」→「OmniPortlet」に移動します(図5-55)。
「OmniPortlet」を、「構造」ウィンドウで、ページの「contentB」の下の「Panel Customizable」にドラッグ・アンド・ドロップします。図5-56に示すように、ページの「設計」ビューにOmniPortletが表示されます。エラー・メッセージが表示された場合、デフォルト・サーバーを起動したことを確認し、再度実行します。
OmniPortlet使用に関するトラブルシューティングのヒントの詳細は、『Oracle Fusion Middleware Oracle WebCenterのための開発者ガイド』を参照してください。
ページにOmniPortletを追加したので、そのコンテンツをカスタマイズしましょう。
ブラウザにページを実行します。
図5-57は、ブラウザに表示されたMyPage上のOmniPortletを示しています。
この項では、第2章「チュートリアルの準備」でアプリケーションに追加したデータベース・スキーマからの情報とイメージが表示されるように、OmniPortletをカスタマイズします。
OmniPortletは事前構成済ポートレットであるため、それをアプリケーションに追加して、実行時にカスタマイズすればよいだけです。ポートレットをページに配置し、ブラウザでページを実行したので、このポートレットのレイアウトとコンテンツをカスタマイズします。
ポートレットの右上隅にある矢印をクリックし、「カスタマイズ」を選択してOmniPortletウィザードを起動します(図5-59)。
「データ型」ページで、データベースのスキーマからデータを取得できるように「SQL」を選択して、「次へ」をクリックします。この時点で、データベースにスキーマを追加したこと(第2章「チュートリアルの準備」)と、アプリケーション・リソースにイメージを追加したこと(第3章「カスタマイズ可能ページを含むWebCenterアプリケーションの作成」)を確認します。追加されていないと、ポートレットではサンプル・チュートリアル・データを取得できません。
SQLと自分のデータベースを熟知している場合、いつでも独自のサンプル・データを使用できますが、この後のイメージと手順が必ずしも読者にとって的確なものになるとはかぎりません。
「データソース」ページで、SQL文を定義し、スキーマをインストールしたデータベースへの接続を設定できます。
「文」ボックスに、例5-7のコードを入力します。文のパラメータは、このポートレットを「手順5: 規格に基づいたポートレットのアプリケーションへの登録」で追加したProductsポートレットとワイヤリングするときに使用されます。
注意: このテキストのコードの書式設定が機能しない場合は、C:\TutorialContent\Portlets\OmniPortlet_SQL_Statement.txt ファイルを開き、そこからコードをコピーして貼り付けてください。 |
例5-7 OmniPortletのSQL文
SELECT product_name name , cost_price our_price , cost_price * 1.3 retail_price , cost_price * 0.3 savings , external_url image_url , category_description , supplier_name FROM category_translations, products_base, suppliers WHERE products_base.category_id = category_translations.category_id AND products_base.supplier_id = suppliers.supplier_id AND products_base.product_id = nvl('##Param1##',0)
注意: この文のローカルホストの参照に注目します。これは、第2章「チュートリアルの準備」で登録したOmniPortletプロデューサを参照しています。「テスト」ボタンをクリックしても、文によって返されるものを確認できます。 |
「接続」の下の「接続の編集」をクリックします。
接続名と、データベースの接続情報を入力します。スキーマのユーザー名はfod
、パスワードはfusion
です。たとえば、Oracle XEデータベースをローカルで使用している場合、ページは図5-59のように表示されます。
「テスト」をクリックして、接続情報が正しいことを確認します。図5-60は、テスト成功のメッセージを示しています。
「閉じる」をクリックし、「OK」をクリックして接続の作成を終了します。
「ポートレット・パラメータ」の下で、Param1から12
までの「デフォルト値」を設定します。こうすることで、SQL文内のパラメータのデフォルト値が指定されます。
図5-61は、SQLのソース・ページを示しています。
注意: 第3章「カスタマイズ可能ページを含むWebCenterアプリケーションの作成」で説明したように、ViewControllerプロジェクトに「images」 フォルダがない場合、SQL文で参照されるイメージは表示されません。「手順2: アプリケーションへのイメージ・ファイルの追加」に戻って、手順に従い、ここでイメージを追加できますが、OmniPortletで新規フォルダが認識されるように、アプリケーションをブラウザで再び実行する必要があります。 |
「バインド変数の表示」ボタンの隣にある「テスト」をクリックして、SQL文と接続を検証します。
文に基づいた行を返すポップアップ・ウィンドウが表示されます。返された行がない場合、SQL文、接続およびポートレット・パラメータを検証してください。
「次へ」をクリックします。
「フィルタ」ページで、「次へ」をクリックします。
「表示」ページで、「タイトル」フィールドにポートレットの名前としてProduct Information
などを入力します。
このポートレットには、任意のデフォルト・レイアウトを選択できます。ただし、ポートレットのルック・アンド・フィールを微調整できるHTMLレイアウトであることを確かめます。
図5-64に示すように、「レイアウト・スタイル」で「HTML」を選択して、「次へ」をクリックします。
「レイアウト」ページで、HTMLで入力するテンプレートのフォームに注目します。ここで、ポートレットのレイアウトを変更するには、ヘッダー、本文およびフッターのフィールドを更新します。OmniPortletで提供されるデフォルト・レイアウトを使用できますが、独自のHTMLレイアウトを順を追って作成しましょう。
「クイック・スタート」リストで「フィールドのクリア」を選択し、「適用」をクリックします。こうすると、既存のHTMLコードがレイアウト・テンプレートから削除されます。
「繰返しセクション」に例5-8のHTMLを入力して、データの書式を設定する表を作成します。
注意: このテキストのコードの書式設定が機能しない場合は、C:\TutorialContent\Portlets\OmniPortlet_HTML_Layout.txt ファイルを開き、そこからコードをコピーして貼り付けてください。 |
例5-8 OmniPortlet HTMLレイアウトのコード
<table> <tr> <td> <font class="PortletHeading1">##NAME##</font> <img src="##IMAGE_URL##" title="##NAME## - ##CATEGORY_DESCRIPTION## by ##SUPPLIER_NAME##"></img> </td> <td> <table> <tr class="PortletText2"> <td> Product supplied by <font class="PortletHeading3"> ##SUPPLIER_NAME## </font> </td> </tr> <tr class="PortletText2"> <td> List price: $##RETAIL_PRICE## </td> </tr> <tr class="PortletHeading2"> <td> Our price: $##OUR_PRICE## </td> </tr> <tr class="PortletText2"> <td> You save: $##SAVINGS## </td> </tr> <tr class="PortletText2"> <td> <font class="PortletHeading2">Availability:</font> In Stock. Ships from and sold by <font class="PortletHeading2">FusionOnline.com</font> . Gift-wrap available. </td> </tr> <tr> <td> </td> </tr> </table> </td> </tr> <tr class="PortletText1"> <td colspan="2">Want it delivered Thursday? Order it in the next 22 hours and 45 minutes, and choose One-Day Shipping at checkout.</td> </tr> </table>
レイアウト・ページは、図5-65のように表示されます。
「終了」をクリックします。図5-66は、ブラウザに表示されたOmniPortletを示しています。
これで2つのポートレットを作成したので、これらをワイヤリングします。
Products
という規格に基づいたポートレットのコードを追加したとき、productId
というパラメータも含めました。Products
ポートレットで異なるオプションを選択すると、アプリケーションではこのパラメータをOmniPortletに送信し、特定の製品の詳細をその製品の識別番号とともに表示できるようにします。
ここで、2つのパラメータを互いにマップし、Productsポートレットでオプションを選択すると、OmniPortletの情報がそれに応じて更新されるようにする必要があります。
ポートレットをワイヤリングするには、次のようにします。
Oracle JDeveloperで、「MyTutorialApplication」が開いていることを確認します。
アプリケーション・ナビゲータで、MyPage.jspx
ページのページ定義ファイルを開きます。ファイルを開くには、アプリケーション・ナビゲータでページ定義ファイル自体を開くか、またはページをダブルクリックして「ページ定義に移動」を選択します。
「構造」ウィンドウで、押しピンを使用して、現在のビューを固定します。「設計」ビューでMyPageのページ定義が選択されていることを確認し、次に「構造」ウィンドウで、押しピンをクリックして、固定の位置(押した状態)になるようにします。
MyPagePageDef.xml(ページ定義)ファイルの「構造」ウィンドウで、「OmniPortlet1_1」→ 「parameters」を開き、図5-67のように、ポートレット変数Param1を選択します。
変数を選択しているときに、プロパティ・インスペクタでその変数のプロパティを表示できます。
図5-68のように、「pageVariable」プロパティを「Products1_1_productId」に設定します。
マスター・ポートレットの値が変更されたときはいつでも、詳細ポートレット(OmniPortlet)がリフレッシュされるようにする必要があります。それには、詳細ポートレットに部分トリガーを追加します。ビジュアル・エディタの上部にある「MyPage.jspx」タブをクリックして、フォーカスを移します。
「設計」ビューでページ上の「OmniPortlet」を選択します。
OmniPortletのプロパティ・インスペクタでは、「共通」の下で、「PartialTriggers」の隣の矢印をクリックして、「編集」を選択します(図5-70)。
「プロパティの編集: PartialTriggers」ダイアログ・ボックスでは、OmniPortletのポートレットIDが自動的に選択されます。「Panel Customizable」の下の「facet (contentA
)」にあるProductsポートレットのポートレットIDを探します(図5-71)。
ポートレットID(この場合は「portlet - portlet1」)を選択し、右向きの矢印をクリックして「選択済」リストに移動してから、「OK」をクリックします(図5-72)。
ポートレット・パレメータのワイヤリングを行ったので、それらが実行時にどのように動作するかを調べます。
「MyPage.jspx」をブラウザで実行します。次の手順では、JSR 168(Products)ポートレットとOmniPortletが実行時にどのように相互作用するかをテストします。
Productsポートレットで、オプション(「iPod Speakers」など)を選択し、「詳細の表示」をクリックします。
OmniPortletでは、ポートレットが更新されて、iPodスピーカーについての情報が表示されていることに注目してください(図5-73)。
図5-74は、ブラウザに表示されたMyPageを示しています。
おめでとうございます。これで、このレッスンは終わりです。2つのポートレットを作成し、それらが互いに通信できるようになりました。次の第6章「結び」に進み、このチュートリアルで学習したことを復習してください。この章には、使用した機能についての追加情報もあります。