目 录
- 一.什么是 Spring MVC?
- 1.MVC 定义
- 2.MVC 和 Spring MVC 的关系
- 二.为什么要学 Spring MVC?
- 三.怎么学 Spring MVC?
- 1.Spring MVC 创建和连接
- 综上连接方式:
- 2.获取参数
- 1.传递单个参数
- 2.获取多个参数
- 3.获取对象
- 4.获取表单参数
- 5.接收JSON对象
- 6.上传文件
- 7.获取Cookie/Session/header
- 8.后端参数重命名
- 9.特殊的URL地址和获取参数的方式:
- 3.返回数据
- 请求转发和请求重定向
一.什么是 Spring MVC?
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称 “Spring Web MVC” 来自其源模块的名称(Spring-webmvc),但它通常被称为“Spring MVC”。
从上述定义我们可以得出两个关键信息:
- Spring MVC 是⼀个 Web 框架。
- Spring MVC 是基于 Servlet API 构建的。
1.MVC 定义
MVC 是 Model View Controller 的缩写,它是软件工程中的⼀种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。
-
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据
-
View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
-
Controller(控制器)是应用程序中处理⽤户交互的部分。通常控制器负责从视图读取数据,控制用户输⼊,并向模型发送数据。
2.MVC 和 Spring MVC 的关系
MVC 是⼀种思想,而 Spring MVC 是对 MVC 思想的具体实现。
总结来说,Spring MVC 是⼀个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。既然是 Web框架,那么当⽤户在浏览器中输入了 url 之后,我们的 Spring MVC 项目就可以感知到用户的请求。
二.为什么要学 Spring MVC?
现在绝大部分的 Java 项目都是基于 Spring(或 Spring Boot)的,而 Spring 的核心就是 SpringMVC。也就是说 Spring MVC 是 Spring 框架的核心模块,而 Spring Boot 是 Spring 的脚手架,因此我们可以推断出,现在市面上绝大部分的 Java 项目约等于 Spring MVC 项目,这是我们要学 SpringMVC 的原因
在创建 Spring Boot 项目时,我们勾选的 Spring Web 框架其实就是 Spring MVC 框架,如下图所示:
Spring MVC 它是⼀切项目的基础,以后创建的所有Spring、Spring Boot 项目基本都是基于 Spring MVC 的。
三.怎么学 Spring MVC?
- 连接的功能:将用户(浏览器)和 Java 程序连接起来,也就是访问一个地址能够调用到我们的Spring 程序。
- 获取参数的功能:用户访问的时候会带一些参数,在程序中要想办法获取到参数。
- 输出数据的功能:执行了业务逻辑之后,要把程序执行的结果返回给用户。
对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC。
1.Spring MVC 创建和连接
在创建的时候选择 Spring Web 就相当于创建了 Spring MVC 的项目,在 Spring MVC 中使用 @RequestMapping 来实现 URL 路由映射,也就是浏览器连接程序的作用
- 由于 Spring MVC 在前端页面显示的是 view 信息,我们此处就需要用 @ResponseBody 声明当前类返回的是非静态页面,@RequestMapping 在浏览器中可以实现路由映射,如上面代码,端口号是 8181 ,我们使用端口号加上类路由加上方法路由就可以访问到程序
- 也可以把类的路由省略,只要端口号加上方法路由也可以访问,但是方法路由不能省略,必须得有
- @Controller 控制器,在 Spring 启动时加载并注册,根据前面的五大类注解,这里可不可以换成别的注解呢?答案是不行的,此处只能使用 @Controller 注解,由于我们的 @Controller 是配合着 @ResponseBody 使用的,他们也可以缩写成一个注解 @RestController,并且功能还是齐全的
@RestController = @Controller + @ResponseBody:是一个http控制器,返回的是非静态页面的数据
@RequestMapping 是 post 还是 get 请求?
使用 PostMan 测试⼀下,默认情况下使用注解 @RequestMapping 是否可以接收 GET 或 POST 请求
由此可发现 @RequestMapping 既是 post 也是 get 请求,我们还可以在 @RequestMapping 中修改是使用 post 还是 get 请求,在 @RequestMapping 中加入一个 method 即可
还有一种简化版写法:@GetMapping
综上连接方式:
-
@RequestMapping : 支持使用类型的接口访问(包含Get/Post… . )
-
@PostMapping : 只支持Post请求
-
@GetMapping : 只支持Get请求
注意:以上注解需要配合 @Controller 或 @RestController 一起使用。
2.获取参数
参数请求的类型:
- URL传参
- Ajax传参
- Form表单传参
1.传递单个参数
在后端代码中这样编写单个参数的获取
在前端URL中传参:
注意:参数名必须相同,才能获取到参数的值。
这种方式也是 Spring MVC (Spring Web)主要获取参数的方式。
2.获取多个参数
Spring MVC 中当传递多个参数的时候,传递参数的顺序是不影响程序执行的,获取参数的结果之和参数的名称有关,和顺序无关。
3.获取对象
创建一个学生类:
调用:
注意事项:参数的传递是对大小写敏感的,此处不要写错
4.获取表单参数
- 获取少数 form 表单参数
此处就可以获取到表单参数了
- 获取多参数 form 表单参数(封装成对象)
5.接收JSON对象
后端接收代码:
此处既不能用单个数据类型接收也不能用对象,只能用 @RequestBody 加对象的方式来获取
6.上传文件
在本地创建的一个目录 D:\Testpng 用来测试桌面的图片是否能存储到文件夹中
在 postman 中传:
在 D 盘中的目录:
表示当前文件传输成功了
此处写绝对路径
7.获取Cookie/Session/header
获取 Cookie:
访问浏览器,由于浏览器里我们没有存储 Cookie,此处使用开发者工具添加 cookie,然后进行打印:
如果有多个 cookie 需要打印,只需要在 @CookieValue(“java”)String java 后面加个逗号隔开继续添加即可
浏览器会默认将当前网站的所有 cookie 发送给后端,是因为 http 协议无状态。
Session 获取:
设置 Session:
读取:
获取 header:
通过 fiddler 抓包看到百度的 User-Agent
8.后端参数重命名
例如我们后端写了一个 time 的程序,前端输入数据的时候,只想用 t 来表示,前后端都不妥协的情况下就只能后端来加一个注解来过渡了
此时我们需要在代码里加入注解:
只能识别 t 参数,并将t参数的值,设置给 time 变量,此时即使使用 time 参数,那么当前的写法也是读取不到前端的参数的,它只认参数名为 t 的参数。所以加了个 required ,传递的不是按规则来的就直接为 null,而不是报错,设置参数是否必传,如果是 true 就需要必传。
9.特殊的URL地址和获取参数的方式:
如果想重命名就按照上面 name 的格式来,不用重命名就按照上面 password 来。
3.返回数据
默认请求下无论是 Spring MVC 或者是 Spring Boot 返回的是视图(xxx.html),而现在都是前后端分离的,后端只需要返给给前端数据即可,这个时候我们就需要使用 @ResponseBody 注解了。
前面详解了 @ResponseBody 注解
- @ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成 application/json 返回给前端。
- @ResponseBody 可以用来修饰方法或者是修饰类,修饰类表示类中的所有方法都会返回 html 或者 json,而不是视图。
请求转发和请求重定向
forward VS redirect
return 不但可以返回⼀个视图,还可以实现跳转,跳转的方式有两种:
- forward 是请求转发;
- redirect:请求重定向。
forward(请求转发)和 redirect(请求重定向)的区别,举例来说,例如,你告诉你妈妈,你想吃辣条,如果你妈妈,说好,我帮你去买,这就是 forward 请求转发;如果你妈妈让你自己去买,那么就是请求 redirect 重定向。
注意:我这里是返回的前端页面,就需要把 @RestController 换成 @Controller,相当于去掉了 @ResponseBody,让他返回一个前端静态页面
forward 和 redirect 具体区别如下:
- 请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。
- 请求重定向地址发生变化,请求转发地址不发生变化。
- 请求重定向与直接访问新地址效果⼀直,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问。