目录
3.6.3 @SessionAttribute获取Session
1.Spring MVC的定义
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来自其源模块的名称(Spring-webmvc),但它通常被称为“Spring MVC”。
1.1 MVC 的定义
MVC 是 Model View Controller 的缩写,它是软件工程中的⼀种软件架构模式,它把软件系统分 为模型、视图和控制器三个基本部分
1.2 MVC 和 Spring MVC 的关系
MVC 是⼀种思想,而 Spring MVC 是对 MVC 思想的具体实现。
1.3 学习Spring MVC的必要性
现在绝大部分的 Java 项目都是基于 Spring(或 Spring Boot)的,而Spring 的核心就是 Spring MVC。也就是说 Spring MVC 是 Spring 框架的核心模块,而 Spring Boot 是 Spring 的脚手架,因此 我们可以推断出,现在市面上绝大部分的 Java 项目约等于 Spring MVC 项目
1.4 Spring MVC的功能
- 连接的功能:将用户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调用到我们的 Spring 程序。
- 获取参数的功能:用户访问的时候会带⼀些参数,在程序中要想办法获取到参数。
- 输出数据的功能:执行了业务逻辑之后,要把程序执行的结果返回给用户。
2.Spring MVC 创建和连接
2.1 创建Spring MVC项目
注意事项:Spring MVC 可以基于 Spring Boot 创建
2.2 实现Spring MVC的连接
@RestController //进行页面跳转而是直接返回数据
public class UserController {
@RequestMapping("/say")
public String sayHi(){
return "hello Spring MVC";
}
访问地址:http://localhost:8080/say 时就能打印“hello Spring MVC”的信息 了。
2.2.1 @RequestMapping 注解介绍
@RequestMapping 是 Spring Web 应用程序中最常被用到的注解之⼀,它是用来注册接口的路由映射的。
所谓的路由映射指的是,当用户访问⼀个 url 时,将用户的请求对应到程序中某个类 的某个方法的过程就叫路由映射。
@RequestMapping 即可修饰类,也可以修饰方法,当修饰类和方法时,访问的地址是类 + 方 法。
@RequestMapping 支持post请求也支持get请求
@GetMapping只支持get请求
@PostMapping只支持post请求
3.Spring MVC 获取参数
3.1 传递单个参数
@RestController //进行页面跳转而是直接返回数据
public class UserController {
@RequestMapping("/say")
public String sayHi(String name){
return "hello Spring MVC "+name;
}
执行结果:
注意事项:可以传递多个参数,当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的,因此参数的位置 是不影响后端获取参数的结果。
3.2 传递对象
Userinfo对象:
@Data //代替setter、getter方法,配置好以后就可反复使用
@ToString
public class Userinfo {
private int id;
private String name;
private int age;
}
传递对象代码实现:
@RestController //进行页面跳转而是直接返回数据
public class UserController {
@RequestMapping("/reg")
public Object reg(Userinfo userinfo) {
System.out.println(userinfo.getName());
System.out.println(userinfo.getId());
return userinfo;
}
}
postman执行结果:
程序执行结果:
3.3 @RequestBody 接收JSON对象
@RestController //进行页面跳转而是直接返回数据,等同于@Controller + @ResponseBody
public class UserController {
@RequestMapping("/reg2")
public Object reg2(@RequestBody Userinfo userinfo){
//@RequestBody可以帮助我们从 HTTP 请求体中获取请求参数,并将其转换为指定的 Java 对象
System.out.println(userinfo);
return userinfo;
}
}
postman执行结果:
程序执行结果:
3.4 @PathVariable 获取URL中参数
@RestController //进行页面跳转而是直接返回数据,等同于@Controller + @ResponseBody
public class UserController {
@RequestMapping("/reg3/{name}/{password}")
public Object reg3(@PathVariable String name,@PathVariable String password){
return "name="+name+" | "+"password="+password;
}
}
注意事项:
postman执行结果:
注意事项:
1.使用 @RequestParam 来重命名前后端的参数值。@RequestParam传的是URL问号(?)之后的参数,@PathVariable传的是URL问号(?)之前的参数
2. @PathVariable(required=false)代表非必传参数
3.5 @RequestPart 上传文件
上传⼀个图片到本机的某个目录
@RestController //进行页面跳转而是直接返回数据,等同于@Controller + @ResponseBody
public class UserController {
@RequestMapping("/myUpload")
public Object upload(@RequestPart("myimg")MultipartFile file){
// 获取新文件名=随机名称+文件后缀名
String filename= UUID.randomUUID()+file.getOriginalFilename().
substring(file.getOriginalFilename().lastIndexOf("."));
// 新文件保存路径
File savefile=new File("D:\\code\\"+filename);
try {
file.transferTo(savefile);
return true;
}catch (IOException e){
e.printStackTrace();
}
return false;
}
}
postman模拟选择上传要移动的照片
执行结果:
3.6 获取Cookie/Session/header
3.6.1 @CookieValue 获取Cookie
@RequestMapping("/getck")
public Object getCk(@CookieValue(value = "java",required = false)String java){
return java;
}
3.6.2 @RequestHeader获取header
@RequestMapping("/gethd")
public Object gethd(@RequestHeader("User-Agent")String ua){
return "header -> "+ua;
}
3.6.3 @SessionAttribute获取Session
@RequestMapping("/getsess")
public Object getsess(@SessionAttribute(value = "username",required = false)
String username){
return "session -> "+username;
}
4.返回数据
4.1 返回静态页面
4.1.1 创建前端静态页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>index</title>
</head>
<body>
<h1>hello index</h1>
</body>
</html>
4.1.2 创建控制器controller
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping("/p")
public Object index(){
return "/index.html";
}
}
执行结果:
4.2 返回 text/html
@Controller
@RequestMapping("/test")
public class TestController {
@ResponseBody //不加这个注解会报错
@RequestMapping("/p1")
public Object index1(){
return "<h3>hello html</h3>";
}
}
执行结果:
注意事项:通过上⾯的学习我们知道,默认请求下无论是 Spring MVC 或者是 Spring Boot 返回的是视图 (xxx.html),而现在都是前后端分离的,后端只需要返给给前端数据即可,这个时候我们就需要使用 @ResponseBody 注解了。
4.3 返回JSON对象
@Controller
@RequestMapping("/test")
public class TestController {
@ResponseBody //不加这个注解会报错
@RequestMapping("/p1")
public HashMap<String,String> hashMap(){
HashMap<String,String>hashMap=new HashMap<>();
hashMap.put("java","111");
hashMap.put("java2","222");
hashMap.put("java3","333");
return hashMap;
}
}
执行结果:
4.4 请求转发和请求重定向
return 不但可以返回⼀个视图,还可以实现跳转,跳转的方式有两种:
- forward 是请求转发;
- redirect:请求重定向。
4.4.1 forward 是请求转发
@RequestMapping("/fw")
public Object fw(){
return "forward:/index.html";
}
执行结果:
4.4.2 redirect:请求重定向
@RequestMapping("/rd")
public Object rd(){
return "redirect:/index.html";
}
执行结果:
4.4.3 请求转发和请求重定向的区别
- 请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。
- 请求重定向地址发生变化,请求转发地址不发生变化。
- 请求重定向与直接访问新地址效果⼀直,不存在原来的外部资源不能访问;请求转发服务器端转发 有可能造成原外部资源不能访问。
本文内容到此结束了,
如有收获欢迎点赞收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误疑问💬欢迎各位指出。
主页:爱放阳的小女孩的博客_CSDN博客-软件测试,spring领域博主求同存异,与光同尘🏃🏃