SpringBoot学习笔记之表单验证@Valid与AOP切面

Posted 锅锅7533

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot学习笔记之表单验证@Valid与AOP切面相关的知识,希望对你有一定的参考价值。

限制说明

@Null

限制只能为null

@NotNull

限制必须不为null

@AssertFalse

限制必须为false

@AssertTrue

限制必须为true

@DecimalMax(value)

限制必须为一个不大于指定值的数字

@DecimalMin(value)

限制必须为一个不小于指定值的数字

@Digits(integer,fraction)

限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction

@Future

限制必须是一个将来的日期

@Max(value)

限制必须为一个不大于指定值的数字

@Min(value)

限制必须为一个不小于指定值的数字

@Past

限制必须是一个过去的日期

@Pattern(value)

限制必须符合指定的正则表达式

@Size(max,min)

限制字符长度必须在min到max之间

@Past

验证注解的元素值(日期类型)比当前时间早

@NotEmpty

验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)

@NotBlank

验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格

@Email

验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

一、.模拟添加学生信息,先新建个实体 Student.java

package com.guo.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.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;

@Entity     // 实体
@Table(name="t_student")   //
public class Student {
    @Id      // 组件
    @GeneratedValue   //表 自增
    private Integer studentid;    // 主键
    @NotEmpty(message="名字不能为空") //验证name不为空,到时候在前台显示报错信息message
    @Column(length=100)   
    private String name; 
    @NotNull(message="年龄不为空")
    @Min(value=18,message="年龄不能小于18岁")
    private Integer age;
    
    
    public Integer getStudentid() {
        return studentid;
    }
    public void setStudentid(Integer studentid) {
        this.studentid = studentid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student [studentid=" + studentid + ", name=" + name + ", age=" + age + "]";
    }  
    
}

二、.新建StudentDao接口

package com.guo.dao;


import org.springframework.data.jpa.repository.JpaRepository;

import com.guo.entity.Student;

                                 //<>中Student对应实体类,Integer,主键什么类型就是什么
public interface StudentDao extends JpaRepository<Student,Integer>{
  
}

三、新建service接口

package com.guo.service;

import com.guo.entity.Student;

public interface StudentService {
    
      public void add(Student student);

}

四、新建serviceimpl实现类

package com.guo.service.impl;

import javax.annotation.Resource;


import org.springframework.stereotype.Service;

import com.guo.dao.StudentDao;
import com.guo.entity.Student;
import com.guo.service.StudentService;
@Service("StudentService")
public class StudentServiceImpl implements StudentService{
    @Resource
    private StudentDao studentDao;

    @Override
    public void add(Student student) {
        studentDao.save(student);
    }    
}

五、新建controller

package com.guo.controller;

import javax.annotation.Resource;
import javax.validation.Valid;

import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.guo.entity.Student;
import com.guo.service.StudentService;

/**
 * 账户controller层
 * @author Administrator
 *
 */
@RestController
@RequestMapping("/student")
public class StudentController {

    @Resource
    private StudentService studentService;
    
    @RequestMapping("/add")
    // 这里声明为String返回一个简单的字符串文本,如果复杂一点的要声明为Map,因为@RestController 这里省略了ResponseBody,会自动转成json
    public String add(@Valid Student student,BindingResult bindingResult){ //没有表单验证参数为(Student student)就行了
                      //因为有表单验证所以加个@Valid ,BindingResult是用来绑定一个内部验证的返回结果
        if(bindingResult.hasErrors()){ // 如果验证信息错误
            return bindingResult.getFieldError().getDefaultMessage(); // 返回一个错误信息
        }else{
            studentService.add(student);  
            return "添加成功";
        }
    }
}

六、新建studentAdd.html 目录如下

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>添加学生信息</title>
<script src="http://jquery.min.js"></script>
<script type="text/javascript">
    
    function submitData(){
        $.post("/student/add",{name:$("#name").val(),age:$("#age").val()},
                function(result){
                    alert(result);
                }
        );
    }
    
</script>
</head>
<body>
<!-- <form action="/book/add" method="post"> 这里用ajax提交 不用form提交了 -->
    姓名:<input type="text" id="name" name="name"/><br/>
    年龄:<input type="text" id="age" name="age"/><br/>
    <input type="button" onclick="submitData()" value="提交"/>
</body>
<!-- </form> -->
</body>
</htm

七、运行 输入名字和年龄,如果输入年龄小于18岁或为空 标签@NotNull(message="年龄不为空")和
@Min(value=18,message="年龄不能小于18岁")来进行判断(没有SpringBoot标签 以前要用js来判断),名字为空同理。

 

八、AOP切面

 

AOP切面主要是切方法,我们记录些日志信息和操作事务,要用到切面,类似拦截器;

 

比如Service层切入事务,我们搞个常用的 切controller层方法

 

每个执行controller层的方法 都记录下请求Url,访问者IP 执行类方法参数等信息;

 

@Aspect注解是切面注解类

 

@Pointcut切点定义

 

@Before是方法执行前调用

 

@After是方法执行后调用

 

@AfterReturning方法执行返回值调用

 

1.新建个包aspect ,包下新建切面类RequestAspect ,以前都是xml配置,但SpringBoot都是用类来实现

package com.guo.aspect;

import javax.servlet.http.HttpServletRequest;

import org.apache.logging.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.guo.entity.Student;

@Aspect
@Component
public class RequestAspect {
    private Logger logger=Logger.getLogger(RequestAspect.class); //参数传入当前类
    
    @Pointcut("execution(public * com.guo.controller.*.*(..))")
    public void log(){   // 定义切点,对controller层切入,public *表任意public方法,com.guo.controller.*.*表controller包下的任意类任意方法
                       //(..) 任意参数
    }
    
    @Before("log()") // 加入上面定义的切点
    public void doBefore(JoinPoint joinPoint){//执行前 ,JoinPoint类用于获取执行前的信息
        logger.info("方法执行前...");
        ServletRequestAttributes sra=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();//
        HttpServletRequest request=sra.getRequest();//  获取request,通过request获取ip 等信息
        logger.info("url:"+request.getRequestURI());  // 获取url
        logger.info("ip:"+request.getRemoteHost());  // 获取ip
        logger.info("method:"+request.getMethod());  // 获取调用的方法
        logger.info("class_method:"+joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName()); // 获取构造 方法
        logger.info("args:"+joinPoint.getArgs());  // 获取参数
        Student student=(Student) joinPoint.getArgs()[0];  // 遍历参数(是个student对象)从0开始
        System.out.println(student);  // 加个toString  输出student对象 
    }
    
    @After("log()")
    public void doAfter(JoinPoint joinPoint){
        logger.info("方法执行后...");
    }
    
    @AfterReturning(returning="result",pointcut="log()")  // 方法的返回值 ,returning="result"指定返回参数,pointcut="log()"指定切点
    public void doAfterReturning(Object result){
        logger.info("方法返回值:"+result);
    }
    
}

 

以上是关于SpringBoot学习笔记之表单验证@Valid与AOP切面的主要内容,如果未能解决你的问题,请参考以下文章

springboot ------ 表单验证

在 Spring Boot 应用程序中使用 @Valid 和 BindingResult 时的表单输入验证问题

后盾网-CI框架实例教程-马振宇 - 学习笔记

vue+Element表单验证之滚动条定位到校验未通过的表单控件的位置

HTML5自学笔记[ 3 ]表单验证反馈

jquery中validation部分学习笔记