精华内容
下载资源
问答
  • 点击上方蓝色“后端面试那些事儿”,选择“设为星标”学最好别人,做最好我们... 嵌套验证Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303 规范,是标准 JSR-303 一个变种),j...

    点击上方蓝色“后端面试那些事儿”,选择“设为星标”

    学最好的别人,做最好的我们

    d40ec2f001bf201fbab700a4752d1909.png

    来源 | blog.csdn.net/qq_27680317/article/details/79970590

    • 1. 分组
    • 2. 注解地方
    • 3. 嵌套验证

    Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303 规范,是标准 JSR-303 的一个变种),javax提供了@Valid(标准JSR-303规范),配合 BindingResult 可以直接提供参数验证结果。其中对于字段的特定验证注解比如 @NotNull 等网上到处都有,这里不详述

    在检验 Controller 的入参是否符合规范时,使用 @Validated 或者 @Valid 在基本验证功能上没有太多区别。但是在分组、注解地方、嵌套验证等功能上两个有所不同:

    1. 分组

    @Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制,这个网上也有资料,不详述。

    @Valid:作为标准JSR-303规范,还没有吸收分组的功能。

    2. 注解地方

    @Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上

    @Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上

    两者是否能用于成员属性(字段)上直接影响能否提供嵌套验证的功能。

    3. 嵌套验证

    在比较两者嵌套验证时,先说明下什么叫做嵌套验证。比如我们现在有个实体叫做Item:

    public class Item {

        @NotNull(message = "id不能为空")
        @Min(value = 1, message = "id必须为正整数")
        private Long id;

        @NotNull(message = "props不能为空")
        @Size(min = 1, message = "至少要有一个属性")
        private List props;
    }

    Item带有很多属性,属性里面有属性id,属性值id,属性名和属性值,如下所示:

    public class Prop {

        @NotNull(message = "pid不能为空")
        @Min(value = 1, message = "pid必须为正整数")
        private Long pid;

        @NotNull(message = "vid不能为空")
        @Min(value = 1, message = "vid必须为正整数")
        private Long vid;

        @NotBlank(message = "pidName不能为空")
        private String pidName;

        @NotBlank(message = "vidName不能为空")
        private String vidName;
    }

    属性这个实体也有自己的验证机制,比如属性和属性值id不能为空,属性名和属性值不能为空等。

    现在我们有个 ItemController 接受一个Item的入参,想要对Item进行验证,如下所示:

    @RestController
    public class ItemController {

        @RequestMapping("/item/add")
        public void addItem(@Validated Item item, BindingResult bindingResult) {
            doSomething();
        }
    }

    在上图中,如果Item实体的props属性不额外加注释,只有@NotNull和@Size,无论入参采用@Validated还是@Valid验证,Spring Validation框架只会对Item的id和props做非空和数量验证,不会对props字段里的Prop实体进行字段验证,也就是@Validated和@Valid加在方法参数前,都不会自动对参数进行嵌套验证。也就是说如果传的List中有Prop的pid为空或者是负数,入参验证不会检测出来。

    为了能够进行嵌套验证,必须手动在Item实体的props字段上明确指出这个字段里面的实体也要进行验证。由于@Validated不能用在成员属性(字段)上,但是@Valid能加在成员属性(字段)上,而且@Valid类注解上也说明了它支持嵌套验证功能,那么我们能够推断出:@Valid加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上,来配合方法参数上@Validated或@Valid来进行嵌套验证。

    我们修改Item类如下所示:

    public class Item {

        @NotNull(message = "id不能为空")
        @Min(value = 1, message = "id必须为正整数")
        private Long id;

        @Valid // 嵌套验证必须用@Valid
        @NotNull(message = "props不能为空")
        @Size(min = 1, message = "props至少要有一个自定义属性")
        private List props;
    }

    然后我们在ItemController的addItem函数上再使用@Validated或者@Valid,就能对Item的入参进行嵌套验证。此时Item里面的props如果含有Prop的相应字段为空的情况,Spring Validation框架就会检测出来,bindingResult就会记录相应的错误。

    总结一下 @Validated 和 @Valid 在嵌套验证功能上的区别:

    @Validated: 用在方法入参上无法单独提供嵌套验证功能。不能用在成员属性(字段)上,也无法提示框架进行嵌套验证。能配合嵌套验证注解@Valid进行嵌套验证。

    @Valid: 用在方法入参上无法单独提供嵌套验证功能。能够用在成员属性(字段)上,提示验证框架进行嵌套验证。能配合嵌套验证注解@Valid进行嵌套验证。

    0008edd57cf16a1ef6faa335b4adf037.gif

    往期推荐

    你说,一个Java字符串到底有多少个字符?

    2020-07-21

    89fa28ba70619df2cdde5974c7255764.png

    Mybatis 框架下 SQL 注入攻击的 3 种方式,真是防不胜防!

    2020-07-20

    458708a80b8810af88a21a90986bbaf1.png

    Netty解决粘包和拆包问题的四种方案

    2020-07-19

    485e53073822e02800d7d0a744b33239.png

    SpringSecurity + JWT,从入门到精通!

    2020-07-18

    6c1bd01af2e34c5a147ab32bf96d0998.png

    如何决定使用 HashMap 还是 TreeMap?

    2020-07-17

    e0aaa918a7afbbebdeb818631bde1a36.png

    一起进大厂,每日学干货

    关注我,不迷路

    5bfe049bfa8157a5945759a87c75841a.png

    展开全文
  • 4.类的static字段与非static字段的区别是什么?什么情况应该使用static修饰符?5.Java中final修饰符都有什么作用?6.Java中float[10] arr; 语句正确么?7.Java数组元素类型为基本数据类型引用类型时,有什么不同?...

    一、对象与对象引用的区别是什么?

    通俗简单地认为,Java的内存分为堆内存和栈内存(堆在应用程序生命周期内一直存在,而栈在方法调用完毕后就释放)。类和对象被分配到堆中,对象引用和方法执行时用的局部变量和形式参数则放到栈空间当中。
    以类A为例:

    A p;//对象声明(p为对象引用)
    

    在这里插入图片描述

    p = new A()

    在这里插入图片描述
    注:
    1. 只有类中没有被static修饰的属性被复制到对象中(方法不被复制过去)。
    2. 对象可以通过 “对象引用.方法名” 调用对应类中的方法,调用时系统会在栈中为其开辟用于储存其局部变量的和形式参数的空间,调用完后再释放空间。

    (static说明见下)


    二、对象作为参数传递的特点是什么?

    对象是引用传递,传递的是对象的地址,对象只有一个。如下面两个例子:
    例一:

    package hello;
    
    class IntClass1{
    	int value;
    }
    public class RunIntClass1 {
    	public static void modifyValue(IntClass1 s,int val) {
    		s.value=val;
    	}
    	public static void main(String[] args) {
    		IntClass1 a = new IntClass1();
    		modifyValue(a,8);
    		System.out.println(a.value);
    	}
    }
    
    

    在这里插入图片描述
    将实参对象引用a中的对象的地址复制到形参对象引用s中,s和a指向同一个对象。

    例二:

    package hello;
    
    class IntClass2{
    	int value;
    }
    public class RunIntClass2 {
    	public static IntClass2 getInstance() {
    		//在方法中产生对象
    		IntClass2 s = new IntClass2();
    		s.value = 8;
    		return s;
    	}
    	public static void main(String[] args) {
    		IntClass2 a;
    		a = getInstance();
    		System.out.println(a.value);
    	}
    }
    
    

    在这里插入图片描述
    在方法getInstance()中产生的对象引用s所指向的对象没有在方法执行完后自动释放空间(和c/c++不同),其地址作为返回值赋给对象引用a。


    三、对象初始化顺序是怎样的?

    1.系统会对数据成员进行默认初始化。
    2.执行数据成员定义处的初始化语句。
    3.调用构造方法为数据成员指定初值。

    package hello;
    
    class IntClass{
    	int value;//自动初始化,默认值为0
    	//int value=5; //在定义时指定初值
    	
    	public IntClass() {}
    	
    	//定义构造方法将属性value初始化
    	public IntClass(int val) {
    		value=val;
    	}
    }
    public class IntClassConstructor {
    	public static IntClass getInstance() {
    		//调用构造方法从而省略了s.value代码
    		IntClass s=new IntClass(8);
    		//s.value=8;
    		return s;
    	}
    	public static void main(String[] args) {
    		IntClass a=new IntClass();
    		System.out.println(a.value);
    		a=getInstance();
    		System.out.println(a.value);
    	}
    }
    
    

    四、类的static字段与非static字段的区别是什么?什么情况应该使用static修饰符?

    1.static字段:
    (1).修饰数据成员:用static修饰符修饰的数据成员是不属于任何一个类的具体对象,而是属于类的静态数据成员;它被保存在类的内存区的公共存储单元中,而不是保存在某个对象的内存区中,因此,一个类的任何对象访问它时,存取到的都是相同的数值;访问方式为通过类名加点操作符来访问,也可通过对象引用来访问。《Java开发手册》强制使用类名(而不是该类的对象引用)访问静态方法和静态变量。
    例 static数据成员初始化:

    class IntClass{
    	static int num=0;//静态数据成员初始化
    	int value=5; //在定义时指定初值
    	
    	public IntClass() {}
    	
    	//定义构造方法将属性value初始化
    	public IntClass(int val) {
    		value=val;
    	}
    }
    public class IntClassConstructor {
    	public static IntClass getInstance() {
    		IntClass s=new IntClass(8);
    		return s;
    	}
    	public static void main(String[] args) {
    		IntClass a=new IntClass();//value被初始化为5
    		System.out.println(a.value);
    		IntClass.num++;//静态数据成员自加
    		a=getInstance();
    		a.num++;//静态数据成员自加
    		System.out.println(a.num);
    	}
    }
    

    这两行有警告(通过对象引用来访问):

    在这里插入图片描述

    结果:
    在这里插入图片描述

    静态数据成员仅在类加载时进行初始化,且只执行一次初始化。

    (2).static方法:static方法是类方法,但可以被所有对象所访问,引用这个方法时,可以使用对象名做前缀,也可以使用类名做前缀。《Java开发手册》强制使用类名(而不是该类的对象引用)访问静态方法和静态变量;static方法内部的代码,只能访问类中的static属性或方法,不能直接访问类中的非static属性或方法(因为那是对象方法),但非static方法(对象方法)可以访问static数据成员;main方法是特殊的静态方法,是application程序入口点,必须写成public static void main(String [] args)的形式
    例 static方法:

    class IntClass{
    	static int num=1;//静态数据成员初始化
    	int value=5; //在定义时指定初值
    	
    	public IntClass() {}
    	
    	//定义构造方法将属性value初始化
    	public IntClass(int val) {
    		value=val;
    	}
    	static int countNum() {
    		return num;
    	}//静态方法
    }
    public class IntClassConstructor {
    	public static IntClass getInstance() {
    		IntClass s=new IntClass(8);
    		return s;
    	}
    	public static void main(String[] args) {
    		System.out.println(IntClass.countNum());
    		IntClass a=new IntClass();//value被初始化为5
    		System.out.println(a.value);
    		IntClass.num++;//静态数据成员自加
    		a=getInstance();
    		a.num++;//静态数据成员自加
    		System.out.println(a.num);
    	}
    }
    

    结果:在这里插入图片描述
    当首次访问某类的静态字段或静态方法时,会加载该类(.class),并执行静态初始化语句。

    (3).静态代码块:一个类中可以使用不包含在任何方法体中的静态代码块,当类被装载时,静态代码块被执行,且只被执行一次,静态代码块经常用来对类中定义的属性进行初始化。
    例:

    public class Test2 {
    	 static int value ;
    	   static {  
    	            value = 3;
    	            System.out.println("value="+value); 
    	   }
    	   public static void main(String[] args){   }
    
    }
    

    结果:
    在这里插入图片描述

    2.非static字段:
    (1).数据成员:被复制到对象中,每个对象中都有其各自的属性;通过对象引用访问。
    (2).方法:通过对象引用调用,在调用时系统会为方法开辟一个栈空间,用于存放方法中的局部变量和形式参数,并且方法在执行时还能访问复制到对象中的属性,其效果如同方法也被复制的对象中一样。方法执行完毕之后,栈空间被释放。

    3.什么时候使用static修饰符:
    像一些所有对象都相同的属性,比如类中所有对象的个数。实际编程中灵活运用。


    五、Java中final修饰符都有什么作用?

    1.final修饰属性,则属性为常量。
    例:

    final int NUM = 20; 
           NUM = 30; // 编译错误
    

    2.如果修饰方法,则该方法在子类当中不能被覆盖,可防止任何继承类修改此方法,保证了程序的安全性和正确性。
    例:

    class Parent {
         public final void method1(){}//这个方法不能被子类覆盖    
    } 
    class Child extends Parent { 
         public final void method1(){}//编译错误
    

    3.final修饰类,则该类不能被继承。
    例:

    class Parent {
                }
                final class Person extends Parent{
                } //可以继承Parent类        
               class Child extends Person{
               } //编译报错,不能继承Person类
    

    六、Java中float[10] arr; 语句正确么?

    不正确;Java语言数组声明时,不可在方括号内指定数组大小因为此时并未分配数组空间,可以使用new给数组分配空间,指定数组长度。
    例如:

     int[] arr = new int[10];  //此时分配了数组空间,每个单元初始化为默认值0
    

    七、Java数组元素类型为基本数据类型和引用类型时,有什么不同?

    1.数组元素为基本数据类型的情形
    例如:

    int[] arr = new int[10];  //此时分配了数组空间,每个单元初始化为默认值0
    

    产生一个有10个单元,类型为int的数组对象,所有单元的初值为0。

    2.数组元素为引用类型
    例如:

     String[] example = new String[10];  //对象引用数组`
    

    产生一个具有10个单元的数组对象,每个单元存放的是1个String对象的引用,所有单元的初值为null,此时并未创建具体的String对象

    for(String x: example)
          System.out.println(x);    输出结果为10个null
    

    为数组对象引用赋值后,才能使用数组元素,否则抛出 NullPointerException异常
    例如:

    example[0] = new String(“ab”); //创建String对象,赋值给example[0], 
    //此时example的第一个元素指向String对象,从而可以操纵String对象 
    
    展开全文
  • blank当blank=True时,说明此处数据可以不填,默认情况下为False,也就意味着默认情况下,所输入数据不得空,blank是页面表单有关,在页面需要输入参数的时候,如果在models里面定义了blank=True时,那么这个...

    blank
    当blank=True时,说明此处的数据可以不填,默认情况下为False,也就意味着默认情况下,所输入的数据不得空,blank是和页面表单有关,在页面需要输入参数的时候,如果在models里面定义了blank=True时,那么这个参数是可以不填写的,如果是默认的话,如果没有填写,则会提示错误。

    null
    当null=True时,也就是说如果没有填写数据,此处用NULL来储存空值,默认的是null=False。

    总结
    blank主要是用在CharField, TextField,这两个字符型字段可以用空字符穿来储存空值。
    null主要是用在IntegerField,DateField, DateTimeField,这几个字段不接受空字符串,所以在使用时,必须将blank和null同时赋值为True。

     

    转载于:https://www.cnblogs.com/believepd/p/10171434.html

    展开全文
  • 二、过程不zhi同1、get是把参数数据队列加到提交表单ACTION属性所指URL中,值表单内各个字段一一对应,在URL中可以看到。2、post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送...

    一、功能不同

    1、get是从服务器上获取数据。

    2、post是向服务器传送数据。

    二、过程不zhi同

    1、get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。

    2、post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

    三、获取值不同

    1、对于get方式,服务器端用Request.QueryString获取变量的值。

    2、对于post方式,服务器端用Request.Form获取提交的数据。

    四、传送数据量不同

    1、get传送的数据量较小,不能大于2KB。

    2、post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。

    五、安全性不同

    1、get安全性非常低。

    2、post安全性较高。

    展开全文
  • #python Django 框架ORM映射中,DateTimeField字段的参数auto_now_add auto_now的区别 auto_now_add 是在您创建数据表的时候会自动添加当前时间; auto_now 会在您每次修改数据表的时候自动添加修改的时的时间. ....
  • 一.属性引入类里面是使用字段来描述其特征, 而字段可以使用修饰符来...class 衍生: 上述例子中, 我们给name字段定义了SetGet两个方法, 这样一来对于name这个私有物来说我们就既可以读又可以写了. 那么以此类推, ...
  • 1、SQL Server  通过 IDENTITY 来设置,参数有2个,一个是“初始值” 一个是“增量”,IDENTITY(初始值,增量),如IDENTITY... 可设置为ID字段的数据类型为自动编号,这是一个。另外,在CREATE table的sql语句中用au
  • 图一: 图二: ... 在图二中使用是${}因为此时没有“作为参数的字段”,所以只能用el表达式直接获取其值,在图一中有“作为参数的字段”所以当用'?'这里的参数字段会按照顺序把'?'取代。 ...
  • 前端向后端传参数,后端用自己封装实体类Page来接收,目的是为了实现根据前端传入的字段sortorder进行正序或倒序排序,log日志显示传入的参数信息正常,但是查询返回结果并没有进行排序,查询sql语句如下: ...
  • 来自:CSDN,作者:花郎徒结链接:https://blog.csdn.net/qq_27680317/article/details/79970590Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303 规范,是标准 JSR-303 一个变种),...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,142
精华内容 856
关键字:

参数和字段的区别