1. 程式人生 > >Spring Boot構建的Web專案如何在服務端校驗表單輸入

Spring Boot構建的Web專案如何在服務端校驗表單輸入

本文首發於個人網站:Spring Boot構建的Web專案如何在服務端校驗表單輸入

這個例子用於演示在Spring Boot應用中如何驗證Web 應用的輸入,我們將會建立一個簡單的Spring MVC應用,來讀取使用者輸入並使用validation註解來檢查,並且當用戶輸入錯誤時,應用需要再螢幕上顯示錯誤資訊提示使用者重新輸入。

首先構建Maven專案,該專案的pom檔案內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>validating-form-input</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <!-- thymeleaf模板,用於前段渲染 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <!-- 用於輸入驗證 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
        </dependency>

        <!-- 用於支援嵌入式tomcat -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-el</artifactId>
        </dependency>

        <!-- 用於spring boot應用的測試 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

Spring Boot Maven外掛提供了很多方便的特性:

  1. 它將該專案中需要的各個Jar包收集起來,並打包成可直接執行的Jar包,以更方便得部署和傳輸;
  2. 它會搜尋包含“public static void main()”方法的類,該類就是可執行Jar包的啟動類;
  3. 它提供了內在的支援,去匹配Spring Boot的版本號。

Form物件

建立一個Form物件,用於對應HTML頁面中輸入的物件——PersonForm,

package hello;

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

/**
 * Created by IntelliJ IDEA.
 * User: duqi
 * Date: 2017/2/28
 * Time: 21:53
 */
public class PersonForm {

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

    @NotNull
    @Min(18)
    private Integer age;

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

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

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

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

在這裡,@NotNull註解表示該屬性不能為空、@Size(min=2, max=30)表示name屬性的長度在[2,30]之間,@Min(18)表示age屬性最小值為18。

web控制器

編寫一個web控制器,引用為:src/main/java/hello/WebController.java,程式碼如下:

package hello;

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.WebMvcConfigurerAdapter;

import javax.validation.Valid;

/**
 * Created by IntelliJ IDEA.
 * User: duqi
 * Date: 2017/3/2
 * Time: 14:07
 */
@Controller
public class WebController extends WebMvcConfigurerAdapter {

    @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";
    }
}

在這個控制器中,GET方法和POST方法都對映到“/”url下,showForm方法會返回“form”字串,表示模板的名稱,檢視控制器根據這個字串查詢模板檔案form.html,在showForm的方法簽名中定義了PersonForm引數,以便模板將屬性繫結到PersonForm物件的屬性中,checkPersonFormInfo方法定義了兩個入參:(1)person物件,在這個引數前用@Valid修飾,用於檢查從form頁面提交過來的屬性值;(2)bindingResult物件,用於存放@Valid註解檢查的結果。

可以從PersonForm表格中提取屬性值,並存入PersonForm物件。@Valid註解會檢查這些屬性的有效性,如果有錯也會把錯誤資訊渲染到模板中並顯示到頁面上。

如果所有的屬性都通過校驗,該方法會將瀏覽器重定向到results頁面。

構建thymeleaf頁面

spring boot預設從src/main/resources/templates目錄下查詢html頁面,form.html和results.html都放在這裡。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Spring Boot Thymeleaf Hello World Example</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<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>

form.html頁面包含一個簡單的form表格,這個表格和post方法繫結。th:object表示該表格和後端的person物件繫結,這就是bean-backed form,在PersonForm物件中,可以看到th:field="*{name}"th:field=*{age}。在form表格中,緊挨著name和age標籤,有兩個用於顯示錯誤資訊的標籤。頁面的最後有個Submit按鈕,如果使用者輸入的name和age不合法,頁面會顯示錯誤提示資訊,如果使用者輸入的name和age不合法,頁面會被路由到下一個頁面。

results.html內容如下:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8" />
    <title>Title</title>
</head>
<body>
    Congratulations! You are old enough to sign up for this site.
</body>
</html>

