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外掛提供了很多方便的特性:
- 它將該專案中需要的各個Jar包收集起來,並打包成可直接執行的Jar包,以更方便得部署和傳輸;
- 它會搜尋包含“public static void main()”方法的類,該類就是可執行Jar包的啟動類;
- 它提供了內在的支援,去匹配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系列
- Spring Boot的自動配置、Command-line-Runner
- 瞭解Spring Boot的自動配置
- Spring Boot的@PropertySource註解在整合Redis中的使用
- Spring Boot專案中如何定製HTTP訊息轉換器
- Spring Boot整合Mongodb提供Restful介面
- Spring中bean的scope
- Spring Boot專案中使用事件派發器模式
- Spring Boot提供RESTful介面時的錯誤處理實踐
- Spring Boot實戰之定製自己的starter
- Spring Boot專案如何同時支援HTTP和HTTPS協議
- 自定義的Spring Boot starter如何設定自動配置註解
- Spring Boot專案中使用Mockito
- 在Spring Boot專案中使用Spock測試框架
- Spring Boot專案中如何定製攔截器
- 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