Spring MVC快速入门

各位看官,大家早安午安晚安呀~~~

如果您觉得这篇文章对您有帮助的话

欢迎您一键三连,小编尽全力做到更好
欢迎您分享给更多人哦

今天我们来学习:Spring MVC快速入门

1.MVC 定义

MVC 是 Model View Controller 的缩写,它是软件工程中的⼀种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分

view =》Controller选择 model 然后再返回给 view

**不过我们现在前后端分离:我们直接浏览器访问 控制器了(Controller)。**也就是Controller来负责接收用户的请求.(省去了走view的这一步了)

MVC 是⼀种架构设计模式, 也⼀种思想, 而 Spring MVC 是对 MVC 思想的具体实现. 除此之外, Spring MVC还是⼀个Web框架.

总结来说,Spring MVC(全称是 Spring Web MVC) 是⼀个实现了 MVC 模式的 Web 框架. 所以, Spring MVC主要关注有两个点:

  1. MVC
  2. Web框架

@RestController和@Controller区别:

Controller(视图控制器):如果你返回一个字符串,Spring 默认会尝试将这个字符串作为视图名称解析,而不是直接返回字符串内容(直接以为pig是一个视图(view)),导致最后什么都没有返回。

RestController能返回自动处理各种返回类型的序列化(返回我们需要的东西)。

2.建立连接@RequestMapping和@RestController

复制代码
@RestController//把这个类交给Spring管理
 //一个类里面有很多方法,Spring程序怎么知道要执行哪些方法呢?这个时候就需要控制器了,在控制器下面找@RequestMapping,找到具体要执行哪个方法

@RequestMapping("/request")  // RequestController 这个类在/request这个路径下面
public class RequestController {
    @RequestMapping("/function1") // // function1 这个方法在function1(方法名字)这个路径下面
    public String function1(){
        return "hello";
    }

}

@RequestMapping标明了一个网络资源在一个主机程序中的具体位置。可以看做是来注册接口的路由映射的. 和URL有直接关系

@RequestMapping 即可修饰类,也可以修饰 方法 ,当修饰类和 方法 时,访问的地址是类路径 + 方法 路径.
@RequestMapping标识⼀个类:设置映射请求的请求路径的初始信息
@RequestMapping标识⼀个方法:设置映射请求请求路径的具体信息

接下来我访问地址:http://127.0.0.1:8080/request/function1

注意:

@RequestMapping 的URL 路径最前⾯加不加 / (斜杠)都可以, Spring程序启动时, 会进行判断, 如果前面没有加 / , Spring会拼接上⼀个 /(建议还是加上,一种大家默认的规范)

3.使用Postman构造HTTP请求,给服务器传递参数

注意:传递参数时尽量使用包装类型,因为我们允许传递多个参数时(不需要全部传完,其他的参数默认为null,但是基本数据类型譬如int,不能为null,因此参数是基本数据类型的必须要传!!!)

为了避免这个错误,我们尽量在这个方法接口里面的参数都要为包装类型

3.1.传递一个参数时

后端实现

java 复制代码
@RestController
@RequestMapping("/request")  // RequestController 这个类在/request这个路径下面
public class RequestController {
    @RequestMapping("/function1") // // function1 这个方法在function1(方法名字)这个路径下面
    public String function1(String name){
        return name;
    }
}

使用Postman或者浏览器构造HTTP请求都可以(GET和POST请求也都可以)

3.2.传递多个参数时

后端实现(我只把这个方法的实现写出来了)(这里ID我使用的int类型)

java 复制代码
    @RequestMapping("/function2")
    public String function2(String name,Integer age,int ID){
        return "姓名:"+name+ ",年龄:"+age + ", ID:" +ID;
    }

使用postman构造

结果:


当我不传递年龄时,可以看到默认为null

当我不传ID时(ID是int类型)

3.3.传递对象

如果参数比较多时, 方法声明就需要有很多形参. 并且后续每次新增⼀个参数, 也需要修改方法声明.
我们不妨把这些参数封装为⼀个对象

3.3.1.传递数组

我们只需要把数组作为接收对象,

  • 然后用数组名当Key,输入几个相同的Key,不同的value就可以了
  • 或者直接array = hello,heihei,lalala

Postman构造请求

或者请求传递的参数放在URL也是一样的,如下:

3.3.2.传递集合时(@RequestParam)

集合参数:和数组类似, 同⼀个请求参数名有为多个,

默认情况下,请求中参数名相同的多个值,是封装到数组 . 如果要封装到集合,要使用
@RequestParam 绑定参数关系
我们先看一下如果不加上注解的话会如何?
如图:


总结两点:
1.方法接口不能放"接口"(譬如Lis来接收)。
这里我们传的数据不是对象(集合),无法向上转型(就算是在Body中传输JSON对象也没有像LinkedList的类型(无类型))

以下两种方式是错误的(等会我会讲解如何传输JSON数据)
1.1.

