読者です 読者をやめる 読者になる 読者になる

なみひらブログ

学んだことを日々記録する。~ since 2012/06/24 ~

SpringMVCアプリケーションにTilesを適用するときにやったことメモ

html Java jsp SpringFramework Web プログラミング

背景

最近いろんなところで画面構築に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

参考

*1:対応する上で利用したのが全部spring配下のクラスだったので要らないかと思ったけど追加が必要でした