[JAVA] Créez un CRUD simple avec SpringBoot + JPA + Thymeleaf ② ~ Création d'écran et de fonctions ~

Contenu

-Suite de Dernière fois --Créez une application CRUD simple avec Spring Boot ――Cette fois, créez les 4 écrans suivants et passez par le traitement

Fonctions à développer

  1. Créez une table de joueur pour stocker les informations des joueurs
  2. Activez pour faire fonctionner la table de lecture à l'aide de JPA
  3. Création d'un point de terminaison pour le lecteur
  4. Créez un modèle pour chaque écran

1. Créez une table de joueur pour stocker les informations des joueurs

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 + "]";
    }
}

--①: Lien avec la table DB en ajoutant @ Entity --②: La variable avec «@ Id» devient la clé d'amorce de la table. --③: Si vous ajoutez @ GeneratedValue, les numéros de série seront attribués automatiquement.

2. Autorisez JPA à faire fonctionner la table de lecture

--JPA fournit le traitement de base pour accéder à la table, vous n'avez donc pas à écrire SQL. --Peut être utilisé en créant une interface qui hérite du référentiel JPA de JPA.

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> {

}

--Créez un service qui appelle le traitement du référentiel

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);
    }
}

--①: Si vous déclarez avec @ Autowired, le bean sera injecté, vous pouvez donc l'utiliser sans nouveau.

3. Création d'un point de terminaison pour le lecteur

--Créer une méthode associée à l'URL accédée par l'utilisateur --Les 6 types de points finaux suivants sont créés

Méthode HTTP URL Méthode du contrôleur Aperçu
GET /players index() Affichage de l'écran de liste
POST /players create() Stockage de données
GET /players/new newPlayer() Affichage d'un nouvel écran de création
GET /players/1/edit edit() Affichage de l'écran d'édition
GET /players/1 show() Affichage de l'écran de référence
PUT /players/1 update() Mise à jour des données
DELETE /players/1 destroy() Suprimmer les données

--Créez PlayerController.java dans 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";
    }
}

--①: Si vous ajoutez @ RequestMapping à la classe, il sera appliqué à toutes les méthodes de la classe.

4. Créez un modèle pour chaque écran

--Depuis cette fois, nous allons créer un template pour player, nous le créerons sous src / main / resources / templates / players --Créez les 4 fichiers d'écran suivants --index.html (écran de liste) --new.html (nouvel écran de création) --edit.html (écran d'édition) --show.html (écran de référence)

Placement de fichiers statiques

--Préparez les fichiers css et javascript avant de créer un modèle --Cette fois, utilisez Bootstrap

