[JAVA] [Introduction à Spring Boot] Vérification de la validation du formulaire

Objectif

Pour ceux qui ont fini de travailler sur Spring Quickstart Guide, ceux qui ont commencé à apprendre Spring Boot et ceux qui veulent revoir

Nous partagerons ce que nous avons appris en travaillant réellement sur le guide officiel Validating Form Input.

Le formulaire rempli est ici.

Il existe un formulaire pour saisir le nom et l'âge, スクリーンショット 2020-07-09 14.05.32.png

Si le bouton Soumettre est enfoncé avec une valeur non valide saisie, un message d'erreur s'affiche et スクリーンショット 2020-07-09 14.05.40.png

Si une valeur valide est saisie, nous la mettrons en œuvre afin que vous puissiez passer à un autre écran. スクリーンショット 2020-07-09 14.12.54.png

L'environnement de développement et l'examen jusqu'à présent sont les suivants.

Environnement de développement


Système d'exploitation: macOS Mojave version 10.14.6
Éditeur de texte: Visual Studio Code (ci-après VSCode)
Java: 11.0.2

Cliquez ici pour consulter le guide de démarrage rapide Cliquez ici pour un examen de la création d'un service Web RESTful Cliquez ici pour un examen de la consommation d'un service Web RESTful Cliquez ici pour un examen de l'accès aux données avec JPA Cliquez ici pour un examen de la soumission du formulaire de traitement

1. Commençons le projet Spring Boot!

Tout d'abord, accédez à spring initializr.

  1. Cliquez sur le bouton AJOUTER DES DÉPENDANCES et ajoutez «Spring Web» et «Thymeleaf». 2.Artifact, nom changé en validating-form-input.
  2. Remplacez Java par 11.

Cliquez ensuite sur le bouton GENERATE pour télécharger le fichier Zip.

スクリーンショット 2020-07-09 14.25.27.png

Extrayez le fichier Zip téléchargé et vous êtes prêt à partir.

2. Ajoutez du code!

Ouvrez le dossier précédent avec VS Code. Nous vous recommandons d'installer le Java Extension Pack pour les extensions. Il est dit que vous devez l'installer.

スクリーンショット 2020-06-30 10.08.25.png

Créons PersonForm.java!

Créez un fichier PersonForm.java dans src / main / java / com / example / validatingforminput /.

スクリーンショット 2020-07-09 14.30.13.png

Ajoutez le code faisant référence à la formule.

PersonForm.java


