Spring MVC
目录
什么是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
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.连接
新建一个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:
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
实现一个网页计算器
前端页面:
<!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>
后端代码:
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
前端代码:
<!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>
后端代码:
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:请求重定向
用法:
// 请求重定向
@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地址不同: 请求转发 指向的地址不变 请求重定位 指向的地址会变为资源所在地址
- 代码实现不同