十四:java web(6)-- Spring Spring MVC

目录

[Spring MVC](#Spring MVC)

[1.1 Spring MVC 概述](#1.1 Spring MVC 概述)

[1.1.1 什么是 MVC 模式](#1.1.1 什么是 MVC 模式)

[1.1.2 Spring MVC 工作原理](#1.1.2 Spring MVC 工作原理)

[1.2 Spring MVC 核心组件](#1.2 Spring MVC 核心组件)

[1.2.1 DispatcherServlet](#1.2.1 DispatcherServlet)

[1.2.2 控制器(Controller)](#1.2.2 控制器(Controller))

[1.2.3 请求映射(@RequestMapping)](#1.2.3 请求映射(@RequestMapping))

[1.2.4 视图解析器(View Resolver)](#1.2.4 视图解析器(View Resolver))

[在 Spring MVC 中,视图层的处理已经不再是重点,因为现在大多数项目采用了前后端分离的架构。即使使用 JSP,也往往通过 Ajax 请求进行数据交互,视图层的渲染和控制并不需要过多关注,重点是如何通过注解(如 @Controller, @RequestMapping, @ResponseBody 等)来处理请求和响应。例如,使用 Ajax 请求时,前端发送一个 JSON 数据,后端通过 @ResponseBody 注解将数据返回给前端,而视图部分则通过 JavaScript 动态更新,不再依赖传统的 JSP 渲染。](#在 Spring MVC 中,视图层的处理已经不再是重点,因为现在大多数项目采用了前后端分离的架构。即使使用 JSP,也往往通过 Ajax 请求进行数据交互,视图层的渲染和控制并不需要过多关注,重点是如何通过注解(如 @Controller, @RequestMapping, @ResponseBody 等)来处理请求和响应。例如,使用 Ajax 请求时,前端发送一个 JSON 数据,后端通过 @ResponseBody 注解将数据返回给前端,而视图部分则通过 JavaScript 动态更新,不再依赖传统的 JSP 渲染。)

[1.3 RESTful API 开发](#1.3 RESTful API 开发)

[1.3.1 构建 RESTful 控制器](#1.3.1 构建 RESTful 控制器)

[1.3.2 返回 JSON 数据(@RestController)](#1.3.2 返回 JSON 数据(@RestController))

[1.3.3 RESTful API 的常见返回格式](#1.3.3 RESTful API 的常见返回格式)

[1.4 常用注解:](#1.4 常用注解:)


Spring MVC

1.1 Spring MVC 概述

  • Spring MVC(Model-View-Controller)是 Spring 框架的一部分,提供了基于请求的 Web 应用程序开发框架。它通过分层架构帮助开发者将应用程序的关注点分离,使得应用更易于管理、扩展和测试。
    *

    1.1.1 什么是 MVC 模式

    • MVC 模式是一种软件架构设计模式,它将应用程序的业务逻辑、用户界面和输入控制分离开来。MVC 模式的主要目的是为了提高代码的可维护性、可扩展性和可测试性。具体来说,MVC 模式由以下三个部分组成:

      • Model(模型):表示应用程序的数据和业务逻辑。模型层通常负责数据的持久化操作(例如与数据库的交互)和业务逻辑的处理。

      • View(视图):负责展示模型数据,并且通常会响应用户输入。视图层主要包括界面显示部分,如 HTML 页面、JSP 页面、Thymeleaf 模板等。

      • Controller(控制器):处理用户请求,调用业务逻辑并返回相应的视图。控制器作为调度器,协调模型和视图之间的交互。用户输入通过控制器转发到相应的服务层或模型层,并选择合适的视图呈现给用户。

    • MVC 的优势:

      • 分离关注点,简化了代码的维护。

      • 增强了代码的重用性,视图可以改变而不影响模型和控制器。

      • 业务逻辑与界面解耦,提高了应用程序的灵活性。

    1.1.2 Spring MVC 工作原理

    • 请求到达 DispatcherServlet:客户端的请求首先会被 DispatcherServlet 接收。DispatcherServlet 是一个前端控制器,它负责将请求转发到对应的处理逻辑。

    • 请求映射(HandlerMapping):DispatcherServlet 根据请求的 URL 调用 HandlerMapping 获取请求与相应的处理器(Controller)之间的映射关系。这个映射信息通常是由注解或 XML 配置来指定的。

    • 调用 Controller 方法:一旦找到匹配的控制器(Controller)及其方法,DispatcherServlet 会调用该控制器的方法来处理请求。Controller 通常会调用服务层(Service)来执行业务逻辑,可能会返回一个模型数据。

    • 返回模型数据:控制器方法返回的数据(通常是一个模型对象或一个视图名称)被传递给 ViewResolver(视图解析器)进行处理。

    • 视图渲染:ViewResolver 会根据返回的视图名称找到对应的视图(如 JSP、HTML、Thymeleaf 等),并将模型数据渲染到视图中,生成最终的 HTML 内容。

    • 响应返回给客户端:最后,渲染后的视图会返回给客户端,完成一次完整的请求-响应周期。

1.2 Spring MVC 核心组件

#### 1.2.1 DispatcherServlet

* `DispatcherServlet` 是 Spring MVC 的前端控制器(Front Controller),它是整个 Web 应用的核心组件之一。所有的请求都首先通过 `DispatcherServlet`,然后由它来分发和处理请求。具体来说,`DispatcherServlet` 主要负责以下几个方面:

  * **请求接收** :当用户发起一个 HTTP 请求时,该请求会首先到达 `DispatcherServlet`。

  * **请求转发** :`DispatcherServlet` 根据请求的 URL,使用 `HandlerMapping` 查找并调用合适的 `Controller` 来处理请求。

  * `DispatcherServlet` 是由 Web 容器(如 Tomcat)启动的,它在应用的 `web.xml` 或 Spring Boot 的配置文件中配置。

  * **返回视图** :处理完请求后,`DispatcherServlet` 会使用 `ViewResolver` 解析视图并将结果返回给用户。
#### 1.2.2 控制器(Controller)

* 控制器是 Spring MVC 中负责处理用户请求的组件。它的主要功能是接收来自 `DispatcherServlet` 转发的请求,执行具体的业务逻辑,并返回数据或视图。

  在 Spring MVC 中,控制器通常是用 `@Controller` 或 `@RestController` 注解标记的类,`@RequestMapping` 注解用于将 HTTP 请求映射到具体的控制器方法。
* `@Controller` 注解的类是一个普通的控制器,返回视图模型。

* `@RestController` 是一个特殊的控制器,它默认将返回的对象转换为 JSON 或 XML 格式,通常用于构建 RESTful 风格的 Web 服务。

*

      @Controller
      public class UserController {

          @RequestMapping("/user")
          public String getUser(Model model) {
              User user = userService.getUser();
              model.addAttribute("user", user);
              return "userView";  // 返回视图的名称
          }
      }
#### 1.2.3 请求映射(@RequestMapping)

* `@RequestMapping` 是用于映射 HTTP 请求到控制器方法的注解。通过这个注解,开发者可以将不同的 URL 映射到不同的控制器方法上,并且可以指定请求类型(如 GET、POST 等)以及其他参数(如请求头、请求参数等)。

  `@RequestMapping` 可以用于类级别和方法级别。类级别的 `@RequestMapping` 用于指定该类中的所有请求路径的公共部分,方法级别的 `@RequestMapping` 用于指定具体的 URL 路径和请求方式。

  **`@RequestMapping` 示例**:
*

      @Controller
      @RequestMapping("/user")  // 类级别的请求映射
      public class UserController {

          @RequestMapping("/info")  // 方法级别的请求映射
          public String getUserInfo() {
              return "userInfo";  // 返回视图
          }

          @RequestMapping("/details")  // 方法级别的请求映射
          public String getUserDetails() {
              return "userDetails";  // 返回视图
          }
      }

  **常见的 `@RequestMapping` 变体**:
  * `@GetMapping`:用于处理 HTTP GET 请求。

  * `@PostMapping`:用于处理 HTTP POST 请求。

  * `@PutMapping`:用于处理 HTTP PUT 请求。

  * `@DeleteMapping`:用于处理 HTTP DELETE 请求。

  *

        @RestController
        @RequestMapping("/api/users")
        public class UserRestController {

            @GetMapping("/{id}")
            public User getUserById(@PathVariable Long id) {
                return userService.getUserById(id);  // 返回 JSON 格式的用户信息
            }
        }
#### 1.2.4 视图解析器(View Resolver)

* 视图解析器(`ViewResolver`)是 Spring MVC 中的一个重要组件,它负责将控制器返回的视图名称解析为实际的视图对象(如 JSP 页面、HTML 页面、PDF 文件等),并将模型数据填充到视图中,最终渲染并返回给客户端。

  Spring MVC 提供了多种类型的视图解析器,最常见的是 **InternalResourceViewResolver**,它用于解析 JSP 视图。视图解析器的配置可以指定前缀和后缀,帮助确定视图文件的位置。

  **`ViewResolver` 配置示例**:
*

      <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
          <property name="prefix" value="/WEB-INF/views/" />
          <property name="suffix" value=".jsp" />
      </bean>

在 Spring MVC 中,视图层的处理已经不再是重点,因为现在大多数项目采用了前后端分离的架构。即使使用 JSP,也往往通过 Ajax 请求进行数据交互,视图层的渲染和控制并不需要过多关注,重点是如何通过注解(如 @Controller, @RequestMapping, @ResponseBody 等)来处理请求和响应。例如,使用 Ajax 请求时,前端发送一个 JSON 数据,后端通过 @ResponseBody 注解将数据返回给前端,而视图部分则通过 JavaScript 动态更新,不再依赖传统的 JSP 渲染。

1.3 RESTful API 开发

  • RESTful API 是一种基于 REST (Representational State Transfer) 架构风格的 API 设计风格,它通过 HTTP 协议的标准方法(GET、POST、PUT、DELETE)进行操作。Spring MVC 提供了强大的支持来开发 RESTful API,通常通过 @RestController 注解来简化 API 开发。
#### 1.3.1 构建 RESTful 控制器

* RESTful 控制器的设计遵循 HTTP 协议的约定,使用标准的 HTTP 方法来处理不同的操作。

  常见的 RESTful API 操作:
  * **GET**:获取资源(数据)。

  * **POST**:创建资源。

  * **PUT**:更新资源。

  * **DELETE**:删除资源。

*

  ```java
  @RestController
  @RequestMapping("/api/users")
  public class UserRestController {

      @GetMapping("/{id}")
      public ResponseEntity<User> getUserById(@PathVariable Long id) {
          User user = userService.getUserById(id);
          if (user != null) {
              return ResponseEntity.ok(user);
          } else {
              return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
          }
      }

      @PostMapping
      public ResponseEntity<User> createUser(@RequestBody @Valid User user) {
          User savedUser = userService.save(user);
          return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);
      }

      @PutMapping("/{id}")
      public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) {
          User existingUser = userService.getUserById(id);
          if (existingUser != null) {
              user.setId(id);
              User updatedUser = userService.save(user);
              return ResponseEntity.ok(updatedUser);
          } else {
              return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
          }
      }

      @DeleteMapping("/{id}")
      public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
          if (userService.exists(id)) {
              userService.delete(id);
              return ResponseEntity.noContent().build();
          } else {
              return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
          }
      }
  }
  ```

* **`@RestController`**:该注解标记的类用于处理 RESTful 请求,默认返回 JSON 格式的数据。

* **`@GetMapping`** 、**`@PostMapping`** 、**`@PutMapping`** 、**`@DeleteMapping`**:分别用于处理 GET、POST、PUT 和 DELETE 请求。

* **`@PathVariable`**:用于从 URL 中提取路径变量。

* **`@RequestBody`**:用于从请求体中提取数据并绑定到 Java 对象。
#### 1.3.2 返回 JSON 数据(@RestController)

* `@RestController` 是 `@Controller` 和 `@ResponseBody` 的组合注解,用于将方法返回的对象自动转化为 JSON 格式并返回。

*

  ```java
  @RestController
  @RequestMapping("/api/products")
  public class ProductRestController {

      @GetMapping("/{id}")
      public Product getProduct(@PathVariable Long id) {
          // 假设通过 id 获取产品信息
          return productService.getProductById(id);
      }

      @PostMapping
      public Product createProduct(@RequestBody Product product) {
          return productService.saveProduct(product);
      }
  }
  ```

  * `@GetMapping("/{id}")`:通过 GET 请求获取资源。

  * `@PostMapping`:通过 POST 请求创建新资源。

  * `@RequestBody`:将请求体中的 JSON 数据自动绑定到 `Product` 对象。

  * 返回的 `Product` 对象会被自动转化为 JSON 格式并返回给客户端。
#### 1.3.3 RESTful API 的常见返回格式

*

  ```java
  {
      "id": 1,
      "name": "Product A",
      "price": 100.0
  }
  ```

  通常 RESTful API 会返回一个标准化的响应格式,以便客户端处理。例如,可以包装响应数据和状态码:
*

  ```java
  public class ApiResponse<T> {
      private String status;
      private T data;
      private String message;

      // Getter 和 Setter
  }
  ```

1.4 常用注解:

  • 常用控制器注解
    • **@Controller:**用于标记一个类为 Spring MVC 的控制器类,表示该类将处理 Web 请求。
    • @RestController:@Controller@ResponseBody 的组合注解,表示该类的所有方法都会返回 JSON 或其他格式的数据,而不是视图。
    • @RequestMapping: 用于定义请求的映射,支持多种 HTTP 方法(GET、POST、PUT、DELETE 等)。可以用于类或方法级别,类级别的 @RequestMapping 会作为方法级别的基础路径。
    • @GetMapping: 用于处理 HTTP GET 请求。是 @RequestMapping 的快捷方式,专门用于 GET 请求。
    • @PostMapping: 用于处理 HTTP POST 请求。是 @RequestMapping 的快捷方式,专门用于 POST 请求。
    • @PutMapping: 用于处理 HTTP PUT 请求。是 @RequestMapping 的快捷方式,专门用于 PUT 请求。
    • @DeleteMapping: 用于处理 HTTP DELETE 请求。是 @RequestMapping 的快捷方式,专门用于 DELETE 请求。
    • @PatchMapping: 用于处理 HTTP PATCH 请求。是 @RequestMapping 的快捷方式,专门用于 PATCH 请求。
  • 请求参数相关注解
    • **@RequestParam:**用于从请求的查询参数、表单参数或 URL 中提取参数。
    • **@PathVariable:**用于从 URL 路径中提取变量,常用于 RESTful 风格的 API 中。
    • **@RequestBody:**用于将 HTTP 请求的内容(通常是 JSON 数据)绑定到方法的参数上。常用于 POST、PUT 和 PATCH 请求中。
    • **@RequestHeader:**用于获取 HTTP 请求头中的参数。
    • **@CookieValue:**用于获取请求中的 Cookie 值。
  • 响应相关注解
    • **@ResponseBody:**用于将控制器方法的返回值直接写入 HTTP 响应体,通常用于返回 JSON、XML 或其他格式的数据。
    • **@ResponseStatus:**用于指定方法执行完成后返回的 HTTP 状态码,可以直接将状态码应用于方法。
    • **@ExceptionHandler:**用于在控制器中处理异常。当方法抛出异常时,Spring MVC 会调用带有该注解的方法来处理异常。
相关推荐
威哥爱编程6 分钟前
Java灵魂拷问13个为什么,你都会哪些?
java·面试·javaee
噜啦啦噜啦啦噜啦噜啦嘞噜啦噜啦8 分钟前
源码解析-Spring Eureka
java·spring·eureka
A_cot12 分钟前
Vue.js:构建现代 Web 应用的强大框架
前端·javascript·vue.js·flutter·html·web·js
q5673152316 分钟前
通过scrapy和Django登录、爬取和持久化数据
java·开发语言·数据库·scrapy·django
我爱鸿蒙开发17 分钟前
ArkTS的进阶语法(函数补充与正则表达式)
前端·harmonyos
ModelBulider21 分钟前
九、HttpMessageConverter
java·开发语言·后端·spring·springmvc
晨曦_子画22 分钟前
使用 Regex 在 Java 中使用 Logstash LogBack 屏蔽日志
java
AI浩29 分钟前
Labelme标注数据的一些操作
前端·javascript·python
就叫飞六吧29 分钟前
电商系统表的1-n如何设计?情景分析
java·后端·spring