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