「Thymeleaf」はJavaの代表的なテンプレートエンジンライブラリです。次の特徴があります。
- Webサーバから受け取ったデータを埋め込んで表示できる
- 定義されたロジックをDOM上でXMLタグ・属性で指定。HTMLを静的に表示できる
- パースされたフィアルをキャッシュしてI/Oを最適化し、高速に表示
🐹 Thymeleafのデータ指定方法
リンク/CSS/JS/画像パスの指定:@{...}
リンク/CSS/JS/画像などのパスの記述するために@{...}
の書き方があります。
<link rel="stylesheet" href="../../img/example.jpg" th:href="@{/img/example.jpg}" >
|
自動でコンテキストパスを補完してくれて、HTMLのレスポンスはつぎのようになります。
<link rel="stylesheet" href="/path/to/img/example.jpg" />
|
現在のURLを指定:@{''}
前述のパス指定の応用で@{''}
とすると現在のURLを指定できます。formを使ってひとつのパスでGetのときは表示、Postのときは登録とアクションを振り分けるときに便利です。
<form action="@{''}" method="post"> form>
|
多言語対応:#{...}
多言語対応を行う場合は#{...}
を使います。
<p th:text="#{title}">タイトルp>
|
ロケールファイルはデフォルトがhello.properties
:
日本語はhello_ja.properties
:
HTMLレスポンスは日本語のロケールでは次のようになります。
変数展開:${...}
Webサーバ(Controller)から渡された変数の展開は${...}
を使います。
<p th:text="${title}">タイトルp>
|
HTMLレスポンスはつぎのようになります。
コレクションの変数展開:*{...}
コレクションを順番に処理するようなループ処理では次のように記述します。
<ul> <li th:each="article: ${articleList}" th:object="${article}"> <span th:text="*{title}">タイトルspan> li> ul>
|
HTMLレスポンスはつぎのようになります。
<ul> <li><span th:text="*{title}">最初のタイトルspan>li> <li><span th:text="*{title}">2個目のタイトルspan>li> ul>
|
リテラル置換:|テキスト ${...}|
|テキスト ${...}|
で変数式を組み込んだリテラル置換ができます。
<p th:text="|置換後のテキスト: ${text}|">テキストp>
|
コメント:
レスポンスに含めたくないコメントは
と書きます。
🍮 ロジックを記述するth
タグ
条件分岐:th:if
、th:unless
<p th:if="${#lists.isEmpty(items)}">アイテムがみつかりませんでしたp> <p th:unless="${#lists.isEmpty(items)}" />アイテムが見つかりました!p>
|
th:if
、th:unless
の評価はboolean
以外でも次のように評価します。
number
、char
で0
、null
以外
String
で、false
、off
、no
、null
以外
boolean
、number
、char
、String
以外でnull
以外
多項分岐:th:switch
複数の条件の分岐はth:switch
が使えます。"*"
でデフォルト値を設定できます。
<div th:switch="${month}"> <p th:case="1 th:text=|${month}月|">Janp> <p th:case="2 th:text=|${month}月|">Febp> <p th:case="*">Otherp> div>
|
繰り返し:th:each
<ul> <li th:each="article: ${articleList}" th:object="${article}"> <span th:text="*{title}">タイトルspan> li> ul>
|
[[$(変数)]]
でインライン処理で下記なおすこともできます。
<ul> <li th:each="article: ${articleList}" th:object="${article}"> <span>[[${article.title}]]span> li> ul>
|
ローカル変数の定義:th:with
th:with=変数=値
でテンプレート内で変数を定義できます。
<div th:with="title=hoge,author=john"> <p th:text="${title}">タイトルp> <p th:text="${author}">著者p> div>
|
🚕 HTMLに出力するth
タグ
疑似ブロック:th:block
<th:block th:text="${author}">th:block>
|
author = John Due
の場合、HTMLレスポンスは次のようになります。
値がない場合にタグを表示したくない場合はth:block
を使うのがよさそうです。
サニタイズせずに出力:th:untext
th:untext
でサニタイズせずに内容を出力できます。Controller側で次のように記述します。
model.addAttribute(title, "hoge")
|
テンプレート側は次のように変数を受け取って出力。
<div th:utext="${title}">タイトルdiv>
|
インライン処理:th:inline
タグの中に変数を埋め込むにはth:inline
属性を使い、表示したい変数を[[...]]
で囲みます。
<p th:inline="text">Heelo, [[${author]]!p>
|
author = John Due
の場合、HTMLレスポンスは次のようになります。
🎳 フォームに関すするth
タグ
フォームの入力値管理:th:field
フォームのinputタグのid/name属性の生成や戻る遷移時のvalueの設定はth:field
を使います。
<form method="post" action="#" th:action="@{'/article/create'}" th:object="${form}"> <input type="text" th:field="*{name}" /> form>
|
生成されるHTMLは次のようになります。
<form method="post" action="/article/create"> <input type="text" class="form-control" id="name" name="name" value="" /> form>
|
🍣 クラス定義に関するth
タグ
動的なCSSクラスの定義:th:class
th:class
で動的にCSSクラスを設定できます。(HTMLのclass
を上書きします)
<li th:class="${#strings.contains(content.language,'JP')} ? 'active' : ''">
|
動的にCSSクラスを追加:th:classappend
th:classappend
で動的にクラスを追加できます。
<a href="#" class="baseclass" th:classappend="${isAdmin} ? 'adminclass' : 'userclass'">Go to xxxa>
|
🐯 サポート記法
三項演算子
次のように三項演算子で値をセットできます。
<tr th:class="${row.even}? 'even' : 'odd'"> ... tr>
|
条件を満たさなければnull
をセットすることもできます。(三項演算子の最後要素を省略できます)
<tr th:class="${row.even}? 'alt'"> ... tr>
|
nullの場合のデフォルト値:?:
?:
を使うと、変数の値がnullの場合はデフォルト値を表示できます。
<p th:text="${title}?: 'unknown'">タイトルp>
|
title
がnull
の場合のHTMLレスポンスは次のようになります。
nullでない場合のみチェインを実行:?
値がnull
出ない場合のみメソッドチェインを処理していくこともできます。
<td th:text="${user?.address?.city}">td>
|
パラメータへのアクセス:param
URLが/article?id=123
のパラメータへのアクセスはparam.id[0]
を使います。
<p th:text="${param.id[0]}">idp>
|
日付フォーマット:dates.format
<span th:text="${#dates.format(sprint.releaseDate, 'yyyy/MM/dd')}">Datespan>
|
比較演算子
>
、<
、>=
、<=< code>が利用可能。ただし<
、>
は利用すべきでないのでgt(>)
、lt(<)< code>、ge(>=)
、le(<=)< code>、not(!)
のエイリアスを使うべきです。=)<>
)<>
=<>
<p th:text="6 gt 5">truep> <p th:text="6 le 5">falsep>
|
🎉 ユーティリティオブジェクト
java.util.Date
オブジェクト用のユーティリティメソッド
#dates
はjava.util.Date
オブジェクト用のユーティリティメソッドです。フォーマット、コンポーネントの抽出などがあります。
利用例 |
説明 |
#dates.format(date, 'yyyy/MM/dd HH:mm') |
指定されたパターンで日付をフォーマット(HHは24時間表記) |
#dates.day(date) |
日(1-31)のプロパティを取得 |
#dates.month(date) |
月のプロパティを取得 |
#dates.createNow() |
現在日時の日付オブジェクトを生成 |
#dates.createToday() |
ぜんざい日の日付オブジェクトを生成(時間は00:00) |
数値オブジェクト用のユーティリティメソッド
#numbers
は数値オブジェクト用のユーティリティメソッドです。
利用例 |
説明 |
#numbers.formatInteger(num, 1,'COMMA') |
整数の最小桁数と3桁ごとの区切り文字を設定 |
リスト用のユーティリティメソッド
#lists
はリスト用のユーティリティメソッドです。
利用例 |
説明 |
#lists.isEmpty(list) |
リストが空かどうかをチェック |
#lists.size(list) |
リストがからかどうかをチェック |
🐝 参考リンク
🖥 VULTRおすすめ
「VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。
最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!