目录
Spring Web MVC(正式名)是基于Servlet API构建的Web框架,从一开始就包含在Spring框架中.
在Spring Boot项目的基础上,加入Spring Web框架就成了包含有Spring MVC的项目.
spring我们先前可以知道是一个IOC容器,那MVC是什么呢?
MVC其实只是一种设计思想,是Modle,View,Controller是缩写.是一种软件工程中的,软件架构模式.
基于MVC的思想上,Spring MVC就实现了这个MVC这个模式,并继承了Servlet API的web框架.
学习一个框架,当然是要学会框架的运用.
这里就围绕,用户与程序的连接,参数的获取,数据的输出三个方面来展开.
连接通常使用@RequestMapping来实现.此标签通常用来注册接口的路由映射,路由映射指的是:当用户访问一个特定的URL时会请求到某个类的某个方法当中.
@RequestMapping既能修饰类,也能修饰方法.
- @Controller//类注册到spring容器中
- @ResponseBody//表明返回的是一个数据并非页面
- public class Hello {
-
- @RequestMapping("/hello")//注册接口的路由映射
- public String Hello(){
- return "hello~";
- }
- }
我们知道一般的http请求可以分成几个类型,get,post,put,head,delete...
那么被@RequestMapping修饰的类或方法能接收哪一种类型方法呢?
可以使用postman来进行测试一下:
发现,使用上面的方法都能成功的返回一个hello.
其实@RequestMapping是一个共享映射,在没有设置特定的请求方式下其能接收多种类型的请求.
- //方法一
- @RequestMapping("/hello")
- //方法二
- @RequestMapping(value = "/hello",method = RequestMethod.GET)
- //方法三
- @GetMapping("/hello")
在一般开发中,@RequestMapping的普通形式一般会被程序员们默认成get请求,虽然能用但最好还是不要啦.
- //方法一
- @RequestMapping(value = "/hello",method = RequestMethod.POST)
- //方法二
- @PostMapping("/hello")
在Spring MVC中可以直接使用方法中的参数来进行传参.
- @Controller//类注册到spring容器中
- @ResponseBody//表明返回的是一个数据并非页面
- public class Hello {
-
- @PostMapping("/hello")//注册接口的路由映射
- public String Hello(String name){//通过方法的参数来传参
- return name + " says hello~";
- }
- @PostMapping("/hello")//注册接口的路由映射
- public String Hello(String name,String state){
- return name + " says hello " + state;
- }
Spring MVC中可以实现参数对象的自动赋值
- @Data//Lombok的标签自动注入属性的getter与setter,非必要
- public class User {
- private String name;
- private String state;
- private int age;//传参不一定要与对象的属性全部匹配也是可以的
- }
- @Controller//类注册到spring容器中
- @ResponseBody//表明返回的是一个数据并非页面
- public class Hello {
-
- @PostMapping("/hello")//注册接口的路由映射
- public String Hello(User user){
- return user.getName() + " says hello " + user.getState();
- }
包括表单中的多个参数传递,在拥有多个参数时前后端进行交互时.是以参数的命名来进行匹配的,传参的位置并不会影响结果.
在某些情况下,可能前端传参的属性名与后端接收的属性名可能会不一致.这样就导致了后端接收不到参数的情况.但在Spring MVC中可以在后端将属性重命名成与前端一致,这样就可以正常的接收数据了.
使用@RequestParam来实现对方法中参数的重命名
- @PostMapping("/hi")
- public String hi(@RequestParam("username") String name){//此处将name重命名为username
- return name + " says hi";
- }
这样就可以在不改动方法中代码的情况下去成功的接收前端传参的信息.
在上面的四种情况下,前端只传了一个或少于方法中参数的个数甚至压根没传时.没传的参数会被赋予属性的默认值.(String -> null) 并不会导致程序报错
但在使用了@RequestParam注解后的参数默认都是必传的,即前端一定要传输一个值给后端否则程序会进行报错,
可以去看一看@RequestParam注解中看一看缘由
我们也可以将默认值更改为false,这样一来被@RequestParam修饰的参数就不一样要前端传输了
- @PostMapping("/hi")
- public String hi(@RequestParam(value = "username",required = false) String name){//此处将name重命名为username,并设置参数为非必传
- return name + " says hi";
- }
使用@RequestBody来获取http请求中的json对象.
- @PostMapping("/hello")//注册接口的路由映射
- public String Hello(@RequestBody User user){
- return user.getName() + " says hello " + user.getState();
- }
@RequestBody注解的作用就是,告知方法中的参数前端传过来的数据在http请求的body中,而不是url的queryString中.
- @PostMapping("/hello")//注册接口的路由映射
- public String Hello(User user){//没有使用@RequestBody标签
- return user.getName() + " says hello " + user.getState();
- }
此处中的url中的参数,并非query string形式的参数.
例如下面的url形式,999并非是一个键值对的形式只是单纯的将value添加到了url末尾.也可以添加在url之间.
http://localhost:8080/hello/999
通过@PathVariable注解,能够获取到999.
- @PostMapping("hello3/{name}")//表明url中hello3后的是一个名为name的参数
- public String hello3(@PathVariable("name") String userName){//@PathVariable还能对方法中的参数进行重命名为"name"
- return userName + " says hello";
- }
url中的参数可以是多个的,也可以夹杂在url当中.
url为:http://localhost:8080/hello3/xin/and/20
后端的@PostMapping为:("/hello3/{name}/and/{age}")
其实上面url中的参数只有两个,name与age.但两个参数之间是可以夹在一个固定的地址中的.
这里的上传文件所指的是用户方,即用户上传文件至服务器当中.
- @Controller
- @ResponseBody
- public class TestFile {
- //MultipartFile是spring类型,用来接收传输的文件
- //使用@RequestPart注解将接收到的文件传到方法的参数中
- @PostMapping("/file")
- public String getFile(@RequestPart MultipartFile file) throws IOException {
- //保存文件主要分为:
- //1.获取文件名后缀,这是方便我们来存储并重命名文件
- //2.设置保存路径并保存
-
- //1.获取后缀
- String fileLastName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
- //此语句为,获取文件的原文件名,并将文件名的后缀拿到.substring是将"."后的字符串拿到
- //此处使用一个UUID,UUID会为我们创建出一个唯一识别码
- String fileName = UUID.randomUUID() + fileLastName;//这是最终的文件名
-
- //2.在要保存的路径上创建出一个文件实例
- String path = "D:\\\\JAVA-home\\\\logs\\\\" + fileName;
- File filePath = new File("D:\\JAVA-home\\logs\\" + fileName);//file的构造方法中放入路径就会在此处创建出一个文件实例,暂时并不存在真的文件
- //此处最好使用绝对路径
- //3.保存文件
- //transferTo方法可以将文件存放到指定的路径当中
- file.transferTo(filePath);
- return path;
- }
- }
使用postman上传文件
成功接收到啦
这三个属性通常在HttpServlet的请求和响应当中,在spring mvc当中进行了连接的方法会识别方法中的参数有无请求与响应的对象,如果有会自动进行载入.
传统方法:
- @Controller
- @ResponseBody
- public class demo {
-
- @PostMapping("/demo")
- public String get(HttpServletRequest request, HttpServletResponse response){
- //获取cookie 获取所有的cookie
- Cookie[] cookies= request.getCookies();
- //获取Header
- String head = request.getHeader("user");
- //获取Session
- HttpSession session = request.getSession(false);
- String user = null;//假设有一个user对象
- if(session != null && session.getAttribute("user") != null){
- user = (String) session.getAttribute("user");
- }
- return "finish";
- }
- }
使用注解方法:
- @Controller
- @ResponseBody
- public class demo2 {
- @PostMapping
- public String getCookie(@CookieValue("wow") String cookie){
- return cookie;//获取单个名为wow的cookie
- }
-
- @PostMapping
- public String getHeader(@RequestHeader("Host") String headerHost){
- return headerHost;//获取Header报头中的Host属性
- }
-
- @PostMapping
- public String getSession(@SessionAttribute(value = "userName",required = false) String user){
- return user;//根据Session的键值对中的key来获取session
- }
- }
在Spring MVC与Spring Boot当中,默认返回的是视图而不是参数.所以我们上面的方法中都加上了一个@ResponseBody
- @Controller
- public class demo3 {
- @GetMapping("/hello")
- public Object html(){
- return "/index.html";
- }
- }
在访问对应的URL后呈现出的就是一个页面
@RespondBody可以修饰类或方法.
其返回值如果是字符就会转成text/html,如果返回的是一个对象则会变成application/json 返回给前端.
- @ResponseBody
- @GetMapping("/JSON")
- public Object json(){
- HashMap
map = new HashMap<>(); - map.put("hello","world");
- map.put("cat","dog");
- return map;
- }
- @ResponseBody
- @GetMapping("/wow")
- public Object html(){
- return "wow";
- }
重定向:
客户端重新访问新的页面
- @GetMapping("/wow")
- public Object html(){
- return "redirect:/index.html";
- }
转发:
客户端请求服务器帮忙访问新的页面
- @GetMapping("/wow")
- public Object html(){
- return "forward:/index.html";
- }