目录
[什么是Spring MVC](#什么是Spring MVC)
[Spring MVC的执行流程](#Spring MVC的执行流程)
[创建Spring MVC项目](#创建Spring MVC项目)
[怎么学习Spring MVC](#怎么学习Spring MVC)
[Spring MVC 的使用](#Spring MVC 的使用)
[1.返回 text 与静态页面](#1.返回 text 与静态页面)
[3.请求转发 与 请求重定位 (重点)](#3.请求转发 与 请求重定位 (重点))
什么是Spring MVC
Spring MVC 是一个web框架,而且是基于servlet API 构建的.
MVC 的全称是 model(模型) view(视图) controller(控制)
MVC是一种设计思想,而Spring MVC就是具体实现它的方式. 就好比IoC容器的设计思想,具体实现是通过依赖注入(DI) 依赖查找
MVC 是 Model View Controller 的缩写,它是软件工程中的一种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。
- 控制器: 在应用程序中用于处理前后端数据交互的部分,负责从视图读取数据,控制用户输入发送给模型
- 模型: 在应用程序中用于处理数据逻辑的部分,负责在数据库存取数据
- 视图: 在应用程序中用于处理数据显示的部分,负责将模型响应的数据生成视图给用户
Spring MVC的执行流程
如上图
用户的请求首先到Controller
Controller将请求信息发送给model
model在数据库获取数据后返回给Controller
Controller再将数据返回给view
最后由view将数据生成最终的页面提供给用户
创建Spring MVC项目
在项目创建中勾选Spring Web 就是勾选了Spring MVC项目
通过下面的描述中我们也可以看到,它说使用了Spring MVC
怎么学习Spring MVC
当我们学会了以下三种功能后,就基本上掌握了Spring MVC
- 连接 将用户(浏览器)与Java程序连接起来,使用用户可以通过地址访问程序
- 获取参数 获取用户访问请求中的参数
- 输出数据 把程序的执行结果返回给用户
Spring MVC 的使用
1.连接
在 Spring MVC 中使⽤ @RequestMapping 来实现 URL 路由映射,也就是浏览器连接程序的作⽤。
接下来要实现的功能是访问地址: http://localhost:8080/user/hi ,能打印"hello,spring mvc"信息。
新建一个User类
java
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:
2.获取
1.获取单个参数
这里创建的对象名必须与请求中的key值一致,才可成功获取
2..获取对象
如果要获取多个参数,再如上一个一个输入就太麻烦了,我们通过一个对象来接收
model包里新建Student类 通过@Data 注解自动生成getter,setter等方法
controller包里新建StudentController类,方法是获取这个对象然后返回这个对象
启动后打开网址 localhost:8080/object
3.获取参数的重命名
如果用户传递参数的key值是 n , 我们觉得太粗略,可以通过@RequestParam 注解进行重命名
我们将其重命名为 name , 然后返回name
此时 n 是必传的参数,如果程序没获取到就会报错
参数不是n,报错了
我们再补充n上去,就正常了
如果参数 n 可传可不传,则要添加一个说明
此时不报错了
4.获取JSON对象
java程序是不能直接获取JSON对象的,我们通过Postman来演示
构造了一个JSON对象后发送给java程序,返回的值都是null,说明JSON对象没有被获取到
通过注解@RequestBody 实现获取JSON对象
此处就是成功接收到了JSON对象 并返回了各参数的值
5.获取URL参数
此处的URL参数不是指URL字符串里的参数,而是URL地址的参数
传递参数有两种方式
如图,csdn还是常规的URL格式,,存在键值对
而掘金网站的网页则是只有文章id, 这样就很简洁, 唯一定位到这篇文章
通过注解 @PathVariable
6.获取上传文件
通过注解 @RequestPart
然后通过postman来实现一下,文件传输
选择Post请求,body,form-data,选择 File文件格式
key值一定要与注解 @RequestPart 的参数一致, 然后发送,后台就提示已成功保存到哪个路径里
打开这个路径就找到了保存的文件了
但这样的写法,是把文件名 和 文件后缀给写死的,因此我们要改进设置保存路径的代码
UUID通过一系列算法,保证了生成的id是全球唯一的
randomUUID() 生成随机值
toString() 将随机值打印为字符串
replace("-","") 去掉随机值中的横杠
通过 getOriginalFilename() 可以获取到原文件的名称
substring() 选择这一段字符串
lastIndexOf(".") 获取到从最后一个 "." 开始的字符串片段
再通过postman发送可以发现每次生成的图片名称都是不一样的,且文件后缀都是正确的
7.获取Cookie
通过注解 @CookieValue
然后在网页按F12进入控制台
点击应用程序,Cookie, 右键新增一个cookie
key值要与注解 @CookieValue 的参数一致, value值随意
刷新网页,返回了value值,表示Java程序已经成功获取到了网页cookie
8.获取session
通过注解 @SessionAttribute
该注解有两个属性, value 表示需要获取 Session 对象里面内容的 key 值,还有一个 require 表示修饰的参数是否必须,一般需要设置为 false,如果设置成 true,没有获取到对应的value就会返回一个400的页面。
9.获取header
通过注解 @RequestHeader
header(请求报头)包含哪些内容,可以点击了解 http://t.csdnimg.cn/6idLb
3.输出
1.返回 text 与静态页面
在Spring MVC诞生之初, 前后端是不分离的, Spring通过注解 @Controller
因此后端向浏览器返回的不是一个数据,而是一个页面.
例如,当我们想返回一个字符串(text) " computer.html " , 却发现他返回了一个静态页面
所以, 如果需要传输的是数据, 而不是页面, 需要再添加一个注解 @ResponseBody
表明传输的是body数据
这样就能成功获取到字符串 computer.html 了
我们也可使用更简洁的注解 @RestController
@RestController = @Controller + @ResponseBody
实现一个网页计算器
前端页面:
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>computer</title>
</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>
后端代码:
java
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 "<h2>参数错误!</h2><a href='javascript:history.go(-1)'>返回</a>";
}
return "<h1>"+ (num1+num2) +"<h1>";
}
}
访问网页: localhost:8080/computer
效果:
2.返回一个JSON对象
实现一个登录界面
通过这行代码,写死 登录成功的用户名是 张三 密码是 123456
succ 是一个用于表示操作结果的状态码,此处我们设置为200,
更常见的做法是,登录成功时返回200,登录失败时返回其他的状态码,比如400或401
前端代码:
html
<!DOCTYPE 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>login</title>
<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>
后端代码:
java
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<String,String> res(String username,String password){
HashMap<String,String> 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;
}
}
3.请求转发 与 请求重定位 (重点)
return 不但可以返回一个视图,还可以实现跳转,跳转的方式分别为两种:
- forward:请求转发
- redirect:请求重定向
用法:
java
// 请求重定向
@RequestMapping("/computer")
public String computer(){
return "redirect:/computer.html";
}
// 请求转发
@RequestMapping("/computer2")
public String computer2(){
return "forward:/computer2.html";
}
请求转发:
浏览器通过 URL 访问某个地址获取资源, 这个地址是指向服务器的, 然后服务器会去访问资源所在的地址, 获取到资源后, 将资源返回给浏览器, 这期间 浏览器的 URL 是不变的
请求重定位:
浏览器通过 URL 访问某个地址获取资源, 这个地址是指向服务器的, 然后服务器会将资源所在的地址返回给浏览器, 然后浏览器会根据这个资源地址去访问获取资源, 这期间 浏览器的 URL 改变了
示例分析:
请求转发:
注意要将注解改为 @Controller , 不然会将返回值识别成字符串, 而不是html静态页面资源
请求重定位:
请求转发与请求重定位的区别
- 定义不同: 请求转发 发生在服务器内部程序上, 当服务器接收到客户端的请求后,服务器会去访问资源地址获取资源, 再将返回结果发送给客户端. 请求重定位 服务器接收到客户端的请求后, 会生成一个临时报头返回给客户端告知 资源所在地址URL, 客户端再通过这个资源地址自己去获取资源
- 资源的请求方不同: 请求转发 是由服务器帮客户端请求资源, 资源请求方是服务器 请求重定位 是由客户端自己去请求资源, 资源请求方是客户端
- 数据共享不同: 请求转发是服务器端实现的,所以整个执行流程中,客户端(浏览器端)只需要发送一次请求,因此整个交互过程中使用的都是同一个 Request 请求对象和一个 Response 响应对象,所以整个请求过程中,请求和返回的数据是共享的;而请求重定向客户端发送两次完全不同的请求,所以两次请求中的数据是不同的
- 最终的URL地址不同: 请求转发 指向的地址不变 请求重定位 指向的地址会变为资源所在地址
- 代码实现不同