メモ > 技術 > フレームワーク: SpringBoot > Webアプリケーションの作成
Webアプリケーションの作成
■HTMLを返すコントローラーの作成
com.example.demo 内に新規Javaクラス HomeController を作る
HomeController.java が作成されるので、以下の内容を記述する
@RestController はレスポンスとして文字列を返すような場合に使用する
@Controller はレスポンスとしてHTMLを返すような場合に使用する
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.time.LocalDateTime;
@Controller
public class HomeController {
@GetMapping(value = "/")
@ResponseBody
String index() {
return """
<html>
<head>
<title>Spring Boot</title>
</head>
<body>
<h1>Spring Boot</h1>
<p>It works!</p>
</body>
</html>
""";
}
@GetMapping(value = "/now")
@ResponseBody
String now() {
return """
<html>
<head>
<title>Spring Boot</title>
</head>
<body>
<h1>Spring Boot</h1>
<p>現在時刻は%sです。</p>
</body>
</html>
""".formatted(LocalDateTime.now());
}
}
■HTMLテンプレートを利用する
テンプレートエンジンのThymeleaf(タイムリーフ)を利用する
pom.xml に以下を追加し、さらにMavenの変更を読み込む
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
src/main/resources/templates/index.html を作成し、以下の内容を記述する
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Spring Boot</title>
</head>
<body>
<h1>Spring Boot</h1>
<p>It works!</p>
</body>
</html>
src/main/resources/templates/now.html を作成し、以下の内容を記述する
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Spring Boot</title>
</head>
<body>
<h1>Spring Boot</h1>
<p>現在時刻は<span th:text="${time}"></span>です。</p>
</body>
</html>
HomeController.java の内容を以下に変更する
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import java.time.LocalDateTime;
@Controller
public class HomeController {
@GetMapping(value = "/")
String index() {
return "index";
}
@GetMapping(value = "/now")
String now(Model model) {
model.addAttribute("time", LocalDateTime.now());
return "now";
}
}
これでブラウザからアクセスすると、テンプレートの内容に従って画面が表示される
Thymeleafについては、後述の「テンプレート(Thymeleaf)」も参照
■MySQLを利用する(JDBCの場合)
※特に理由がなければ、JDBCではなくSpring Data JPAを使うと良さそう
Spring Data JPAについては、後述の「MySQLを利用する(Spring Data JPAの場合)」を参照
ここでは、MySQLはXAMPPに付属しているものを使用することにする
XAMPPのApacheとMySQLを起動する
phpMyAdminで今回は「spring」というデータベースを作成しておく
データベースの文字コードは「utf8mb4_general_ci」としておく
以下のテーブルを作成する
CREATE TABLE tasks (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
title VARCHAR(80) NOT NULL,
text TEXT,
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
MySQLを利用するため、pom.xml に以下を追加する(「mysql-connector-j」を「mysql-connector-java」とするとエラーになった)
追加したら、Mavenの変更を読み込む
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
src/main/resources/application.properties にデータベースへの接続設定を記述する(正しく設定しないと起動できない)
なお昔はドライバに「com.mysql.jdbc.Driver」が指定されたようだが、今はその指定は非推奨らしい
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mysql://localhost:3306/spring
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
Spring BootでMySQLに接続する | 株式会社CONFRAGE ITソリューション事業部
https://confrage.jp/spring-boot%E3%81%A7mysql%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B/
You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support. | 株式会社CONFRAGE ITソリューション事業部
https://confrage.jp/you-must-configure-either-the-server-or-jdbc-driver-via-the-servertimezone-confi...
src/main/java/com/example/demo/Task.java としてデータクラスを作成する
package com.example.demo;
public class Task {
private String id;
private String title;
private String text;
public Task(String id, String title, String text) {
this.id = id;
this.title = title;
this.text = text;
}
public String id() {
return id;
}
public String title() {
return title;
}
public String text() {
return text;
}
}
src/main/java/com/example/demo/TaskDao.java としてデータベースアクセスクラスを作成する
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service
public class TaskDao {
private final JdbcTemplate jdbcTemplate;
@Autowired
TaskDao(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void add(Task task) {
SqlParameterSource param = new BeanPropertySqlParameterSource(task);
SimpleJdbcInsert insert = new SimpleJdbcInsert(jdbcTemplate).withTableName("tasks");
insert.execute(param);
}
public List<Task> findAll() {
String query = "SELECT * FROM tasks";
List<Map<String, Object>> result = jdbcTemplate.queryForList(query);
List<Task> tasks = result.stream()
.map((Map<String, Object> row) -> new Task(
row.get("id").toString(),
row.get("title").toString(),
row.get("text").toString()
)).toList();
return tasks;
}
}
src/main/resources/templates/task.html としてデータ一覧のテンプレートを作成する
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Spring Boot</title>
</head>
<body>
<h1>Spring Boot</h1>
<p>タスクは以下のとおりです。</p>
<table>
<tr>
<th>ID</th>
<th>タイトル</th>
<th>テキスト</th>
</tr>
<tr th:each="task : ${tasks}">
<td th:text="${task.id}"></td>
<td th:text="${task.title}"></td>
<td th:text="${task.text}"></td>
</tr>
</table>
</body>
</html>
src/main/resources/templates/task_add.html としてデータ登録完了のテンプレートを作成する
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Spring Boot</title>
</head>
<body>
<h1>Spring Boot</h1>
<p>タスクを登録しました。</p>
</body>
</html>
src/main/java/com/example/demo/HomeController.java を以下のように変更する
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import java.time.LocalDateTime;
import java.util.List;
@Controller
public class HomeController {
private final TaskDao taskDao;
@Autowired
HomeController(TaskDao taskDao) {
this.taskDao = taskDao;
}
@GetMapping(value = "/")
String index() {
return "index";
}
@GetMapping(value = "/now")
String now(Model model) {
model.addAttribute("time", LocalDateTime.now());
return "now";
}
@GetMapping(value = "/task")
String task(Model model) {
List<Task> tasks = taskDao.findAll();
model.addAttribute("tasks", tasks);
return "task";
}
@GetMapping(value = "/task_add")
String addTask() {
Task task = new Task(null, "テスト", "テスト。\nこれはテストです。");
taskDao.add(task);
return "task_add";
}
}
http://localhost:8080/task_add にアクセスするとタスクが登録される
http://localhost:8080/task にアクセスするとタスクが一覧表示される
データベースの接続情報を環境ごとに用意する方法は、このファイル内の「プロパティの上書き」を参照
■MySQLを利用する(Spring Data JPAの場合)
SpringBoot JPAを使う方法(Spring Data JPA の使用方法) - Web系開発メモ
https://web-dev.hatenablog.com/entry/spring-boot/intro/jpa
Spring Boot入門:MySQLにSpring Boot アプリケーションからアクセスする - あるSEのつぶやき・改
https://www.aruse.net/entry/2019/08/04/003838
Spring Boot+JPAでデータベースに接続する方法 - ITを分かりやすく解説
https://medium-company.com/spring-boot%EF%BC%8Bjpa%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%8...
ここでは、MySQLはXAMPPに付属しているものを使用することにする
XAMPPのApacheとMySQLを起動する
phpMyAdminで今回は「spring」というデータベースを作成しておく
データベースの文字コードは「utf8mb4_general_ci」としておく
以下のテーブルを作成する
CREATE TABLE tasks (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
title VARCHAR(80) NOT NULL,
text TEXT,
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
MySQLを利用するため、pom.xml に以下を追加する(「mysql-connector-j」を「mysql-connector-java」とするとエラーになった)
追加したら、Mavenの変更を読み込む
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
src/main/resources/application.properties にデータベースへの接続設定を記述する(正しく設定しないと起動できない)
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mysql://localhost:3306/spring
spring.datasource.username=root
spring.datasource.password=1234
src/main/java/com/example/demo/Task.java としてエンティティクラスを作成する
package com.example.demo;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Table;
import jakarta.persistence.Id;
@Entity
@Table(name="tasks")
public class Task {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String title;
private String text;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
src/main/java/com/example/demo/TaskRepository.java としてリポジトリクラスを作成する
package com.example.demo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface TaskRepository extends JpaRepository<Task, Integer> {
}
src/main/resources/templates/task.html としてデータ一覧のテンプレートを作成する
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Spring Boot</title>
</head>
<body>
<h1>Spring Boot</h1>
<p>タスクは以下のとおりです。</p>
<table>
<tr>
<th>ID</th>
<th>タイトル</th>
<th>テキスト</th>
</tr>
<tr th:each="task : ${tasks}">
<td th:text="${task.id}"></td>
<td th:text="${task.title}"></td>
<td th:text="${task.text}"></td>
</tr>
</table>
</body>
</html>
src/main/resources/templates/task_add.html としてデータ登録完了のテンプレートを作成する
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Spring Boot</title>
</head>
<body>
<h1>Spring Boot</h1>
<p>タスクを登録しました。</p>
</body>
</html>
src/main/java/com/example/demo/HomeController.java を以下のように変更する
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import java.time.LocalDateTime;
import java.util.List;
@Controller
public class HomeController {
@Autowired
private TaskRepository taskRepository;
@GetMapping(value = "/")
String index() {
return "index";
}
@GetMapping(value = "/now")
String now(Model model) {
model.addAttribute("time", LocalDateTime.now());
return "now";
}
@GetMapping(value = "/task")
String task(Model model) {
List<Task> tasks = taskRepository.findAll();
model.addAttribute("tasks", tasks);
return "task";
}
@GetMapping(value = "/task_add")
String addTask() {
Task task = new Task();
task.setId(null);
task.setTitle("テスト");
task.setText("テスト。\nこれはリポジトリのテストです。");
taskRepository.save(task);
return "task_add";
}
}
これで http://localhost:8080/task_add にアクセスすると、タスクが登録される
また http://localhost:8080/task にアクセスすると、タスクが一覧表示される
データベースの接続情報を環境ごとに用意する方法は、このファイル内の「プロパティの上書き」を参照
Spring Data JPAについては、後述の「データベース(Spring Data JPA)」も参照