ThymeleafでJavaメソッドを使う方法

Thymeleafを使ったhtml内でもJavaメソッドを使うことはできます。

今回は3種類のJavaメソッドをThymeleafで呼び出す方法を紹介していきます。

[スポンサーリンク]

もくじ

@ModelAttribute内のメソッド
@Autowiredのメソッド
Staticメソッド

@ModelAttribute内のメソッド

こちらはSpring frameworkを使っていることを前提としています。

Spring frameworkの@ModelAttributeとは、ModelへオブジェクトをセットしThymeleaf内でオブジェクトのフィールドを取得するというものですが、Thymeleaf内ではフィールドだけではなくメソッドも呼び出すことができます。

ではまずこちらをご覧ください。
こちらが@ModelAttributeへセットするオブジェクトです。
こちらフィールドの他にtoStringというメソッドを持っています。
今回はThymeleaf内でこのメソッドを呼び出していきます。

public class User {

    private String name;
    private int age;

    public String toString() {
        return "Name:" + name + " Age:" + age;
    }
}

@ModelAttributeへはこのようにセットしていきます。

@Controller
public class TopController {

    @ModelAttribute("user")
    public User getUser() {
        User user = new User();
        user.setName("taro");
        user.setAge(20);
        return user;
    }
}

Thymeleaf内ではこのようにしてuserオブジェクト内のメソッドを呼び出します。
方法としては、ただメソッドを呼び出すだけなのでフィールド呼び出しとあまりかわりませんね。フィールドとの違いは、末尾に()が必要になったくらいです。

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
  <p th:text="${user.toString()}"></p>
</body>
</html>

@Autowiredのメソッド

つづいてもSpring frameworkを使っていることを前提としています。

こちらが@Autowiredでbean化されるクラスです。
Thymeleaf内でgetName()メソッドを呼び出していきます。

@Service
public class TopService {

    public String getName() {
        return "サービスクラスだよ";
    }
}

@Autowiredで先程のクラスをbean化していきます。

@Autowired
private TopService topService;

Thymeleaf内ではこのようにして@Autowiredクラスのメソッドを呼び出します。
1番目の方法との違いは、@を付ける必要がありますので注意して下さい。

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
  <p th:text="${@topService.getName()}"></p>
</body>
</html>

Staticメソッド

さいごにStatiメソッドをThymeleaf内で呼び出す方法を紹介していきます。

この方法は特にSpring frameworkには依存していません。

ではまず、呼び出されるstatic メソッドを作っていきましょう。

public class TopUtil {

    public static String getName() {
        return "Utilクラスだよ";
    }
}

Thymeleaf内ではこのようにしてStaticメソッドを呼び出します。
Utilクラスのパッケージまで書く必要があるのでちょっとだけ複雑に感じてしまいますね。

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
  <p th:text="${T(jp.co.example.util.TopUtil).getName()}"></p>
</body>
</html>

さいごに

昔(15〜16年くらい前でしょうか)、JSPが注目されだした頃はみんなJSP内へJavaコードを書いていましたが、その後JSPとJavaコードは分離しようという考え方にシフトしていきました。(いわゆるMVCですね。)

ThymeleafでもJavaロジックは使えることは使えますが、Util系のみにとどめるとかルールを決めておいて、html内でJavaコードを多用するのは控えておいた方がよいかもしれませんね。

それでは!