[JAVA] Erstellen Sie eine einfache CRUD mit SpringBoot + JPA + Thymeleaf ② ~ Bildschirm- und Funktionserstellung ~

Inhalt

Zu entwickelnde Funktionen

  1. Erstellen Sie eine Spielertabelle zum Speichern von Spielerinformationen
  2. Aktivieren Sie die Bedienung des Spielertisches mit JPA
  3. Erstellen eines Endpunkts für den Spieler
  4. Erstellen Sie für jeden Bildschirm eine Vorlage

1. Erstellen Sie eine Spielertabelle zum Speichern von Spielerinformationen

src/main/java/com/example/baseball/domain/Player.java


package com.example.baseball.domain;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity // ①
public class Player {
    @Id // ②
    @GeneratedValue(strategy = GenerationType.IDENTITY) // ③
    private Long id;
    private String name;
    private Integer age;
    private String team;
    private String position;

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getTeam() {
        return team;
    }
    public void setTeam(String team) {
        this.team = team;
    }
    public String getPosition() {
        return position;
    }
    public void setPosition(String position) {
        this.position = position;
    }

    @Override
    public String toString() {
        return "Player [id=" + id + ", name=" + name + ", age=" + age + ", team=" + team + ", position=" + position + "]";
    }
}

--①: Verknüpfung mit der DB-Tabelle durch Hinzufügen von "@ Entity" --②: Die Variable mit @ Id wird zum Primer-Schlüssel der Tabelle. --③: Wenn Sie "@ GeneratedValue" hinzufügen, werden Seriennummern automatisch zugewiesen.

2. Lassen Sie JPA den Spielertisch bedienen

--JPA bietet die grundlegende Verarbeitung für den Zugriff auf die Tabelle, sodass Sie kein SQL schreiben müssen.

src/main/java/com/example/baseball/repository/PlayerRepository.java


package com.example.baseball.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.example.baseball.domain.Player;

@Repository
public interface PlayerRepository extends JpaRepository<Player, Long> {

}

--Erstellen Sie einen Dienst, der die Repository-Verarbeitung aufruft

src/main/java/com/example/baseball/service/PlayerService.java


package com.example.baseball.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example.baseball.domain.Player;
import com.example.baseball.repository.PlayerRepository;

@Service
public class PlayerService {
    // ①
    @Autowired
    private PlayerRepository playerRepository;

    public List<Player> findAll() {
        return playerRepository.findAll();
    }

    public Player findOne(Long id) {
        return playerRepository.findOne(id);
    }

    public Player save(Player player) {
        return playerRepository.save(player);
    }

    public void delete(Long id) {
        playerRepository.delete(id);
    }
}

--①: Wenn Sie es mit "@ Autowired" deklarieren, wird die Bohne injiziert, sodass Sie es ohne "new" verwenden können.

3. Erstellen eines Endpunkts für den Player

--Erstellen Sie eine Methode, die der URL zugeordnet ist, auf die der Benutzer zugreift

HTTP-Methode URL Controller-Methode Überblick
GET /players index() Anzeige des Listenbildschirms
POST /players create() Datenspeicher
GET /players/new newPlayer() Anzeige des neuen Erstellungsbildschirms
GET /players/1/edit edit() Anzeige des Bearbeitungsbildschirms
GET /players/1 show() Anzeige des Referenzbildschirms
PUT /players/1 update() Datenaktualisierung
DELETE /players/1 destroy() Daten löschen

--Erstelle PlayerController.java in src / main / java / com / example / baseball / controller

src/main/java/com/example/baseball/controller/PlayerController.java


package com.example.baseball.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.example.baseball.domain.Player;
import com.example.baseball.service.PlayerService;

@Controller
@RequestMapping("/players") // ①
public class PlayerController {
    @Autowired
    private PlayerService playerService;

    @GetMapping
    public String index(Model model) { // ②
        List<Player> players = playerService.findAll();
        model.addAttribute("players", players); // ③
        return "players/index"; // ④
    }

    @GetMapping("new")
    public String newPlayer(Model model) {
        return "players/new";
    }

    @GetMapping("{id}/edit")
    public String edit(@PathVariable Long id, Model model) { // ⑤
        Player player = playerService.findOne(id);
        model.addAttribute("player", player);
        return "players/edit";
    }

    @GetMapping("{id}")
    public String show(@PathVariable Long id, Model model) {
        Player player = playerService.findOne(id);
        model.addAttribute("player", player);
        return "players/show";
    }

    @PostMapping
    public String create(@ModelAttribute Player player) { // ⑥
        playerService.save(player);
        return "redirect:/players"; // ⑦
    }

