SpringBoot结合JSR303对前端数据进行校验的示例代码
作者:IT小村 发布时间:2022-09-15 03:22:55
一、校验分类
数据的校验一般分为**前端校验
、后端校验
**
二、前端校验
前端校验是最为明显的,先说一下:
① HTML
非空校验
如 HTML5
新增的属性required="true"
,一旦没有填写就输入框就显示红色,具体使用如:
<input type="text" id="name" name="name" required="true"/>
② JS
同时在提交表单发送 Ajax请求
的时候,来个 onSubmit
函数,具体例如(使用点 EasyUI ):
function submitData(){
$("#fm").form("submit",{
url:"/admin/film/save",
onSubmit:function(){
var content=CKEDITOR.instances.content.getData();
if(content==""){
$.messager.alert("系统提示","内容不能为空!");
return false;
}
return $(this).form("validate");
},
success:function(result){
var result=eval('('+result+')');
if(result.success){
$.messager.alert("系统提示","保存成功!");
resetValue();
}else{
$.messager.alert("系统提示","保存失败!");
}
}
});
}
但我们都知道,这是防君子不防小人的做法,用户可以使用 F12
,查看源码,修改关键部位的代码,
如把 required="true"
删除掉,就可以提交表单了。
所以前端作用虽然明显,但是数据处理方面,真正用处并不大。
三、后端校验
前面说了那么多,就是为了引出 后端校验
这一话题。数据是否提交到数据库中去,就看后端的代码了。
后端校验,主要实施在 JavaBean、Controller 中。下面列举一个简单的例子,从代码中说明一切。
① 代码结构图
② entity
实体属性部位空,一般使用如 @NotEmpty(message="请输入用户名!")
,这样既不能为 空
,也不能为null
package com.cun.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotBlank;
import io.swagger.annotations.ApiModelProperty;
@Entity
@Table(name = "t_person")
public class Person {
@Id
@GeneratedValue
@ApiModelProperty(value = "用户id")
private Integer id;
@NotBlank(message = "用户名不能为空") // 为""/''都不行
@Size(min = 2, max = 30, message = "2<长度<30")
@Column(length = 50)
@ApiModelProperty(value = "用户名")
private String userName;
@NotNull(message = "用户密码不能为空")
@Column(length = 50)
@ApiModelProperty(value = "用户密码")
private String password;
@Max(value = 150, message = "age应<150") // 数字
@Min(value = 1, message = "age应>1") // 数字
@NotNull(message = "年龄不能为空")
@ApiModelProperty(value = "用户年龄")
private Integer age;
@NotNull(message = "邮箱不为空")
@Email(message = "邮件格式不对")
@Column(length = 100)
@ApiModelProperty(value = "用户邮箱")
private String email;
// 使用 JPA 必备
public Person() {
super();
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
③ dao
其实也没什么代码,这就是 JPA 的强大之处
package com.cun.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import com.cun.entity.Person;
public interface PersonDao extends JpaRepository<Person, Integer>, JpaSpecificationExecutor<Person> {
}
④ Service、ServiceImpl (省略)
⑤ Controller
package com.cun.controller;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.cun.dao.PersonDao;
import com.cun.entity.Person;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@RestController
@RequestMapping("/person")
@EnableSwagger2
public class PersonController {
@Autowired
private PersonDao personDao;
@PostMapping("/insert")
public Map<String, Object> insertPerson(@Valid Person person, BindingResult bindingResult) {
Map<String, Object> map = new HashMap<String, Object>();
if (bindingResult.hasErrors()) {
List<ObjectError> errorList = bindingResult.getAllErrors();
List<String> mesList=new ArrayList<String>();
for (int i = 0; i < errorList.size(); i++) {
mesList.add(errorList.get(i).getDefaultMessage());
}
map.put("status", false);
map.put("error", mesList);
} else {
map.put("status", true);
map.put("msg", "添加成功");
personDao.save(person);
}
return map;
}
}
⑥ yml
server:
port: 80 #为了以后访问项目不用写端口号
context-path: / #为了以后访问项目不用写项目名
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot
username: root
password: 123
jpa:
hibernate:
ddl-auto: update #数据库同步代码
show-sql: true #dao操作时,显示sql语句
⑦ POM
使用 SpringBoot Starter 导入 JPA、MySQL
使用 Swagger 演示
<!-- swagger生成接口API -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<!-- 接口API生成html文档 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.1</version>
</dependency>
四、演示
输入 http://localhost/swagger-ui.html 进入接口测试站点
什么都没有填写,直接点击Try it out!
,可以看到返回给前端的 JSON
数据,这时候数据的数据是没有改动的,一条sql
语句都没有执行
当然还可以进行其他测试,这里就省略了
来源:https://blog.csdn.net/larger5/article/details/79744569
猜你喜欢
- 错误Mybatis-Plus (简称MP) 是mybatis的一个增强工具,在mybatis的基础上只做增强不做改变,简化了开发效率。其实就
- 1.前言string是属于引用类型的,这个大家都知道吧?但是平常在使用的过程中,发现它还是拥有一些值类型的特征的,这到底是为什么呢?原因就是
- 本文介绍了Spring Boot Admin监控服务上下线邮件通知,分享给大家,具体如下:微服务架构下,服务的数量少则几十,多则上百,对服务
- 1 关于自动内存管理Java是由jvm来管理内存,包括自动分配以及自动回收,因此它不容易出现内存泄漏和内存溢出问题。C/C++,由程序员手动
- 工厂方法模式的定义工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂
- 对于使用文件进行交换数据的应用来说,使用FTP 服务器是一个很不错的解决方案。关于FileZilla Server服务器的详细搭建配置过程,
- 在使用fastJson时,对于泛型的反序列化很多场景下都会使用到TypeReference,例如:void testTypeReferenc
- 1. SpringBoot ResponseBody 返回值中null值处理@PostMapping(path = "/test&
- 完整代码已上传到GitHub。Web端体验地址:http://47.116.72.33/(只剩一个月有效期)apk下载地址:https://
- 本文实例讲述了C#检查字符串是否是合法URL地址的方法。分享给大家供大家参考。具体实现方法如下:protected string HTTPC
- 很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友。对于软件配置参数的保存,
- 相信大家都经常使用String 的split方法,但是大家有没有遇到下面的这种情况:大家想想下面的代码执行结果是什么public stati
- 本文实例讲述了Java实现的双向匹配分词算法。分享给大家供大家参考,具体如下:目前比较流行的几大分词算法有:基于字符串匹配的分词方法、基于理
- 配置文件中设置通常在公司级别的项目中,我们可能会写多个application- dev/prod.yml ,然后我们通常会在applicat
- java 方法签名,我想做java 开发的朋友也知道,方法签名的重要性,是方法重载的一个比较好的解释,尤其是在后续优化方面,这里记录下,有看
- 缓存淘汰算法在高并发、高性能的质量要求不断提高时,我们首先会想到的就是利用缓存予以应对。第一次请求时把计算好的结果存放在缓存中,下次遇到同样
- 基于JavaFX开发桌面程序注:我也是JAVA FX的初学者之一,自己在学习的时候踩了许多的坑,中文英文的资料查了不少,但是觉得FX技术和其
- 需求:字符串(字符串只有一位小数)转float进行运算, 将结果转成字符串(保留一位小数)直接上代码:float f1 = 0.1f;Str
- 本文为大家分享了Java实现文件上传下载功能的具体代码,供大家参考,具体内容如下前端通过form表单的enctype属性,将数据传递方式修改
- 前言本文主要给大家介绍了关于Java读取二进制文件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。读Hex写CS