5. ポートレットの開発(JavaEE 開発編)¶
目次
5.1. 概要¶
画面開発 (render サイクル)
ポートレットに表示する画面を作成します。モードやウィンドウステータスを判定して切り替えることも可能です。表示モード用の画面は必ず必要となります。アクション処理 (processAction サイクル)
ポートレットからサブミットされたデータの処理を作成します。作成されたファンクションコンテナは、Action ハンドラと呼ばれ、ポートレット編集画面で登録することによって利用できます。また、Event を設定することによって、別のポートレットと連携することも可能です。イベント処理 (processEvent サイクル)
他のポートレットから発生したイベントの受信処理を作成します。作成されたファンクションコンテナは、Event ハンドラと呼ばれ、ポートレット編集画面で登録することによって利用できます。Action ハンドラで Event を設定された場合のみ実行されます。
ポートレットのライフサイクルごとに、以下のように作成するファイルが異なります。
render 必須 JavaEE 開発モデルの画面。主 JSP と HelperBean。 processAction 任意 handleAction PortletActionHandler インタフェースを実装した Java クラス。 processEvent 任意 PortletEventHandler インタフェースを実装した Java クラス。
5.2. ポートレットAPI¶
5.2.1. PortalManager¶
jp.co.intra_mart.foundation.portal.common.PortalManager
5.3. ポートレットモード¶
5.3.1. ポートレットモードの設定¶
ポートレット定義の変更ポートレットモードの設定は以下のファイルで管理されています。intra-mart Accel Platform を停止して設定後、再起動を行います。設定ファイル%CONTEXT_PATH%/WEB-INF/plugin/jp.co.intra_mart.portal.portlets.javaee_8.0.0/plugin.xml設定箇所<?xml version="1.0" encoding="utf-8"?> <plugin> <extension point="jp.co.intra_mart.portal.portlets"> <portlet id="jp.co.intra_mart.portal.portlets.javaee" name="JavaeeFwPortlet" display-name="%display-name" description="%description" version="8.0.0" rank="1"> <portlet-class>jp.co.intra_mart.foundation.portal.portlets.model.JavaeeFwPortlet</portlet-class> <expiration-cache>0</expiration-cache> <supports> <mime-type>text/html</mime-type> <portlet-mode>VIEW</portlet-mode> <portlet-mode>EDIT</portlet-mode> <!-- ここにモードを追加 --> </supports> ... </portlet> </extension> </plugin>
5.3.2. ポートレットモードの取得¶
(ex.) PortletMode.VIEW, PortletMode.EDIT, PortletMode.HELP
javax.portlet.RenderRequest renderRequest = PortalManager.getRenderRequest(); javax.portletPortletMode portletMode = renderRequest.getPortletMode();
5.4. ウィンドウステータス¶
5.4.1. ウィンドウステータスの取得¶
(ex.) WindowState.NORMAL, WindowState.MAXIMIZED, WindowState.MINIMIZED
javax.portlet.RenderRequest renderRequest = PortalManager. getRenderRequest(); javax.portlet.WindowState windowState = renderRequest. getWindowState();
5.5. 画面開発 (renderサイクル)¶
5.5.1. RenderRequest, RenderResponse¶
RenderRequest, RenderResponse の取得
RenderRequest renderRequest = PortalManager.getRenderRequest(); RenderResponse renderResponse = PortalManager.getRenderResponse();ただし、通常の Web ページと共用できるように、ページ引数は、HttpServletRequest オブジェクト(JSP で「request」キーワードによりアクセスされる)を利用して取得することも可能です。
JSP でのページ引数の取得
<% RenderRequest renderRequest = PortalManager.getRenderRequest(); // value1 と value2 は同じ値 String value1 = request.getParameter("param1"); String value2 = renderRequest.getParameter("param1"); %>RenderRequest から、現在のポートレットモード、ウィンドウステータスなどが取得できます。
5.5.1.1. RenderRequestのスコープ¶
portal_cd ポートレットが配置されているポータル画面のキー。 portalKind ポートレットが配置されているポータル画面のポータル種別。以下の値が取得される。
user ユーザポータル group グループポータル ポートレットにリクエストパラメータを設定するためには、アクション処理またはイベント処理を実行する必要があります。また、一度設定したリクエストパラメータは、セッションが持続する間、再度アクション処理またはイベント処理が実行されるまで有効となります。
5.5.2. ActionURL, RenderURL¶
ActionURL Action 機能を呼び出す URL RenderURL ポータル画面を再表示するための URL これらは、PortalManager を利用して取得することができます。
ActionURL, RenderURL の取得
PortletURL actionURL = PortalManager.createActionURL(); PortletURL renderURL = PortalManager.createRenderURL();
JSP
<% PortletURL actionURL = PortalManager.createActionURL(); %> <!-- 何らかの登録処理を行うサービスを呼び出す --> <form action="<%= actionURL.toString() %>" method="POST"> <!-- 登録処理で使用する値 --> <input type="text" name="param1" value=""> <input type="submit" value="実行"> </form>
ポータル画面の表示には、「portal/desktop」というパスが割り振られています。そのため、このサービスID-URLにサブミットすることでもポータル画面の再表示が可能ですが、その場合ポータル情報を引き継ぐことができませんので、上記の方法を利用するようにしてください。 アクション処理を呼び出すためには、ActionURL にサブミットする以外にありません。ポートレット管理画面で Action ハンドラを登録し、プレゼンテーションページで ActionURL にサブミットするようにしてください。Action ハンドラが未定義の場合、単純にポータル画面を再表示します。 ActionURL はポータル情報を含むため、データ量が多くなります。メソッドは POST を指定するようにしてください。
5.5.3. 通常の画面とポートレット画面を共用するには¶
<ポートレット画面と共用する通常画面のプレゼンテーションページ>
<html> <head> <link src="sample.css" type="text/css"> </head> <body> <div> ヘッダ表示情報 </div> <!-- 共用コードをインクルードする --> <jsp:include page="sample/sample-portlet.jsp" flush="true"/> <div> フッタ表示情報 </div> </body> </html>
5.6. アクション処理 (processActionサイクル)¶
5.6.1. Actionハンドラの作成¶
PortletActionHandler インタフェースを実装した Java クラスを作成し、以下の関数を定義します。
(この Java クラスを Action ハンドラと呼びます。)
(ex.) sample.portal.SampleActionHandler.java
// 「PortletActionHandler」インタフェースを実装する。 public class SampleActionHandler implements PortletActionHandler { public Serializable handleAction(String portletCd, ActionRequest request, ActionResponse response) { // リクエスト引数を取得 String value = request.getParameter("param1"); // イベントを設定 // intramart 用ポートレットにイベントを送信する場合、ImEvent オブジェクトを利用する。 // QName は ImEvent.IM_QNAME を利用する。 ImEvent event = new ImEvent(); event.setEvent(value); response.setEvent(ImEvent.IM_QNAME, event); return null; } }
Action ハンドラは、render で利用するスクリプト開発モデルで作成されたファンクションコンテナを利用することもできます。 以下のような値を return することでもイベントを発生させることができます。
- jp.co.intra_mart.foundation.portal.common.handler .ImEvent のインスタンス
- java.util.Map のインスタンス ・・・Map のキーと値をペアとするイベント
- その他 ・・・ 文字列として判断し、キーと値が同じイベント
ただし、IM 用ポートレットに対するイベントを発生させるためには、ImEvent クラスを利用するか、‘im_’ で始まるキーを指定する必要があります。
詳細は「ポータル API リスト」の PortletActionHandler を参照してください。Action ハンドラをポートレットに登録します。
「 画面開発 (renderサイクル) 」で作成した画面をポータル画面に配置し、ポートレットからアクション処理を呼び出します。
5.6.2. ActionRequest, ActionResponse¶
5.6.3. RenderParameterの設定¶
(ex.) processAction サイクルでの RenderParameter の設定
// リクエストパラメータを設定する場合。 response.setRenderParameter("param1", "value1"); // リクエストパラメータを削除する場合。 response.setRenderParameter("param2", null);(ex.) render サイクルでの RenderParameter の利用
String value = request.getParamter("param1");
5.6.4. PortletPreferencesの設定¶
(ex.) javax.portlet.PortletPreferences の利用
// PortletPreferences の取得。 PortletPreferences preferences = request.getPreferences(); // PortletPreferences に設定された情報の取得。 String value = preferences.getValue("key1", "Default Value"); // PortletPreferences に情報を設定する。 preferences.setValue("key1", "value1"); // PortletPreferences を確定する。 // この処理を行わない場合、情報は保存されません。 preferences.store();
5.6.5. イベントの設定¶
(ex.) processEvent サイクルでのイベントの設定
response.setEvent(eventId, eventValue);
5.6.6. 利用可能なActionハンドラ¶
intra-mart Accel Platform では、以下の Action ハンドラが標準で用意されています。
5.7. イベント処理 (processEventサイクル)¶
5.7.1. Eventハンドラの作成¶
PortletEventHandler インタフェースを実装した Java クラスを作成し、以下の関数を定義します。
(この Java クラスを Event ハンドラと呼びます。)
(ex.) sample.portal.SampleEventHandler.java
// 「PortletEventHandler」インタフェースを実装する。 public class SampleEventHandler implements PortletEventHandler { public Serializable handleEvent(String portletCd, EventRequest request, EventResponse response) { // イベントオブジェクトを取得 // intramart 用ポートレット間で利用するイベントオブジェクトは、「ImEvent」になります。 ImEvent event = (ImEvent) request.getEvent().getValue(); // 画面表示に利用するリクエストパラメータを設定 response.setRenderParameter(event.getEventId(), event.getEvent()); return null; } }
Event ハンドラは、render で利用するスクリプト開発モデルで作成されたファンクションコンテナを利用することもできます。
戻り値を設定することで、さらにイベントを発生させることができます。※ループしないように注意して設計してください。Event ハンドラをポートレットに登録します。
「 画面開発 (renderサイクル) 」で作成した画面と「 アクション処理 (processActionサイクル) 」で作成したイベントを呼び出すことができるポートレットをポータル画面に配置し、イベントを設定するポートレットからアクション処理を呼び出します。
5.7.2. ImEventオブジェクト¶
プロパティ名 型 値 id String アクション処理で設定されたイベント ID省略された場合、文字列「ImEvent」が設定される。value String アクション処理で設定されたイベントの値オブジェクトを設定した場合も文字列として取得される。source String Event を設定したポートレットのポートレットコード
5.7.3. EventRequest, EventResponse¶
5.7.4. RenderParameterの設定¶
(ex.) processEvent サイクルでの RenderParameter の設定
// リクエストパラメータを設定する場合。 response.setRenderParameter("param1", "value1"); // リクエストパラメータを削除する場合。 response.setRenderParameter("param2", null);(ex.) render サイクルでの RenderParameter の利用
request.getParamter(eventId);
5.7.5. PortletPreferencesの設定¶
(ex.) java.portlet.PortletPreferences の利用
// PortletPreferences の取得。 PortletPreferences preferences = request.getPreferences(); // PortletPreferences に設定された情報の取得。 String value = preferences.getValue("key1", "Default Value"); // PortletPreferences に情報を設定する。 preferences.setValue("key1", "value1"); // PortletPreferences を確定する。 // この処理を行わない場合、情報は保存されません。 preferences.store();
5.7.6. イベントの設定¶
(ex.) processEvent サイクルでのイベントの設定
response.setEvent(eventId, eventValue);
5.8. 「重要なお知らせ」ポートレットについて¶
- 新着情報の種類を示すためのカテゴリ
- 新着情報の内容(概要)
- 配信日付
- 新着情報に紐付く遷移先の情報(リンク)
新着情報を取得するプロバイダを実装する。新着ポートレットに表示される情報は、以下のインタフェースを実装したプロバイダより取得されます。
「重要なお知らせ」新着情報のプロバイダーのインタフェース
jp.co.intra_mart.foundation.portal.general_purpose_portlet.provider.NewArrivedProvider
「重要なお知らせ」ポートレットに、以下のプロバイダを利用して、パスワード履歴管理情報を表示しています。独自のプロバイダを実装する場合の参考にしてください。
パスワード履歴管理「重要なお知らせ」新着情報のプロバイダ
jp.co.intra_mart.foundation.security.password.PasswordHistoryNewArrivedProvider
プロバイダのインタフェースおよびプロバイダの実装についての詳細は「ポータル API リスト」を参照してください。 プロバイダの実装を定義する。実装したプロバイダクラスについての情報は、%PUBLIC_STORAGE_PATH%/portal/system_notice.xml に 以下の情報を定義します。<プロバイダ設定ファイル>
要素 説明 new-arrived-portlet/sort 取得した新着情報をカテゴリでソートするかどうかを定義します。 new-arrived-portlet/provider/provider-class プロバイダの実装クラスを定義します。 new-arrived-portlet/provider/init-param プロバイダクラスに設定する初期化パラメータを定義します。 以下に設定ファイルの記述例を示します。
<system_notice.xml>
<new-arrived-portlet> <sort>true</sort> : : <provider> <provider-class> sample.SampleProvider </provider-class> <init-param> <param-name>param1</param-name> <param-value>hogehoge</param-value> </init-param> </provider> </new-arrived-portlet>プロバイダを複数登録して、複数の新着情報を1つのポートレットに表示することも可能です。