SpringMVCアプリケーションにTilesを適用するときにやったことメモ
背景
最近いろんなところで画面構築にTilesというフレームワークが使われているので、ちょっと動作確認してみると仕組みの勉強のメモです。Apache Tiles - Home
作業メモ
Tilesライブラリへの依存追加
pom.xmlにTilesライブラリへの依存を追記します*1。<dependency> <groupId>org.apache.tiles</groupId> <artifactId>tiles-extras</artifactId> <version>3.0.5</version> </dependency>
Springの設定ファイルへの追記
ControllerとTilesをつなぐために、新しくViewResolverを追加します。- spring-context.xml
(中略) <!-- Web --> <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver" > <!-- 今回追加したViewResolver --> <property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView" /> <property name="order" value="0" /> <!-- 以下のviewResolverよりも優先度を高くしておく --> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" > <!-- もともとあったViewResolver --> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> <property name="order" value="1" /> <!-- Tiles対応したら不要になるけど一応残しておく --> </bean> <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer" > <property name="definitions"> <list> <value>/WEB-INF/tiles/definition.xml</value> <!-- Tilesの定義ファイルの指定 --> </list> </property> </bean> (中略)
Tilesの定義
Tilesの定義ファイルで画面のレイアウトなどの定義を行います。- 定義ファイルの内容は、各画面によって変わらない不変要素を親テンプレートとして定義しておいて、変動部分を各画面で定義すると良いらしい
- "name"で指定した値がControllerのメソッドの返り値(文字列)になります。
- definition.xml
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" "http://tiles.apache.org/dtds/tiles-config_3_0.dtd"> <tiles-definitions> <definition name="baseLayout" template="/WEB-INF/views/common/layout.jsp"> <put-attribute name="header" value="/WEB-INF/views/common/header.jsp" /> <!-- 各画面で変わらない要素 --> <put-attribute name="navigation" value="/WEB-INF/views/common/navigation.jsp" /> <!-- 各画面で変わらない要素 --> <put-attribute name="footer" value="/WEB-INF/views/common/footer.jsp" /> <!-- 各画面で変わらない要素 --> </definition> <definition name="home" extends="baseLayout"> <put-attribute name="title" value="ホーム画面" /> <!-- 各画面で変わる要素 --> <put-attribute name="body" value="/WEB-INF/views/home.jsp" /> <!-- 各画面で変わる要素 --> </definition> <definition name="user" extends="baseLayout"> <put-attribute name="title" value="ユーザ設定" /> <!-- 各画面で変わる要素 --> <put-attribute name="body" value="/WEB-INF/views/user.jsp" /> <!-- 各画面で変わる要素 --> </definition> </tiles-definitions>
テンプレートの定義
上で定義することになる画面レイアウト(layout.jsp)を定義します。- insertAttributeで定義されている"name"の部分に上で定義したJSPが挿入されたものが、リクエスト元に返却されます。
- (もうちょい凝ったレイアウトにしたい(;´Д`))
- layout.jsp
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <html> <head> <title><tiles:getAsString name="title"/></title> <tiles:insertAttribute name="header" /> </head> <body> <tiles:insertAttribute name="navigation" /> <tiles:insertAttribute name="body" /> <tiles:insertAttribute name="footer" /> </body> </html>
Controllerの実装
リクエストを受けて、Tilesで定義した文字列を返すようなControllerを書きます。- HomeController.java
@Controller public class HomeController { @RequestMapping(value = "/home", method = GET) public String get() { return "home"; // ここで返した値をtilesViewResolverが解釈し、Tilesのビュークラス(TilesView)に渡してくれる。 } }
まとめ
今まで以下のような<jsp:include page="../footer.jsp"/>
のようなのを各画面に書いて頑張っていたけど、だいぶ楽になりそう(´・ω・`)b
参考
- Apache Tiles - Home
Spring3入門 ――Javaフレームワーク・より良い設計とアーキテクチャ
- 作者: 長谷川裕一,大野渉,土岐孝平
- 出版社/メーカー: 技術評論社
- 発売日: 2012/11/02
- メディア: 大型本
- 購入: 8人 クリック: 115回
- この商品を含むブログ (14件) を見る
*1:対応する上で利用したのが全部spring配下のクラスだったので要らないかと思ったけど追加が必要でした