サイト共通デザインをテンプレート化する - Tilesプラグイン
Tilesプラグインは、Struts 1時代でも使われていました、Web共通レイアウトを定義するためのテンプレートライブラリであるTilesを利用するプラグインです。レイアウトごとにJSPやHTMLなどを分割し、同じ内容のコンテンツにはリソースを再利用することができます。現在はバージョン2がリリースされており(Tiles2と呼ばれています)、Struts 2用の機能拡張もされています。
ライブラリの準備
今回のライブラリはApache Tilesから最新版であるtiles-2.2.2-binを選択します。ダウンロードファイルを解凍し、次のjarファイルを/WEB-INF/libフォルダへコピーします。
- tiles-core.jar
- tiles-servlet.jar
- tiles-jsp.jar
- tiles-api.jar
また、Tiles2は次のライブラリも使っていますので、併せてダウンロードします。
- commons-digester 2.0以降(最新は2.1)
- slf4j 1.5以降(最新は1.6.1)
commons-digesterはApache commons - commons digester、slf4jはSLF4J - Simple Logging Facade for Javaよりダウンロード後解凍し、以下の3つのjarファイルを/WEB-INF/libフォルダへコピーします。
- commons-digester.jar
- jcl-over-slf4j.jar
- slf4j-log4j12.jar(※今回のサンプルでlog4jを利用しているので必須となっています)
Struts 2のTilesプラグインについてはStruts 2のコアパッケージに同梱されていますので別途入手の必要はありません。Tilesプラグインの設定をすることで利用できるようになっていますので、これでライブラリの準備は完了です。
Tilesの設定
設定する内容は、Tilesプラグインの設定と、Tilesそのものの設定の2種類になります。まずはTilesプラグインの設定です。
Webアプリケーションのweb.xmlに、次のリスナー設定を追加することでTilesプラグインが有効になります。
<?xml version="1.0" encoding="UTF-8"?> <web-app …(省略)… > <listener> <listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class> </listener> </web-app>
次にTilesの設定を行います。Tilesの設定は、画面レイアウト定義用のJSPファイルと、レイアウトの内容を定義したxmlファイルの2つになります。例えば、次の図のような画面レイアウトを想定します。
画面は、ヘッダー、メニュー、ボディ(本文)、フッターの4つのブロックに分割しています。この分割されたレイアウト定義のJSPファイルは次のようになります。
<?xml version="1.0" encoding="UTF-8" ?> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> …(省略)… <%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %> …(省略)… <head> <!-- HTMLのタイトルもTiles定義から取得 --> <title><tiles:getAsString name="title"/></title> </head> <body> <table border="0"> <!-- ヘッダー --> <tr> <td colspan="2"> <tiles:insertAttribute name="header" /> </td> </tr> <!-- 左パネルメニュー / 右パネルボディー --> <tr> <td> <tiles:insertAttribute name="menu" /> </td> <td> <tiles:insertAttribute name="body" /> </td> </tr> <!-- フッター --> <tr> <td colspan="2"> <tiles:insertAttribute name="footer" /> </td> </tr> </table> </body> </html>
単純にブロックをテーブルで区切ります。Tilesを利用するため、JSPの<head>より前の行で <%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>が必須となります。JSP中でtiles:の接頭辞で書かれているタグが、Tilesの機能として使われます。今回はこの中で使われている2つの機能を利用してコンテンツを表示します。
要素名 | 概要 |
getAsString | Tiles定義ファイルから、nameに指定した値をそのまま出力する |
insertAttribute Tiles | 定義ファイルから、nameに指定した値のレスポンス結果を出力する |
insertAttributeではレイアウトごとに区切った画面を設定しています。
次にTiles定義ファイルです。Webアプリケーションの/WEB-INF以下に、tiles.xmlを作成します。以下がその内容となります。
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN" "http://tiles.apache.org/dtds/tiles-config_2_1.dtd"> <tiles-definitions> <definition name="tiles.sample" template="success.jsp"> <put-attribute name="title" value="Tilesサンプルのタイトルです" /> <put-attribute name="header" value="/tiles/header.jsp" /> <put-attribute name="menu" value="/tiles/menu.jsp" /> <put-attribute name="body" value="/tiles/body.jsp" /> <put-attribute name="footer" value="/tiles/footer.jsp" /> </definition> </tiles-definitions>
<definition>要素のname属性はアプリケーション内で使われる画面名となります。この値がStruts 2のActionクラスで呼び出されます。テンプレートとなるファイルをtemplate属性で指定します。この画面で参照される内容を、その子要素である<put-attribute>で指定します。
<put-attribute>要素では、それぞれの名前に対応した値や表示する画面を指定します。複数の画面を設定する場合には、<definition>要素を増やしていきます。
以上で設定は終わりです。
Actionクラス
最後はこのTilesの画面を呼び出すActionクラスです。Tilesプラグインを使うActionでは次のルールに従います。
- tiles-defaultパッケージを継承する
- Resultにtilesを指定する
具体的にソースを見てみましょう。サンプルとなるActionクラスは以下のようになります。
// 名前空間=URLのパス @Namespace("/tiles") // tiles-default継承 @ParentPackage("tiles-default") // Actionの戻り結果 @Results({ @Result(name="success" , type="tiles" , location="tiles.sample" ), }) public class TilesSampleAction extends ActionSupport { @Action("") public String execute() throws Exception { return "success"; } }
大切なところは2か所、@ParentPackageにtiles-defaultを設定すること、@Resultのtype値にtilesを指定し、その遷移先をtiles.xmlで定義した画面名とすることだけです。Actionクラスの実装には、Tiles用に対応するコードを追加することなく使えます。
最後にサンプルを動かした結果が次の図になります。http://127.0.0.1:8080/sample/tiles/ をブラウザで見てみましょう。
このようにレイアウトごとに分割をすることができ、それぞれJSPも利用できますので、JSPの再利用も容易になります。
まとめ
以上簡単ではありますが、Struts 2の解説を終わりとしたいと思います。今まで紹介してきましたインターセプタやプラグインは、すべての場面で必ず使うというものではなく、ケースに合わせて簡単に使い分けられるようにできています。Struts 2本体もまだまだ拡張や改良が進められている最中ですから、今後また大変化をする可能性を秘めています。私の方で個人的に進めているStruts 2の解析サイトもありますので、もし参考にされたい方がいましたら、そのときは引き続きよろしくお願いいたします。