目录
什么是Spring MVC
Spring MVC的执行流程
创建Spring MVC项目
怎么学习Spring MVC
Spring MVC 的使用
1.连接
2.获取
1.获取单个参数
2..获取对象
3.获取参数的重命名
4.获取JSON对象
5.获取URL参数
6.获取上传文件
7.获取Cookie
8.获取session
9.获取header
3.输出
1.返回 text 与静态页面
实现一个网页计算器
2.返回一个JSON对象
实现一个登录界面
3.请求转发 与 请求重定位 (重点)
请求转发与请求重定位的区别
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
前端页面:
computer
后端代码:
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
前端代码:
login
登录
⽤户:
密码:
后端代码:
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静态页面资源
请求重定位: