⚠️注意あり⚠️ ThymeleafテンプレートからJavaのStaticリソースにアクセスする方法 

Thymeleafテンプレートから、JavaのStaticリソースにアクセスしたいときってありませんか？（例えばEnumの要素をif判定で使いたいときとか）

そんなときThymeleafにはテンプレートからJavaのStaticリソースにアクセスできる便利な関数があります。

# T()関数
JavaのMathクラスにあるstaticなリソース（ここではフィールドやメソッドを指しています）に対して、Thymeleafからアクセスしてみましょう。
```html:sample.html
<!-- staticフィールドにアクセス -->
<input type="number" th:value="${T(java.lang.Math).PI}" />

<!-- staticメソッドにアクセス -->
<p th:text="${T(java.lang.Math).random()}">Random Number</p>
```
```java:Math.java
/**
Mathクラスを一部抜粋
*/
public final class Math {
    // staticフィールド
    public static final double E = 2.7182818284590452354;
    public static final double PI = 3.14159265358979323846;

    // staticメソッド
    public static double random() {
        return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();
    }
}
```

ここからわかるように、`th`タグにおいて、`"${T(クラスパス).staticフィールド名}"`もしくは`"${T(クラスパス).staticメソッド名（）}"`としてあげることで、ThymeleafテンプレートからJavaのStaticリソースにアクセスすることができます！

他の`th`タグの例も見てみましょう。
```html:sample.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<!-- th:text -->
<p th:text="${T(java.lang.Math).random()}">Random Number</p>

<!-- th:utext -->
<p th:utext="${T(java.lang.Math).random()}">Random Number</p>

<!-- th:if -->
<p th:if="${T(java.lang.Math).random() > 0.5}">Random number is greater than 0.5</p>

<!-- th:unless -->
<p th:unless="${T(java.lang.Math).random() <= 0.5}">Random number is less or equal to 0.5</p>

<!-- th:switch and th:case -->
<div th:switch="${T(java.lang.Math).PI}">
  <p th:case="${T(java.lang.Math).PI}">PI is equal to PI</p>
  <p th:case="${T(java.lang.Math).E}">PI is equal to E</p>
  <p th:case="*">PI is not equal to any known constants</p>
</div>

<!-- th:href -->
<a th:href="@{'/' + ${T(java.lang.Math).random()}}">Random Link</a>

<!-- th:each -->
<ul>
  <li th:each="item : ${T(java.util.Arrays).asList('Apple', 'Banana', 'Cherry')}">
    <span th:text="${item}">Item</span>
  </li>
</ul>

<!-- th:value -->
<input type="number" th:value="${T(java.lang.Math).PI}" />

<!-- th:with -->
<div th:with="randomNumber=${T(java.lang.Math).random()}">
  <p th:text="${randomNumber}">Random Number</p>
</div>

</body>
</html>
```
これを画面で表示してみると、こんな感じできちんとエラーなく表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630308/f931e081-d8fe-5f6d-ffef-4ef3586f70e9.png)


# 注意せよ
Thymeleafのバージョンによって、T()関数が使えない`th`タグが存在するので注意が必要です！

私の調べた感じだと、`thymeleaf-spring5`ライブラリのバージョン`3.0.12.RELEASE`とバージョン`3.0.13.RELEASE`が境界地でした。（`org.springframework.boot`でいうと、`2.6.1`と`2.6.2`）

| thタグ | 3.0.12以前 | 3.0.13以後 |
|:-:|:-:|:-:|
| th:text  | T()関数使える  | T()関数使える  |
| **th:utext**  | T()関数使える  | **T()関数使えない**  |
| th:if  | T()関数使える  | T()関数使える  |
| th:unless  | T()関数使える  | T()関数使える  |
| th:switch  | T()関数使える  | T()関数使える  |
| th:case  | T()関数使える  | T()関数使える  |
| **th:href**  | T()関数使える  | **T()関数使えない**  |
| th:each  | T()関数使える  | T()関数使える  |
| th:value  | T()関数使える  | T()関数使える  |
| th:with  | T()関数使える  | T()関数使える  |

もし、`thymeleaf-spring5`ライブラリのバージョン`3.0.13.RELEASE`以降において、`th:href`内でT()関数を使おうものなら、下記のようなエラーが発生するのでご注意ください。

```java
java.lang.IllegalAccessError: 
class org.thymeleaf.spring5.dialect.SpringStandardDialect tried to access private field org.thymeleaf.standard.StandardDialect.conversionService
```


以上ですー。