// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。

JavaWorld2006/03号に特集されていたJBoss Portalを使ってみます。JBoss PortalはJSR168に準拠したポータルサーバです。
[[JavaWorld2006/03号:http://www.amazon.co.jp/exec/obidos/redirect?tag=kinosite-22&creative=203&camp=23&link_code=st1&path=ASIN/B000APJZDI]]に特集されていた[[JBoss Portal:http://www.jboss.org/products/jbossportal]]を使ってみます。[[JBoss Portal:http://www.jboss.org/products/jbossportal]]は[[JSR-168:http://www.jcp.org/aboutJava/communityprocess/review/jsr168/]]に準拠したポータルサーバです。

#contents


**インストール [#tc92c8f7]
***ダウンロード [#q8d71adb]
http://www.jboss.org/products/jbossportal/downloads よりダウンロードします。JBossが同梱されている物もありますが、今回は
 JBoss Portal Binary 2.2
をダウンロードしてインストールします。

***インストール [#ce0c33f6]
インストールは簡単で、ファイルを解凍してJBossのDeployディレクトリ((${JBOSS_HOME}/server/default/deploy とか))に
-jboss-portal.sar
-データベース設定ファイル

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

**使ってみる [#ee14053e]
***まずはアクセス [#m82d5c42]
http://localhost:8080/portal/ にアクセスするとトップページが表示されます。

#ref(top.png)

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

などが用意されています。
#ref(manager.png)


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


WEB-INF配下に以下のファイル群を置いていきます。
-portlet.xml
-jboss-app.xml
-*-object.xml

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>
は[アプリ名].[ポートレット名]ってなってるみたいです。

この辺はそのうち、後述します((ていうかいろいろやってる最中))

また、実装クラスはこんな感じ:
 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にする [#oc549576]
 $ 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の各メソッドのよばれるタイミング [#sf972113]
: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にやらせる。 [#s3729f0a]
 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);
 }






**関連リンク [#c2168e9b]
-[[JBoss Portal Documentation Library:http://www.jboss.org/products/jbossportal/docs]]
-[[JSR 168 − Java ポートレット仕様 − 入門:http://sdc.sun.co.jp/javasystem/techtips/wp_sunoneportalsrvr_jsr168.html]]
-[[「eXo Platform」で体験するポータル・サイト開発:http://www.javaworld.jp/technology_and_programming/-/15962-5.html]]


----
この記事は
#vote(おもしろかった,そうでもない)
#vote(おもしろかった[9],そうでもない[0])
-MySQLはLinuxだとOKみたいだけど、何故かlocalhostのWindowsではダメだったなあ。 -- [[きの]] &new{2006-02-01 09:17:24 (水)};
-MySQLだと、Managerタブが出てこない。。。adminにRoleたして再起動してとか適当やったらうまくいったけど。。。。。 -- [[きの]] &new{2006-02-01 10:05:04 (水)};
-renderRequest と通常のrequestどっちから取ればよいか、ようわからんですね。 -- [[きの]] &new{2006-02-01 22:47:09 (水)};
-たまにDeployするとエラーに。プロジェクトのキャッシュを削除。.metadata\.plugins\org.eclipse.core.resources\.projects -- [[きの]] &new{2006-02-02 16:08:57 (木)};
-JBoss Portalに限らずJBossの話。文字化けが発生したので対処。文字コードがUTF-8だったので、FilterのsetCharacterEncodingはUTF-8にしないとダメだね。さらにTomcat5.5から、setCharacterEncodingメソッドはgetのみエンコードしない、という仕様になったため、混乱したっ。解法はこちら[[TomcatのServletRequest#setCharacterEncoding()問題まとめ:http://d.hatena.ne.jp/hyperash/20040309#1078809879]] -- [[きの]] &new{2006-02-02 17:18:49 (木)};
- Windows環境でやっております。う、うまくいきません、、、 -- [[Fuji]] &new{2007-07-06 (金) 02:58:03};

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}


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