建立程式啟動類

建立一個Application類,用於啟動Spring Boot應用,

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Created by IntelliJ IDEA.
 * User: duqi
 * Date: 2017/3/2
 * Time: 15:50
 */
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@SpringBootApplication註解也為Thymeleaf提供了預設配置:預設情況下會從resources/templates目錄下查詢模板檔案,並將*.html檔案中的字尾忽略掉後剩下的檔名稱解析為檢視。可以通過在application.properties裡設定相關屬性來修改Thymeleaf的配置,這裡我們不再細說。

演示的程式碼:https://github.com/duqicauc/validatingforminput

Spring Boot 1.x系列

  1. Spring Boot的自動配置、Command-line-Runner
  2. 瞭解Spring Boot的自動配置
  3. Spring Boot的@PropertySource註解在整合Redis中的使用
  4. Spring Boot專案中如何定製HTTP訊息轉換器
  5. Spring Boot整合Mongodb提供Restful介面
  6. Spring中bean的scope
  7. Spring Boot專案中使用事件派發器模式
  8. Spring Boot提供RESTful介面時的錯誤處理實踐
  9. Spring Boot實戰之定製自己的starter
  10. Spring Boot專案如何同時支援HTTP和HTTPS協議
  11. 自定義的Spring Boot starter如何設定自動配置註解
  12. Spring Boot專案中使用Mockito
  13. 在Spring Boot專案中使用Spock測試框架
  14. Spring Boot專案中如何定製攔截器
  15. Spring Boot專案中如何定製PropertyEditors

本號專注於後端技術、JVM問題排查和優化、Java面試題、個人成長和自我管理等主題,為讀者提供一線開發者的工作和成長經驗,期待你能在這裡有所收穫。

相關推薦

Spring Boot構建Web專案如何在服務輸入

本文首發於個人網站:Spring Boot構建的Web專案如何在服務端校驗表單輸入 這個例子用於演示在Spring Boot應用中如何驗證Web 應用的輸入,我們將會建立一個簡單的Spring MVC應用,來讀取使用者輸入並使用validation註解來檢查,並且當用戶輸入錯誤時,應用需要再螢幕上顯示錯誤

spring boot 整合activemq 進行服務訊息推送(web頁面)