    @PutMapping("{id}")
    public String update(@PathVariable Long id, @ModelAttribute Player player) {
        player.setId(id);
        playerService.save(player);
        return "redirect:/players";
    }

    @DeleteMapping("{id}")
    public String destroy(@PathVariable Long id) {
        playerService.delete(id);
        return "redirect:/players";
    }
}

--①: Wenn Sie der Klasse "@ RequestMapping" hinzufügen, wird es auf alle Methoden in der Klasse angewendet.

4. Erstellen Sie für jeden Bildschirm eine Vorlage

Platzierung statischer Dateien

スクリーンショット 2017-10-25 11.08.37.png

index.html

index.png

src/main/resources/templates/players/index.html


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="utf-8" />
    <title>Listing Players - baseball</title>
    <!-- ① -->
    <link rel="stylesheet" href="/css/bootstrap.css" />
    <script src="/js/jquery.js"></script>
    <script src="/js/bootstrap.js"></script>
  </head>
  <body>
    <div class="container">
      <h1>Listing Players</h1>
      <table class="table">
        <thead>
          <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Alter</th>
            <th>Teamname</th>
            <th>Verteidigungsposition</th>
            <th></th>
            <th></th>
            <th></th>
          </tr>
        </thead>
        <tbody>
          <!-- ② -->
          <tr th:each="player:${players}" th:object="${player}">
            <!-- ③ -->
            <td th:text="*{id}"></td>
            <td th:text="*{name}"></td>
            <td th:text="*{age}"></td>
            <td th:text="*{team}"></td>
            <td th:text="*{position}"></td>
            <!-- ④ -->
            <td><a class="btn btn-default btn-xs" th:href="@{/players/{id}(id=*{id})}">Referenz</a></td>
            <td><a class="btn btn-default btn-xs" th:href="@{/players/{id}/edit(id=*{id})}">Bearbeiten</a></td>
            <td>
              <!-- ⑤ -->
              <form th:action="@{/players/{id}(id=*{id})}" th:method="delete">
                <input class="btn btn-default btn-xs" type="submit" value="Löschen" />
              </form>
            </td>
          </tr>
        </tbody>
      </table>
      <a class="btn btn-default" href="/players/new">Erstelle neu</a>
    </div>
  </body>
</html>

--①: Lesen Sie CSS- und Javascript-Dateien --②: Die Schleifenverarbeitung wird für die vom Controller übergebenen "Spieler" durchgeführt.

new.html

--Player neuer Erstellungsbildschirm --Erstelle new.html in src / main / resources / templates / player

new.png

src/main/resources/templates/players/new.html


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="utf-8" />
    <title>New Player - baseball</title>
    <link rel="stylesheet" href="/css/bootstrap.css" />
    <script src="/js/jquery.js"></script>
    <script src="/js/bootstrap.js"></script>
  </head>
  <body>
    <div class="container">
      <h1>New Player</h1>
      <form th:action="@{/players}" th:method="post">
        <div class="form-group">
          <label class="control-label">Name</label>
          <input class="form-control" type="text" name="name" />
        </div>
        <div class="form-group">
          <label class="control-label">Alter</label>
          <input class="form-control" type="number" name="age" />
        </div>
        <div class="form-group">
          <label class="control-label">Teamname</label>
          <input class="form-control" type="text" name="team" />
        </div>
        <div class="form-group">
          <label class="control-label">Verteidigungsposition</label>
          <input class="form-control" type="text" name="position" />
        </div>
        <button class="btn btn-default" type="submit">Erstellen</button>
      </form>
      <div class="pull-right">
        <a class="btn btn-link" href="/players">Zum Listenbildschirm</a>
      </div>
    </div>
  </body>
</html>

edit.html

edit.png

src/main/resources/templates/players/edit.html


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="utf-8" />
    <title>Editing Player - baseball</title>
    <link rel="stylesheet" href="/css/bootstrap.css" />
    <script src="/js/jquery.js"></script>
    <script src="/js/bootstrap.js"></script>
  </head>
  <body>
    <div class="container">
      <h1>Editing Player</h1>
      <form th:action="@{/players/{id}(id=*{id})}" th:method="put" th:object="${player}">
        <div class="form-group">
          <label class="control-label">Name</label>
          <!-- ① -->
          <input class="form-control" type="text" th:field="*{name}" />
        </div>
        <div class="form-group">
          <label class="control-label">Alter</label>
          <input class="form-control" type="number" th:field="*{age}" />
        </div>
        <div class="form-group">
          <label class="control-label">Teamname</label>
          <input class="form-control" type="text" th:field="*{team}" />
        </div>
        <div class="form-group">
          <label class="control-label">Verteidigungsposition</label>
          <input class="form-control" type="text" th:field="*{position}" />
        </div>
        <button class="btn btn-default" type="submit">aktualisieren</button>
      </form>
      <div class="pull-right">
        <a class="btn btn-link" href="/players">Zum Listenbildschirm</a>
      </div>
    </div>
  </body>
