目录
2.1.1 @RequestMapping, @GetMapping, @PostMapping 三个注解的区别
1. 什么是 Spring MVC
- Spring MVC就是整个 Spring Framework 中的一个 web 模块
- 它是基于 Servlet API (HTTP 协议, request, response) 构建的.
1.1 如何理解 MVC
MVC 的全称为 Model View Controller , 它是一种软件架构模式, 将 web 应用程序分为模型、视图、控制器三部分.
关系图:
1.2 Spring MVC 和 MVC 的关系
Spring MVC 和 MVC 的关系就和 IoC 和 DI 的关系一样, MVC 是一种思想, 而 Spring MVC 是一种具体的实现, 简单来说就是 Spring MVC 实现了 MVC.
2. 如何学习 Spring MVC
学习 Spring MVC 只学三个东西:
- 将浏览器和服务器连接起来
- 在程序中获取前端传递过来的参数
- 执行了相应业务逻辑后, 把执行结果返回给用户
2.1 将浏览器和服务器连接起来
我们连接用户和 Java 程序之前, 先要创建一个 Spring MVC 项目, 而 SpringMVC 项目就是基于 Spring MVC 项目本身是基于 Spring Boot 项目的 (前面的博客有详细讲解 - 创建 Spring Boot 项目)
此处我们只需要在创建的时候多添加一个 Spring Web 框架即可:
Spring MVC 项目创建好了之后, 就可以进行编写代码了:
【代码示例】
@Controller // 加载并注册类
@ResponseBody // 当前类返回的是非静态页面
@RequestMapping("/web") // 使用 "/web" 可以访问到当前类 (可省略)
public class WebController {
@RequestMapping("/hello") // 使用 "/web" + "/hello" 可以访问到当前方法
public String hello() {
return "hello Spring MVC~";
}
}
当我们写出这样一个代码的时候, 浏览器通过 http://127.0.0.1:8080/web/hello 的时候就可以映射到我们程序中的 hello() 方法.
【注意事项】
2.1.1 @RequestMapping, @GetMapping, @PostMapping 三个注解的区别
前边代码使用的 @RequestMapping 注解, 可以正确访问到本地程序的方法, 且在浏览器通过 url 映射到本地程序本身就是 Get 请求, 那我们来看看 POST 请求是否也能正常访问到程序.
当你的程序想要只支持 GET 请求或者只支持 POST 请求的时候, 就可以使用 @GetMapping 和 @PostMapping 注解, 这俩注解和 @RequestMapping 是类似的用法, 使用相应的请求类型, 是能够正确映射到本地程序的.
【处理 Get 请求】
// 写法一(都适用)
@RequestMapping("/hello")
// 写法二
@RequestMapping(value="/hello", method=RequestMethod.GET)
// 写法三
@GetMapping("/hello")
【处理 Post 请求】
// 写法一
@RequestMapping(value = "/hello",method = RequestMethod.POST)
// 写法二
@PostMapping("/hello")
2.2 在程序中获取前端传递过来的参数
参数请求的类型无非就三种:
- URL 传参(人为的)
- ajax 传参
- form 表单传参
2.2.1 传递单个参数
第一种获取方式(了解):
URL 传参 : http://127.0.0.1:8080/web/hello?name=zhangsan
第二种获取方式:
URL 传参: http://127.0.0.1:8080/web/get1?age=11
2.2.2 传递多个参数
http://127.0.0.1:8080/web/get1/name=zhangsan&age=11
浏览器访问结果:
如果前端传递过来的参数不止两三个, 假设有一百个怎么办. 这时候就可以封装成对象来接受了.
2.2.3 获取对象
使用 postman 传递参数.
2.2.4 获取表单参数
前端代码:
后端代码:
浏览器访问: http://127.0.0.1:8080/login.html
输入姓名, 密码提交后, 显示运行结果:
2.2.4 获取 ajax 传递的普通对象
前端通过 ajax 传参:
后端代码:
>>> 当后端返回 map 类型的时候, Spring MVC 会自动识别键值对格式并帮我们转成 JSON 格式返回给前端.
打开 fiddler 抓包查看 Content-Type:
>>> 前端传递过来的参数不是 JSON 对象, 只是简单的对象, 抓包查看 Content-Type:
2.2.5 获取 JSON 对象
后端代码: (@RequestBody 神奇注解)
前端通过 postman 构造参数:
执行结果:
>>> 此时再抓包查看请求中的 Content-Type:
此时请求的数据类型已经不再是 form-urlencoded, 而是变成了真正的 JSON 格式 的类型了. body 中的数据格式也随之而变了.
2.2.6 上传文件
后端代码:
前端通过 postman 构造:
2.2.7 获取 Cookie
【传统方式】Servlet 获取 Cookie
通过开发者工具构造 Cookie :
浏览器访问: http://127.0.0.1:8080/web/getck
【Spring MVC 中的方式】@CookieValue
获取一个 Cookie:
获取多个 Cookie:
2.2.8 获取 Session
在获取 session 之前, 先存储 session:
以前获取 Session 的方式:
【Spring MVC 的方式】@SessionAttribute
【玩个花活】
由于 Session 是依赖于 Cookie 的, 如果我们篡改了 SessionId, 浏览器是否还能访问到 ?
此时, 我们在设置 session 的情况下再去获取 session, 就会显示 null 了.
【理解 Cookie 和 Session 机制】
2.2.8 获取 Header
传统的方式就不啰嗦了, 直接演示 Spring MVC 的写法:
浏览器访问: http://127.0.0.1:8080/web/get_head
2.2.9 后端参数重命名
有时候, 前端传过来的参数, 不符合后端的命名规则时, 这时候就要用到后端参数重命名了.
浏览器访问: http://127.0.0.1:8080/web/rename?t=2022-12-6%2014:48:21
2.2.10 获取URL中参数@PathVariable
此处讲到的 URL 中传参和普通的 URL 传参还不太一样
- 普通 URL 传参: http://127.0.0.1:8080/web/hello?username=zhangsan&age=12
- 特殊的 URL 传参 : http://127.0.0.1:8080/web/hello/zhangsan/12
>>>为什么会有这样的 URL 传参呢, 其实就是为了提高在搜索引擎中的权重.
Spring MVC 接收 URL 中参数的代码:
2.2.11 设置参数必传@RequestParam
其实前面讲到过的设置 required 参数就是来控制参数是否必传.
2.3 返回数据给前端
2.3.1 返回静态页面
在 static 目录下新建一个 xxx.html 文件:
index.html:
Controller 代码:
2.3.2 返回 text/html
加上 @RestController 注解或者 @Controller + @ResponseBody, 返回String 等基本类型.
2.3.3 返回 JSON 对象
当我们的返回类型为集合或者对象的时候, Spring MVC 会自动帮我们转成 JSON 格式的对象, 返回给前端.
浏览器访问 URL: http://127.0.0.1:8080/index
使用 fiddler 抓包查看 Content-Type.
2.3.4 请求转发和请求重定向【了解】
- forward: 请求转发
- redirect: 请求重定向
【举例说明】请求转发和请求重定向
【区别】forward VS redirect
本篇文章就到这里了, 谢谢观看!!