図1●Shaleのイメージ
[画像のクリックで拡大表示]
図2●アプリケーションのサンプル
[画像のクリックで拡大表示]
前回は Strutsプロジェクトで開発が進められている Shale の概要について紹介した。今回はその続きでShaleについてさらに踏み込み,アプリケーションを作成しながらShaleの機能を紹介してゆこう。
Struts 2.0として提案されたShale
まずは,Shaleについて簡単に復習しよう。ShaleはStrutsの生みの親でありJSF1.0,1.1のスペックリードでもあるCraig McClanahanによって,Struts2.0として提案されたプロダクトだ。ただし,現在のStruts(バージョン1系)とはあまりにもアーキテクチャが違うため,Struts2.XとはせずにShaleという名前でStrutsプロジェクトのサブプロジェクトとして承認され開発が開始された。
Strutsとの大きな違いは Strutsが Servlet,JSP(JavaServer Pages)テクノロジをベースに構築されていたのに対し,ShaleはJSF(JavaServer Faces)をベース・テクノロジに据えている点だ。すなわちShaleはJSFを拡張したWebアプリケーション・フレームワークといえるだろう。
JSFを全面的に採用したことでStrutsで提供されていた多くのカスタムタグは不要となり,プレゼンテーションの作成はJSPファイルにJSTLおよびJSFのカスタムタグを利用するようになった。また,JSFを採用したことでJ2EEのメインストリームテクノロジ(この表現が正しいかは今後のJSFの浸透度にもよるが)とのかい離も避けることができ,Shaleを採用したアプリケーション構築においても,技術者の確保も今後は容易になると思われる。
では,Shaleはどのような機能をJSFアプリケーションに提供するのだろうか。これは,前回も簡単に触れたが,現時点では以下のような機能が予定されている。まだ,βリリースにも満たない開発途中のプロダクトのため,すべての機能が実装されてはいないが,その方向性が分かるだろう。
View Controller : ビュー管理
Dialog Manager : ページフロー管理
Application Manager: アプリケーション管理
Validation : 入力検証
Remoting : AJAXサポート
Spring Integration : Spring Frameworkとの統合
Reusable Views : 再利用可能なビュー管理
Test Framework : 単体テスト
これら機能のうち一部はJSFと重複しているものもある。しかし,JSFの機能を十二分に知りながらあえてShaleによって提供しているというのは非常に興味深い(スペックリードとしての自分を否定しているかにも見える:-)。筆者が思うにJSFでは様々な事情から十分満足できなかった部分が多々あるのだろう。これら機能のほとんどは,必要な時にアプリケーションに組み込むようになっている。それらは,Strutsと異なりフィルタやリスナの形態をとっている。そして,Shale自身もフィルタとして提供されている。まさにShale(頁岩)の名の通り,ブラウザとアプリケーションの間に幾十にも機能が積み重なるイメージである。
Shaleアプリケーションの構造
Shaleによるアプリケーションを作成する場合,JSFの知識が不可欠であるが本項ではJSFの説明は割愛する。
まず,今回作成するアプリケーションの概要を説明しておく。サンプルのアプリケーションは説明の簡素化のために,非常にシンプルなアプリケーションとした。具体的には整数の四則演算を行い結果を別のページに表示するだけのもので,下図のような遷移をもつ簡単なものだ。
Shaleアプリケーションを作成する場合でもアプリケーションのディレクトリ構造は,通常のJ2EE Webアプリケーションと同じである。Shaleで必要となるjarファイルを表1に示す。shale自身のjarファイル以外に,JSFのjarとjstlのjar,commonsのプロダクトが必要となる。また,SpringFrameworkにビーン管理を行わせる場合,SpringFrameworkのjarファイルも必要となる。
表1●Shaleで必要となるjarファイル
-----------------------------+----------------------------
Shaleのjarファイル | shale-clay.jar
| shale-core.jar
| shale-spring.jar
-----------------------------+----------------------------
commonsのjarファイル | commons-beanutils.jar
| commons-chain.jar
| commons-collections.jar
| commons-digester.jar
| commons-logging.jar
| commons-validator.jar
-----------------------------+----------------------------
JSFのjarファイル | jsf-api.jar
| jsf-impl.jar
-----------------------------+----------------------------
JSTLのjarファイル | jstl.jar
| standard.jar
-----------------------------+----------------------------
SpringFrameworkのjarファイル | spring-beans.jar
| spring-context.jar
| spring-core.jar
| spring-web.jar
-----------------------------+----------------------------
また,web.xmlにはJSFの利用定義以外に,リスト2のようにShaleをJSFサーブレットに対するフィルタとして定義する必要がある。
リスト1●web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Struts-Shale Sample</display-name>
<!-- Shale Application Controller Filter -->
<filter>
<filter-name>shale</filter-name>
<filter-class>
org.apache.shale.faces.ShaleApplicationFilter
</filter-class>
</filter>
<!-- Shale Application Controller Filter Mapping -->
<filter-mapping>
<filter-name>shale</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- JavaServer Faces Servlet Configuration -->
<servlet>
<servlet-name>faces</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- JavaServer Faces Servlet Mapping -->
<servlet-mapping>
<servlet-name>faces</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<!-- Welcome File List -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
ShaleではWebデプロイメント・ディスクリプタ(WEB-INF/web.xml)以外にJSFの設定ファイル(WEB-INF/faces-config.xml)と,必要に応じて様々な設定ファイルを用意する。利用するShaleの機能によってそれぞれの専用設定ファイルを用意するといえば良いだろうか。
まずは,View Controller機能を利用する方法を紹介しよう。