詳解SpringBoot構(gòu)建的Web項(xiàng)目如何在服務(wù)端校驗(yàn)表單輸入
這個(gè)例子用于演示在Spring Boot應(yīng)用中如何驗(yàn)證Web 應(yīng)用的輸入,我們將會(huì)建立一個(gè)簡(jiǎn)單的Spring MVC應(yīng)用,來讀取用戶輸入并使用validation注解來檢查,并且當(dāng)用戶輸入錯(cuò)誤時(shí),應(yīng)用需要再屏幕上顯示錯(cuò)誤信息提示用戶重新輸入。
首先構(gòu)建Maven項(xiàng)目,該項(xiàng)目的pom文件內(nèi)容如下:
<?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>
<!-- 用于輸入驗(yàn)證 -->
<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應(yīng)用的測(cè)試 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Spring Boot Maven插件提供了很多方便的特性:
- 它將該項(xiàng)目中需要的各個(gè)Jar包收集起來,并打包成可直接運(yùn)行的Jar包,以更方便得部署和傳輸;
- 它會(huì)搜索包含“public static void main()”方法的類,該類就是可運(yùn)行Jar包的啟動(dòng)類;
- 它提供了內(nèi)在的支持,去匹配Spring Boot的版本號(hào)。
Form對(duì)象
創(chuàng)建一個(gè)Form對(duì)象,用于對(duì)應(yīng)HTML頁面中輸入的對(duì)象——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屬性的長(zhǎng)度在[2,30]之間,@Min(18)表示age屬性最小值為18。
web控制器
編寫一個(gè)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";
}
}
在這個(gè)控制器中,GET方法和POST方法都映射到“/”url下,showForm方法會(huì)返回“form”字符串,表示模板的名稱,視圖控制器根據(jù)這個(gè)字符串查找模板文件form.html,在showForm的方法簽名中定義了PersonForm參數(shù),以便模板將屬性綁定到PersonForm對(duì)象的屬性中,checkPersonFormInfo方法定義了兩個(gè)入?yún)ⅲ海?)person對(duì)象,在這個(gè)參數(shù)前用@Valid修飾,用于檢查從form頁面提交過來的屬性值;(2)bindingResult對(duì)象,用于存放@Valid注解檢查的結(jié)果。
可以從PersonForm表格中提取屬性值,并存入PersonForm對(duì)象。@Valid注解會(huì)檢查這些屬性的有效性,如果有錯(cuò)也會(huì)把錯(cuò)誤信息渲染到模板中并顯示到頁面上。
如果所有的屬性都通過校驗(yàn),該方法會(huì)將瀏覽器重定向到results頁面。
構(gòu)建thymeleaf頁面
spring boot默認(rèn)從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頁面包含一個(gè)簡(jiǎn)單的form表格,這個(gè)表格和post方法綁定。th:object表示該表格和后端的person對(duì)象綁定,這就是bean-backed form,在PersonForm對(duì)象中,可以看到th:field="*{name}"和th:field=*{age}。在form表格中,緊挨著name和age標(biāo)簽,有兩個(gè)用于顯示錯(cuò)誤信息的標(biāo)簽。頁面的最后有個(gè)Submit按鈕,如果用戶輸入的name和age不合法,頁面會(huì)顯示錯(cuò)誤提示信息,如果用戶輸入的name和age不合法,頁面會(huì)被路由到下一個(gè)頁面。
results.html內(nèi)容如下:
<!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>
創(chuàng)建程序啟動(dòng)類
創(chuàng)建一個(gè)Application類,用于啟動(dòng)Spring Boot應(yīng)用,
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提供了默認(rèn)配置:默認(rèn)情況下會(huì)從resources/templates目錄下查找模板文件,并將*.html文件中的后綴忽略掉后剩下的文件名稱解析為視圖??梢酝ㄟ^在application.properties里設(shè)置相關(guān)屬性來修改Thymeleaf的配置,這里我們不再細(xì)說。
演示的代碼:https://github.com/duqicauc/validatingforminput
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SpringBoot基于SpringSecurity表單登錄和權(quán)限驗(yàn)證的示例
- Spring MVC接受表單自動(dòng)封裝特性實(shí)例解析
- SpringSecurity 自定義表單登錄的實(shí)現(xiàn)
- SpringSecurity 默認(rèn)表單登錄頁展示流程源碼
- Spring Boot 2 Thymeleaf服務(wù)器端表單驗(yàn)證實(shí)現(xiàn)詳解
- springmvc后臺(tái)基于@ModelAttribute獲取表單提交的數(shù)據(jù)
- layui 圖片上傳+表單提交+ Spring MVC的實(shí)例
- Spring Security 表單登錄功能的實(shí)現(xiàn)方法
- Spring Security在標(biāo)準(zhǔn)登錄表單中添加一個(gè)額外的字段
- Spring如何處理表單提交
相關(guān)文章
在Java8與Java7中HashMap源碼實(shí)現(xiàn)的對(duì)比
這篇文章主要介紹了在Java8與Java7中HashMap源碼實(shí)現(xiàn)的對(duì)比,內(nèi)容包括HashMap 的原理簡(jiǎn)單介紹、結(jié)合源碼在Java7中是如何解決hash沖突的以及優(yōu)缺點(diǎn),結(jié)合源碼以及在Java8中如何解決hash沖突,balance tree相關(guān)源碼介紹,需要的朋友可以參考借鑒。2017-01-01
JavaWeb ServletConfig作用及原理分析講解
ServletConfig對(duì)象,叫Servlet配置對(duì)象。主要用于加載配置文件的初始化參數(shù)。我們知道一個(gè)Web應(yīng)用里面可以有多個(gè)servlet,如果現(xiàn)在有一份數(shù)據(jù)需要傳給所有的servlet使用,那么我們就可以使用ServletContext對(duì)象了2022-10-10
java List.of()與Arrays.asList()方法對(duì)比分析
這篇文章主要為大家介紹了java List.of()與Arrays.asList()方法對(duì)比分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
SpringSecurity退出功能實(shí)現(xiàn)的正確方式(推薦)
本文將介紹在Spring Security框架下如何實(shí)現(xiàn)用戶的"退出"logout的功能。本文通過實(shí)例代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-11-11

