转载

Spring Boot 与 Kotlin 验证web表单信息

在做web开发的时候,我们需要验证表单,确认用户提交的信息是安全的,比如用户名不能超过多少位,密码不能少于多少位等等。

那么如何在Spring Boot 与 Kotlin中验证表单信息?

在springmvc工程中,需要检查表单信息,表单信息验证主要通过注解的形式。

表单验证

下面我们在之前《Spring Boot 与 Kotlin使用Freemarker模板引擎渲染web视图》项目的基础上,增加表单验证。

build.gradle 文件增加依赖

compile "org.hibernate:hibernate-validator"
compile "org.apache.tomcat.embed:tomcat-embed-el"

完整的 build.gradle 文件

group 'name.quanke.kotlin'
version '1.0-SNAPSHOT'

buildscript {
 ext.kotlin_version = '1.2.10'
 ext.spring_boot_version = '1.5.4.RELEASE'
 repositories {
 mavenCentral()
 }
 dependencies {
 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
 classpath("org.springframework.boot:spring-boot-gradle-plugin:$spring_boot_version")

// Kotlin整合SpringBoot的默认无参构造函数,默认把所有的类设置open类插件
 classpath("org.jetbrains.kotlin:kotlin-noarg:$kotlin_version")
 classpath("org.jetbrains.kotlin:kotlin-allopen:$kotlin_version")
 }
}

apply plugin: 'kotlin'
apply plugin: "kotlin-spring" // See https://kotlinlang.org/docs/reference/compiler-plugins.html#kotlin-spring-compiler-plugin
apply plugin: 'org.springframework.boot'

jar {
 baseName = 'chapter11-5-5-service'
 version = '0.1.0'
}
repositories {
 mavenCentral()
}


dependencies {
 compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
 compile "org.springframework.boot:spring-boot-starter-web:$spring_boot_version"
 compile "org.springframework.boot:spring-boot-starter-thymeleaf:$spring_boot_version"
 compile "org.hibernate:hibernate-validator"
 compile "org.apache.tomcat.embed:tomcat-embed-el"

 testCompile "org.springframework.boot:spring-boot-starter-test:$spring_boot_version"
 testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"

}

compileKotlin {
 kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
 kotlinOptions.jvmTarget = "1.8"
}

创建UserForm类

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

/**
 * Created by http://quanke.name on 2018/1/12.
 * https://stackoverflow.com/questions/36515094/kotlin-and-valid-spring-annotation
 * https://stonesoupprogramming.com/2017/06/21/spring-bean-validation-example-jsr-303-in-kotlin/
 */
data class UserForm(@get:NotNull(message = "{name.required}") @get:Size(min = 2, max = 5,message = "{name.size}") var name: String? = "", @get:Min(18) var age: Int? = 0)

如果是Spring boot 可以不增加 @get注解,如果使用kotlin 语言实现必须加@get

这个实体类,在2个属性:name,age.它们各自有验证的注解:

  • @Size(min=2, max=5) name的长度为2-30个字符
  • @NotNull 不为空
  • @Min(18)age不能小于18

创建 WebController

import name.quanke.kotlin.chaper11_5_5.entity.UserForm
import org.springframework.stereotype.Controller
import org.springframework.validation.Errors
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 http://quanke.name on 2018/1/12.
 */

@Controller
class WebController : WebMvcConfigurerAdapter() {
 override fun addViewControllers(registry: ViewControllerRegistry?) {
 registry!!.addViewController("/results").setViewName("results")
 }

 @GetMapping("/")
 fun index(userForm: UserForm): String {
 return "index"
 }

 @PostMapping("/")
 fun checkPersonInfo(@Valid userForm: UserForm, errors: Errors): String {

 val result: String = when {
 //Test for errors
 errors.hasErrors() -> "index"
 else -> {
 //Otherwise proceed to the next page
 "redirect:/results"
 }
 }
 return result

 }
}

创建form表单 src/main/resources/templates/index.html

<!DOCTYPE html>
<html xmlns:th="http://www.w3.org/1999/xhtml">
<head lang="en">
 <title>quanke.name</title>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>

<h1>Form</h1>
<form action="#" th:action="@{/}" th:object="${userForm}" 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>

成功页面 src/main/resources/templates/results.html

<!DOCTYPE html>
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
 <title>quanke</title>
</head>
<body>
<h1>quanke.name</h1>
Congratulations! You are old enough to sign up for this site
</body>
</html>

src/main/resources/ 目录下增加 ValidationMessages.properties 文件

# /u8FD9/u91CC/u8981/u6CE8/u610F/u7F16/u7801/u95EE/u9898
name.required=/u540D/u5B57/u4E0D/u80FD/u4E3A/u7A7A
name.size=/u540D/u5B57/u957F/u5EA6/u8FD4/u56DE/u53EA/u80FD/u662F2-5

Spring Boot 启动

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


/**
 * Created by http://quanke.name on 2018/1/9.
 */

@SpringBootApplication
class Application

fun main(args: Array<String>) {
 SpringApplication.run(Application::class.java, *args)
}
原文  http://quanke.name/posts/46111/
正文到此结束
Loading...