概要Spring MVCで、Tilesを使用する方法を見ていきます。
目標 まず、以下のサンプルの目標(ゴール)を示します。 ここではTilesに必要な設定のみを記述します。 その他の設定や、Controllerのコードは以前のサンプルの記事を参照ください。 【Controllerが返すView名について】 Controllerのメソッドは、通常View名を返します。 今までのサンプルではView名がJSPファイル名を表していました。 Tilesの設定をした場合は、View名はTilesの定義名を表すことになります。 【Tilesの定義ファイル(Tiles.xml)】 定義ファイルには、以前のサンプルの記事のうち、入力画面だけ記述することにします。 あまりいろいろ記述すると分かりにくくなるからです。 【ViewResolverの設定】 以前のサンプルの記事のVewResolverの設定はそのままにしておく方針にします。 つまり、通常のJSPによるViewと、今回追加するTilesによるViewと同時に混在させて使用することにします。 使用サンプル<Springの設定ファイル (WEB-INF/spring/applicationContext-webmvc.xml)>
【JSPのView設定】 2つ以上のView技術を同時に使用する場合は、orderプロパティ(優先順位)を記述します。 上記の例では、JSPは優先順位を2にしました。 Tilesの方は1にしましたので、View名を解決するときはまずTilesから検索して、見つからなければJSPから検索します。 【Tilesの設定】 tilesConfigurerは、Tilesの設定ファイルの場所を指定します。 【TilesのVewResolver】 JSPのViewResolverと同じクラスを使用しますが、viewClassプロパティだけTilesViewに変わっています。 これだけでTilesを使用できるようになります。 もし、ViewにJSPを使用しないのであれば、JSPのViewResolverは削除しても構いません。 また、orderプロパティを記述する必要もありません。 <Tilesの定義ファイル(WEB-INF/jsp/tiles/common/tiles.xml)>
<tiles-definitions> <!-- ベースのレイアウト --> <definition name="baseLayout" template="/WEB-INF/jsp/tiles/common/layout.jsp"> </definition> <definition name="user-Edit-Input" extends="baseLayout"> <put-attribute name="titleName" value="ユーザ情報入力画面" /> <put-attribute name="body" value="/WEB-INF/jsp/tiles/user-Edit-Input.jsp" > </put-attribute> </definition> </tiles-definitions> Tilesを使用したことがある方には特に説明は不要かと思います。 最新のTilesではワイルドカードも使用できます。 上記のようにdefinitionを1つずつ記述すると大変なので、View名のルールを作ってワイルドカードで記述する方がよいかと思います。 <layout.jsp (WEB-INF/jsp/tiles/common/layout.jsp)>
<!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 "> <c:set var="titleName><tiles:getAsString name='titleName' /></c:set> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>${titleName}</title> </head> <body> <div> <div class="body"> <div class="body-header"> ${titleName} </div> <div class="body-content"> <tiles:insertAttribute name="body" /> </div> </div> </div> </body> </html> Tilesのメインです。 内部でbodyを呼び出しています。 <ユーザ情報入力画面 (WEB-INF/jsp/tiles/user-Edit-Input.jsp)><form:form action="confirm.html" method="POST" modelAttribute="form"> <form:hidden path="user.id"/> <table class="data"> <tr> <th><spring:message code="model.user.name" /><br></th> <td><spring:bind path="user.name">${status.value}</spring:bind><br></td> </tr> <tr> <th><spring:message code="model.user.age"/><br></th> <td><form:input path="user.age"/><br><form:errors path="user.age" cssStyle="color:red"/> </td> </tr> <tr> <th><spring:message code="model.user.upDate"/><br></th> <td><form:input path="user.upDate" maxlength="10"/><br> <form:errors path="user.upDate" cssStyle="color:red"/></td> </tr> </table> <br> <input type="submit" value="確認" /> </form:form> Tilesを使用することで、headタグなどを記述しなくてよくなり、すっきりしました。 まとめ ここではTilesを使用する方法を見てきました。 Spring MVCでは、このTilesのサンプルのように、複数のViewの技術を同時に使用することができます。 優先順位をつけ、優先順位の高いものがView名を解決できない場合は、 次の優先順位のViewResolverで解決しようとする、という方法をとります。 ViewResolverは、Velocity、FreeMarker、Excelなど様々なものが用意されていますし、自作することもできます。 かなり幅も広く、自由に使っていけます。 また、上記のサンプルで見ましたように、Controllerのメソッドで返すView名を変更せずに他のView技術に変更することもできるので、 後でVelocityに変えたいような場合でもソースコードをいじる必要がありません。 便利な機能かと思います。 ただ、同時に複数のView技術を使用する場合は、View名の命名ルールはしっかり決めておいた方がよいかと思います。 【View名の補足】 View名にはコロン(:)を使用しないように気を付けてください。 "redirect:"のように予約語に使用されているようです。 Created Date: 2012/04/21 |