0
0

More than 1 year has passed since last update.

Groovy templatesの繰り返し表示でちょっと戸惑った話

Posted at

はじめに

以下の続きで、eachでの繰り返し処理を表の列で使おうと思ってやってみたら、すぐには上手くいかなかった。

参考文献(前回と同じ)

詰まったこと

前回の状態から、tplファイルでAccoutテーブルのデータを表示しているところを表にしてみようと思った

getData.tpl
yieldUnescaped '<!DOCTYPE html>'

html(lang:'ja') {
	head {
		meta(charset:"UTF-8")
		title("繰り返し")
		link(rel:"stylesheet", type:"text/css",
			href:"https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css")
	}
	body(class:"container"){
		h1(class:"display-4 mb-4", title)
		p(message)
		div (class:"alert alert-primary") {
			if (flag1) {
				p("flag1がtrueの時に出力されるよ")
			} else {
				p("flag1がfalseだったら出力")	
			}
			if (flag2) {
				p("flag2がtrueの時に出力されるよ")
			} else {
				p("flag2がfalseだったら出力")	
			}
		}

// ------------ ここから前回と書き換えた部分 ------------

		table(class:"table") {
			thead {
				tr {
					th("ID")
					th("Name")
					th("Mail")
				}
			}
			tbody {
				data.each {
					tr {
						td(it.id)
						td(it.name)
						td(it.mail)
					}
				}
			}
		}
	}
}

実行してみると... (プロジェクトを右クリック > 実行 > Spring Boot アプリケーション)
エラーが出た
java.lang.NullPointerException: Cannot get property 'id' on null object

eachの繰り返し処理で、リストであるdataの中身が1つずつ取り出されてitという変数に入れられて情報が取得できるはずなのに、idがnullと言われてしまった。

考察

data.eachtd(it.id)の間にtrが挟まっていることがよくないのかも

解決策

明示的に変数itemに格納してみた

getData.tpl(修正した範囲だけ)
table(class:"table") {
    thead {
        tr {
            th("ID")
            th("Name")
            th("Mail")
        }
    }
    tbody {
        data.each { item -> // ここ
            tr {
                td(item.id)
                td(item.name)
                td(item.mail)
            }
        }
    }
}

解決した!

表作成.jpg

他にも...

以下のようにしてもうまくいった

getData.tpl(修正その2)
table(class:"table") {
    thead {
        tr {
            th("ID")
            th("Name")
            th("Mail")
        }
    }
    tbody {
        for(item in data) {
            tr {
                td(item.id)
                td(item.name)
                td(item.mail)
            }
        }
    }
}
getData.tpl(修正その3)
table(class:"table") {
    thead {
        tr {
            th("ID")
            th("Name")
            th("Mail")
        }
    }
    tbody {
        Integer i = 0
        while(i < data.size()) {
            tr {
                td(data[i].id)
                td(data[i].name)
                td(data[i].mail)
            }
            i++
        }
    }
}

終わりに

Groovyの文法をちゃんと理解したほうがいいな

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0