目录
Spring MVC 是一个web框架,而且是基于servlet API 构建的.
MVC 的全称是 model(模型) view(视图) controller(控制)
MVC是一种设计思想,而Spring MVC就是具体实现它的方式. 就好比IoC容器的设计思想,具体实现是通过依赖注入(DI) 依赖查找

MVC 是 Model View Controller 的缩写,它是软件工程中的一种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。
如上图
用户的请求首先到Controller
Controller将请求信息发送给model
model在数据库获取数据后返回给Controller
Controller再将数据返回给view
最后由view将数据生成最终的页面提供给用户
在项目创建中勾选Spring Web 就是勾选了Spring MVC项目
通过下面的描述中我们也可以看到,它说使用了Spring MVC

当我们学会了以下三种功能后,就基本上掌握了Spring MVC
新建一个User类
- package com.example.demo.controller;
-
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- @RestController
- public class User {
-
- @RequestMapping("/user/hi")
- public String sayHi(){
- return "Hi , Spring MVC";
- }
- }

@RequestMapping 默认是Get 请求 Post请求都能接收
如果我们想指定接收 Get请求
// 写法 1@ RequestMapping ( "/index" )// 写法2@ RequestMapping ( value = "/index" , method = RequestMethod . GET )// 写法3@GetMapping( "/index" )
如果想指定接收 Post请求
// 写法2@ RequestMapping ( value = "/index" , method = RequestMethod . POST )// 写法3@PostMapping( "/index" )
如图,设置为Post 后再用 Get请求就会报错, Post请求则能成功获取

Post:


这里创建的对象名必须与请求中的key值一致,才可成功获取

如果要获取多个参数,再如上一个一个输入就太麻烦了,我们通过一个对象来接收

model包里新建Student类 通过@Data 注解自动生成getter,setter等方法

controller包里新建StudentController类,方法是获取这个对象然后返回这个对象

启动后打开网址 localhost:8080/object

如果用户传递参数的key值是 n , 我们觉得太粗略,可以通过@RequestParam 注解进行重命名
我们将其重命名为 name , 然后返回name


此时 n 是必传的参数,如果程序没获取到就会报错
参数不是n,报错了

我们再补充n上去,就正常了

如果参数 n 可传可不传,则要添加一个说明

此时不报错了

java程序是不能直接获取JSON对象的,我们通过Postman来演示
构造了一个JSON对象后发送给java程序,返回的值都是null,说明JSON对象没有被获取到


通过注解@RequestBody 实现获取JSON对象

此处就是成功接收到了JSON对象 并返回了各参数的值

此处的URL参数不是指URL字符串里的参数,而是URL地址的参数
传递参数有两种方式
如图,csdn还是常规的URL格式,,存在键值对

而掘金网站的网页则是只有文章id, 这样就很简洁, 唯一定位到这篇文章

通过注解 @PathVariable


通过注解 @RequestPart

然后通过postman来实现一下,文件传输
选择Post请求,body,form-data,选择 File文件格式
key值一定要与注解 @RequestPart 的参数一致, 然后发送,后台就提示已成功保存到哪个路径里

打开这个路径就找到了保存的文件了

但这样的写法,是把文件名 和 文件后缀给写死的,因此我们要改进设置保存路径的代码

UUID通过一系列算法,保证了生成的id是全球唯一的
randomUUID() 生成随机值
toString() 将随机值打印为字符串
replace("-","") 去掉随机值中的横杠
通过 getOriginalFilename() 可以获取到原文件的名称
substring() 选择这一段字符串
lastIndexOf(".") 获取到从最后一个 "." 开始的字符串片段
再通过postman发送可以发现每次生成的图片名称都是不一样的,且文件后缀都是正确的

通过注解 @CookieValue

然后在网页按F12进入控制台
点击应用程序,Cookie, 右键新增一个cookie
key值要与注解 @CookieValue 的参数一致, value值随意

刷新网页,返回了value值,表示Java程序已经成功获取到了网页cookie

