Spring Bootで扱うThymeleafについて。
Thymeleafはhtmlを生成するテンプレートエンジン。
独自のタグを使うのではなく、通常のHTMLのタグに独自の属性を追加していく方式となっている。
これにより、変換前のhtmlファイルをそのままブラウザーで表示してデザインを確認することが出来る。
(ブラウザーが解釈できない属性は単純に無視される為)
このため、テンプレートファイルの拡張子はhtmlである。
テンプレートファイルはsrc/main/resources/templates/の下に置く。
(テンプレートでない固定ファイル(cssやimage等)はsrc/main/resources/static/の下に置く)
ControllerのHTTPリクエスト処理メソッドで「hoge/zzz」を返すと、「src/main/resources/templates/hoge/zzz.html」を指すことになる。
Thymeleafでは「th:
」で始まる属性を主に使用する。
例えば「<a href="index.html" th:href="@{/index}">hoge</a>
」というタグがある場合、ブラウザーでそのまま表示するとth:href属性は無視される。
テンプレートエンジンで処理すると、th:hrefで書いたものがhrefに上書きされる。(元のhrefは消える)
こういう処理が行われる(テンプレートのHTMLをXMLとして読み込む)為、テンプレートファイルの内容は正しいXMLである必要がある。
独自タグも「th:block
」というものだけ存在する。
Thymelaef独自のタグや属性のことをダイアレクト(Dialect)と呼ぶ。
Spring BootでThymeleafを扱うにはThymeleafのライブラリーを使用する。
また、セキュリティー(認証)用の「sec:
」系タグを使う場合はそのライブラリーも追加する。
〜 dependencies { compile('org.springframework.boot:spring-boot-starter-data-rest') // REST compile('org.springframework.boot:spring-boot-starter-security') // 認証 compile('org.springframework.boot:spring-boot-starter-thymeleaf') // Thymeleaf compile('org.thymeleaf.extras:thymeleaf-extras-springsecurity4') // secタグを使う場合 runtime('org.springframework.boot:spring-boot-devtools') testCompile('org.springframework.boot:spring-boot-starter-test') testCompile('org.springframework.security:spring-security-test') }
Thymeleafを使用するhtmlファイルのヘッダーは以下のようになる。
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Thymeleaf example</title> </head> <body> 〜 </body> </html>
secも加えると以下のようになる。
<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
Thymeleafの属性(接頭辞「th:
」の属性)は、ほとんど通常のHTMLタグの属性と同じものが用意されている。[2017-10-21]
タグ内に通常のHTMLとThymeleafの同等の属性の両方(例えば「href
」と「th:href
」)が記述されている場合、テンプレート処理が行われると、通常のHTMLの属性は消され、Thymeleafの属性で上書きされる。
(テンプレートファイルを直接ブラウザーで表示した場合、接頭辞「th:
」の属性は無視されるので、通常の属性が使われる)
その他に、Thymeleaf独自の動作をする属性もある。
属性 | 説明 | 更新日 |
---|---|---|
th:if |
条件に応じてタグを出力したり削除したりする。 | 2017-10-21 |
th:remove |
タグを削除する。 | 2017-10-21 |
th:each |
タグを繰り返し出力する。 | 2017-10-21 |