Spring MVCはデフォルトのビューはJSPみたいですね。
JSPでも問題ないのですが、せっかくなのでTilesを使ってみたいと思います。
僕の印象ではTilesは、それ自体がテンプレートシステムというより、構造を管理できるシステムという印象を持っています。
なので、Tilesで各ビューの構造を管理し実際のビューはJSPで書きたいと思います。
では、まずはpomにTilesの依存を追加していきます。
pom.xmlにTilesの依存を追加
pom.xmlを編集します。
[xml]
<!-- Tiles -->
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-api</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-core</artifactId>
<version>2.2.2</version>
<exclusions>
<exclusion>
<artifactId>jcl-over-slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-servlet</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-template</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!-- slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
[/xml]
Apache TilesがSLF4jを使っているので合わせて追加しておきます。
Springの設定を変更
mvc-dispatcher-servlet.xmlを編集します。
[xml highlight="4"]
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
<beans:property name="order" value="1"/>
</beans:bean>
<!-- 以下追加 -->
<beans:bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<beans:property name="definitions">
<beans:list>
<beans:value>/WEB-INF/tiles.xml</beans:value>
</beans:list>
</beans:property>
</beans:bean>
<beans:bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<beans:property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
<beans:property name="order" value="0" />
</beans:bean>
[/xml]
ハイライトした行は変更しました。
後は、追加してます。
デフォルトはTilesを使って、見つからなかった場合はJSPを探しにくような設定です。
(tilesが見つからなかった場合の動作確認までは行えていません・・・)
Tilesの設定ファイルを作成
新たに、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/tiles/common/layout.jsp">
</definition>
<definition name="index" extends="baseLayout">
<put-attribute name="titleName" value="テスト" />
<put-attribute name="body" value="/WEB-INF/tiles/index.jsp" />
</definition>
</tiles-definitions>
[/xml]
ベースとなるレイアウトを準備してページでは変更部分だけ差し替えています。
ベースレイアウト用のjspを作成
ベースレイアウト用のJSPを作成します。tiles.xmlに記述したパスになるように作成します。
[html highlight="18"]
<%@ 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>
[/html]
ハイライトした行が各ページの内容が差し込まれます。
ページを作成
tiles用のindex.jspを作成します。tiles.xmlに記述したパスになるように作成します。
とりあえずテストなので
[html]
Tilesだよ
[/html]
としておきます。
Controllerを作成
せっかくなので新しくControllerを作成します。
[java]
@Controller
@RequestMapping("/")
public class IndexController {
@RequestMapping(method = RequestMethod.GET)
public String index(Model model) {
return "index";
}
}
[/java]
/でアクセスすると、呼び出されるように設定しました。
表示させてみます
Tomcatを再起動してコンテキストにアクセスすると、

と表示されればOKです。
まとめ
正直なところ、この程度のことであればJSPのincludeあたりを使ってできると思いますが、いまいち構造管理としては弱いのでTilesを使ってみました。
技術者目線から見ると、ある程度重複を除外できて便利なんですけど、技術者だけで仕事をするわけじゃないですからね。
構造化すると、システムを動かすまでプレビューできないということなので、デザイン修正などでデザイナーの方に作業依頼する時・・・ってなりそうな予感がします。
これ、どうやって防いでるのかなーと思います。画面デザインを完パケで納品してもお客様のレビュー時に修正することなんてよくあるし、そのたびにデザイナーさんから「ギャー」って言われるような気がします。
まぁ、今回は自分しか触らないのでTilesを使っていきます。