通过注解 @SessionAttribute
该注解有两个属性, value 表示需要获取 Session 对象里面内容的 key 值,还有一个 require 表示修饰的参数是否必须,一般需要设置为 false,如果设置成 true,没有获取到对应的value就会返回一个400的页面。

通过注解 @RequestHeader
header(请求报头)包含哪些内容,可以点击了解 http://t.csdnimg.cn/6idLb


在Spring MVC诞生之初, 前后端是不分离的, Spring通过注解 @Controller
因此后端向浏览器返回的不是一个数据,而是一个页面.
例如,当我们想返回一个字符串(text) " computer.html " , 却发现他返回了一个静态页面



所以, 如果需要传输的是数据, 而不是页面, 需要再添加一个注解 @ResponseBody
表明传输的是body数据

这样就能成功获取到字符串 computer.html 了

我们也可使用更简洁的注解 @RestController
@RestController = @Controller + @ResponseBody


前端页面:
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>computertitle>
- head>
- <body>
- <form action="computer">
- <h1>计算器h1>
- 数字1:<input name="num1" type="text"><br>
- 数字2:<input name="num2" type="text"><br>
- <input type="submit" value="查看结果">
- form>
- body>
- html>
后端代码:
- package com.example.demo.controller;
-
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- @RestController
- public class ComputerController {
- @RequestMapping("/computer")
- public String computer(Integer num1,Integer num2){
- // 非空验证
- if (num1 == null || num2 == null) {
- return "
参数错误!
返回"; - }
- return "
"
+ (num1+num2) +""
; - }
- }
访问网页: localhost:8080/computer
效果:




![]()
通过这行代码,写死 登录成功的用户名是 张三 密码是 123456

succ 是一个用于表示操作结果的状态码,此处我们设置为200,
更常见的做法是,登录成功时返回200,登录失败时返回其他的状态码,比如400或401

前端代码:
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js">script>
- <title>logintitle>
- <script>
- function mysub() {
- let username = jQuery("#username").val();
- let password = jQuery("#password").val();
- jQuery.getJSON("/login",
- {
- "username":username,
- "password":password
- },
- function (result) {
- if(result.succ==200){
- alert("返回结果:"+result.msg);
- }else{
- alert("操作失败,请重试。");
- }
- });
- }
- script>
- head>
- <body>
- <div style="text-align: center;">
- <h1>登录h1>
- ⽤户:<input id="username">
- <br>
- 密码:<input id="password" type="password">
- <br>
- <input type="button" value=" 提交 " onclick="mysub()" style="margin-top: 20px; margin-left: 50px;">
- div>
- body>
- html>
后端代码:
- package com.example.demo.controller;
-
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- import java.util.HashMap;
-
- @RestController
- public class LoginCController {
-
- @RequestMapping("/login")
- public HashMap
res(String username,String password){ - HashMap
response = new HashMap<>(); - int succ = 200;
- if(username != null && password != null
- && username.equals("张三") && password.equals("123456")){
- response.put("msg","登录成功");
- }else {
- response.put("msg","登录失败");
- }
- response.put("succ","200");
- return response;
- }
- }
return 不但可以返回一个视图,还可以实现跳转,跳转的方式分别为两种:
用法:
- // 请求重定向
- @RequestMapping("/computer")
- public String computer(){
- return "redirect:/computer.html";
- }
-
- // 请求转发
- @RequestMapping("/computer2")
- public String computer2(){
- return "forward:/computer2.html";
- }
请求转发:
浏览器通过 URL 访问某个地址获取资源, 这个地址是指向服务器的, 然后服务器会去访问资源所在的地址, 获取到资源后, 将资源返回给浏览器, 这期间 浏览器的 URL 是不变的
请求重定位:
浏览器通过 URL 访问某个地址获取资源, 这个地址是指向服务器的, 然后服务器会将资源所在的地址返回给浏览器, 然后浏览器会根据这个资源地址去访问获取资源, 这期间 浏览器的 URL 改变了
示例分析:
请求转发:
注意要将注解改为 @Controller , 不然会将返回值识别成字符串, 而不是html静态页面资源


请求重定位:


