次に、ポートレット用のコントローラ、ビュー、ハンドラとして機能するJavaソースコードを記述します。ビューはJSPページ、コントローラとハンドラはJavaクラスです。これらのサンプルについては、本稿のダウンロード可能なソースコードを参照ください。その中には、本稿のポートレットスケルトンプロジェクトがあります。
コントローラは、ハンドラクラスを利用することにより、Webサービス、データベース、またはフィードなどのデータソースからデータを取得します。コマンドパターンによって、このデータをビューへと引き渡す機構を実装できます。ユーザーのポートレットセッション全体を通して、情報の送受にはcommandObjectを使用します。
例えば、データを取得し、それをビューレイヤーに返すためのポートレットAPIのメソッドのスケルトンコードは、次のようになります。
@Override
protected ModelAndView handleRenderRequestInternal(
RenderRequest request, RenderResponse response) throws Exception
{
logger.info ("Inside Controller handleRenderRequestInternal");
Map<String, CommandObject> model = new
HashMap<String, CommandObject>();
CommandObject commandObject =
(CommandObject)request.getPortletSession().getAttribute(
CommandObject.COMMAND_NAME,PortletSession.APPLICATION_SCOPE);
if (commandObject == null){
commandObject = new CommandObject();
}
// logic to get the data and put it in the commandObject
// should be here...
String view = getFormView();
model.put("commandObject", commandObject);
ModelAndView mav = new ModelAndView(view, model);
return mav;
}
@Override
public void onSubmitAction (final ActionRequest request,
final ActionResponse response, final Object command,
final BindException bindException) throws Exception
{
logger.info ("Inside onSubmitAction");
// Set the form bean into session so that it will be available
CommandObject commandObject = (CommandObject)command;
logger.info("Command Object :"+ToStringBuilder.reflectionToString(
commandObject));
request.getPortletSession ().setAttribute ("command_obj",
command,PortletSession.APPLICATION_SCOPE);
}
JSPからは、以下のようにしてデータを取得できます。
<form:form action="${formAction}" name="quickProcess"
method="post" commandName="commandObject">
<form:hidden path="p" id="p" />
<c:if test="${commandObject.someList != null}">
<c:forEach items="${commandObject.someList}"
var="listItem" varStatus="loop">
<c:out value="${listItem.name}"/><br>
</c:forEach>
</c:if>
</form:form>
ポートレットは、それを画面上にレイアウトする方法、リサイズの可否、高さや幅を指定しないことに注意してください。これらの外部的な属性はすべて、ポートレットコンテナが制御します。
ポートレットプロジェクトを動作させるには、それをビルドしデプロイする必要があります。ビルドでは、Javaの標準的なwarファイルを(通常はAntまたはMavenを使用して)作成します。デプロイでは、warファイルをアプリケーションサーバに配置します。このアプリケーションサーバでは、ポートレットコンテナアプリケーションも稼働しています。ポートレットがポートレットコンテナに登録されるときには、どのようなポートレットが存在し、何という名前なのかを調べるためにportlet.xmlファイルが参照されます。例えばVignette Portalサーバで新しいポートレットを作成するには、目的のポートレットを検索してサイトに追加します(図6と図7参照)。
ポートレットをポートレットコンテナに追加したら、(プラットフォームによっては)その配置、レイアウト、属性を設定できます。例えば、デフォルトの幅と位置を設定したり、ポートレットの最小化や移動ができないように指定したりできます。
図8に、3つの設定済みポートレットからなるVignetteのページ例を示します。これが、ユーザーがポータルにログインしたときに使用されるデフォルトの配置となります。
図9は、eXo JBossポートレットコンテナで選択できるデフォルトレイアウトを示したものです。もちろん、これ以外のレイアウトも可能ですが、ほんの数回のマウスクリックですぐに使用できるページグリッドレイアウトがあるのは便利です。

最新のポートレットコンテナでは、ポータルサイトのルック&フィールの変更を容易にするために、ポートレットのレイアウト、スキン、UIスキームなどを便利な管理ダッシュボードからまとめて変更できるようになっています。
以上、Webポータルおよびポートレットコンテナの動作の基本と、最新のJava仕様およびデプロイメント手法を用いたポートレットの開発例を示しました。具体的な仕様の策定により、Web開発分野において、オープンソースと商用ベンダーの両方によるポートレットコンテナが普及しました。それによって、JavaのWeb開発者は、ポートレットコードを再利用し、ビジネスロジックに専念し、ポータルコードをそれほど記述しなくてもそのまま使用できる堅牢な機能をエンドユーザー向けに提供できるようになりました。今後数年間で、Javaポータルの分野にどのような新しい進展が見られるかは、興味深いところです。より詳細な情報については、以下の参考サイトを参照ください。
参考サイト
- JSR 168
- JSR 286
- Open Source Java PortalとPortlet Server
- Apache JetSpeedおよびUser's Guide
- eXoとJboss
- Apache Pluto
- GateIn Portal Project
- Vignette Portal
- WebSphere Portal
- IBM Portlet API
- Sun Liferay Portal:オープンソースポータル
- Sun OpenPortal(ソースと詳細情報についてはこちらを参照のこと)
- Oracle Portal