最近公司的專案裡有需要服務端向web端實時推送訊息的需求,網上搜索了一番,有前端頁面通過定時任務向後臺傳送ajax請求重新整理,有使用第三方提供的訊息服務(GoEasy),前者因為會有很多請求是無用的,容易加大伺服器負荷造成宕機,後者現在收費了(免費的也只能用一

spring boot 搭建web專案完整流程及遇到的一些坑坑窪窪總結

一、spring boot簡介 spring boot是最近非常流行的,在spring的框架上改進的框架。該框架的目的是為了提高開發人員的速度,降低配置的難度等 少,大部分都是在原有的基礎上開發,所以當讓你搭建一個簡單的框架,就會出現各種各樣的困難,

java--spring boot微信支付服務實現含程式碼(app支付、掃碼支付等)

最近在弄支付寶、微信支付等的事,發現這兩家的文件都寫得很差,demo也讓人看的雲裡霧裡。所以寫篇部落格,來儘量減少後來的同學走的彎路。 首先,若是要做app支付的話,在微信第三方平臺申請APP,若是安卓的話上傳你的keystore和包名,ios上傳bundle id,微信會

spring boot security oauth2 jwt 服務實現

最近在寫提供給第三方的登入和獲取資源,老大說要使用oauth2 協議,因此最近在啃這一塊。一下是個人的配置。 首先要理解什麼是OAUTH2協議。 以下是阮一峰大大的文章:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.htm

Spring Boot系列-使用自定義註解使用者是否登入

摘要: 記得今年年初剛開始面試的時候,被問的最多的就是你知道Spring的兩大核心嘛?那你說說什麼是AOP,什麼是IOC?我相信你可能也被問了很多次了。 1、到底是什麼是AOP? 所謂AOP也就是面向切面程式設計,能夠讓我們在不影響原有業務功能的前提下,橫切擴充套件新的功能。 記得今年

Hibernate Validator服務

         Hibernate Validator 是 Bean Validation 的參考實現。Hibernate Validator 提供了 JSR 303 規範中所有內建 constraint(約束) 的實現,除此之外還有一些附加的 c

SMSSDK驗證碼服務介面

一、前言 有些時候開發者需要驗證服務託管自己的伺服器(開發者伺服器擁有校驗驗證碼的功能),然後可以更好處理自己的業務邏輯。因此,Mob平臺提供了此介面實現上述需求,供開發者使用。 此介面支援 SMSSDK2.0.0以上版本(包括2.0.0)。 二、摘要 本介面屬於SMSSDK簡訊

Spring Boot 使用hibernate validator進行引數

demo 實體類 public class UserBean { @NotBlank(message="使用者名稱不能為空") private String userName; @NotBlank(message="年齡不能為空") @P

Spring boot使用總結(三)[email protected] 使用

spring boot 1.4預設使用 hibernate validator 5.2.4 Final實現校驗功能。hibernate validator 5.2.4 Final是JSR 349 Bean Validation 1.1的具體實現。 一 初步使用

spring boot validation實現對引數的

validation實現對引數的校驗 配置流程 引入spring-boot-starter-validation包 配置註解介面,配置註解介面實現類(implements ConstraintVali

springmvc服務hibernate validation配置

springmvc服務端校驗hibernate validation的配置 步驟如下: 0.需要引3個jar包    hibernate-validator-4.3.0.Final.jar    jb

如何去掉Spring Boot 的thymeleaf模版引擎強制

筆者在使用Spring Boot 的thymeleaf模版引擎做html頁面時。遇到一個很頭疼的問題,那就是thymeleaf模版引擎強制校驗,由於是網上找的bootstrap模版,用的h5,頁面很多標籤都沒有閉合標籤/,就會報錯跳轉到錯誤頁面。 html頁面如下:

Spring Boot (一) 重複提交

一、前言 在某些情況下,由於網速慢,使用者操作有誤(連續點選兩下提交按鈕),頁面卡頓等原因,可能會出現表單資料重複提交造成資料庫儲存多條重複資料。 存在如上問題可以交給前端解決,判斷多長時間內不能再次點選儲存按鈕,當然,如果存在聰明的使用者能夠繞過前端驗證,後端更應該去進行攔截處理,下面小編將基於 Sprin

spring boot 自定義引數解析器實現form型別請求或位址列請求引數下劃線轉駝峰屬性

一、定義引數解析註解 @Target(value = ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface ParameterModel { } 二、定義抽象類AbstractCustomiz

iview動態,獲取值為undefined

場景:實際程式碼如下:https://run.iviewui.com/XPofr3YS 原因:在動態校驗名稱時,沒法獲取值,請教了大神後,發現原來是自己demo沒理清楚 這裡的prop="name"應該是動態的,從新梳理demo 解決:程式碼應

20181006:為什麼要使用form而不是直接用html模板?是怎樣處理的?

使用者登入流程:在forms.py中自己定義定義loginform類(其中包含登陸的表單,比如賬號、密碼、提交按鈕等)→ views.py中路由控制跳轉到登陸頁面模板(在其中傳入form),使用者輸入了賬號、密碼後點擊“提交”按鈕後,前端、後端校驗完成後,跳轉到

jQuery Validate 實現儲存時不,提交時才

                //儲存按鈕事件 function saveAction() {var form = $("#inputForm").find('.required');$.each(form, function(idx, item) {$(this).addClass('ignore');}

js資料

//新增驗證規則 jQuery.validator.addMethod("chcharacter",function (value, element) { var tel = /^[\一-\龥]+$/

JS(包括電話,郵編,手機號等等)

function isMail(obj,str,allowNull) { var pattern = /^([a-zA-Z0-9_-])[email protected]([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/; if(!isNo