• Spring MVC上篇


    在这里插入图片描述

    🍌 一.什么是Spring MVC

    Spring Web MVC是基于Servlet API构建的原始Web框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为“Spring MVC”。前面学习了Spring Boot,其是为了快速开发Spring而创建的框架,其本质也是spring,所以现在大部分Java项目都是基于Spring(或 Spring Boot)的,而Spring的核心就是Spring MVC,也就是说Spring MVC 是Spring框架的核心模块,那么MVC代表什么呢?
    MVC是Model View Controller的缩写,这其实是一种设计模式,这种设计模式将软件(项目)分成三部分:模型,视图和控制器,下面是一个项目和用户的具体交互过程:

    在这里插入图片描述
    通过这样的MVC设计模式就可以实现一个web项目,那么MVC和Spring MVC又有什么关系:MVC是一种设计思想,而Spring MVC是具体的实现框架!
    总结一下:Spring MVC其实就是一个基于MVC设计模式和Servlet API实现的web项目,同时Spring MVC又是Spring框架中的一个Web模块,它是随着Spring的诞生而存在的一个框架!


    🍌 二.Spring MVC 创建和连接

    Spring MVC项目的创建和Spring Boot项目的创建其实是差不多的,在创建项目的时候,选择了Spring Web就相当于创建了Spring MVC项目!

    🍓 1.实现用户和程序的映射

    🍉 1.1.使用注解@RequestMapping

    @Controller
    @ResponseBody
    public class UserController {
    
        @RequestMapping("/func")
        public String func(){
            return "Hello,world!";
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    这里是需要加上@ResponseBody的,否则就会认为你返回的是一个静态页面,就会去查找到底有没有这个页面,如果没有的话就会404了,因此这里是需要加上这个注解的,这样才能访问到这个页面,这其实是一个遗留的问题。
    在这里插入图片描述在这里插入图片描述
    而通过抓包工具可以发现这个是一个get请求(使用浏览器直接访问的一般都是get请求),那有没有办法构造post请求呢?答案是肯定的!

    
    @Controller
    @ResponseBody //返回一个非静态页面
    public class UserController {
        @RequestMapping(value = "/func",method = RequestMethod.POST)
        public String func(){
            return "Hello,world!";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    通过这样的参数设计就可以将请求设置为post请求了,其他类型的请求也是可以进行设置的,下面可以通过postman来看一下这个到底是不是post请求:
    在这里插入图片描述
    在这里插入图片描述
    可以发现这个请求已经是post请求了

    🍉 1.2.使用注解@PostMapping

    @Controller
    @ResponseBody //返回一个非静态页面
    public class UserController {
        @PostMapping("/func2")
        public String func2(){
            return "我是post请求!";
        }
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    在这里插入图片描述
    这样构造出来的一定是post请求

    🍉 1.3使用注解@GetMapping

    @Controller
    @ResponseBody //返回一个非静态页面
    public class UserController {
    
        @GetMapping("/func3")
        public String func3(){
            return "我是get请求!";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    🍓 2.服务器端得到用户的请求参数

    🍉 2.1.获取单个参数

    这里在参数里面传一个id值,

    @Controller
    @ResponseBody //返回一个非静态页面
    public class UserController {
        @RequestMapping("/getuserbyid")
        public User getUserById(Integer id){  //这里一定使用包装类,可以避免为空的异常
            //这里不查询数据库,直接返回
            User user = new User();
            user.setId(id);
            user.setUsername("张三");
            user.setPassword("123");
            user.setAge(19);
            return user;
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述
    在这里插入图片描述
    抓包工具里面也可以发现其响应结果正是这样的数据,另外这里传递的参数一定是要和前端传递的参数一致的,否则就无法进行参数的传递!

    🍉 2.2.获取多个参数

    这里也是可以传递多个参数的:

    @Controller
    @ResponseBody //返回一个非静态页面
    public class UserController {
        @RequestMapping("/login")
        public String login(String username,String password){
            return "username: " + username + " | password: " + password;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述
    在这里插入图片描述
    但是当参数过多的话,在使用这样的方式来进行传递,每次增加的参数,都需要再参数列表里面进行传递,这显然是不合适的,那么有什么更好的方法嘛?当然这里也是可以传递一个对象的!

    🍉 2.3.获取对象

    
    @Controller
    @ResponseBody //返回一个非静态页面
    public class UserController {
        
        @RequestMapping("/reg")
        public String reg(User user){
            return "用户信息: " + user; 
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    在这里插入图片描述
    这里就可以发现传递一个对象也是可以的,而Spring内部会根据返回的信息来自己设置返回类型,这也是Spring非常厉害的一个地方吗,另外通过form表单参数传递/传递多个参数也是可以的,这里就不详细介绍了!

    🍉 2.4.后端参数重命名

    如果前端传递过来的参数,不符合后端的需要,后端也是可以对前端传递过来的参数进行重名的!这里使用一个@RequestParam就可以解决了:

    @Controller
    @ResponseBody //返回一个非静态页面
    public class UserController {
        //RequestParam里面放着前端传递的参数,后面是后端要重命名的参数
        @RequestMapping("/set")
        public String set(@RequestParam("name") String username){
            return username;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述
    在这里插入图片描述

    前端传递的参数是name,但是在后端可以使用username,这样就可以进行了重命名!
    而当使用了@RequestParam之后,传递过来的参数就不能是空的了,如果是空的话就会直接报错了,想要让其可以传递空的参数的话,可以将@RequestParam里面的属性required = false就可以传递空的参数了!

    🍉 2.5.获取JSON对象

    此时就不能再使用接收普通对象来接收了,此时就需要使用@RequestBody注解了,@RequestBody表示从前端接收过来的数据是JSON形式的

    @Controller
    @ResponseBody //返回一个非静态页面
    public class UserController {
        @RequestMapping("/getjson")
        public String getJson(@RequestBody User user){
            return "用户信息:" + user;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述
    在这里插入图片描述

    可以发现是获取到了这个对象了!

    🍉 2.6.获取URL中的参数

    想要从url里面获取参数,就需要使用到@PathVariable注解了,而前面的获取url的参数是从?后面的参数中获取的,但这里可以从url地址(?前面)来进行获取,下面一起来看一下:

    @Controller
    @ResponseBody //返回一个非静态页面
    public class UserController {
        @RequestMapping("/geturl/{username}/{password}")
        public String getUrl(@PathVariable String username,@PathVariable String password){
            return "用户名: " + username + " | 密码: " + password;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在@RequestMapping里面也是要根据顺序来进行编写的
    在这里插入图片描述
    在这里插入图片描述

    发现信息也是可以获取到的!

    🍉 2.7.上传文件

    这里也是可以进行上传文件操作的,使用@RequestPart注解就可以实现:

    @Slf4j
    @Controller
    @ResponseBody //返回一个非静态页面
    public class UserController {
    
        //上传文件
        @RequestMapping("/upimg")
        public boolean upImg(Integer id, @RequestPart("img")MultipartFile file){
            boolean result = false;
    
            //保存文件到本地目录
            try {
                file.transferTo(new File("E:\\Web\\img.png"));
                result = true;
            } catch (IOException e) {
                log.error("上传图片失败"  + e.getMessage());
            }
            return result;
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    图片也是上传成功了!


    在这里插入图片描述

  • 相关阅读:
    软件工程——期末复习知识点汇总
    crypto 加解密库简介与测试【GO 常用的库】
    学习C++第二十二课--类模版概念与函数模版的定义、调用笔记
    洛谷题单算法1-6二分查找与二分答案
    TensorFlow手动加载数据集(以mnist为例)
    python3网络爬虫--2323爬取B站视频弹幕 解so文件(附源码)
    <四>虚函数 静态绑定 动态绑定
    windows中python版本冲突问题之二
    戴口罩人脸数据集和戴口罩人脸生成方法
    【IPC 通信】信号处理接口 Signal API(3)
  • 原文地址:https://blog.csdn.net/qq_58266033/article/details/126068331