JavaWorld2006/03号に特集されていたJBoss Portalを使ってみます。JBoss PortalはJSR-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/ にアクセスするとトップページが表示されます。 このトップページから管理画面などへ入ることができます。左上のログインから遷移して、admin/admin で管理画面を表示することができます。管理画面には
などが用意されています。 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の各メソッドのよばれるタイミング †
これらのコンテナから直接呼び出されるメソッドに加えて、render() メソッドを実装した GenericPortlet? クラスが提供されています。このクラスは、描画要求をポートレットのモードに応じた描画メソッドに渡します。開発者は GenericPortlet? クラスのサブクラスを作成し、これらの特別な描画メソッドのうち、ポートレットに必要なものを実装できます。これらの描画メソッドを次に示します。
はまったのが、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); } 関連リンク †この記事は
現在のアクセス:18375 |