Top / JBoss / JBoss Portalを使う

JavaWorld2006/03号に特集されていたJBoss Portalを使ってみます。JBoss PortalJSR-168に準拠したポータルサーバです。

インストール

ダウンロード

http://www.jboss.org/products/jbossportal/downloads よりダウンロードします。JBossが同梱されている物もありますが、今回は

JBoss Portal Binary 2.2

をダウンロードしてインストールします。

インストール

インストールは簡単で、ファイルを解凍してJBossのDeployディレクトリ*1

を置くだけです。これでJBoss起動時にPortal Serverが起動されます。データベース設定ファイルは、HSQLDBを使うのならば portal-hsqldb-ds.xmlというファイル(解凍したときのsetupディレクトリにある)を同じくDeployディレクトリに置くだけです。

使ってみる

まずはアクセス

http://localhost:8080/portal/ にアクセスするとトップページが表示されます。

top.png

このトップページから管理画面などへ入ることができます。左上のログインから遷移して、admin/admin で管理画面を表示することができます。管理画面には

などが用意されています。

manager.png

Portletなどを組み込む

さて、自作のPortletをポータルコンテナに組み込んでいきます。Portletを組み込むには、普通(?)通りのエンタープライズアプリケーションを作成し、JBoss Portalが動いているJBossサーバにearをデプロイするだけみたいです。

WEB-INF配下に以下のファイル群を置いていきます。

portlet.xmlはJSR168の仕様内のファイルみたいです。

<portlet-name>HelloPortlet</portlet-name>
<portlet-class>nu.mine.kino.portlets.HelloPortlet</portlet-class>

などのようにして、ポートレット名と実際のクラス名を関連づけます。

jboss-app.xmlは

<jboss-app>
  <app-name>helloworld</app-name>
</jboss-app>

のようにして、このwar内のポートレットのアプリ名を記述します。

*-object.xmlは実際のポートレットの配置などを定義するファイルのようです。たとえば

<?xml version="1.0" encoding="UTF-8"?>
<deployments>
  <deployment>
    <if-exists>overwrite</if-exists>
    <parent-ref>default</parent-ref>
    <properties/>
    <page>
      <!-- tabにあらわれる -->
      <page-name>Hello World MyPage</page-name>
      <properties/>
      <window>
      <window-name>HelloWorldPortletWindow</window-name>
      <instance-ref>HelloWorldPortletInstance</instance-ref>
      <region>center</region>
      <height>0</height>
      </window>
    </page>
  </deployment>
  <deployment>
    <if-exists>overwrite</if-exists>
    <instance>
      <instance-name>HelloWorldPortletInstance</instance-name>
      <component-ref>helloworld.HelloPortlet</component-ref>
    </instance>
  </deployment>
</deployments>

などのようにします。

<component-ref>helloworld.HelloPortlet</component-ref>

は[アプリ名].[ポートレット名]ってなってるみたいです。

この辺はそのうち、後述します*2

また、実装クラスはこんな感じ:

package nu.mine.kino.portlets;

import java.io.IOException;

import javax.portlet.GenericPortlet;
import javax.portlet.PortletException;
import javax.portlet.PortletSecurityException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

/**
 * @author Masatomi KINO
 * @version $Revision$
 */
public class HelloPortlet extends GenericPortlet {
    protected String getTitle(RenderRequest request) {
        System.out.println(super.getTitle(request));
        return "Hello Portlet Example!";
    }

    protected void doView(RenderRequest request, RenderResponse response)
            throws PortletException, PortletSecurityException, IOException {
        response.setContentType("text/html");
        response.getWriter().println("Hello Portlet!!");
    }
}

データベースをMySQLにする

$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2 to server version: 5.0.15-max-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create database jbossportal;
Query OK, 1 row affected (0.03 sec)

mysql> grant all privileges on jbossportal.* to portal identified by 'xxxx';
Query OK, 0 rows affected (0.04 sec)

mysql>

としてjbossportalというデータベースとそのデータベースにアクセス可能なportalというユーザを作成します。先ほど置いたportal-hsqldb-ds.xmlは削除して、代わりにportal-mysql-ds.xmlを置きます。パラメタはIPやパスワードなど、適当に変えておきましょう。 次にJBossを起動したときに、自動的にテーブルが作成されるみたいです。見てみたところ、以下のようになってました。

