Java

Spring MVCでビューにApache Tilesを使う

投稿日:2013/09/30 更新日:

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を再起動してコンテキストにアクセスすると、
tilestest
と表示されればOKです。

まとめ

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

今回のプロジェクト

https://github.com/beeete2/springmvc-testwebapp

-Java
-

執筆者:


comment

メールアドレスが公開されることはありません。

関連記事

SpringMVCを使ってみることにしました。

Tomcat3時代のころからJavaでウェブアプリケーションを使っておりますが、フレームワークはあんまり使ったことがありません。 業界標準?だったStruts1も試しに使ってみてxml書くのと存在意味 …

Spockを使いたいからEclipseからIntelliJ IDEAへ移行した話

Javaを書くときはずーとEclipseを使っていましたが最近IntelliJ IDEAへ移行しました。 確かEclipse2のときから使っていたので10年以上は使っていたと思います。 Eclipse …

no image

JavaからTwitter4jを使ってタイムラインを表示してみる

今、Playframework2でTwitterアプリを作っています。 ですが、最初にTwitterの準備をしなければならないことがわかりました。 JavaでTwitterを操作するのであれば・・・。 …

Maven2でwarを実行すると2回目がエラーになる

Mavenでwar:warを実行してWARファイルを作成することがあると思います。 1回目はうまくいくのですが、続けて実行すると失敗してしまいました。 試しに、target以下の作成されたWARファイ …

Maven2でDomaを使ったアプリケーションをコンパイルする方法

JavaのO/Rマッパーの金字塔はなんですかね。 自分で言うのもなんですが、僕は完全にO/Rマッパーの移行に失敗したので、この辺りは疎いのですが・・・。 そんな僕はDomaというO/Rマッパーを使って …