82.参考: Spring MVCでTilesを使用する方法

概要

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)>

<!-- View(以前の記事とは赤字のプロパティの箇所だけが違います) -->

<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">

<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>

<property name="prefix" value="/WEB-INF/jsp/"/>

<property name="suffix" value=".jsp"/>

<property name="order" value="2"/>

</bean>

<!-- Tilesの設定 -->

<bean id="tilesConfigurer"

class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"

p:definitions="/WEB-INF/jsp/tiles/common/tiles.xml" />

<!-- Teils の View Resolver -->

<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">

<property name="order" value="1"/>

<property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/>

</bean>

【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)>

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE tiles-definitions PUBLIC

"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"

"http://tiles.apache.org/dtds/tiles-config_2_0.dtd">

<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)>

<%@ page language="java" pageEncoding="utf-8"%>

<!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