Spring Boot 2 + Thymeleaf:伺服器端表單驗證

来源:https://www.cnblogs.com/gdjlc/archive/2019/10/21/11717023.html
-Advertisement-
Play Games

表單驗證分為前端驗證和伺服器端驗證。 伺服器端驗證方面,Java提供了主要用於數據驗證的JSR 303規範,而Hibernate Validator實現了JSR 303規範。 項目依賴加入spring-boot-starter-thymeleaf時,預設就會加入Hibernate Validat... ...


表單驗證分為前端驗證和伺服器端驗證。
伺服器端驗證方面,Java提供了主要用於數據驗證的JSR 303規範,而Hibernate Validator實現了JSR 303規範。
項目依賴加入spring-boot-starter-thymeleaf時,預設就會加入Hibernate Validator的依賴。

開發環境:IntelliJ IDEA 2019.2.2
Spring Boot版本:2.1.8

新建一個名稱為demo的Spring Boot項目。

1、pom.xml

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

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

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

2、src/main/java/com/example/demo/User.java

package com.example.demo;

import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

public class User {
    @NotBlank(message = "用戶名不能為空")
    String name;
    @Length(min = 11, max = 11, message = "手機號長度必須11位")
    String phone;
    @Size(min = 6, max = 20, message = "密碼長度6-20位")
    String password;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

3、src/main/java/com/example/demo/FormController.java

package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
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.RequestMapping;

import javax.validation.Valid;
import java.util.List;

@Controller
public class FormController {
    @RequestMapping("/{form}")
    public String form(@PathVariable String form, @ModelAttribute User user){
        return form;
    }

    @PostMapping("/submit")
    public String submit(@Valid User user, BindingResult result){
        if (result.hasErrors()) {
            List<ObjectError> list = result.getAllErrors();
            for (ObjectError error : list) {
                System.out.println(error.getDefaultMessage());
            }
            return "form";
        }
        //業務邏輯處理
        return "form";
    }

}

4、src/main/resources/templates/form.html

前端通過#fields對象輸出錯誤信息有2種方式,1種是在每個欄位後面輸出,另1種是全部在一起輸出。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>表單的提交處理</title>
    <style>
        .fieldError{color: red}
    </style>
</head>
<body>
    <form method="post" th:action="@{/submit}" th:object="${user}">
       <table>
           <tr>
               <td>用戶名:</td>
               <td><input type="text" th:field="*{name}" />
                   <span class="fieldError" th:if="${#fields.hasErrors('*{name}')}" th:errors="*{name}"></span>
               </td>
           </tr>
           <tr>
               <td>手機號:</td>
               <td><input type="text" th:field="*{phone}" />
                   <span class="fieldError" th:if="${#fields.hasErrors('*{phone}')}" th:errors="*{phone}"></span>
               </td>
           </tr>
           <tr>
               <td>密碼:</td>
               <td><input type="text" th:field="*{password}" />
                   <span class="fieldError" th:if="${#fields.hasErrors('*{password}')}" th:errors="*{password}"></span>
               </td>
           </tr>
           <tr>
               <td colspan="2">
                   <input type="submit" value="提交" />
                   <div th:each="err : ${#fields.errors('*')}">
                       <span th:text="${err}" class="fieldError"></span>
                   </div>
               </td>
           </tr>
       </table>
    </form>
</body>
</html>

啟動服務後,瀏覽器訪問http://localhost:8080/form,點擊提交按鈕,結果如下:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前幾周,很流行一個手機游戲,叫《家國夢》。我在手機上玩了一兩天後,發現了兩個問題: 1. 收貨收金幣太沒意思,只需要手指滑在固定的路線,一會兒就煩了 2. 怎麼追趕也追不上手快的人(當然也需要一定策略) 我剛玩這個游戲的時候,還能在好友里排名第一,但三四天後就落到了第三,真是比不過年輕人。。。 正好 ...
  • 本人3年開發經驗、18年年底開始跑路找工作,在互聯網寒冬下成功拿到阿裡巴巴、今日頭條、滴滴等公司offer,崗位是 Java後端開發,最終選擇去了阿裡巴巴。 面試了很多家公司,感覺大部分公司考察的點都差不多,所以將自己的心得記下來,希望能給正在找或者準備找工作的朋友提供一點幫助。另外,目前在阿裡也做 ...
  • 廢話不多說,上代碼 1.從類名開始(我真是太貼心了,給自己點個贊) 首先數組類需要帶有泛型,這個不多說。需要註意的是在java中,數組只能存放同一個類型的。 2.成員變數 插個題外話: 關於size和索引,最開始學數組時讓我很傷神,首先數組的索引是從0開始,而size是指數組中元素的 的個數,假設數 ...
  • Python是一種面向對象的編程語言,語法簡潔而清晰,具有豐富和強大的類庫。Python在設計上堅持了清晰劃一的風格,這使得Python成為一門易讀、易維護,並且被大量用戶所歡迎的、用途廣泛的語言。對於初學編程者來說,首選Python是個非常棒的選擇。 零基礎學編程 零基礎學編程,用python入門 ...
  • 兩種併發編程模型 多進程 進程間通信常用的幾種方式: 文件 管道 消息隊列 多線程 一個進程中存在的多個線程,通常通過共用記憶體來通信,(說的非常非常粗俗,就是通過類似“全局變數”的一些數據對象來通信。不知道這種說對不對) 兩者優缺點 多線程優點 線程被稱為“輕量級進程”,一般啟動更快,而開啟一個進程 ...
  • 庸置疑,Spring 早已成為 Java 後端開發事實上的行業標準,無數的公司選擇 Spring 作為基礎的開發框架,大部分 Java 後端程式員在日常工作中也會接觸到 Spring ,因此,如何用好 Spring ,也就成為 Java 程式員的必修課之一。 同時,Spring Boot 和 Spr ...
  • 本文接著上一篇寫的《Java微服務(二):服務消費者與提供者搭建》,上一篇文章主要講述了消費者與服務者的搭建與簡單的實現。其中重點需要註意配置文件中的幾個坑。 本章節介紹一些零散的內容:服務的負載均衡,序列化和熔斷 1.服務負載均衡 負載均衡可分為軟體負載均衡和硬體負載均衡。在我們日常開發中,一般很 ...
  • 最近用到NodeInstantiator批量加入實體 剛開始用的時候一直程式崩潰 錯誤代碼大致如下: 大體上代碼結構類似上面這樣,簡單起見NodeInstantiator的model就寫成2 manage_system是c++寫的一個QObject子類,存儲一些載入進來的數據 manage_syst ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...