• 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);
        }
        
    }
    本博客为博主的学习笔记,不作任何商业用途。
  • 相关阅读:
    [转]红帽 Red Hat Linux相关产品iso镜像下载【百度云】
    JAVA中的类
    Java并发编程:Lock
    字符集和编码的区别
    MySQL索引背后的数据结构及算法原理
    B树、B-树、B+树、B*树 红黑树
    linux下nginx的安装
    对.net orm工具Dapper在多数据库方面的优化
    Dapper使用方法
    filebeat to elasticsearch配置
  • 原文地址:https://www.cnblogs.com/guo7533/p/8727221.html
Copyright © 2020-2023  润新知