zoukankan      html  css  js  c++  java
  • 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. 数组类型的绑定:

        应用:批量删除

        需求:首先出现一个页面,里面有很多的数据,然后有一个批量删除的按钮,点击的时候,把这些数据都删了。

        页面:

    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作用域:

  • 相关阅读:
    23种设计模式(12):策略模式
    23种设计模式(11):责任链模式
    23种设计模式(10):命令模式
    23种设计模式(9):访问者模式
    23种设计模式(8):观察者模式
    23种设计模式(7):中介者模式
    23种设计模式(6):模版方法模式
    创建型模式总结
    23种设计模式(5):原型模式
    leetcode6
  • 原文地址:https://www.cnblogs.com/hcdychen/p/5826148.html
Copyright © 2011-2022 走看看