引き続き、Thymeleafのチュートリアルを続ける。4章のスタンダード式構文を読む。なんだ「スタンダード式構文」って。
Tutorial: Using Thymeleaf (ja)
メッセージ
ひきつづき、メッセージについて。メッセージにパラメータを入れたい場合、どうするか。
こんなメッセージプロパティに対して、
err.nofile=ファイル:{0}が存在しません。
こんな感じでパラメータを渡せる。
<p th:text="#{err.nofile(${filename})}"></p>
メッセージキーも変数で渡せるので、エラー表示エリアに好きなメッセージを表示できる。
変数
${xxx}
で取ってきてるものは、実際はctx.getVariable("xxx")
である。しかし、${session.user.name}
は((User) ctx.getVariable("session").get("user")).getName()
のショートハンドである。
ふーん・・・ダサいって印象しかないが・・・まあ、いろいろと仕方がないのである。たぶん。
このスコープのなかでアクセス出来るものにはctxやsession以外にもいろいろあって、Appendix Aにまとまっている。
他に式ユーティリティというものもある。上のAppendix Aのすぐ下にAppendix Bとしてまとまってる。ま、なんかヘルパがあると。
アスタリスク構文
#{xxx}
、${xxx}
に続いて、次は*{xxx}
の話。いっぱいあるネ
*{xxx}
はVB.netのWithみたいなもので、あるオブジェクトの属性をまとめて表示したいよというような時に使うらしい。チュートリアルにある例を見れば、まあ、わかる。th:object
じゃなくてth:with
にすればよかったのにね。ま、VBに寄せても誰も喜ばないか。
<div th:object="${session.user}"> <p>Name: <span th:text="*{firstName}">Sebastian</span>.</p> <p>Surname: <span th:text="*{lastName}">Pepper</span>.</p> <p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p> </div>
リンクURL
まだ続くぞ。次は@{xxx}
だ。URL専用の構文らしい。必要性はよくわからない・・・
フラグメント
まだあるのかよ。次は~{xxx}
だって。フラグメントというものに関わるらしい。しかしながら、チュートリアルの説明文はまったく意味不明だ。
フラグメント式を使用すると、簡単にマークアップのフラグメントを指定したり、テンプレート内でフラグメントを移動したりすることができます。これによって、フラグメントを複製したり、他のテンプレートに引数として渡したりすることができるようになります。
無視して次に進むことにする。ちなみに、ここのサンプルでth:with
が出てくるのでこれはアスタリスク構文には使えなかったようだ(笑)
リテラル
- 文字列リテラルは
'xxx'
("xxx"
で書かれる属性のvalueに入れる必要があるから)。ただし、[A-z0-9\.\-\_\[\]]
だけの文字列はシングルクォートで囲む必要がない(リテラルトークンというらしい) - 数値リテラルは数字そのまま
- 真偽値はtrueとfalse。
${xxx}
の中に書くとJavaの処理系で処理されてしまい、Thymeleafのリテラルだとは扱われないので注意 - nullはnull
文字列の結合
+で結合できる・・・
リテラル置換
・・・が|xxx|
の中ならば${xxx}
を書けば置換されるので+を使う必要はない
算術演算子
まあ、どうでもいい
比較演算子と等価演算子
比較演算子として<
が使えるけど、HTMLの中では<
を使おうねと。ダサっ
条件式
比較演算子や等価演算子を使って真偽値を得て何がうれしいかというと、条件式を使えるから。th:if
みたいなものも使えるし、なんなら属性に対してth:class="${row.even}? 'even' : 'odd'"
みたいな3項演算子みたいなものを使ってもいい(この3項演算子っぽい記法を条件式と呼んでいるのかな?)
デフォルト式(エルビス演算子)
Groovyのエルビス演算子( a ? a : b
をa ?: b
と書くショートハンド。プレスリーのリーゼントに似てるから)もある。
処理なしトークン
_
が評価されると、それを指定されたth:xxx
は作用しなくなり、テンプレートに書いたデフォルトが使われる。
データ変換/フォーマット
${{xxx}}
の様に2重にすると、xxxにtoString()
(もしくは、Springではなんか定義されたなにか)が実行されて文字列になってからテンプレートの評価に回される。ややこしいね
プリプロセッシング
ここまでも十分面倒くさかったが、さらにマクロっぽいものもある。要するに、Themeleafでやる処理(式ユーティリティとか)を${xxx}
の中身より先に評価したいときに使う。まあ、とりあえず使わないわ。
というわけで、長かった・・・次は5章。まだ繰り返し出てこないぞ。