mysql> show tables;
+-------------------------+
| Tables_in_jbossportal   |
+-------------------------+
| JBP_CONTEXT             |
| JBP_INSTANCE            |
| JBP_INSTANCE_PREF       |
| JBP_INSTANCE_PREF_VALUE |
| JBP_OBJECT_NODE         |
| JBP_PAGE                |
| JBP_PORTAL              |
| JBP_PORTAL_MODE         |
| JBP_PORTAL_OBJECT       |
| JBP_PORTAL_OBJECT_PROPS |
| JBP_PORTAL_WINDOW_STATE |
| JBP_SECURITY_CONSTRAINT |
| JBP_SECURITY_POLICY     |
| JBP_WINDOW              |
| jbp_role_membership     |
| jbp_roles               |
| jbp_user_pref           |
| jbp_user_pref_set       |
| jbp_user_pref_value     |
| jbp_user_prefs_group    |
| jbp_user_prop           |
| jbp_users               |
+-------------------------+
22 rows in set (0.01 sec)

なんかエラーが一杯コンソールにでてたので、うまくいってないみたいですが、とりあえずこんな感じです。エラーはコミットをしてないから?みたい。。何度かJBossを再起動したら動くようになったみたいですね。

Portletの各メソッドのよばれるタイミング

init()
ポートレットコンテナがポートレットをインスタンス化したときに呼び出されます。このメソッドに、ポートレットによる要求処理を準備するためのロジックを組み込みます。
destroy()
ポートレットコンテナがポートレットを破棄するときに呼び出されます。このメソッドに、ポートレットが不要になったり、サーバーが停止するときに実行するクリーンアップロジックを組み込みます。
processAction()
ユーザーがポートレットに変更内容を送出した後で呼び出されます。このメソッドの中で、ユーザーからの入力を処理します。
render()
デスクトップでポートレットが再描画されるたびに呼び出されます。

これらのコンテナから直接呼び出されるメソッドに加えて、render() メソッドを実装した GenericPortlet? クラスが提供されています。このクラスは、描画要求をポートレットのモードに応じた描画メソッドに渡します。開発者は GenericPortlet? クラスのサブクラスを作成し、これらの特別な描画メソッドのうち、ポートレットに必要なものを実装できます。これらの描画メソッドを次に示します。

doView()
ポートレットが表示モードの場合に render() から呼び出されます。このメソッドに、ポートレットの表示ページの描画ロジックを組み込みます。
doEdit()
ポートレットが編集モードの場合に render() から呼び出されます。このメソッドに、ポートレットの編集ページの描画ロジックを組み込みます。
doHelp()
ポートレットがヘルプモードの場合に render() から呼び出されます。このメソッドに、ポートレットのヘルプページの描画ロジックを組み込みます。

はまったのが、processActionで引数のオブジェクトActionRequest?にrequest.setAttribute("hoge",hoge)して JSP側でrequest.getAttribute("hoge");してて取れねーってやってました。正しくはもう一つの引数ActionResponse?に対して、response.setRenderParameter?("hoge",hoge);して、doView()の引数RenderRequest?にrequest.setAttribute("hoge",hoge)する。んで、JSP側では、(たぶん)

<portlet:defineObjects/>
<%
  Object hoge = renderRequest.getAttribute("hoge");
%>

とするみたいです。はまったー。。。。

描画をJSPにやらせる。

protected void doView(RenderRequest request, RenderResponse response)
        throws PortletException, PortletSecurityException, IOException {
    // ココでは、ViewをJSPに任せている。
    response.setContentType("text/html");
    getPortletContext().getRequestDispatcher("/WEB-INF/jsp/calcPlus.jsp")
            .include(request, response);
}

関連リンク


この記事は

選択肢 投票
おもしろかった 6  
そうでもない 0  

Top / JBoss / JBoss Portalを使う

現在のアクセス:17958


*1 ${JBOSS_HOME}/server/default/deploy とか
*2 ていうかいろいろやってる最中

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS