salut! C'est la 4ème série à jouer avec Java à partir de zéro. Je viens de le nommer.
Cliquez ici pour les articles jusqu'à la dernière fois ↓
Cette fois, je voudrais ajouter une validation à l'application d'écho que j'ai faite la dernière fois.
Actuellement, les chaînes de caractères, les nombres et les caractères dépendants de l'environnement peuvent être entrés dans n'importe quel nombre de caractères, donc si vous envoyez un document fantôme, l'affichage sera corrompu comme indiqué ci-dessous.
effrayé. Si Hatena est aligné sur le nom, cela créera une atmosphère inquiétante. Est-ce brouillé? Je n'aime pas le fait que Zero ait franchi la largeur de l'écran.
Donc, cette fois, je vais essayer de valider avec les exigences suivantes, comme le nom d'utilisateur d'un service. En cas d'erreur C'est une image qu'un message d'erreur s'affiche sur le même écran.
--Types de caractères disponibles: alphanumérique demi-largeur uniquement
Le produit fini a la forme suivante. (La couleur d'arrière-plan a été changée en une couleur qui est agréable pour les yeux)
Les annotations suivantes ont été ajoutées à la classe de formulaire.
-- @ NotBlank
: Vous pouvez vérifier qu'il n'est pas nul ou vide [^ 1]
-- @ Size
: Vous pouvez spécifier les valeurs minimum et maximum en utilisant l'attribut min ou max.
-- @ Pattern
: Vous pouvez spécifier la chaîne de caractères du modèle de l'expression régulière avec la valeur d'attribut regexp. Cette fois, j'ai utilisé une expression régulière qui n'autorise que les caractères alphanumériques demi-largeur
[^ 1]: utilisez @NotNull pour ne vérifier que null
EchoForm.java
package com.example.form;
import java.io.Serializable;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotBlank;
public class EchoForm implements Serializable {
private static final long serialVersionUID = 1L;
@NotBlank
@Size(min = 4)
@Pattern(regexp = "[a-zA-Z0-9]*") //Doit être alphanumérique
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Ecrivez uniquement la méthode d'écho modifiée. Il y a deux changements ci-dessous.
branche en cas d'erreur
.
Si une erreur survient lors de la vérification par annotation, je ne souhaite pas que vous alliez à l'écran "Bonjour $ {username}", donc je change pour retourner la même page.EchoController.java
@RequestMapping(value = "echo", method = RequestMethod.POST)
public String echo(@Validated EchoForm echoForm, BindingResult result, Model model) {
if (result.hasErrors() ) {
model.addAttribute("name", echoForm.getName());
return "index";
}
model.addAttribute("name", echoForm.getName());
return "echo";
}
Je souhaite afficher le message d'erreur en rouge comme indiqué ci-dessous uniquement lorsqu'une erreur se produit ... Cela peut être fait avec Spring!
Puisque nous avons déjà lié l'objet de formulaire la dernière fois, nous pouvons obtenir les informations d'erreur de echoForm et les insérer dans Thymeleaf pour créer du HTML. Le printemps est incroyable. Thymeleaf est incroyable.
Seule la partie du formulaire est décrite.
A l'endroit entouré par span, le message d'erreur s'affiche uniquement lorsque l'objet est en erreur [^ 2]. Plus précisément, comme les propriétés de l'objet formulaire sont définies dans l'attribut th: errors, seuls les messages d'erreur pour les propriétés spécifiées sont affichés.
S'il y a plusieurs messages d'erreur, «
» est automatiquement entré. Je vous remercie.
[^ 2]: j'ai fait référence à la mise en œuvre de cette page.
index.html
<form th:object="${echoForm}" th:action="@{/echo}" method="POST">
<div>s'il vous plaît entrez votre nom d'utilisateur</div>
<div>(4 caractères alphanumériques demi-largeur ou plus)</div>
<div>
<input type="text" th:field="*{name}" />
<button>j'enverrai</button>
</div>
<span th:if="${#fields.hasErrors('name')}" th:errors="*{name}" style="color: red"></span>
</form>
En fait, si vous exécutez avec l'implémentation jusqu'à présent, le message d'erreur sera le message par défaut (anglais) de l'annotation, donc l'erreur sera la suivante.
Je n'aime pas un peu ça ... Ce qui précède peut encore être transmis avec un message d'erreur à la mode ❤️, mais le numéro de taille n'a pas de sens pour l'utilisateur ... Corrigeons cela à un message d'erreur japonais!
Il semble souhaitable de définir les messages d'erreur Bean Validation par Spring MVC dans le fichier de propriétés. Il semble y avoir plusieurs méthodes, mais j'ai choisi cela car il était facile de comprendre comment créer ValidationMessages.properties directement sous le chemin de classe.
Créez un nouveau ValidationMessages.properties sous ressources.
Le contenu est une implémentation simple qui réécrit simplement le message de l'annotation utilisée.
ValidationMessages.properties
org.hibernate.validator.constraints.NotBlank.message=Une entrée est requise.
javax.validation.constraints.Size.message=Doit comporter au moins 4 caractères.
javax.validation.constraints.Pattern.message=Seuls les caractères alphanumériques demi-largeur sont valides.
À propos, lorsque je viens de coller ce qui précède dans ValidationMessages.properties, il est automatiquement devenu comme suit simplement en entrant japonais et en appuyant sur Entrée ... Parce que le bean standard de Spring Boot n'est pas UTF-8, Multibyte Il semble que les personnages soient déformés.
ValidationMessages.properties
org.hibernate.validator.constraints.NotBlank.message=\u5165\u529B\u5FC5\u9808\u3067\u3059\u3002
javax.validation.constraints.Size.message=4\u6587\u5B57\u4EE5\u4E0A\u3067\u306A\u304F\u3066\u306F\u3044\u3051\u307E\u305B\u3093\u3002
javax.validation.constraints.Pattern.message=\u534A\u89D2\u82F1\u6570\u306E\u307F\u6709\u52B9\u3067\u3059\u3002
Comme mentionné dans la section commentaire de Qiita here, probablement parce que je suis également un système Spring 2 et Java 11 ou supérieur, UTF dans les propriétés du fichier Si je le mets à -8, cela a bien fonctionné dans l'application. Cliquez simplement avec le bouton droit sur le fichier> Propriétés> Ressource et changez le codage du fichier texte par défaut en UTF-8.
Maintenant, quand j'essaye d'enregistrer le fichier, j'obtiens l'avertissement suivant, mais cela a bien fonctionné avec Save as UTF-8
.
Vous avez maintenant un message japonais comme celui-ci!
Cette fois, j'ai eu un petit problème avec la notation Thymeleaf de la partie d'ajout de texte au moment de l'erreur et la localisation japonaise de ValidationMessages.properties! La méthode introduite cette fois est suspecte s'il s'agit du système Spring 1, veuillez donc la vérifier si nécessaire.
Merci pour la lecture!
Recommended Posts