【Spring】Spring MVC

简介: 1. 什么是 Spring MVC1.1 MVC 定义1.2 MVC 和 Spring MVC 的关系2. Spring MVC 创建和连接2.1 创建 Spring MVC 项目2.2 @RequestMapping 注解2.2.1 修饰方法2.2.2 修饰类2.3 @GetMapping 和 @PostMapping2.3.1 get 请求三种写法2.3.2 post 请求的两种写法2.3 获取参数2.3.1 获取单个参数2.3.2 传递多个参数2.3.3 传递对象的几种方法2.4 获取 URL 中的参数2.5 上传文件并保存到磁盘3. 请求转发和请求重定

1. 什么是 Spring MVC

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


1.1 MVC 定义

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


11.png


Model(模型) 是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。

View(视图) 是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。

Controller(控制器) 是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制 用户输入,并向模型发送数据。

1.2 MVC 和 Spring MVC 的关系

MVC 是一种思想,而 Spring MVC 是对 MVC 思想的具体实现。 总结来说,Spring MVC 是一个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。既然是 Web 框

架,那么当用户在浏览器中输入了 url 之后,我们的 Spring MVC 项目就可以感知到用户的请求。


2. Spring MVC 创建和连接

Spring MVC 项目创建和 Spring Boot 创建项目相同(Spring MVC 使用 Spring Boot 的方式创建),在 创建的时候选择 Spring Web 就相当于创建了 Spring MVC 的项目。


2.1 创建 Spring MVC 项目

Spring MVC 可以基于 Spring Boot 创建,也就是创建一个 Spring Boot 项目,勾选上 Spring Web 模块 即可,如下图所示:


12.png


接下来,创建一个 UserController 类,实现用户到 Spring 程序的互联互通,具体实现代码如下:

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.ResponseBody;
@Controller // 让 spring 框架启动时,加载 
@ResponseBody // 返回一个 text/html 信息 
@RequestMapping("/user") // 路由器规则注册 
public class UserController { 
    // 路由器规则注册 
    @RequestMapping("/hi") 
    public String sayHi(){ 
        return "<h1>Hi,Spring MVC.</h1>";
  }
}

这样实现之后,当访问地址:http://localhost:8080/user/hi 时就能打印“hello,spring mvc”的信息 了。


2.2 @RequestMapping 注解

@RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一,它是用来注册接口的路由映射的。


@RequestMapping 即可修饰类,也可以修饰方法,当同时修饰类和方法时,访问的地址是类 + 方法。


2.2.1 修饰方法

方法地址:http://localhost:8080/hi

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UserController { 
    @RequestMapping("/hi") 
    public String sayHi(){ 
        return "<h1>Hi,Spring MVC.</h1>";
  }
}

2.2.2 修饰类

当修饰类的时候,这个类下的所有方法访问地址前都必须加类的地址,当方法也被修饰时,则访问地址就是 类 + 方法

如图方法访问地址为:http://localhost:8080/p/hi


import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/p") 
public class UserController { 
    @RequestMapping("/hi") 
    public String sayHi(){ 
        return "<h1>Hi,Spring MVC.</h1>";
  }
}

2.3 @GetMapping 和 @PostMapping

2.3.1 get 请求三种写法

// 写法1 
@RequestMapping("/index")
// 写法2 
@RequestMapping(value = "/index",method = RequestMethod.GET)
// 写法3
@GetMapping("/index")

2.3.2 post 请求的两种写法

// 写法1 
@RequestMapping(value = "/index",method = RequestMethod.POST)
// 写法2
@PostMapping("/index")

2.3 获取参数

  • @RequestParam:设置必传参数,当请求体中的参数和方法中的参数相同时,可以省略
  • @RequestBody:接受 JSON 参数,用此注解修饰方法之后,此方法的返回值会被自动 JSON 序列化

2.3.1 获取单个参数


@RequestMapping(value = "/hello4")
@ResponseBody
public String hello4(@RequestParam(value = "target", defaultValue = "世界") String target) {
    return "你好" + target;
}

方法访问地址: http://127.0.0.1:8080/hello4?target=hello


13.png

2.3.2 传递多个参数

@RequestMapping(value = "/hello5")
@ResponseBody
public String hello5(String a, String b) {
    return a + b;
}
\

方法访问地址: http://127.0.0.1:8080/hello5?a=Hello&b=World

14.png

2.3.3 传递对象的几种方法

@GetMapping("/method1")
@ResponseBody
public Cat createCat() {
    return new Cat("喵喵", 5);
}

15.png

// 如果变量比较多,可以直接在对象内完成
// Spring 内部会构造好对象
@GetMapping("/method4")
@ResponseBody
public Cat createCat(Cat cat) {
    return cat;
}

方法访问地址: http://127.0.0.1:8080/method2?name=喵喵&age=1

16.png


@GetMapping("/method2")
@ResponseBody
public Cat createCa2(String name, String age) {
    int ageInt = Integer.parseInt(age);
    return new Cat(name, ageInt);
}

方法访问地址: http://127.0.0.1:8080/method2?name=喵喵&age=1

17.png

// 让 Spring 内部做数据转换,Spring -> int
@GetMapping("/method3")
@ResponseBody
public Cat createCa3(String name, int age) {
    return new Cat(name, age);
}

2.4 获取 URL 中的参数

使用@PathVariable注解修饰参数

@GetMapping("/{username}/article/details/{aid}")
@ResponseBody
public String getMessage(@PathVariable("username") String username, @PathVariable("aid") String aid) {
    log.info("得到的 username = {}, aid = {}", username, aid);
    return "成功";
}

2.5 上传文件并保存到磁盘

@RequestMapping("/param9") 
public String param9(String name, @RequestPart("myfile") MultipartFile file) throws IOException { 
    // 获取文件后缀名 
    String fileName =file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") );
// 文件保存地址 
    String filePath =ClassUtils.getDefaultClassLoader().getResource("static").getPath() + "/" + UUID.randomUUID() + fileName;
// 保存文件 
    file.transferTo(new File(filePath)); 
    return filePath + " 上传成功.";
}

3. 请求转发和请求重定向

  • forward 是请求转发;
  • redirect:请求重定向。


// 请求重定向 
@RequestMapping("/index") public String index(){ 
    return "redirect:/index.html";
}
// 请求转发 
@RequestMapping("/index2") public String index2(){ 
    return "forward:/index.html";
}

3.1 forward 和 redirect 具体区别

请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。

请求重定向地址发生变化,请求转发地址不发生变化。

请求重定向与直接访问新地址效果一直,不存在原来的外部资源不能访问;请求转发服务器端转发 有可能造成原外部资源不能访问。


目录
相关文章
|
7月前
|
前端开发 Java 测试技术
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
本文介绍了 `@RequestParam` 注解的使用方法及其与 `@PathVariable` 的区别。`@RequestParam` 用于从请求中获取参数值(如 GET 请求的 URL 参数或 POST 请求的表单数据),而 `@PathVariable` 用于从 URL 模板中提取参数。文章通过示例代码详细说明了 `@RequestParam` 的常用属性,如 `required` 和 `defaultValue`,并展示了如何用实体类封装大量表单参数以简化处理流程。最后,结合 Postman 测试工具验证了接口的功能。
382 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
|
7月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestBody
`@RequestBody` 是 Spring 框架中的注解,用于将 HTTP 请求体中的 JSON 数据自动映射为 Java 对象。例如,前端通过 POST 请求发送包含 `username` 和 `password` 的 JSON 数据,后端可通过带有 `@RequestBody` 注解的方法参数接收并处理。此注解适用于传递复杂对象的场景,简化了数据解析过程。与表单提交不同,它主要用于接收 JSON 格式的实体数据。
580 0
|
7月前
|
前端开发 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@PathVariable
`@PathVariable` 是 Spring Boot 中用于从 URL 中提取参数的注解,支持 RESTful 风格接口开发。例如,通过 `@GetMapping(&quot;/user/{id}&quot;)` 可以将 URL 中的 `{id}` 参数自动映射到方法参数中。若参数名不一致,可通过 `@PathVariable(&quot;自定义名&quot;)` 指定绑定关系。此外,还支持多参数占位符,如 `/user/{id}/{name}`,分别映射到方法中的多个参数。运行项目后,访问指定 URL 即可验证参数是否正确接收。
382 0
|
7月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestMapping
@RequestMapping 是 Spring MVC 中用于请求地址映射的注解,可作用于类或方法上。类级别定义控制器父路径,方法级别进一步指定处理逻辑。常用属性包括 value(请求地址)、method(请求类型,如 GET/POST 等,默认 GET)和 produces(返回内容类型)。例如:`@RequestMapping(value = &quot;/test&quot;, produces = &quot;application/json; charset=UTF-8&quot;)`。此外,针对不同请求方式还有简化注解,如 @GetMapping、@PostMapping 等。
330 0
|
7月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RestController
本文主要介绍 Spring Boot 中 MVC 开发常用的几个注解及其使用方式,包括 `@RestController`、`@RequestMapping`、`@PathVariable`、`@RequestParam` 和 `@RequestBody`。其中重点讲解了 `@RestController` 注解的构成与特点:它是 `@Controller` 和 `@ResponseBody` 的结合体,适用于返回 JSON 数据的场景。文章还指出,在需要模板渲染(如 Thymeleaf)而非前后端分离的情况下,应使用 `@Controller` 而非 `@RestController`
240 0
|
3月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
239 0
|
3月前
|
SQL Java 数据库连接
Spring、SpringMVC 与 MyBatis 核心知识点解析
我梳理的这些内容,涵盖了 Spring、SpringMVC 和 MyBatis 的核心知识点。 在 Spring 中,我了解到 IOC 是控制反转,把对象控制权交容器;DI 是依赖注入,有三种实现方式。Bean 有五种作用域,单例 bean 的线程安全问题及自动装配方式也清晰了。事务基于数据库和 AOP,有失效场景和七种传播行为。AOP 是面向切面编程,动态代理有 JDK 和 CGLIB 两种。 SpringMVC 的 11 步执行流程我烂熟于心,还有那些常用注解的用法。 MyBatis 里,#{} 和 ${} 的区别很关键,获取主键、处理字段与属性名不匹配的方法也掌握了。多表查询、动态
126 0
|
3月前
|
JSON 前端开发 Java
第05课:Spring Boot中的MVC支持
第05课:Spring Boot中的MVC支持
199 0
|
9月前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
423 29
|
10月前
|
设计模式 前端开发 Java
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
235 4