SpringBoot Gradleを利用し、HTML上にデータ出力をしたい
Q&A
Closed
解決したいこと
SpringToolSuite4を利用し、DBに格納されたデータ3名分の「id」「名前」「年齢」をHTML上にテーブルの形式で出力したいのですが、th:textにて指定したデータがHTML上に出力されません。
解決方法をご教示頂きたいです。
また、認識が異なるところがございましたらご指摘頂きたいです。
使用している環境は下記の通りです。
・使用しているpc:mac
・SpringToolSuite4
・ビルドツール:Gradle
・DB:MySQL
今回の手順は下記を参考にしました。
URL:https://qiita.com/t-yama-3/items/969825d5c1bc4a16866d
※プロジェクト名のみ「gradle-bulletin-board」に変更しております。
発生している問題・エラー(一部抜粋)
table-header部分のみ表示され、th:textにて指定しているデータが出力されない。(下記の画像のように表示される)
該当するソースコード
application.properties(パスワードは変更しております)
spring.datasource.url=jdbc:mysql://localhost:3306/gradle
spring.datasource.username=manami
spring.datasource.password=XXXXXX //パスワードは念の為隠しております
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.sql.init.mode=always
spring.sql.init.schema-locations=classpath:schema.sql
spring.sql.init.data-locations=classpath:data.sql
spring.sql.init.encoding=utf-8
build.gradle
plugins {
id 'org.springframework.boot' version '2.5.7'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-validation'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'mysql:mysql-connector-java'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
test {
useJUnitPlatform()
}
GradleBulletinBoardApplication.java(自動生成されるクラス)
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GradleBulletinBoardApplication {
public static void main(String[] args) {
SpringApplication.run(GradleBulletinBoardApplication.class, args);
}
}
schema.sql(テーブル作成)
USE gradle;
DROP TABLE IF EXISTS test_table;
CREATE TABLE test_table
(id INT NOT NULL AUTO_INCREMENT,name VARCHAR(100),old INT,PRIMARY KEY(id));
data.sql(挿入するデータ)
INSERT INTO test_table(name, old)
VALUES('Taro', 30), ('Jiro', 25),('Saburo', 22);
TestController.java
package com.example.demo;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/")
public class TestController {
@Autowired
private JdbcTemplate jdbcTemplate;
@GetMapping("/index")
public String index(Model model) {
// test_tableの全てのレコードを取得する
String sql = "SELECT * FROM test_table";
// 変数listにSQL文で取得したデータが代入される
List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
System.out.println(list);
// modelオブジェクトのaddAttributeを使ってModelにlistを追加している
model.addAttribute("testlist", list);
// Viewファイルの指定
return "index";
}
}
index.html(DBのデータを出力する用)
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border="1">
<tr>
<th>id</th>
<th>name</th>
<th>old</th>
</tr>
<tr th:each="test:${testlist}">
<td th:text="${test.id}"></td>
<td th:text="${test.name}"></td>
<td th:text="${test.pld}"></td>
</tr>
</table>
</body>
</html>
自分で試したこと
①ターミナルでDB上にテーブルの作成とデータの追加が成功しているか確認。
⇒無事実行できている。
②コントローラーのindexメソッドにてlistにうまくデータが受け渡されているか確認。
⇒コンソールには何も出力されておらず、データの受け渡しがうまく出来ていない?
System.out.println(list);
③HTMLのデベロッパーツールの確認
⇒th:text部分が反映されていない。
④MySQLからPostgreSQLに変更しても表示は変わらなかったため、DBの問題ではなさそう。