[JAVA] Je veux rendre le cadre de la zone de texte rouge lorsqu'il y a une erreur de saisie

introduction

J'ai essayé de rendre le cadre de la zone de texte rouge lorsqu'il y avait une erreur de saisie, mais j'ai eu du mal à l'implémenter, alors je vais le poster.

environnement

OS: macOS Catalina 10.15.6 JDK:14.0.1 Spring Boot 2.3.3 jquery 3.3.1-1 bootstrap 4.2.1

① Lors de la vérification de l'entrée

En effectuant le contrôle d'entrée (validation), l'auteur a créé la classe comme suit.

■ Classe de contrôleur

SignupController.java


package com.example.demo.login.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;

import com.example.demo.login.domain.model.GroupOrder;
import com.example.demo.login.domain.model.SignupForm;
import com.example.demo.login.domain.model.User;
import com.example.demo.login.domain.service.UserService;

//Contrôleur pour l'enregistrement d'un nouvel utilisateur
@Controller
public class SignupController {

	@Autowired
	private UserService userService;

	//Transition vers l'écran d'enregistrement des utilisateurs
	@PostMapping("/signup")
	public String postSignUp(@ModelAttribute SignupForm form, Model model) {

		return "signup/signup";
	}

	//Méthode d'exécution de l'enregistrement d'un nouvel utilisateur
	@PostMapping("/signupUser") //Exécuter la validation dans l'ordre défini dans "Ordre de groupe"
	public String postSignUp(@ModelAttribute @Validated(GroupOrder.class) SignupForm form, BindingResult bindingResult, Model model) {

		//Erreur de liaison(Y compris l'erreur de validation)Si vous le faites, l'écran passera à l'écran d'enregistrement de l'utilisateur.
		if (bindingResult.hasErrors()) {
			return postSignUp(form, model);

		}

		//Afficher le contenu nouvellement enregistré sur la console
		System.out.println(form);

		//Créer une instance utilisateur
		User user = new User();

		//Définissez le contenu saisi dans le formulaire d'inscription dans la classe Utilisateur
		user.setUserId(form.getUserId());
		user.setMailAddress(form.getMailAddress());
		user.setPassword(form.getPassword());

		//Lancer le traitement vers la classe de service avec "User" qui définit le contenu de l'entrée du formulaire comme argument
		boolean result = userService.insertOne(user);

		//Afficher le résultat de l'exécution du travail d'enregistrement sur la console
		if (result == true) {
			System.out.println("insérer le succès");
		} else {
			System.out.println("l'insertion a échoué");
		}

		//Transition vers l'écran de connexion
		return "redirect:/login";

	}

}

■ Groupe de validation

GroupOrder.java


package com.example.demo.login.domain.model;

import javax.validation.GroupSequence;

//Exécutez la validation dans l'ordre «Groupe valide 1» et «Groupe valide 2» lors de l'enregistrement d'un nouvel utilisateur et de la mise à jour des informations d'enregistrement de l'utilisateur.
@GroupSequence({ValidGroup1.class, ValidGroup2.class})
public interface GroupOrder {


}

ValidGroup1.java


package com.example.demo.login.domain.model;

//Interface ValidGroup1
public interface ValidGroup1 {

}

ValidGroup2.java


package com.example.demo.login.domain.model;

//Interface ValidGroup2
public interface ValidGroup2 {

}

■ Classe de formulaire d'entrée

SignupForm.java



package com.example.demo.login.domain.model;


import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;

import org.hibernate.validator.constraints.Length;

import lombok.Data;


//Formulaire d'inscription utilisé dans le formulaire d'inscription d'un nouvel utilisateur
@Data
public class SignupForm {

	/*
	 *null Espace demi-largeur Une erreur se produit si le caractère est vide(Classé comme groupe valide 1)
	 *3 à 20 caractères(Classé comme groupe valide 2)
	 */
	@NotBlank(groups = ValidGroup1.class)
	@Length(min = 3, max = 20, groups = ValidGroup2.class)
	private String userId;

	/*
	 *null Espace demi-largeur Une erreur se produit si le caractère est vide(Classé comme groupe valide 1)
	 *Une erreur se produit si le format n'est pas l'adresse e-mail(Classé comme groupe valide 2)
	 */
	@NotBlank(groups = ValidGroup1.class)
	@Email(groups = ValidGroup2.class)
	private String mailAddress;

	/*
	 *null Espace demi-largeur Une erreur se produit si le caractère est vide(Classé comme groupe valide 1)
	 *3 à 20 caractères(Classé comme groupe valide 2)
	 *Alphabet uniquement(Classé comme groupe valide 2)
	 */
	@NotBlank(groups = ValidGroup1.class)
	@Length(min = 3, max = 20, groups = ValidGroup2.class)
	@Pattern(regexp = "^[a-zA-Z0-9]+$", groups = ValidGroup2.class)
	private String password;

}

■ Message d'erreur

messages.properties


#Message d'erreur de validation
signupForm.userId=Identifiant d'utilisateur
NotBlank.signupForm.userId={0}Entrez s'il vous plait
Length.signupForm.userId={0}Est{2}Plus que des lettres{1}Veuillez entrer sous la lettre

signupForm.mailAddress=adresse mail
NotBlank.signupForm.mailAddress={0}Entrez s'il vous plait
Email.signupForm.mailAddress=Veuillez saisir le format d'adresse e-mail

signupForm.password=mot de passe
NotBlank.signupForm.password={0}Entrez s'il vous plait
Length.signupForm.password={0}Est{2}Plus que des lettres{1}Veuillez entrer sous la lettre
Pattern.signupForm.password={0}Veuillez saisir des caractères alphanumériques demi-largeur

searchForm.keyword=mot-clé
NotBlank.searchForm.keyword={0}Entrez s'il vous plait

#Personnaliser le message d'erreur de connexion
AbstractUserDetailsAuthenticationProvider.badCredentials=L'ID de connexion ou le mot de passe est incorrect.

② Création du formulaire de saisie (avant modification)

Au départ, j'ai créé le html du formulaire de saisie comme indiqué ci-dessous.

signup.html


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
	  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{layout/template}">
<head>
	<meta charset="UTF-8"></meta>
    <title>SignUp</title>

</head>
<!--Écran d'enregistrement de l'utilisateur-->
<body>
    <div layout:fragment="content">
		<div class="col-sm-4 offset-sm-4">
			<div class="page-header">
				<h1>Écran d'enregistrement de l'utilisateur</h1>
			</div>
			<form method="post" th:action="@{/signupUser}" th:object="${signupForm}">

				<table class="table table-bordered table-hover">
				<tr>
					<td> <!--Si une erreur se produit dans le champ "userId" de l'objet de modèle "signupForm", "has" dans l'attribut de classe-Ajouter "erreur" et rendre la zone autour de la zone de texte rouge
-->
						<div class="form-group" th:classappend="${#fields.hasErrors('userId')}?'has-error'">
							<input type="text" class="form-control" placeholder="Identifiant de connexion" th:field="*{userId}"/>
							<span class="text-danger"
								th:if="${#fields.hasErrors('userId')}"
								th:errors="*{userId}">
								userId error
							</span>
						</div>
					</td>
				<tr>
				<tr>
					<td> <!--Si une erreur se produit dans le champ "mailAddress" de l'objet de modèle "signupForm", "has" dans l'attribut class-Ajouter "erreur" et rendre la zone autour de la zone de texte rouge
-->
						<div class="form-group"
							th:classappend="${#fields.hasErrors('mailAddress')}?'has-error'">
							<input type="text" class="form-control" placeholder="adresse mail" th:field="*{mailAddress}"/>
							<span class="text-danger"
								th:if="${#fields.hasErrors('mailAddress')}"
								th:errors="*{mailAddress}">
								mailAddress error
							</span>
						</div>
					</td>
				<tr>
				<tr>
					<td> <!--Si une erreur se produit dans le champ "mot de passe" de l'objet de modèle "signupForm", "a" dans l'attribut de classe-Ajouter "erreur" et rendre la zone autour de la zone de texte rouge
-->
						<div class="form-group"
							th:classappend="${#fields.hasErrors('password')}?'has-errors'">
							<input type="text" class="form-control" placeholder="mot de passe" th:field="*{password}"/>
							<span class="text-danger"
								th:if="${#fields.hasErrors('password')}"
								th:errors="*{password}">
								password error
							</span>
						</div>
					</td>
				<tr>
				</table>
				<button class="btn btn-primary col-sm-6" type="submit">s'inscrire</button>
			</form>
		</div>
	</div>
</body>
</html>

Comme décrit dans le commentaire en html, lorsqu'une erreur s'est produite dans chaque champ, j'ai écrit que le cadre de la zone de texte devenait rouge, mais le résultat était que le cadre ne devenait pas rouge comme indiqué ci-dessous.

À propos, "has-error" est une classe Bootstrap qui rend le cadre de la zone de texte rouge.

スクリーンショット 2020-10-21 13.00.49.png

Lorsque j'ai vérifié le «Guide de migration Bootstrap 4», il y avait la description suivante.

** [Modifications depuis Bootstrap 3.x] Changez le style d'affichage de chaque état de vérification en style à l'aide de la fonction de vérification de formulaire HTML5 .has-warning, .has-error, .has-success, .has-feedback, .form-control-feedback sont obsolètes En tant que solution de secours, les classes .is-invalid et .is-valid peuvent être utilisées à la place des pseudo-classes pour la validation côté serveur. .was-validated Aucune classe parent requise. ** **

URL:https://bootstrap-guide.com/components/forms?

Depuis Bootstrap 4, "has-error" a été aboli, et "is-invalid" semble être fourni en tant que fonction à la place.

③ Modifier le formulaire de saisie

Écrivez dans la balise d'entrée, pas dans la balise div.

signup.html


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
	  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{layout/template}">
<head>
	<meta charset="UTF-8"></meta>
    <title>SignUp</title>

</head>
<!--Écran d'enregistrement de l'utilisateur-->
<body>
    <div layout:fragment="content">
		<div class="col-sm-4 offset-sm-4">
			<div class="page-header">
				<h1>Écran d'enregistrement de l'utilisateur</h1>
			</div>
			<form method="post" th:action="@{/signupUser}" th:object="${signupForm}">

				<table class="table table-bordered table-hover">
				<tr>
					<td>
						<div class="form-group">
							<!--Si une erreur se produit dans le champ "userId" de l'objet modèle "signupForm", ajoutez l'attribut class et "is"-Rouge autour de la zone de texte avec "invalide"-->
							<input type="text" class="form-control" placeholder="Identifiant de connexion" th:field="*{userId}"
							th:classappend="${#fields.hasErrors('userId')}?'is-invalid'"/>
							<span class="text-danger"
								th:if="${#fields.hasErrors('userId')}"
								th:errors="*{userId}">
								userId error
							</span>
						</div>
					</td>
				<tr>
				<tr>
					<td>
						<div class="form-group">
							<!--Si une erreur se produit dans le champ "mailAddress" de l'objet modèle "signupForm", ajoutez l'attribut class et "is"-Rouge autour de la zone de texte avec "invalide"-->
							<input type="text" class="form-control" placeholder="adresse mail" th:field="*{mailAddress}"
							th:classappend="${#fields.hasErrors('mailAddress')}?'is-invalid'"/>
							<span class="text-danger"
								th:if="${#fields.hasErrors('mailAddress')}"
								th:errors="*{mailAddress}">
								mailAddress error
							</span>
						</div>
					</td>
				<tr>
				<tr>
					<td>
						<div class="form-group">
							<!--Si une erreur se produit dans le champ "mot de passe" de l'objet de modèle "signupForm", ajoutez l'attribut de classe et "est"-Rouge autour de la zone de texte avec "invalide"-->
							<input type="text" class="form-control" placeholder="mot de passe" th:field="*{password}"
							th:classappend="${#fields.hasErrors('password')}?'is-invalid'"/>
							<span class="text-danger"
								th:if="${#fields.hasErrors('password')}"
								th:errors="*{password}">
								password error
							</span>
						</div>
					</td>
				<tr>
				</table>
				<button class="btn btn-primary col-sm-6" type="submit">s'inscrire</button>
			</form>
		</div>
	</div>
</body>
</html>

Lorsque je l'ai exécuté, j'ai pu rendre le cadre de la zone de texte rouge en cas d'erreur de saisie, comme indiqué ci-dessous.

スクリーンショット 2020-10-21 13.28.10.png

référence: https://www.e-pokke.com/blog/bootstrap4-invalid-feedback.html https://learning-collection.com/thymeleaf%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/

Recommended Posts

