SpringMVC(三) —— 参数绑定和数据回显
参数绑定的过程:就是页面向后台传递参数,后台接受的一个过程。
默认支持的参数类型:(就是你在方法上以形参的形式去定义一下的类型,就可以直接使用它)
- HttpServletRequest
- HttpServletResponse
- HttpSession
- Model/ModelMap;前面这个是一个接口,后面试一个实现类。
作用:就是把数据放到request域。
1.支持简单的数据类型绑定:(页面的name属性必须和你定义的参数名一致)
- Integer
- String
- ......
例:
1 public String test_user(int sid,String name){ 2 //int sid等价于 request.getparameter("sid"); 3 System.out.println(sid+"="+nam); 4 return "hello"; 5 }
如果想要名字不一样,要使用:@RequestParam
1 //value:对应页面的name属性 2 //required:是否必须 3 //defaultValue:默认值 4 public String test_user(@RequestParam(value="sid",required=true) int sbid,@RequestParam(value="name")String sbname){ 5 System.out.println(sbid+"="+sbname); 6 return "hello"; 7 }
2.参数绑定之——实体类
有一个要求:实体类的属性名必须和页面的name值一样。
实体的属性:
页面的name属性:
当然,实体类的绑定和简单数据类型的绑定不会相互影响,可以同时使用。
3.参数绑定之——包装的实体类(pojo,entity)绑定
Items.java
1 package com.test.entity; 2 3 public class Items { 4 private Student student; 5 6 public Student getStudent() { 7 return student; 8 } 9 10 public void setStudent(Student student) { 11 this.student = student; 12 } 13 14 }
页面写法:
控制器写法:
此时,我们会有这么一个疑问:明明可以直接用student,为什么要多一层的包装?这就好比多裤子放屁多此一举?答案当然不是,它这么做一定是有意思所在的。
下面我们来看一下案例:
案例1:
学生有: name
教师有: name
如果要求页面同时向后台传输这两个名字,那你后台到底怎么接受????
案例2:
做搜索的时候,多条件搜索(你能保证这些搜索条件都在一张表里面吗?),根据班级名,学生姓名,学号,教师,教室。这个时候我们可以对其进行封装,封装一个QueryItems类,专门用于查询。
4.参数绑定之——集合类型的绑定
- 数组类型的绑定:
应用:批量删除
需求:首先出现一个页面,里面有很多的数据,然后有一个批量删除的按钮,点击的时候,把这些数据都删了。
页面:
1 <c:forEach items="${list}" var="stu"> 2 <tr> 3 <th><input type="checkbox" name="stu_id" value="${stu.sid }"> </th> 4 <th>${stu.sid }</th> 5 <th>${stu.name }</th> 6 <th>${stu.sex }</th> 7 <th>${stu.hobbies }</th> 8 </tr> 9 </c:forEach>
控制器:
1 @RequestMapping(value="deletemore") 2 public String deletemore(int [] stu_id){ 3 for (int i : stu_id) { 4 System.out.println(i); 5 } 6 return "studentlist"; 7 }
2.List类型的绑定:
应用:类似一些教务管理系统:成绩的批量录入,对于成绩的批量修改。
需求:现在需要我完成一个系统,里面可以批量修改学生的信息。
思路:到一个页面,里面有一堆的学生要我们编辑,编辑完成点击提交,这些数据就会提交到我们的后台。
页面:
注意其中划线的地方连空格都不可以多加。
控制器:
要利用我们的包装类进行传输数据,不可以直接在方法上面声明形参。
Items.java
1 package com.test.entity; 2 3 import java.util.List; 4 5 public class Items { 6 private Student student; 7 private List<Student>list;//这个是批量修改学生的包装类 8 9 10 public List<Student> getList() { 11 return list; 12 } 13 14 public void setList(List<Student> list) { 15 this.list = list; 16 } 17 18 public Student getStudent() { 19 return student; 20 } 21 22 public void setStudent(Student student) { 23 this.student = student; 24 } 25 26 }
3.Map类型的绑定:类比上面的List,这里就不说了。
数据回显
1. springmvc会有自动回显的类型实体类(pojo)
实体类的数据会在页面进入控制器后,springmvc会自动将自己的数据放到request作用域,并且他的key为该实体类的首字母小写。Student student User user
有值的写法:
不按照首字母小写的情况:(证实取不到值)
2.简单的类型不会自动回显
简单的类型就是:int,String,boolean……不会自动回显,就用一下携带参数的手段进行数据回显
3.常见的 携带参数的手段
ModelAndView(数据是放在request的作用域)
1 //常见的构造使用 2 //1.空的 3 ModelAndView mv = new ModelAndView(); 4 Map<String, Student>map=new HashMap<String, Student>(); 5 mv.addAllObjects(map); 6 mv.setViewName("hello"); 7 //2.new ModelAndView(viewName,数据); 8 ModelAndView mv1 = new ModelAndView("hello",map);
Model/ModelMap:可以在该方法的形参中声明,以下可以直接使用。
@ModelAttribute可以把页面接收的值放入到request作用域
1 @RequestMapping(value="model") 2 public String model(@ModelAttribute("stu") Student sb){ 3 return "hello"; 4 }
@SessionAttributes:会自动把model中的数据放到session作用域。他是写在类上面的,并且属性名和model中的一致。
Model中的名字叫 stu
1 @RequestMapping(value="model2") 2 public String model2(Model model){ 3 Student student= new Student(1, "傻大个", "男", "李胜"); 4 model.addAttribute("stu",student); 5 return "hello"; 6 }
声明在类上,并且名字是stu
Map:也是放在request作用域
直接new一个Map<String, Student>mvp = new HashMap<String, Student>();是没有办法把值放到作用域的。我们需要在方法以形参的形式声明,才会把值放到request作用域: