Spring MVC

Spring MVC

  • [1. 概念](#1. 概念)
  • [2. 使用](#2. 使用)
    • [2.1 @RequestMapping](#2.1 @RequestMapping)
    • [2.2 获取参数](#2.2 获取参数)
      • [2.2.1 传递单个参数](#2.2.1 传递单个参数)
      • 2.2.2传递多个参数
      • [2.2.3 传递对象](#2.2.3 传递对象)
      • [2.2.4 后端参数重命名(@RequestParam)](#2.2.4 后端参数重命名(@RequestParam))
      • [2.2.5 接收 JSON 对象(@RequestBody)](#2.2.5 接收 JSON 对象(@RequestBody))
      • [2.2.6 获取URL中参数(@PathVariable)](#2.2.6 获取URL中参数(@PathVariable))
      • [2.2.7 上传⽂件(@RequestPart)](#2.2.7 上传⽂件(@RequestPart))
      • [2.2.8 获取Cookie(@CookieValue)](#2.2.8 获取Cookie(@CookieValue))
      • [2.2.9 获取 Header (@RequestHeader)](#2.2.9 获取 Header (@RequestHeader))
      • [2.2.10 获取 Session(@SessionAttribute)](#2.2.10 获取 Session(@SessionAttribute))
    • [2.3 返回数据](#2.3 返回数据)
      • [2.3.1 返回静态页面](#2.3.1 返回静态页面)
      • [2.3.2 返回 JSON 对象](#2.3.2 返回 JSON 对象)
      • [2.3.3 请求转发或请求重定向](#2.3.3 请求转发或请求重定向)

1. 概念

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

MVC:

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

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

MVC 是⼀种思想,⽽ Spring MVC 是对 MVC 思想的具体实现

2. 使用

2.1 @RequestMapping

@RequestMapping 是 Spring Web 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的路由映射的.

路由映射:所谓的路由映射指的是,当⽤户访问⼀个 url 时,将⽤户的请求对应到程序中某个类的某个⽅法的过程就叫路由映射.

@RequestMapping 既可修饰类,也可以修饰⽅法 ,当修饰类和⽅法时,访问的地址是类 + ⽅

法.

java 复制代码
@RequestMapping("/test2")
@RestController
public class TestController2 {
    @RequestMapping("demo1")
    public String demo1() {
        return "demo1";
    }
}

@RequestMapping 也可以指定请求方式, 例如:

java 复制代码
@RequestMapping("/test2")
@RestController
public class TestController2 {
    @RequestMapping(value = "demo1", method = RequestMethod.POST)
    public String demo1() {
        return "demo1";
    }
}

当浏览器请求方式与指定方式不一致时就会报错

也可以使用 @GetMapping 和 PostMapping 来指定请求方式和上述方式效果相同

2.2 获取参数

2.2.1 传递单个参数

在 Spring MVC 中可以直接⽤⽅法中的参数来实现传参,⽐如以下代码:

java 复制代码
    @RequestMapping("/demo2")
    public String demo2(String username) {
        return "用户名为: " + username;
    }

执行结果为:

注意: 请求的参数名称和代码中的参数名称必须一致

2.2.2传递多个参数

java 复制代码
    @RequestMapping("/demo4")
    public String demo4(String username, String password) {
        return "用户名: " + username + "密码: " + password;
    }

运行结果:

注意: 当有多个参数时,前后端进⾏参数匹配时,是以参数的名称进⾏匹配的,因此参数的位置不影响后端获取参数的结果

2.2.3 传递对象

Spring MVC 可以⾃动实现参数对象的赋值,⽐如 User 对象:

java 复制代码
@Data
public class User {
    private int id;
    private String username;
    private String password;
}
java 复制代码
@RequestMapping("/demo3")
    public String demo3(User user) {
        return user.toString();
    }

运行结果为:

2.2.4 后端参数重命名(@RequestParam)

某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不⼀致,⽐如前端传递了⼀个

name 给后端,⽽后端⼜是有 username 字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使⽤ @RequestParam 来重命名前后端的参数值

java 复制代码
    @RequestMapping("/demo5")
    public String demo5(@RequestParam("name") String username) {
        return "用户名: " + username;
    }

运行结果为:

@RequestParam 在为参数重命名的同时还会将参数设置为必须项, 当请求中没有这个参数时就会报错

如果重命名的参数是一个非必须参数, 就可以通过将 required 设为 false 将该参数设置为非必须

java 复制代码
    @RequestMapping("/demo5")
    public String demo5(@RequestParam(value = "name", required = false) String username) {
        return "用户名: " + username;
    }

这样即使没有传这个参数也不会报错

2.2.5 接收 JSON 对象(@RequestBody)

Spring 在接收普通对象时可以将参数中的属性填充为一个普通对象, 但是并不能接收 JSON 对象, 所以就需要通过 @RequestBody 来接收 JSON 对象

java 复制代码
    @RequestMapping("/demo6")
    public String demo6(@RequestBody User user) {
        return user.toString();
    }

2.2.6 获取URL中参数(@PathVariable)

java 复制代码
@RequestMapping("/demo7/{username}/{password}")
    public String demo7(@PathVariable String username, @PathVariable String password) {
        return "用户名: " + username + "密码: " + password;
    }

2.2.7 上传⽂件(@RequestPart)

java 复制代码
    @RequestMapping("/demo8")
    public String demo8(@RequestPart("myfile")MultipartFile file) throws IOException {
        String path = "E://";
        //设置名称
        path += UUID.randomUUID().toString();
        //获取后缀
        path += file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        file.transferTo(new File(path));
        return "上传成功";
    }

执行结果:

2.2.8 获取Cookie(@CookieValue)

java 复制代码
 @RequestMapping("/demo9")
    public String demo9(@CookieValue("username") String username) {
        return username;
    }

运行结果:

2.2.9 获取 Header (@RequestHeader)

java 复制代码
 @RequestMapping("/demo10")
    public String demo10(@RequestHeader("User-Agent") String userAgent) {
        return userAgent;
    }

运行结果:

2.2.10 获取 Session(@SessionAttribute)

java 复制代码
    @RequestMapping("/demo11")
    public String demo11(@SessionAttribute("username") String username) {
        return username;
    }

2.3 返回数据

2.3.1 返回静态页面

Spring MVC 默认返回的就是静态页面所以直接返回即可

java 复制代码
    @RequestMapping("/demo13")
    public Object demo13() {
        return "index.html";
    }

2.3.2 返回 JSON 对象

Spring 在返回时可以直接将 HashMap 或者 普通对象 转换为 JSON 对象

java 复制代码
 @RequestMapping("/demo14")
    public HashMap<String, String> method_8() {
        HashMap<String, String> map = new HashMap<>();
        map.put("张三", "123");
        map.put("李四", "456");
        map.put("王五", "789");
        return map;
    }

执行结果:

2.3.3 请求转发或请求重定向

return 不但可以返回⼀个视图,还可以实现跳转,跳转的⽅式有两种:

  • forward 是请求转发
  • redirect:请求重定向
java 复制代码
// 请求重定向
@RequestMapping("/index")
public String index(){
 return "redirect:/index.html";
}
// 请求转发
@RequestMapping("/index2")
public String index2(){
 return "forward:/index.html";
}

forward 和 redirect 区别:

  1. 请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。
  2. 请求重定向地址发⽣变化,请求转发地址不发⽣变化。
  3. 请求重定向与直接访问新地址效果一致,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问
相关推荐
Abladol-aj5 分钟前
并发和并行的基础知识
java·linux·windows
清水白石0085 分钟前
从一个“支付状态不一致“的bug,看大型分布式系统的“隐藏杀机“
java·数据库·bug
吾日三省吾码5 小时前
JVM 性能调优
java
弗拉唐6 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi777 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
少说多做3437 小时前
Android 不同情况下使用 runOnUiThread
android·java
知兀7 小时前
Java的方法、基本和引用数据类型
java·笔记·黑马程序员
蓝黑20208 小时前
IntelliJ IDEA常用快捷键
java·ide·intellij-idea
Ysjt | 深8 小时前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++