質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Q&A

解決済

2回答

28387閲覧

Thymeleaf:ネストth:eachの内側で使用するシーケンスを作りたい

kickkick

総合スコア12

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

0グッド

1クリップ

投稿2017/08/15 13:54

編集2017/08/20 15:44

※Thymeleafの掲示板にも質問は投げましたが、日本語の回答がいただければなお助かるので、teratailさんにも投稿します。

###前提・実現したいこと
複数のth:eachの中で、シーケンスを使いたい
ループの内側で下記のようなシーケンス番号を使いたい
ループは地域⇒都道府県→市区町村のような構造。それぞれに順番がある。

シーケンス外側内側
011
112
213
321
422
523

###試したこと
th:with${#numbers.sequence(from,to)}を使った解決方法を模索しましたが実現できなそうでした。th:withでは、使用箇所より内部のタグでないとnullとなってしまうため、th:eachとともにth:withで変数をインクリメントすることはできませんでした。また、JSPみたいに変数のみ操作する方法があればと思ったのですが、見つけられませんでした。

ダメな例 th:with="index = (${index} ?: 0) + 1"

${#numbers.sequence(from,to)}については、これ自体をth:eachで回さないとうまく取り出せなかったですが、ループの順序と階層構造も重要なため、これでは実現できないです。

Thymeleafで実現できなければ、サーバ側かJavaScriptで連番を作りたいと思いますが、Thymeleafで実現できれば助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koronatail

2017/08/17 02:40

渡すデータのイメージが付かなかったのですがリストが3つあるということでしょうか?渡すデータの例をjavaのコードで表していただけると回答を得られやすいのではと思います。
guest

回答2

0

ベストアンサー

th:eachを2つ回して上記を実現したいという事だと理解していますが、以下のサイトの「6.2 繰り返しステータスの保持」の項のステータス変数で普通に実現できませんか?

Thymeleaf(JP)

投稿2017/08/20 11:09

sllmejacob

総合スコア72

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kickkick

2017/08/20 15:49

コードスニペットがない質問へのご確認・回答ありがとうございます。 > th:eachを2つ回して上記を実現したいという事だと理解しています ご認識の通りです。 質問の中の表を更新しましたが、単純にindexやcountの足し合わせだと正しいシーケンスにならないです。
guest

0

裏技に近いですが、以下のようなことも可能です( Thymeleaf 3.0.7.RELEASEで動作確認済み )

java

1// MultiListController.java 2import java.util.Arrays; 3import java.util.List; 4 5import org.springframework.stereotype.Controller; 6import org.springframework.ui.Model; 7import org.springframework.web.bind.annotation.RequestMapping; 8 9import serendip.spring.sample.model.User; 10 11@Controller 12public class MultiListController { 13 14 @RequestMapping("/list") 15 public String start(Model model) { 16 17 model.addAttribute("resultList", getResultList()); 18 19 return "list"; 20 } 21 22 List<List<User>> getResultList() { 23 List<User> first = Arrays.asList(User.builder().name("A1").build(), 24 User.builder().name("B1").build(), User.builder().name("C1").build(), 25 User.builder().name("D1").build(), User.builder().name("E1").build()); 26 27 List<User> second = Arrays.asList(User.builder().name("A2").build(), 28 User.builder().name("B2").build(), User.builder().name("C2").build(), 29 User.builder().name("D2").build(), User.builder().name("E2").build()); 30 31 List<User> third = Arrays.asList(User.builder().name("A3").build(), 32 User.builder().name("B3").build(), User.builder().name("C3").build(), 33 User.builder().name("D3").build(), User.builder().name("E3").build()); 34 35 return Arrays.asList(first, second, third); 36 } 37 38}

java

1// User.java (Controllerで作成しているVO) 2import lombok.Builder; 3import lombok.Getter; 4 5@Builder 6@Getter 7public class User { 8 private String name; 9}

html

1<!DOCTYPE html> 2<html xmlns:th="http://www.thymeleaf.org"> 3<head> 4<meta charset="UTF-8"> 5<title>MultiList</title> 6</head> 7<body> 8<div th:each="parent : ${resultList}"> 9 <div th:each="sub : ${parent}" > 10 <span th:text="${#ids.seq('')}"></span> 11 <span th:text="${sub.name}"></span> 12 </div> 13</div> 14</body> 15</html>

実行結果:

1 A1 2 B1 3 C1 4 D1 5 E1 6 A2 7 B2 8 C2 9 D2 10 E2 11 A3 12 B3 13 C3 14 D3 15 E3

投稿2017/08/21 06:46

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kickkick

2017/08/30 13:55

返信が遅くなり、失礼しました。 詳細なコードでご説明いただきありがとうございました。 今回は回答が早かった方にベスアンをつけさせてもらいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問