Spring Boot/View/Thymeleaf/テンプレート/パラメータ

Spring Boot/View/Thymeleaf/テンプレート/パラメータ

パラメータを送り込んだり、表示したり。

コントローラーからはこのように Model というものに詰め込む。

@Controller
@RequestMapping("/sample01")
public class Sample01Controller {
    @RequestMapping("/params1")
    public String params1(Model model) {
        model.addAttribute("hoge", "piyo");
        return "sample01/params1";
    }
}

テンプレートからはこのように引き出す。

<p>[[${hoge}]]</p>

インスタンスの参照

インスタンスを送り込むこともできる

@Controller
@RequestMapping("/sample01")
public class Sample01Controller {
    @RequestMapping("/params2")
    public String params2(Model model) {
        model.addAttribute("hoge", new P2());
        return "sample01/params2";
    }
    public class P2{
        public String a = "AAA";
        public String b = "BBB";
    }    
}

テンプレートではこのように引き出す

<p>
    [[${hoge.a}]]
</p>

参照しているインスタンスのメソッド呼び出し

    @RequestMapping("/params3")
    public String params3(Model model) {
        model.addAttribute("hoge", new P3());
        return "sample01/params3";
    }
    public class P3{
        public String hello() {
            return "hello hello";
        }
        public String getHello100() {
            String hello = "";
            for(int i = 0; i < 100; i++) {
                hello += (i + " hello ");
            }
            return hello;
        }
        public String echo(String v) {
            return v + " " + v + " " + v + " " + v;
        }
    }

このような場合、このようにできる

<h2>単純にメソッド呼び出し</h2>
[[${hoge.hello()}]]
 
<h2>単純に getter 呼び出し</h2>
[[${hoge.getHello100()}]]
 
<h2>getter をメンバのように呼び出し</h2>
[[${hoge.hello100}]]
 
<h2>引数付き呼び出し</h2>
[[${hoge.echo('unko')}]]
 
<h2>呼び出し結果のさらにメソッド呼び出し<h2>
[[${hoge.hello().toUpperCase()}]]

普通にメソッドを呼び出すようにメソッド名括弧でも呼び出せるし、getter に限っては、get を取り除いてメンバと同じようにアクセスすることもできる。

テンプレートのリテラルの型に合致するなら引数を与えてのメソッド実行もできる。 これはかなり捗る。

入れ子になっているインスタンスも普通に使える。

List の参照

コントローラからの送り込みは今までと同様である

    @RequestMapping("/params4")
    public String params4(Model model) {
        List<String> hogeList = new ArrayList<>();
        hogeList.add("1aaa");
        hogeList.add("2bbb");
        hogeList.add("3ccc");
        model.addAttribute("hogeList", hogeList);
        return "sample01/params4";
    }
[[${hogeList[0]}]] <br />
[[${hogeList[1]}]] <br />
[[${hogeList[2]}]] <br />

List だけど配列的にアクセスできる。

オーバーするとエラーになる

[[${hogeList[100]}]]

当然ながらインスタンスなのでこのようにもアクセスできる

[[${hogeList.get(0)}]] <br />
[[${hogeList.get(1)}]] <br />
[[${hogeList.get(2)}]] <br />

みんなだいすき foreach

<th:block th:each="hoge : ${hogeList}" >
    [[${hoge}]]
</th:block>

この th という記述は XML の名前空間指定であっておそらく Thymeleaf の th を取っているのだと思う。 table タグの th ではない。

この each という属性をつけると、対象のブロックの内部がグルグル回るのではなく、 対象ブロック全体が何度も評価されるという動きをする。

foreach を使った table の構築はこちらを参考に Spring Boot/View/Thymeleaf/テンプレート/table を出力する

java/spring/spring_boot/view/thymeleaf/template/params.txt · 最終更新: 2018-12-10 11:52 by ore