复制代码
{
    "list": ["zhangsan", "lisi", "wangwu"]
}这是一个对象:含有list键的对象
  • 1.2."list": "zhangsan", "lisi", "wangwu"(不合法的结构)
  • 直接传递数组因该是这种格式: "zhangsan", "lisi", "wangwu"
    2.一定加@ResquestParam,@RequestParam 绑定参数关系,标明传递的是一个集合

3.3.3传递JSON对象(@ResquestBody)

  1. JSON概念:JavaScript Object Notation 【JavaScript 对象表示法】
  2. JSON是⼀种轻量级的数据交互格式.
  3. 简单来说:JSON就是⼀种数据格式, 使用文本表示⼀个对象或数组的信息(一般是对象里面的属性都是用键值对来表示), 因此 JSON本质是字符串. 主要负责在不同的语言中数据传递和交换.

JSON格式:

几种合法的JSON数据格式:


我都介绍完JSON的格式了,你猜我要提问什么问题?
提问:我们一开始都是直接拿传输键值对的方式,有没有一种方式直接传输对象呢?
URL肯定放不下,但是Body中可以直接传输JSON,我们直接在Body中构造一个JSON对象传输过去 ,然后后端方法接口直接一个对象来接收
Postman构造HTTP请求:

后端代码实现:

java 复制代码
@RequestMapping("/function4")
    public String function4(@RequestBody Student student){ //如果是直接传过来对象的话,要加上这个注解
        return " "+student;
    }

3.3.4.JSON字符串和Java对象的转换

这里的转换是在后端代码中。毕竟在HTTP请求中的JSON字符串Spring已经帮助我们转换好了我们只需要加上@RequestBody就行(Spring MVC已经帮助我们解析完成JSON字符串并且构造好Java对象了(自动))

但是在后端代码中我们需要调动API来完成这个操作。Spring MVC框架集成了JSON的转换工具, 我们可以直接使用, 来完成JSON字符串和Java对象的互转。
这本质上是jackson-databind提供的功能, Spring MVC框架中已经把该⼯具包引入了进来, 咱们直接使用即可, 如果脱离Spring MVC使用, 需要引入相关依赖

< dependency >
< groupId >com.fasterxml.jackson.core</ groupId >
< artifactId >jackson-databind</ artifactId >
< version >2.13.5</ version >
</ dependency >

推荐JSON压缩工具:BeJSON

代码演示:

!!! 把JSON字符串进行解析然后创建出这个对象(默认无参数的构造函数,所以如果你要加入其他的构造函数的时候记得把无参数的构造函数也加进来,还要抛出异常)

java 复制代码
 public static void main(String[] args) throws JsonProcessingException {
        String jsonStr ="{\"age\":\"100\",\"name\":\"zhangsan\",\"id\":\"111\"}";

        // !!!!Spring MVC框架也集成了JSON的转换⼯具, 我们可以直接使⽤, 来完成JSON字符串和Java对象的互转
        //不然的话还需要导入这个依赖

        ObjectMapper objectMapper = new ObjectMapper();
        // 转换JSON字符串和Java对象的类ObjectMapper
        Student student1 = objectMapper.readValue(jsonStr, Student.class);//先把Student这个类对象当参数传进去
        // 记得用我们自己的这个对象来接收
/**
         * //!!!!! 把JSON字符串进行解析然后创建出这个对象(默认无参数的构造函数,所以如果你要加入其他的构造函数的时候
         * 记得把无参数的构造函数也加进来
         * 还要抛出异常
         */

        System.out.println(student1);
   }
}

如果没加无参数的构造方法,结果:

加上默认参数构造方法后:

java 复制代码
public class JsonTest {
    public static void main(String[] args) throws JsonProcessingException {
        String jsonStr ="{\"age\":\"100\",\"name\":\"zhangsan\",\"id\":\"111\"}";
        //把字符串复制进来,IDEA会自动帮我们进行转义

        // !!!!Spring MVC框架也集成了JSON的转换⼯具, 我们可以直接使⽤, 来完成JSON字符串和Java对象的互转
        //不然的话还需要导入这个依赖

        ObjectMapper objectMapper = new ObjectMapper();
        // 转换JSON字符串和Java对象的类ObjectMapper
        Student student1 = objectMapper.readValue(jsonStr, Student.class);//先把Student这个类对象当参数传进去
        // 记得用我们自己的这个对象来接收
/**
         * //!!!!! 把JSON字符串进行解析然后创建出这个对象(默认无参数的构造函数,所以如果你要加入其他的构造函数的时候
         * 记得把无参数的构造函数也加进来
         * 还要抛出异常
         */

        System.out.println(student1);
        System.out.println("=========");

        Student student = new Student();
        student.setAge(10);   //只设置age = 10,name和id都是null
        String str = objectMapper.writeValueAsString(student);//把Student对象转换为JSON字符串,
        System.out.println(str);

        // 通过BeJSON这个工具把JSON字符串进行压缩,然后直接复制进来,把复制进来的内容放在双引号里面
        // IDEA会自动帮我们转义

    }
}

因此:

如果是通过HTTP请求传递的JSON字符串。直接传输就行,这个时候构造方法中没有无参数的构造方法也可以)不过要记得后端代码 需要加上注解,@RequestBody,Spring就会自动帮我们构造好这个对象
但是如果在后端代码内部 进行JSON字符串和Java对象转换,就一定要有无参数的构造方法

总的来说:不管怎么干,养成一个好习惯(不管怎么样都要加上无参数的构造方法)

3.4.获取URL中值@PathVariable

简单一句话就是:为了直接在访问路径上赋值

http://127.0.0.1:8080/request/function6/10/zhangsan路径上直接就是10和张三,你敢信?哈哈哈)
path variable: 路径变量
这个注解主要作用在请求URL路径上的数据绑定。就是:把一些query String或者Body中键值对的值 现在直接放在路径上
注意:

1.@PathVariable一定要加,作用:将占位符的值绑定到方法参数上。(直接在访问路径上赋值)
2.后端代码URL路径中的{ }是路径变量占位符,用于动态获取参数。

举例子:

后端代码实现:

java 复制代码
  @RequestMapping("/function6/{id}/{name}")
    public String method8(@PathVariable Integer id, @PathVariable("name") String useName){
        return "解析参数id:"+id+",name:"+useName;
    }

结果:

3.5.上传文件@RequestPart

这里文件的类型是MultipartFile 。Spring MVC 自动把请求中的文件绑定到 MultipartFile这个类 ,。我们可以使用很多这个类里面的方法

使用Postman构造请求,但是文件太大,上传超过限制:我们可以分段传输,或者提高浏览器上传文件的上限(但是小编这里不建议这样做)

接下来我上传一个小的文件给大家示范一下

我上传一个图片,使用Postman构造请求

代码实现:

java 复制代码
 /**
     * 1.上传文件,服务器得到文件然后返回响应,
     * 2.文件类型:MultipartFile
     * 3.注解:@RequestPart(加上就是重命名,不加也可以)和上面那个重命名很像
     * @return
     */
    @RequestMapping("/function5")
    public String function5(@RequestPart("File") MultipartFile file) throws IOException {// transferTO这个方法抛出的异常
        String fileName = file.getOriginalFilename(); //得到文件名,譬如:org.png
        String fileName1 = file.getName();// 得到的文件名字就是 File (震惊我100年)

        file.transferTo(new File("D:/" + fileName));
        //这行代码的作用是将上传的文件保存到服务器的指定路径。
        return "文件名(不带路径):"+fileName + ",  用MultipartFile修饰的名字: "+fileName1;
        //
    }

结果:

可以看到,我们getName得到的字符串就是我们的Key值getOeiginalFileName得到是文件名(不带路径)

但是当文件过大的时候就会发生报错(上传的文件大小超过限制,这个时候需要调整浏览器上传文件大小的限制(不过一般不建议))

3.6.设置状态码

Spring MVC会根据我们方法的返回结果自动设置响应状态码, 程序员也可以手动指定状态码
通过Spring MVC的内置对象HttpServletResponse 提供的方法来进行设置

总结一下常用的这两个

  • @RequestParam :处理 URL 中的简单参数,适合简单值或简单列表

  • @RequestBody :处理 请求体中的复杂数据(用JSON发送的都用这个注解),适合对象、嵌套结构、Map 和复杂列表

  • Map 接收 :当数据结构动态变化或不确定时使用,需要手动类型转换

  • DTO 接收:固定结构时的最佳选择,提供类型安全和自动绑定

Map的键值代表什么?

  • 键(Key):代表JSON对象中的字段名(都是字符串)

  • 值(Value):代表对应字段的值,类型为Object,因为值可以是任意类型:字符串、数字、布尔值、数组(List)、嵌套对象(Map)等。

最后展示:

上述就是Spring MVC快速入门的全部内容啦,不知道您对文章中的问题和思想是否都学会理解了呢?

能看到这里相信您一定对小编的文章有了一定的认可。

有什么问题欢迎各位大佬指出
欢迎各位大佬评论区留言修正~~
您的支持就是我最大的动力​​​!!!

相关推荐
萧瑟余晖10 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring
Flittly16 小时前
【雕虫大技】Agent 动态 Skill 供应链安全加固(二):执行隔离沙箱实战
java·spring boot·spring
BUG指挥官2 天前
Sa-Token和Spring Security对比
java·后端·spring
geminigoth2 天前
Spring AI Alibaba 入门开发一(备份)
java·人工智能·spring
xbgRS2 天前
spring整合mybaits
java·spring·mybatis
ruleslol2 天前
静态依赖注入 VS 动态依赖查询
spring
墨雨晨曦882 天前
Spring AI总结
java·人工智能·spring
用户3126874877202 天前
Spring Boot 异常处理到底怎么玩的?从 DispatcherServlet 到全局兜底的全链路拆解
spring
不才不才不不才2 天前
Spring 源码系列(17): HandlerMapping 与 HandlerAdapter 两大体系
java·后端·spring
(轻舟已过万重山)2 天前
第40章 Spring AI 实战:企业级 AI 应用架构
人工智能·spring·架构