Springmvc数据回显实现原理实例解析
数据回显就是当用户数据提交失败时,自动填充好已经输入的数据,一般来说,如果是使用Ajax来做数据提交,基本上是没有数据回显这个需求的,但是如果通过表单做数据提交,那么数据回显就非常必要了。
简单数据类型数据回显
简单数据类型,实际上框架在这里没有提供任何形式的支持,就是我们自己手动配置。加入提交的Student数据不符合要求,那么重新回到添加Student页面,并且预设之前已经填好的数据。
首先我们先来改造一下student.jsp页面:
学生编号: 学生姓名: 学生邮箱: 学生年龄:
在接收数据时,使用简单数据类型去接收:
@RequestMapping("/addstudent") publicStringaddStudent2(Integerid,Stringname,Stringemail,Integerage,Modelmodel){ model.addAttribute("id",id); model.addAttribute("name",name); model.addAttribute("email",email); model.addAttribute("age",age); return"student"; }
这种方式,相当于框架没有做任何工作,就是我们手动做数据回显的。此时访问页面,服务端会再次定位到该页面,而且数据已经预填好。
实体类数据回显
简单数据类型的回显,实际上非常麻烦,因为需要开发者在服务端一个一个手动设置。如果使用对象的话,就没有这么麻烦了,因为SpringMVC在页面跳转时,会自动将对象填充进返回的数据中。
学生编号: 学生姓名: 学生邮箱: 学生年龄:
注意,在预填数据中,多了一个student.前缀。这student就是服务端接收数据的变量名,服务端的变量名和这里的student要保持一直。服务端定义如下:
@RequestMapping("/addstudent") publicStringaddStudent(@Validated(ValidationGroup2.class)Studentstudent,BindingResultresult){ if(result!=null){ //校验未通过,获取所有的异常信息并展示出来 ListallErrors=result.getAllErrors(); for(ObjectErrorallError:allErrors){ System.out.println(allError.getObjectName()+":"+allError.getDefaultMessage()); } return"student"; } return"hello"; }
注意,服务端什么都不用做,就说要返回的页面就行了,student这个变量会被自动填充到返回的Model
中。变量名就是填充时候的key。如果想自定义这个key,可以在参数中写出来Model,然后手动加入Student对象,就像简单数据类型回显那样。
另一种定义回显变量别名的方式,就是使用@ModelAttribute注解。
ModelAttribute
@ModelAttribute这个注解,主要有两方面的功能:
- 在数据回显时,给变量定义别名
- 定义全局数据
定义别名
在数据回显时,给变量定义别名,非常容易,直接加这个注解即可
@RequestMapping("/addstudent") publicStringaddStudent(@ModelAttribute("s")@Validated(ValidationGroup2.class)Studentstudent,BindingResultresult){ if(result!=null){ //校验未通过,获取所有的异常信息并展示出来 ListallErrors=result.getAllErrors(); for(ObjectErrorallError:allErrors){ System.out.println(allError.getObjectName()+":"+allError.getDefaultMessage()); } return"student"; } return"hello"; }
这样定义完成后,在前端再次访问回显的变量时,变量名称就不是student了,而是s:
学生编号: 学生姓名: 学生邮箱: 学生年龄:
定义全局数据
假设有一个Controller中有很多方法,每个方法都会返回数据给前端,但是每个方法返回给前端的数据又不太一样,虽然不太一样,但是没有方法的返回值又有一些公共的部分。可以将这些公共的部分提取出来单独封装成一个方法,用@ModelAttribute注解来标记。
例如在一个Controller中,添加如下代码:
@ModelAttribute("info") publicMapinfo(){ Map map=newHashMap<>(); map.put("username","javaboy"); map.put("address","www.javaboy.org"); returnmap; }
当用户访问当前Controller中的任意一个方法,在返回数据时,都会将添加了@ModelAttribute注解的方法的返回值,一起返回给前端。@ModelAttribute注解中的info表示返回数据的key。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。