Je veux rendre le cadre de la zone de texte rouge lorsqu'il y a une erreur de saisie
Je souhaite afficher un message d'erreur lors de l'inscription dans la base de données
Rails6 Je veux créer un tableau de valeurs avec une case à cocher
J'ai essayé de résoudre le problème de la machine à karaoké Ruby (il y a un exemple de réponse)
J'ai essayé de résoudre le problème de la boisson bonus Ruby (il y a un exemple de réponse)
Comment afficher la valeur lorsqu'il y a un tableau dans le tableau
Je veux limiter l'entrée en réduisant la plage de nombres
Je veux contrôler le message d'erreur par défaut de Spring Boot
J'ai essayé de résoudre le problème de création de carte de bingo Ruby (il y a un exemple de réponse)
Je veux créer une application ios.android
[JavaScript] Comment afficher une alerte en cas d'omission du formulaire de saisie
Je veux connaître le JSP du portlet ouvert lors du développement de Liferay
[Java] Je veux faciliter les choses car il est difficile d'entrer System.out.println
Je veux var_dump le contenu de l'intention
Après avoir installé le gemfile'devise''bootstrap 'avec des rails, que faire lorsque l'url est une erreur
Quand le survol d'Eclipse est difficile à voir
Je veux connaître la réponse de l'application Janken
Je souhaite afficher le nom de l'affiche du commentaire
Quand j'ai pensé à l'erreur 402 qui est apparue soudainement au milieu de l'introduction de PAY.jp, il y avait un endroit inattendu
Même si je souhaite convertir le contenu d'un objet de données en JSON en Java, il existe une référence circulaire ...
Je veux que vous racontiez que l'erreur a été résolue lorsque vous avez poignardé le chargeur dans le coin de la tête
Je veux retourner la position de défilement de UITableView!
Je veux savoir quelle version de java le fichier jar que j'ai est disponible
Je n'ai trouvé aucun moyen d'obtenir le code d'erreur lorsque j'ai reçu une exception sur Android
J'ai une erreur! * Il n'y a pas de modèle de demande interactif
Je souhaite créer un modèle spécifique d'ActiveRecord ReadOnly
Je souhaite modifier le paramètre de sortie du journal de UtilLoggingJdbcLogger
L'idée de couper quand l'erreur n'est pas résolue
Qu'est-ce qu'un objet immuable? [Explication comment faire]
Je souhaite renvoyer plusieurs valeurs de retour pour l'argument saisi
[Ruby] Je souhaite inverser l'ordre de la table de hachage
Je veux juger de la nécessité de tester en comparant les différences des fichiers de classe lors de la refactorisation de Java.
Lancer une exception et attraper lorsqu'il n'y a pas de gestionnaire correspondant au chemin au printemps
Je veux comprendre le flux des paramètres de demande de traitement Spring
L'histoire de Collectors.groupingBy que je veux garder pour la postérité
Vous voulez savoir ce que Ruby n est la puissance de 2? (Jugement de puissance de 2)
J'ai fait un petit bijou pour poster le texte du mode org sur qiita
Je veux changer la valeur de l'attribut dans Selenium of Ruby
[RSpec] Lorsque vous souhaitez utiliser la variable d'instance du contrôleur dans le test [attribuer n'est pas recommandé]
Un mémo lorsque vous souhaitez effacer la partie horaire de l'agenda
Ce que j'ai pensé en passant la valeur d'entrée de l'utilisateur à la classe Service
Enregistré parce que j'étais accro à l'entrée standard de la classe Scanner
[Ruby] Je souhaite extraire uniquement la valeur du hachage et uniquement la clé
Erreur lors de la finalisation du membre de la classe Entity utilisé dans SpringWebFlux
Je souhaite obtenir l'adresse IP lors de la connexion au Wi-Fi avec Java
J'ai essayé d'utiliser pleinement le cœur du processeur avec Ruby
Je veux obtenir le nom de champ du champ [Java]. (Vieux ton d'histoire)
Je veux que vous utilisiez Enum # name () pour la clé de SharedPreference
[Rails] Que faire lorsque l'image Refile n'est pas affichée lors de l'écriture du traitement au moment de l'erreur de routage
Que faire si le message "Un serveur est déjà en cours d'exécution" s'affiche. Erreur lors de la tentative de démarrage du serveur rails