スクリーンショット 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></th>
            <th></th>
            <th></th>
            <th>--Afficher une liste de joueurs dans une table -Créer ʻindex.html` dans` src / main / resources / templates / players` Nom Âge Nom de l'équipe Position défensive</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})}">référence</a></td>
            <td><a class="btn btn-default btn-xs" th:href="@{/players/{id}/edit(id=*{id})}">Éditer</a></td>
            <td>
              <!-- ⑤ -->
              <form th:action="@{/players/{id}(id=*{id})}" th:method="delete">
                <input class="btn btn-default btn-xs" type="submit" value="Effacer" />
              </form>
            </td>
          </tr>
        </tbody>
      </table>
      <a class="btn btn-default" href="/players/new">Créer un nouveau</a>
    </div>
  </body>
</html>

--①: lire les fichiers css et javascript --②: Le traitement en boucle est effectué pour les «joueurs» transmis par le contrôleur.

new.html

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">Nom</label>
          <input class="form-control" type="text" name="name" />
        </div>
        <div class="form-group">
          <label class="control-label">âge</label>
          <input class="form-control" type="number" name="age" />
        </div>
        <div class="form-group">
          <label class="control-label">Nom de l'équipe</label>
          <input class="form-control" type="text" name="team" />
        </div>
        <div class="form-group">
          <label class="control-label">Position défensive</label>
          <input class="form-control" type="text" name="position" />
        </div>
        <button class="btn btn-default" type="submit">Créer</button>
      </form>
      <div class="pull-right">
        <a class="btn btn-link" href="/players">Vers l'écran de liste</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">Nom</label>
          <!-- ① -->
          <input class="form-control" type="text" th:field="*{name}" />
        </div>
        <div class="form-group">
          <label class="control-label">âge</label>
          <input class="form-control" type="number" th:field="*{age}" />
        </div>
        <div class="form-group">
          <label class="control-label">Nom de l'équipe</label>
          <input class="form-control" type="text" th:field="*{team}" />
        </div>
        <div class="form-group">
          <label class="control-label">Position défensive</label>
          <input class="form-control" type="text" th:field="*{position}" />
        </div>
        <button class="btn btn-default" type="submit">mise à jour</button>
      </form>
      <div class="pull-right">
        <a class="btn btn-link" href="/players">Vers l'écran de liste</a>
      </div>
    </div>
  </body>
</html>

--①: Pour la valeur définie dans «th: field», le nom de la variable est défini dans l'attribut name id attribut et la valeur est définie dans l'attribut value. --Si la valeur de * {age} est 20 comme th: field =" * {age} ", name =" age "id =" age "value =" 20 " est automatiquement défini. ing

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>Nom</label>
          <p th:text="*{name}"></p>
        </div>
        <div>
          <label>âge</label>
          <p th:text="*{age}"></p>
        </div>
        <div>
          <label>Nom de l'équipe</label>
          <p th:text="*{team}"></p>
        </div>
        <div>
          <label>Position défensive</label>
          <p th:text="*{position}"></p>
        </div>
      </div>
      <div>
        <a class="btn btn-default" th:href="@{/players/{id}/edit(id=*{id})}">Éditer</a>
      </div>
      <div class="pull-right">
        <a class="btn btn-link" href="/players">Vers l'écran de liste</a>
      </div>
    </div>
  </body>
</html>

Contrôle de fonctionnement

demo3.gif

la prochaine fois

Recommended Posts

Créez un CRUD simple avec SpringBoot + JPA + Thymeleaf ② ~ Création d'écran et de fonctions ~
Créez un CRUD simple avec SpringBoot + JPA + Thymeleaf ③ ~ Ajouter une validation ~
Créez un CRUD simple avec SpringBoot + JPA + Thymeleaf ④ ~ Personnaliser le message d'erreur ~
Créez un CRUD simple avec SpringBoot + JPA + Thymeleaf ① ~ Hello World ~
Créez un CRUD simple avec SpringBoot + JPA + Thymeleaf ⑤ ~ Modèle commun ~
[Retrait des rails] Créez une fonction de retrait simple avec des rails
Dessiner un écran avec Thymeleaf dans SpringBoot
Créez une application Web simple avec Dropwizard
Créez un lot à la demande simple avec Spring Batch
Créer un graphique à barres simple avec MPAndroidChart
Créez un tableau d'affichage simple avec Java + MySQL
04. J'ai fait un frontal avec SpringBoot + Thymeleaf
Créez une application CRUD avec Spring Boot 2 + Thymeleaf + MyBatis
Afficher un simple Hello World avec SpringBoot + IntelliJ
Un simple jeu de ciseaux-papier-pierre avec JavaFX et SceneBuilder
Essayez de rechercher un code postal avec l'API REST en utilisant SpringBoot, H2 DB et JPA REST-seulement 3 classes à créer-
Créer un site EC avec Rails 5 ⑨ ~ Créer une fonction de panier ~
Créez un site de démonstration simple avec Spring Security avec Spring Boot 2.1
Créez un écran d'authentification de connexion à l'aide de la fonction de session
J'ai écrit un test CRUD avec SpringBoot + MyBatis + DBUnit (Partie 1)
Je veux créer une fonction avec kotlin et java!
Connectez-vous à la base de données avec spring boot + spring jpa et effectuez l'opération CRUD
Un exemple CRUD simple utilisant Java Servlet / JSP et MySQL
Créez un terrain de jeu avec Xcode 12
Créez un serveur Web simple avec la bibliothèque standard Java com.sun.net.httpserver
Créer une JVM pour la distribution d'applications avec les modules JDK 9 et jlink
[Swift] Créez un projet avec Xcode (ver 12.1) et affichez "Hello, World!"
Créez une énumération haute performance avec des champs et des méthodes comme Java avec JavaScript
Créons un mécanisme polymorphe de paramètres avec Generic Dao et Hibernate