package com.example.validatingforminput;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class PersonForm {

  @NotNull
  @Size(min=2, max=30)
  private String name;

  @NotNull
  @Min(18)
  private Integer age;

  public String getName() {
    return this.name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Integer getAge() {
    return age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }

  public String toString() {
    return "Person(Name: " + this.name + ", Age: " + this.age + ")";
  }
}

Nous approfondirons le code ajouté.

@ NotNull et @ Size

PersonForm.java


@NotNull
@Size(min=2, max=30)
private String name;

Deux annotations de validation sont ajoutées à la variable de nom de type String au moment de la déclaration.

@ NotNull n'autorise pas ** null **. Veuillez noter que les valeurs nulles ne sont pas autorisées, mais que les caractères vides et les espaces sont autorisés.

@ Size vérifie s'il est ** min ou plus ** et ** max ou moins ** spécifié dans (). Cette fois, c'est @Size (min = 2, max = 30), donc une erreur se produira à moins qu'elle ne soit 2 ou plus et 30 ou moins.

@Min

PersonForm.java


@NotNull
@Min(18)
private Integer age;

Deux annotations de validation sont ajoutées lors de la déclaration d'une variable d'âge de type Integer. (L'un est «@ NotNull» mentionné ci-dessus)

@ Min est vérifié s'il est inférieur à la valeur décrite dans (). Cette fois, il s'agit de «@ Min (18)», donc moins de 18 entraînera une erreur.

③ Getter / setter, méthode toString

PersonForm.java


public String getName() {
  return this.name;
}

public void setName(String name) {
  this.name = name;
}

public Integer getAge() {
  return age;
}

public void setAge(Integer age) {
  this.age = age;
}

public String toString() {
  return "Person(Name: " + this.name + ", Age: " + this.age + ")";
}

Il définit une méthode getter / setter pour obtenir et modifier les valeurs du nom et de l'âge des variables. Il définit également une méthode toString pour afficher le nom et l'âge sous forme de chaînes. (Je ne pense pas que je l'utilise cette fois, mais est-ce pour le débogage?)

Ajoutons une dépendance de validation à pom.xml!

Bien que cela n'ait pas été mentionné dans le guide officiel, lorsque Spring Boot 2.3 ou supérieur, ʻImport javax.validation.constraints. 〇〇 of PersonForm.java` entraînera une erreur. (Spring Boot2.3 Relealse Notes)

Ajoutez ce qui suit aux dépendances.

pom.xml


<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

スクリーンショット_2020-07-09_15_38_58.png

Créons WebController.java!

Créez un fichier WebController.java dans src / main / java / com / example / validatingforminput /.

スクリーンショット 2020-07-09 15.41.24.png

Ajoutez le code faisant référence à la formule.

WebController.java


package com.example.validatingforminput;

import javax.validation.Valid;

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;


@Controller
public class WebController implements WebMvcConfigurer {

  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/results").setViewName("results");
  }

  @GetMapping("/")
  public String showForm(PersonForm personForm) {
    return "form";
  }

  @PostMapping("/")
  public String checkPersonInfo(@Valid PersonForm personForm, BindingResult bindingResult) {

    if (bindingResult.hasErrors()) {
      return "form";
    }

    return "redirect:/results";
  }
}

Nous approfondirons le code ajouté.

① Interface WebMvcConfigurer et méthode addViewControllers

WebController.java


@Controller
public class WebController implements WebMvcConfigurer {

  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/results").setViewName("results");
  }

 //Ce qui suit est omis
}

Implémente l'interface WebMvcConfigurer, en remplaçant la méthode addViewControllers.

Il est interprété que l'URL «http: // localhost: 8080 / results» est définie pour faire référence au modèle ** results.html **. Il semble que l'URL et le modèle soient mappés. L'implémentation de results.html se fera plus tard.

② méthode showForm

WebController.java


@GetMapping("/")
public String showForm(PersonForm personForm) {
  return "form";
}

@ GetMapping est une annotation pour appeler la méthode showForm quand il y a une requête GET à http: // localhost: 8080 /. Je reçois un PersonForm comme argument. Vous pouvez associer PersonForm à l'attribut form de form.html, qui est la valeur de retour de la méthode. L'implémentation de form.html se fera plus tard.

③ méthode checkPersonInfo

WebController.java


@PostMapping("/")
public String checkPersonInfo(@Valid PersonForm personForm, BindingResult bindingResult) {

  if (bindingResult.hasErrors()) {
    return "form";
  }

  return "redirect:/results";
}

@ PostMapping est une annotation pour appeler la méthode checkPersonInfo quand il y a une requête POST à http: // localhost: 8080 /. Le premier argument, @Valid PersonForm personForm, valide les données d'entrée. Le deuxième argument, BindingResult bindingResult, est une annotation pour contenir les données d'entrée et le résultat de la validation (s'il y a une erreur).

L'instruction if avec bindingResult.hasErrors () vérifie les erreurs. S'il y a une erreur, redessinez form.html avec le message d'erreur et la valeur saisie.

S'il n'y a pas d'erreur, vous serez redirigé vers http: // localhost: 8080 / results.

Créons form.html!

Créez un fichier form.html dans src / main / resources / templates /.

スクリーンショット 2020-07-10 10.18.06.png

Ajoutez le code faisant référence à la formule.

form.html


<html xmlns:th="http://www.thymeleaf.org">
  <body>
      <form action="#" th:action="@{/}" th:object="${personForm}" method="post">
        <table>
          <tr>
            <td>Name:</td>
            <td><input type="text" th:field="*{name}" /></td>
            <td th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</td>
          </tr>
          <tr>
            <td>Age:</td>
            <td><input type="text" th:field="*{age}" /></td>
            <td th:if="${#fields.hasErrors('age')}" th:errors="*{age}">Age Error</td>
          </tr>
          <tr>
            <td><button type="submit">Submit</button></td>
          </tr>
        </table>
      </form>
  </body>
</html>

C'est un écran de formulaire pour entrer le nom et l'âge.

Nous approfondirons la description de thymeleaf dans le code ajouté.

thymeleaf est un moteur de template qui peut être géré par springboot. Th: Décrivez comme 〇〇. [Tutoriel Thymeleaf] écrit en japonais (https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf_ja.html#thymeleaf%E3%81%AE%E7%B4%B9%E4%BB% Il y a aussi 8B)!

th:action

Remplace le contenu de l'attribut action de la balise form. La méthode de description est th: action =" @ {} ". Depuis method = "post", la méthode checkPersonInfo de WebController est appelée lorsque le bouton Soumettre est enfoncé.

th:object

L'objet est spécifié par «th: object». Cela vous permet de faire référence à des variables dans des objets comme * {name} au lieu de personForm.name.

th:field

Écrivez th: field =" * {variable name} " pour afficher les variables dans l'objet spécifié par th: object. Cette fois, comme il y a un nom et un âge dans la classe PersonForm, ce sera th: field =" * {name} ", th: field =" * {age} ". De plus, le nom de la variable décrit dans th: field =" * {variable name} " est l'attribut id et l'attribut name de l'entrée.

th:if

Écrivez th: if = condition. Si true, la balise et les éléments enfants sont affichés. Cette condition sera vraie s'il y a une erreur.

th:errors

Écrivez th: errors =" * {variable name} ". Un message d'erreur s'affichera s'il y a une erreur. Il semble que vous ayez sécurisé une zone pour afficher les messages d'erreur en vérifiant les erreurs avec th: if et th: errors.

Créons results.html!

Créez un fichier results.html dans src / main / resources / templates /.

スクリーンショット 2020-07-10 11.11.36.png

Ajoutez le code faisant référence à la formule.

results.html


<html>
  <body>
    Congratulations! You are old enough to sign up for this site.
  </body>
</html>

Si aucune valeur invalide n'est saisie sur l'écran du formulaire, l'écran passera à cet écran.

3. Lançons-le!

Maintenant que l'application est prête à fonctionner, vérifions.

Entrez la commande suivante dans le terminal et appuyez sur Entrée.

Terminal


$ ./mvnw spring-boot:run

Ensuite, lorsque vous accédez à http: // localhost: 8080 /, vous devriez voir l'écran du formulaire ci-dessous. (Form.html s'affiche)

スクリーンショット 2020-07-09 14.05.32.png

** Entrez un caractère pour le nom et un nombre de moins de 18 ans pour l'âge, et appuyez sur le bouton Soumettre pour afficher un message d'erreur. ** **

スクリーンショット 2020-07-10 13.38.34.png

スクリーンショット 2020-07-10 13.38.46.png

** Si vous appuyez sur le bouton Soumettre sans rien saisir d'âge, un message d'erreur s'affiche. ** **

スクリーンショット 2020-07-10 13.41.09.png

** Entrez 2 caractères ou plus pour le nom et 18 ou plus pour l'âge, et appuyez sur le bouton Soumettre pour afficher l'écran des résultats (result.html). ** **

スクリーンショット 2020-07-10 13.45.01.png

スクリーンショット 2020-07-10 13.45.07.png

Je vous remercie pour votre travail acharné! terminé!

Site de référence

** Vérification de la valeur d'entrée avec Spring Boot ** ** Si c'est un contrôleur qui renvoie simplement le nom de la vue, vous n'avez pas besoin d'un contrôleur séparé! ** ** Validation et message d'erreur **

Recommended Posts

[Introduction à Spring Boot] Vérification de la validation du formulaire
Introduction à Spring Boot ① ~ DI ~
Introduction à Spring Boot ② ~ AOP ~
Introduction à Spring Boot, partie 1
[Introduction à Spring Boot] Soumettez un formulaire à l'aide de thymeleaf
Forme de botte de printemps
Test de validation de classe de formulaire avec Spring Boot
Introduction à Spring Boot + In-Memory Data Grid
[Java] Article pour ajouter une validation avec Spring Boot 2.3.1.
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Essayez Spring Boot de 0 à 100.
Introduction à Ratpack (7) --Guice & Spring
Modifier le message de validation Spring Boot
Comment configurer Spring Boot + PostgreSQL
Obtenez des résultats de validation avec Spring Boot
Comment utiliser ModelMapper (Spring boot)
Mise à niveau de la botte à ressort de la série 1.5 à la série 2.0
Introduction à Spring Boot x Open API ~ Open API créée avec le modèle d'écart de génération ~
L'histoire de la transition de Spring Boot 1.5 à 2.1
Modifications lors de la migration de Spring Boot 1.5 vers Spring Boot 2.0
Modifications lors de la migration de Spring Boot 2.0 vers Spring Boot 2.2
Comment diviser un fichier de message Spring Boot
Ajoutez une botte de printemps et un dégradé à éclipse
[Spring Boot Actuator] Comment enregistrer manuellement votre propre processus de vérification de l'état
Introduction à Ruby 2
Introduction du livre: Spring Boot Livre de référence recommandé pour les débutants!
Spring Fox ① Introduction
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
Comment utiliser h2db intégré avec Spring Boot
Comment réduire l'image de Spring Boot Docker
Comment utiliser les attributs de session Spring Boot (@SessionAttributes)
L'histoire de la montée de la série Spring Boot 1.5 à la série 2.1
Vérifions la sensation de Spring Boot + Swagger 2.0
Essayez d'implémenter la fonction de connexion avec Spring Boot
Défi Spring Boot
Le navigateur Spring Data REST HAL confirme l'opération Spring REST
Comment ajouter un chemin de classe dans Spring Boot
Introduction à web3j
Introduction à Micronaut 1 ~ Introduction ~
[Java] Introduction à Java
Introduction à la migration
Comment se lier avec un fichier de propriétés dans Spring Boot
Essayez d'automatiser la migration avec Spring Boot Flyway
Je voulais classer la botte à ressort dans un multi-projet
Introduction à Java
Appliquer Twitter Bootstrap 4 à Spring Boot 2 à l'aide de Webjars
Spring Boot Rappelez-vous
gae + botte à ressort
Introduction à Doma
[Spring Boot] Comment se référer au fichier de propriétés
Spring Boot - Comment définir le délai d'expiration de la session
Plans pour prendre en charge JDK 11 pour Eclipse et Spring Boot
Comment définir l'injection de dépendance Spring Boot (DI)
Comment écrire un test unitaire pour Spring Boot 2
Mappez automatiquement DTO aux entités avec l'API Spring Boot
Si vous souhaitez séparer le traitement Spring Boot + Thymeleaf
Un mémorandum de dépendance à Spring Boot2 x Doma2
05. J'ai essayé de supprimer la source de Spring Boot