</html>

--①: Für den in th: field festgelegten Wert wird der Variablenname im Attribut name attribute id und der Wert im Wertattribut festgelegt.

show.html

show.png

src/main/resources/templates/players/show.html


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="utf-8" />
    <title>Show Player - baseball</title>
    <link rel="stylesheet" href="/css/bootstrap.css" />
    <script src="/js/jquery.js"></script>
    <script src="/js/bootstrap.js"></script>
  </head>
  <body>
    <div class="container">
      <h1>Show Player</h1>
      <div th:object="${player}">
        <div>
          <label>ID</label>
          <p th:text="*{id}"></p>
        </div>
        <div>
          <label>Name</label>
          <p th:text="*{name}"></p>
        </div>
        <div>
          <label>Alter</label>
          <p th:text="*{age}"></p>
        </div>
        <div>
          <label>Teamname</label>
          <p th:text="*{team}"></p>
        </div>
        <div>
          <label>Verteidigungsposition</label>
          <p th:text="*{position}"></p>
        </div>
      </div>
      <div>
        <a class="btn btn-default" th:href="@{/players/{id}/edit(id=*{id})}">Bearbeiten</a>
      </div>
      <div class="pull-right">
        <a class="btn btn-link" href="/players">Zum Listenbildschirm</a>
      </div>
    </div>
  </body>
</html>

Funktionsprüfung

demo3.gif

nächstes Mal

Recommended Posts

Erstellen Sie eine einfache CRUD mit SpringBoot + JPA + Thymeleaf ② ~ Bildschirm- und Funktionserstellung ~
Erstellen Sie eine einfache CRUD mit SpringBoot + JPA + Thymeleaf ~ ~ Validierung hinzufügen ~
Erstellen Sie eine einfache CRUD mit SpringBoot + JPA + Thymeleaf ④ ~ Fehlermeldung anpassen ~
Erstellen Sie mit SpringBoot + JPA + Thymeleaf ein einfaches CRUD ~ ~ Hallo Welt ~
Erstellen Sie eine einfache CRUD mit SpringBoot + JPA + Thymeleaf ⑤ ~ Common template ~
[Schienenentnahme] Erstellen Sie eine einfache Entnahmefunktion mit Schienen
Zeichnen Sie den Bildschirm mit Thymeleaf in SpringBoot
Erstellen Sie mit Dropwizard eine einfache Webanwendung
Erstellen Sie mit Spring Batch eine einfache On-Demand-Charge
Erstellen eines einfachen Balkendiagramms mit MPAndroidChart
Erstellen Sie mit Java + MySQL ein einfaches Bulletin Board
04. Ich habe mit SpringBoot + Thymeleaf ein Frontend gemacht
Erstellen Sie eine CRUD-App mit Spring Boot 2 + Thymeleaf + MyBatis
Zeigen Sie eine einfache Hallo Welt mit SpringBoot + IntelliJ
Ein einfaches Stein-Papier-Scheren-Spiel mit JavaFX und SceneBuilder
Versuchen Sie, mit der REST-API nach einer Postleitzahl zu suchen, indem Sie die Klassen SpringBoot, H2 DB und JPA REST-Only 3 erstellen.
Erstellen einer EC-Site mit Rails 5 ⑨ ~ Erstellen einer Warenkorbfunktion ~
Erstellen Sie mit Spring Security 2.1 eine einfache Demo-Site mit Spring Security
Erstellen Sie mit der Sitzungsfunktion einen Anmeldeauthentifizierungsbildschirm
Ich habe einen CRUD-Test mit SpringBoot + MyBatis + DBUnit geschrieben (Teil 1)
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Stellen Sie mit spring boot + spring jpa eine Verbindung zur Datenbank her und führen Sie die CRUD-Operation durch
Ein einfaches CRUD-Beispiel mit Java Servlet / JSP und MySQL
Erstellen Sie einen Spielplatz mit Xcode 12
Erstellen Sie einen einfachen Webserver mit der Java-Standardbibliothek com.sun.net.httpserver
Erstellen Sie eine JVM für die App-Verteilung mit JDK 9-Modulen und jlink
[Swift] Erstellen Sie ein Projekt mit Xcode (Version 12.1) und zeigen Sie "Hallo Welt!"
Erstellen Sie mit JavaScript eine leistungsstarke Aufzählung mit Feldern und Methoden wie Java
Lassen Sie uns mit Generic Dao und Hibernate einen Parameter-Polymorph-Mechanismus erstellen