はじめに
以下の続きで、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.each
とtd(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)
}
}
}
}
解決した!
他にも...
以下のようにしてもうまくいった
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の文法をちゃんと理解したほうがいいな