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