Spring MVC

目录

[1.学习 Spring MVC](#1.学习 Spring MVC)

[1.1 学习疑问](#1.1 学习疑问)

[1.2 创建 MVC 项目](#1.2 创建 MVC 项目)

2.实现客户端和程序之间的"连接"

[2.1 @RequestMapping](#2.1 @RequestMapping)

[2.2 @GetMapping 和 @PostMapping](#2.2 @GetMapping 和 @PostMapping)

3.获取参数

[3.1 获取单个参数](#3.1 获取单个参数)

[3.2 获取多个参数](#3.2 获取多个参数)

[3.3 传递对象](#3.3 传递对象)

[3.4 单表传递参数](#3.4 单表传递参数)

[3.5 后端参数重命名](#3.5 后端参数重命名)

​编辑

[3.5.1 必传参数 @RequestParam](#3.5.1 必传参数 @RequestParam)

[3.5.2 非不传参数](#3.5.2 非不传参数)

[3.6 @RequestBody 获取 JSON 对象](#3.6 @RequestBody 获取 JSON 对象)

[3.7 获取 URL 中参数 @PathVariable](#3.7 获取 URL 中参数 @PathVariable)

[3.8 上传文件 @RequestPart](#3.8 上传文件 @RequestPart)

[3.9 获取 Cookie/Session/header](#3.9 获取 Cookie/Session/header)

[3.9.1 @CookieValue 获取 Cookie](#3.9.1 @CookieValue 获取 Cookie)

[3.9.2 @SessionAttribute 获取 Session](#3.9.2 @SessionAttribute 获取 Session)

[3.9.3 @RequestHeader 获取 Header](#3.9.3 @RequestHeader 获取 Header)

[4. 返回数据](#4. 返回数据)

[4.1 返回静态页面](#4.1 返回静态页面)

[4.2 @ResponseBody 返回 text/html](#4.2 @ResponseBody 返回 text/html)

[4.3 请求转发或请求重定向(面试高频)](#4.3 请求转发或请求重定向(面试高频))


Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称"Spring Web MVC"来⾃其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC"。

1️⃣Spring MVC 是⼀个 Web 框架

2️⃣Spring MVC 是基于 Servlet API 构建的

MVC:MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分

  • Model(模型):是应用程序中用户处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据
  • View(视图):是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的
  • Controller(控制器):是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据

MVC 和 Spring MVC 关系:

  • MVC 是⼀种思想,而 Spring MVC 是对 MVC 思想的具体实现。
  • Spring MVC 是⼀个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。既然是 Web 框架,那么当⽤户在浏览器中输⼊了 url 之后,我们的 Spring MVC 项⽬就可以感知到⽤户的请求

1.学习 Spring MVC

现在绝大部分的 Java 项目都是基于 Spring(或 Spring Boot)的,而 Spring 的核心就是 Spring MVC

接下来我们要掌握 Spring MVC 的三大功能:

1️⃣连接:将用户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调用到我们的 Spring 程序

2️⃣获取参数:用户访问的时候会带⼀些参数,在程序中要想办法获取到参数

3️⃣输出数据:执行了业务逻辑之后,要把程序执⾏的结果返回给⽤户


1.1 学习疑问

1.怎样实现客户端和程序之间的连接?在 Spring MVC 中使用 @RequestMapping 来实现 URL 路由映射,也就是浏览器连接程序的作用;接下来要实现的功能是访问地址:http://localhost:8080/user/hi,能打印"hello,spring mvc"信息。

2.@RequestMapping 支持所有的请求类型嘛?

3.除了 @ResquestMapping 之外,有没有其他方式实现客户端和程序之间的连接?

1.2 创建 MVC 项目

然后选择 Maven 即可运行项目

2.实现客户端和程序之间的"连接"

2.1 @RequestMapping

@RequestMapping 既可以修饰类又可以修饰方法(注意斜杠不能省

java 复制代码
package com.example.demo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test") //注意斜杠不能省
public class TestController {

    //客户端到服务器连接
    @RequestMapping("/sayhi")
    public String sayHi() {
        return "你好 Spring MVC";
    }
}

启动项目:访问 http://localhost:8080/test/sayhi 最终效果如下:


提问:@RequestMapping 是 post 还是 get 请求

我们可以通过 postman 可以测试

默认情况下使用注解 @RequestMapping 是可以接收 GET 和 POST 请求

其实我们可以指定 @RequestMapping 来接收 GET 或者 POST之一:

1️⃣GET 请求(method = RequestMethod.GET):

java 复制代码
@RestController
@RequestMapping("/test") //注意斜杠不能省
public class TestController {

    //客户端到服务器连接
    @RequestMapping(value = "/sayhi", method = RequestMethod.GET)
    public String sayHi() {
        return "你好 Spring MVC";
    }
}

只接收 GET 请求

2️⃣POST 请求(method = RequestMethod.POST):

java 复制代码
@RestController
@RequestMapping("/test") //注意斜杠不能省
public class TestController {

    //客户端到服务器连接
    @RequestMapping(value = "/sayhi", method = RequestMethod.POST)
    public String sayHi() {
        return "你好 Spring MVC";
    }
}

只接收 POST 请求

2.2 @GetMapping 和 @PostMapping

  • @GetMapping:实现 HTTP 连接,但只支持 GET 类型的请求
  • @PostMapping:实现 HTTP 连接,但只支持 POST 类型的请求
java 复制代码
@RestController
@RequestMapping("/test") //注意斜杠不能省
public class TestController {

    @GetMapping("/sayhi2")
    public String sayhi2() {
        return "你好 Spring MVC2";
    }

    @PostMapping("/sayhi3")
    public String sayhi3() {
        return "你好 Soring MVC3";
    }
}

3.获取参数

3.1 获取单个参数

java 复制代码
@RestController
@RequestMapping("/test2")
public class TestController2 {
    @RequestMapping("/getname2")
    public String getName(String name) {
        return "Name: " + name;
    }

}

3.2 获取多个参数

java 复制代码
@RestController
@RequestMapping("/test2")
public class TestController2 {

    @RequestMapping("/getname3")
    public String getName(String name, Integer age) {
        return "Name: " + name + " age: " + age;
    }

}

上述多参传递对于参数不变的情况,使用多参传递是 ok 的;如果这些属性能被一个对象所包含,那么建议改成对象

使用多参传递,假如我再怎加一个密码,需要去改方法等等(需求改变,方法也改变),就不适用了

3.3 传递对象

创建对象(User 类):

java 复制代码
//创建对象
@Data
public class User {
    private int id;
    private String name;
    private int age;
    private String password;
}

传递对象(UserController 类):

java 复制代码
package com.example.demo.controller;
import com.example.demo.model.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

//传递对象
@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/add")
    public User add(User user) {
        return user;
    }
}

3.4 单表传递参数

java 复制代码
//传递对象
@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/add")
    public User add(User user) {
        return user;
    }
}

打开 postman 测试:

3.5 后端参数重命名

使用 @RequestParam 来重命名前后端的参数值。

java 复制代码
//传递对象
@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/add")
    public User add(User user) {
        return user;
    }

    @RequestMapping("/name")
    public String name(@RequestParam("n") String name) {

        return name;
    }
}

3.5.1 必传参数 @RequestParam

打开 @RequestParam 源码我们可以看到:有一个 required 表示 必须的意思,默认值为 true,因此不传递参数就会报 400 的错误

3.5.2 非不传参数

我们可以通过设置 @RequestParam 中的required=false来避免不传递时报错

java 复制代码
@RequestMapping("/name")
public String name(@RequestParam(value = "n", required = false) String name) {
    return name;
}

3.6 @RequestBody 获取 JSON 对象

java 复制代码
//传递对象
@RestController
@RequestMapping("/user")
public class UserController {
    /**
     * 获取前端的 JSON 对象
     * @param user
     * @return
     */
    @RequestMapping("/add_json")
    public User addByJson(@RequestBody User user) {
        return user;
    }
}

打开 postman 测试:

3.7 获取 URL 中参数 @PathVariable

@PathVariable("获取变量名称") ------本身的名字和传参名字相同可以省略

java 复制代码
//传递对象
@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/detail/{aid}")//传参必须加{动态参数变量}
    public Integer detail(@PathVariable("aid") Integer aid) {  //@PathVariable("获取变量名称")
        return aid;
    }

    @RequestMapping("/detail2/{aid}/{name}")//传参必须加{动态参数变量}
    //@PathVariable("获取变量名称")------本身的名字和传参名字相同可以省略
    public String detail2(@PathVariable("aid") Integer aid, @PathVariable String name) {
        return "aid: " + aid + " name: " + name;
    }
}

3.8 上传文件 @RequestPart

上传文件使用 POST 方式;因为 GET 方式对于参数的长度是有限制的,文件流是很大的,所以要用 POST

java 复制代码
//传递对象
@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/upload")
    public String upload(@RequestPart("myfile")MultipartFile file) throws IOException {
        String path = "E:\\springboot_log\\img.png";
        //保存文件
        file.transferTo(new File(path));
        return path;
    }
}

每次上传生成一个新的文件进行保存:1️⃣生成一个唯一的 id (UUID) 2️⃣得到源文件后缀名

java 复制代码
//传递对象
@RestController
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/upload")
    public String upload(@RequestPart("myfile")MultipartFile file) throws IOException {
        //1.生成一个唯一的 id --------- UUID = 全球唯一 ID -》 MAC + 随机种子 + 加密算法
        String name = UUID.randomUUID().toString().replace("-", "");
        //2.得到源文件的后缀名
        name += (file.getOriginalFilename().
                substring(file.getOriginalFilename().lastIndexOf(".")));//相当于 cat.png截取.后面的
        String path = "E:\\springboot_log\\" + name;
        //保存文件
        file.transferTo(new File(path));
        return path;
    }
}

3.9 获取 Cookie/Session/header

java 复制代码
//传递对象
@RestController
@RequestMapping("/user")
public class UserController {
    /**
     * 获取 Cookie
     * @param ck
     * @return
     */
    @RequestMapping("/getcookie")
    public String getCookie(@CookieValue(value = "java", required = false) String ck) {
        return ck;
    }
}

模拟 Cookie:

3.9.2 @SessionAttribute 获取 Session

java 复制代码
    /**
     * 获取 Session
     * @param name
     * @return
     */
    @RequestMapping("/getsession")
    public String getSession(@SessionAttribute(value = "session_key", required = false) String name){
        return name;
    }

3.9.3 @RequestHeader 获取 Header

java 复制代码
    /**
     * 获取 Header
     * @param name
     * @return
     */
    @RequestMapping("/header")
    public String getHeader(@RequestHeader(value = "header_key", required = false) String name) {
        return name;
    }

4. 返回数据

4.1 返回静态页面

java 复制代码
@Controller
public class TestController3 {

    @RequestMapping("/index")
    public String index() {
        return "hello.html";
    }

}

创建前端页面 index.htm

XML 复制代码
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <h1>hello, I'm hello page</h1>
</body>
</html>

4.2 @ResponseBody 返回 text/html

java 复制代码
@Controller
@ResponseBody
public class TestController3 {

    @RequestMapping("/index")
    public String index() {
        return "hello.html";
    }

}

4.3 请求转发或请求重定向(面试高频)

1️⃣forward:请求转发 2️⃣redirect:请求重定向

不仅可以返回视图,还可以实现跳转

"转发" 和 "重定向"理解**:转发是服务器帮忙转发的。重定向是浏览器重新请求另外一个地址**

区别:

  • 请求重定向将请求重新定位到资源;请求转发是服务器转发
  • 请求重定向地址发生变化,请求转发地址不发生变化
  • 请求重定向与直接访问新地址一样,不存在原来资源不能访问;请求转发是服务器转发有可能造成外部资源不能访问
相关推荐
打码人的日常分享3 分钟前
企业人力资源管理,人事档案管理,绩效考核,五险一金,招聘培训,薪酬管理一体化管理系统(源码)
java·数据库·python·需求分析·规格说明书
27669582924 分钟前
京东e卡滑块 分析
java·javascript·python·node.js·go·滑块·京东
爱写代码的刚子5 分钟前
C++知识总结
java·开发语言·c++
冷琴199613 分钟前
基于java+springboot的酒店预定网站、酒店客房管理系统
java·开发语言·spring boot
daiyang123...39 分钟前
IT 行业的就业情况
java
Nightselfhurt1 小时前
Spring cloud 中gateway原理
spring·spring cloud·gateway
爬山算法1 小时前
Maven(6)如何使用Maven进行项目构建?
java·maven
.生产的驴1 小时前
Electron Vue框架环境搭建 Vue3环境搭建
java·前端·vue.js·spring boot·后端·electron·ecmascript
爱学的小涛1 小时前
【NIO基础】基于 NIO 中的组件实现对文件的操作(文件编程),FileChannel 详解
java·开发语言·笔记·后端·nio
吹老师个人app编程教学1 小时前
详解Java中的BIO、NIO、AIO
java·开发语言·nio