Spring MVCはデフォルトのビューはJSPみたいですね。
JSPでも問題ないのですが、せっかくなのでTilesを使ってみたいと思います。
僕の印象ではTilesは、それ自体がテンプレートシステムというより、構造を管理できるシステムという印象を持っています。
なので、Tilesで各ビューの構造を管理し実際のビューはJSPで書きたいと思います。
では、まずはpomにTilesの依存を追加していきます。
pom.xmlにTilesの依存を追加
pom.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>
Apache TilesがSLF4jを使っているので合わせて追加しておきます。
Springの設定を変更
mvc-dispatcher-servlet.xmlを編集します。
<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>
ハイライトした行は変更しました。
後は、追加してます。
デフォルトはTilesを使って、見つからなかった場合はJSPを探しにくような設定です。
(tilesが見つからなかった場合の動作確認までは行えていません・・・)
Tilesの設定ファイルを作成
新たに、Tilesの設定ファイルを追加します。上記で設定ファイルまでのパスを指定しているので、そこに作成します。
<?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>
ベースとなるレイアウトを準備してページでは変更部分だけ差し替えています。
ベースレイアウト用のjspを作成
ベースレイアウト用のJSPを作成します。tiles.xmlに記述したパスになるように作成します。
<%@ 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用のindex.jspを作成します。tiles.xmlに記述したパスになるように作成します。
とりあえずテストなので
Tilesだよ
としておきます。
Controllerを作成
せっかくなので新しくControllerを作成します。
@Controller @RequestMapping("/") public class IndexController { @RequestMapping(method = RequestMethod.GET) public String index(Model model) { return "index"; } }
/でアクセスすると、呼び出されるように設定しました。
表示させてみます
Tomcatを再起動してコンテキストにアクセスすると、
と表示されればOKです。
まとめ
正直なところ、この程度のことであればJSPのincludeあたりを使ってできると思いますが、いまいち構造管理としては弱いのでTilesを使ってみました。
技術者目線から見ると、ある程度重複を除外できて便利なんですけど、技術者だけで仕事をするわけじゃないですからね。
構造化すると、システムを動かすまでプレビューできないということなので、デザイン修正などでデザイナーの方に作業依頼する時・・・ってなりそうな予感がします。
これ、どうやって防いでるのかなーと思います。画面デザインを完パケで納品してもお客様のレビュー時に修正することなんてよくあるし、そのたびにデザイナーさんから「ギャー」って言われるような気がします。
まぁ、今回は自分しか触らないのでTilesを使っていきます。