tilesについて | Java Springの逆引きメモ

Java Springの逆引きメモ

JavaのSpring frameworkのメモを書いていきます!
初心者の勉強ノートなので間違いがあるかもしれませんが、何かヒントになることがあれば幸いです。

'2012.03.23 追記

このブログで扱っているSpringMVCのバージョンは2.5で、情報が古くなっています。

現状、アノテーションを使用してかなり柔軟で使いやすくなっていますにひひ

この記事を削除することはしませんが、最新の情報を検索されることをお勧めします。

Spring MVC 3.xについて(日本語の記事)




-----------------------

SpringにもTilesがあるぞ!

ということで、ちょっと調べたメモです。



【使用あたって】

まず、apacheのtilesのバージョンによっては使用できないということをお伝えせねばなりませぬ。。


tilesは、apacheのフレームワークです。

 http://tiles.apache.org/


現在の最新バージョンは 2.1.2です。

そしてSpringが対応したバージョンは、tilesの2.0.4のようです。


どうも、tiles 2.1.x以降ではエラーがでるようです。


以下に記述するのは実際試したわけではなく、WEBのいろいろな方のブログなどを読んだ情報です。



<エラーの原因>

SpringではSpringで用意しているTilesConfigurerというクラスを使用してTilesの初期化をするようです。

その初期化の際に、tiles2.1.xではdepricatedされたメソッドを呼び出しているようです。

そのためエラーになっているようです。


 http://forum.springsource.org/archive/index.php/t-65907.html



<回避方法>

上記のリンクに原因とともに回避方法も書かれているのですが、自分はうまく行きませんでした。

すみません。単に英語が良く分かっていないからだと思うので、

こちらも参照してもし解決されたら幸いです!


TilesConfigurerを自作して回避する方法:

http://richardbarabe.wordpress.com/2009/02/23/apache-tiles-2-integration-with-spring-mvc/



結局、tilesの2.0.xの古いバージョンを使用するか、Strutsを使用するのが手っ取り早そうです。

また、上記のリンクによると、現在の最新Spring3でも改修されていなくて、予想では次のリリースなどで

改修されるかもとのことのようです。


tilesの2.0.x系のダウンロードは例えば以下でできます。

 http://mirrors.isc.org/pub/apache/tiles/v2.0.7/


 ※ただし、tilesのdefinitionの中でワイルドカードを使用できるのは2.1.x以降のようです。
  http://tiles.apache.org/framework/tutorial/advanced/wildcard.html



【使用方法】

使用方法は、こちらのリンクに書かれています。

SpringのTiles機能(Spring本家のHP)


このリンクを参照すれば問題ないかと思います。

でも一応、tiles 2.0.7を使用した場合の例を軽く見ていきます!


<準備>

①tilesをダウンロードします。(tiles-2.0.7-bin.zip)

 http://mirrors.isc.org/pub/apache/tiles/v2.0.7/  


②eclipseのlibにjarをドラッグ&ドロップします。

 tiles-api-2.0.7.jar

 tiles-core-2.0.7.jar

 tiles-jsp-2.0.7.jar



<Spring設定ファイル(/WEB-INF/xxx-servlet.xml)>

以下の記述を追記します。


<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/tiles/defs/tiles-def.xml</value>
</list>
</property>
</bean>

<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/>
</bean>


<!-- マッピング -->

<bean id="handlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/ttt.html">tileNameController</prop>
</props>
</property>
</bean>


<!-- テスト用のコントローラ。何でもいいです。 -->
<bean id="tileNameController" class="org.springframework.web.servlet.mvc.UrlFilenameViewController">
</bean>



<tiles定義ファイルの作成(/WEB-INF/tiles/defs/tiles-def.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="ttt" template="/WEB-INF/tiles/layouts/classic.jsp">
<put-attribute name="title" value="Tiles tutorial homepage" />
<put-attribute name="footer" value="/WEB-INF/tiles/footer.jsp" />
</definition>

</tiles-definitions>



<classicファイルの作成(/WEB-INF/tiles/layouts/classic.jsp)>

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles " prefix="tiles" %>
<html>
<head>
<title><tiles:getAsString name="title"/></title>
</head>
<body>
<table>
<tr>
<td colspan="2">
</td>
</tr>
<tr>
<td colspan="2">
<tiles:insertAttribute name="footer" />
</td>
</tr>
</table>
</body>
</html>



<footerファイルの作成(/WEB-INF/tiles/footer.jsp)>

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>

ふったです!



<表示>

以下のURLでおそらく表示できると思います。

 http://localhost:8080/XXX/ttt.html


 XXXは自分で設定したドキュメントルートを記述してください。



【説明】

なんとなくどのようになっているかは分かると思います。

Springの設定ファイルに、tilesのbean (tilesConfigurer)が設定されています。

初期化と、tilesの定義ファイルを決めることができます。


tileNameControllerはSpringで用意されているコントローラで、UrlFilenameViewControllerクラスです。

リクエストのあったURLをそのままJSPファイルのパスに置き換えて、

置き換えられたパスにあるJSPファイルを表示します。


ただし今回の場合は、viewResolverでTilesを設定しています。

これはJSPファイル名の変わりにtilesで定義された定義名を呼び出すことになります

つまり、http://localhost:8080/XXX/ttt.html  にアクセスがあった場合、"ttt"という定義を

tiles-def.xmlファイルから探します。


すぐに見つかりますね!

それが表示されるのです。



【tiles-definitionsの内容(tiles-def.xml)】

定義ファイルでは、定義名と、使用する文字列やJSPファイルを記述します。


titleは文字どおりタイトルの文字列を記述していて、classic.jspで

 <tiles:getAsString name="title"/>

というように取り出しています。

footerは、JSPファイルのパスを指定していて、classic.jspで

 <tiles:insertAttribute name="footer" />

というように取り出しています。


こうすることで、classic.jspのようなファイルを1つ作って何回も使いまわしできますよね。

定義ファイルでいくらでもfooterに使うJSPファイルやタイトルを変更できますから!



補足:

ここではファイルを/WEB-INF/tilesなどの下に置くようにしました。
定義ファイルへの記述が長くなって大変かと思います。

/WEB-INFのひとつ上のパスに置けば、/footer.jspなどのように簡潔に記述できます。

tilesのデフォルトサンプルではそうなっていますが、ここではいきなり/footer.jspなどと記述しても

どこにおいていいか分からないかと思い、わざとWEB-INFの下におく構成にしました。


各自分かりやすい場所におきましょう!



補足2:

tiles-def.xmlで使用できる定義名について。

定義名には、ピリオド「.」、スラッシュ「/」なども使用できるようです。

ですので、

<definition name="/WEB-INF/jsp/top.jsp" template="/WEB-INF/jsp/top.jsp">
</definition>

なんて記述することもできます。





参考:

・トップ

・tilesとは?

・SpringMVCの機能について