Thymeleafの式について。
|
th:text等のThymeleafの属性にはThymeleafの式を書く。
式なので、数値の四則演算や文字列の結合等を記述する事が出来る。
「${変数名}
」で変数の値を取得できる。
これは、ControllerのModelにセットした値の取得となる。
package com.example.demo.web; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class VariableController {
@RequestMapping(path = "example/variable")
public String init(Model model) {
model.addAttribute("hoge", "zzz");
return "variable";
}
}
〜 <h1>変数式</h1> <p th:text="${hoge}">変数式の実験</p> 〜
↓生成されるHTML
〜
<h1>変数式</h1>
<p>zzz</p>
〜
Modelにクラス(JavaBeans等)のインスタンスをセットし、そのフィールド(プロパティー)の値を取得することも出来る。
「${変数名.プロパティー名}
」の様に記述する。
public class VariableForm { private String message; 〜setter/getter〜 }
VariableForm form = new VariableForm();
form.setMessage("foo");
model.addAttribute("variableForm", form);
<p th:text="${variableForm.message}">変数式の実験</p>
↓生成されるHTML
<p>foo</p>
例えば変数の内容がListで要素数を取得したい場合、Listにはsizeメソッドがあるので、「${変数名.size()}
」で取得できる。
また、ListやMap等に関しては組み込みのユーティリティーオブジェクトがあるので、「#lists.size(変数名)
」で取得することも出来る。
どちらの場合も、変数の値がnullの場合は例外が発生する。
「${変数名.プロパティー名}
」に対し、th:object属性で変数名を指定(選択)しておくと、
「*{プロパティー名}
」でその変数のプロパティーの値を取得できる。
<h2>選択変数式</h2> <p th:object="${variableForm}"> <span th:text="*{message}">選択変数式の実験</span> </p>
↓生成されるHTML
<p>
<span>foo</span>
</p>
「@{パス}
」でURLを記述しておくと、実行時のコンテキストに従ったURLが生成される。
主にth:href等のURLを指定する属性で使用する。
<h2>リンクURL式</h2>
<a href="index.html" th:href="@{/index}">URLの実験</a>
↓生成されるHTML
<h2>リンクURL式</h2>
<a href="/index">URLの実験</a>
URL(パス)にパラメーターを設定したい場合は以下のようにする。
model.addAttribute("id1", "a1"); model.addAttribute("id2", "b1");
<a href="index.html" th:href="@{/index/{id1}(id1=${id1})}">URLの実験1</a> <a href="index.html" th:href="@{/index/{id1}?id={id2}(id1=${id1}, id2=${id2})}">URLの実験2</a> <a href="index.html" th:href="@{/index(id1=${id1}, id2=${id2})}">URLの実験3</a>
↓生成されるHTML
<a href="/index/a1">URLの実験1</a> <a href="/index/a1?id=b1">URLの実験2</a> <a href="/index?id1=a1&id2=b1>URLの実験3</a>
丸括弧で囲んで変数定義すると、それを「{変数}
」でパスの一部に指定することが出来る。
変数を定義したがパスで使用しなかった場合、自動的にURLパラメーター(「?」以降の部分)として追加される。
条件に応じてURLを変えたい場合は文字列として記述する。[2017-10-29]
model.addAttribute("condition", true);
<a th:href="@{${condition} ? '/aaa' : '/bbb'}">url1</a> <a th:href="@{!${condition} ? '/aaa' : '/bbb'}">url2</a>
↓生成されるHTML
model.addAttribute("condition", true); |
model.addAttribute("condition", false); |
---|---|
<a href="/aaa">url1</a> <a href="/bbb">url2</a> |
<a href="/bbb">url1</a> <a href="/aaa">url2</a> |
th:text等のThymeleafの属性の中では、文字列(テキストリテラル)はシングルクォーテーションで囲む。
シングルクォーテーション自体を出力したい場合は「\」でエスケープする。
文字列の結合は「+」演算子で行う。
<h2>文字列</h2> <p th:text="'test1\'test2'">文字列の実験</p> <p th:text="'test' + ${hoge}">結合の実験</p>
↓生成されるHTML
<h2>文字列</h2>
<p>test1'test2</p>
<p>testzzz</p>
文章中の一部に変数を埋め込みたい場合は、「|」で囲む記法(リテラル置換)を使うことが出来る。
<p th:text="|test' ${hoge}|">リテラル置換の実験</p>
↓生成されるHTML
<p>test' zzz</p>
リテラル置換では、シングルクォーテーションはエスケープする必要は無い。
「|」自身を記述する事は出来ないようだ。(「\」でエスケープすることは出来なかった)
リテラル置換を他の式の演算に使うことも出来る。
<p th:text="'test' + |(${id1}, ${id2})|">〜</p>