目录
1.后端接收参数的3种形式
1.提交的域名中的参数名称和处理方法的参数名一致
- 提交数据 : http://localhost:8080/hello?name=zhangsan
- 处理方法 :
@RequestMapping("/hello") public String hello(String name){ System.out.println(name); return "hello"; }
这种情况下,直接传输即可,springMVC将自动将URL中参数值传给方法的参数
2.提交的域名中的参数名称和处理方法的参数名不一致
- 提交数据 : http://localhost:8080/hello?username=zhangsan
- 处理方法 :
//@RequestParam("username") : username提交的域的名称 . @RequestMapping("/hello") public String hello(@RequestParam("username") String name){ System.out.println(name); return "hello"; }
在方法的参数列表的对应参数前面加上一个@RequestParam()注解,并在注解中填上URL中和这个参数对应的参数的变量名
3.前端提交的数据是一个对象
后端可以接收到对象参数的前提:要求提交的表单域和对象的属性名一致 , URL中的参数名称需要使用对象的属性名称进行传递,方法的参数列表直接使用一个pojo接收即可
- 实体类
public class User { private int id; private String name; private int age; //构造 //get/set //tostring() }
- 提交数据 : http://localhost:8080/mvc04/user?name=zhangsan&id=1&age=15
- 处理方法 :
@RequestMapping("/user") public String user(User user){ System.out.println(user); return "hello"; }
后台输出 : User { id=1, name=‘zhangsan’, age=15 }
说明:如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null
2.代码验证
- 创建POJO
package com.thhh.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class User { private int id; private String name; private int age; }
- 情形1:提交的域名中的参数名称和处理方法的参数名一致
package com.thhh.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class UserController { @RequestMapping("/user/t1") public String test01(String name, Model model) { //1、接收前端参数 System.out.println("接收到前端参数,参数值 = "+name); //2、将model层返回的数据返回给前端 model.addAttribute("msg",name); //3、设置视图名称。控制视图跳转 return "hello"; } }
- 情形2:提交的域名中的参数名称和处理方法的参数名不一致
- 情形3:前端提交的数据是一个对象,一般表单提交的数据也就是一个对象
3.Model、ModelAndView、ModelMap
- Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解【最常用】
- ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性【在Model基础上扩展了LinkedMap的功能,用的少】
- ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转【只有使用继承controller接口的时候才会使用它,因为接口中的方法要求我们返回一个ModelAndView对象,几乎不用】
4.小结
-
不管前端传过来的参数和我们的参数列表变量名称是否一致,我们都应该把@RequestParam(“URL中的参数名称”)写上,写上的好处有两点
- 直接解决名称相同和不相同两种情况
- 写上之后我们查看源码的时候一眼就能看出这个参数是前端传过来的,因为参数列表中一般不止接收前端传递的参数
-
当前端传递的参数是一个对象时,我们根本不需要按照POJO的属性顺序来传递,只要穿的参数的变量名称和我们的POJO属性名称一一对应即可;
-
可见,3种情形传递的参数和参数列表是按照名称匹配的
-
我们可以发现,其实它的实现原理还是servletAPI
-
当然以后开发考虑的更多的是性能和优化,就不能单单仅限于以上的了解
-
请使用80%的时间打好扎实的基础,剩下18%的时间研究框架,2%的时间去学点英文,框架的官方文档永远是最好的教程