Spring MVC详细介绍

1.MVC 设计模式

MVC(Model-View-Controller)是一种常见的软件设计模式,用于将应用程序的逻辑分离成三个独立的组件:

  1. 模型(Model):模型是应用程序的数据和业务逻辑的表示。它负责处理数据的读取、存储和操作,以及业务规则的处理。模型通常是独立于用户界面的,可以在不同的视图和控制器之间共享和重用。比如java中的bean对象(User、Student)或者业务处理的bean(Servlet或者Dao对象,用来处理业务逻辑等。)
  2. 视图(View):视图是用户界面的呈现部分,负责展示数据给用户,并接收用户的输入。视图通常是根据模型的数据进行渲染和更新的,它可以是Web页面、图形界面或命令行界面等。
  3. 控制器(Controller):控制器是模型和视图之间的协调者,负责接收用户的输入并根据输入调用相应的模型逻辑。控制器将用户的请求转发给模型进行处理,并将处理结果传递给视图进行展示。控制器还可以处理视图的事件和状态变化。

MVC设计模式的作用如下:

  • 分离关注点:MVC将应用程序的不同关注点(数据、业务逻辑、用户界面)分离开来,使得各个组件可以独立开发、测试和维护,提高了代码的可读性和可维护性。
  • 提高可重用性:通过将数据和业务逻辑抽象成模型,可以在不同的视图和控制器之间共享和重用,减少了重复编写代码的工作量。
  • 改善可扩展性:MVC模式使得各个组件之间的耦合度降低,可以更方便地对应用程序进行扩展和修改,而不会影响其他组件的功能。
  • 改善用户体验:通过将用户界面和业务逻辑分离,MVC模式使得用户界面更加灵活和响应,可以根据不同的需求进行定制和优化。

总的来说,MVC设计模式通过将应用程序的逻辑分离成模型、视图和控制器,提供了一种结构化的开发方式,使得代码更加可读、可维护和可扩展,同时改善了用户体验和开发效率。

2.Spring MVC

2.1,Spring MVC 的介绍

Spring Web MVC是基于Servlet API构建的原始Web框架,也是Spring框架的一部分。它提供了灵活可扩展的MVC架构,方便开发者构建高性能的Web应用程序,并与 Spring 生态系统无缝集成。

2.2,Spring MVC与MVC的关系

Spring MVC与MVC之间的关系的要点总结:

  1. Spring MVC是一个Web框架,而MVC是一种架构模式。Spring MVC是基于MVC模式的实现之一。
  2. MVC是一种将应用程序的不同方面分离的设计模式,包括模型(Model)、视图(View)和控制器(Controller)。
  3. Spring MVC遵循MVC设计模式,将应用程序的不同方面分离开来,通过模型、视图和控制器的协作来处理Web请求。

综上所述,Spring MVC是Spring框架提供的基于MVC架构并继承了Servlet API的Web开发框架。它遵循MVC模式的原则,提供了一套完整的开发流程和特性。通过Spring框架的支持,它能够实现灵活性、可配置性和可扩展性,帮助开发者构建高性能的Web应用程序。

2.3,Spring MVC原理

核心组件

  • DispatcherServlet:前置控制器 ,负责调度其他组件的执行,可以降低不同组件之间的耦合性,是整个Spring MVC的核心模块
  • Handler :处理器 ,完成具体的业务逻辑,相当于Servlet(或者一个方法)
  • HandlerMapping :处理器映射器 ,DispatcherServlet是通过 HandlerMapping把请求映射到不同的Handler
  • HandlerInterceptor :处理器拦截器 ,是一个接口,如果我们需要进行一些拦截处理,可以通过实现该接口完成
  • HandlerExecutionChain :处理器执行链 ,包括两部分内容:Handler和HandlerInterceptor(系统会有一个默认的HandlerInterceptor,如果有额外拦截处理,可以添加拦截器进行设置)
  • HandlerAdapter :处理器适配器,Handler执行业务方法之前,需要进行一系列的操作包括表单的数据验证、数据类型转换、把表单数据封装到POJO等,这些一系列的操作都是由HandlerAdapter完成,DispatcherServlet通过HandlerAdapter执行不同的Handler
  • ModelAndView :封装了模型数据和视图信息,作为Handler的处理结果,返回给DispatcherServlet
  • ViewResolver :视图解析器,DispatcherServlet通过它把逻辑视图解析为物理视图,最终把渲染的结果响应给客户端

工作流程

  • (1)用户发送请求至前端控制器DispatcherServlet;
  • (2)DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handler;
  • (3)处理器映射器根据请求url找到具体的处理器Handler,生成处理器对象及处理器拦截器(如果有则生成),一并返回给DispatcherServlet;
  • (4)DispatcherServlet 调用 HandlerAdapter处理器适配器,请求执行Handler;
  • (5)HandlerAdapter 经过适配调用 具体处理器进行处理业务逻辑;
  • (6)Handler执行完成返回ModelAndView;
  • (7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
  • (8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
  • (9)ViewResolver解析后返回具体View;
  • (10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
  • (11)DispatcherServlet响应用户。

简单总结

首先当一个用户请求(url)进入后,DispatcherServlet(前置控制器)接受请求,然后将该请求调用HandlerMapping获取到请求对应的Handler(比如方法),获取到Handler后就交给HandlerAdapter进行执行(相当于执行那段方法),执行完毕后返回ModelAndView(当做执行完毕后返回的数据),然后将ModelAndView交给ViewResolver进行解析和处理,返回具体的View,最后DispatcherServlet拿到view进行渲染,将模型数据填充,然后响应用户请求。

上述的是以前的项目如JSP等项目就是这种流程,但现在新项目都是前后端分离的项目,那么就会有所变化。

可以看到流程省去了将Handler处理完毕后返回的ModelAndView,也就是将视图处理那部分省去了,处理完Handler(方法)后直接将数据进行转换成JSON并响应给客户端,再由前端进行控制。

2.4,Spring MVC优点

(1)可以支持各种视图技术,而不仅仅局限于JSP;

(2)与Spring框架集成(如IoC容器、AOP等);

(3)清晰的角色分配:前端控制器(dispatcherServlet) ,请求到处理器映射(handlerMapping),处理器适配器(HandlerAdapter),视图解析器(ViewResolver)。

(4) 支持各种请求资源的映射策略。

3.Spring MVC使用

3.1Spring MVC常用注解
@RequestMapping:

用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。

@RequestBody:

将HTTP请求的请求体(body)部分转换为Java对象,并绑定到方法参数上

@RestController
public class UserController {

    @PostMapping("/user")
    public ResponseEntity<String> addUser(@RequestBody User user) {
        // 处理接收到的User对象
        // 这里假设User类包含了用户的姓名、年龄等信息
        
        return ResponseEntity.ok("User added successfully");
    }
}

上面的示例中,@RequestBody注解被用于addUser方法的参数user上,表示该方法接收一个User对象作为请求体,并将请求体中的JSON数据转换为User对象。

@ResponseBody:

@ResponseBody注解用于将方法的返回值直接作为HTTP响应体返回给客户端,而不是通过视图解析器解析为视图。

@RestController
public class UserController {

    @GetMapping("/user/{id}")
    @ResponseBody
    public User getUserById(@PathVariable Long id) {
        // 根据用户ID查询用户信息
        User user = userService.getUserById(id);
        
        return user;
    }
}

在上面的示例中,@ResponseBody注解被用于getUserById方法上,表示该方法的返回值会直接作为HTTP响应体返回给客户端。当客户端发送一个GET请求到"/user/{id}"路径时,Spring框架会调用getUserById方法获取用户信息,并将返回的User对象转换为JSON格式的数据,然后作为HTTP响应返回给客户端。

@RestController:

控制器注解,控制器注解一般是@Controller,@RestController相当于@ResponseBody + @Controller表示是表现层,除此之外,一般不用别的注解代替。

相关推荐
THE WHY几秒前
IDEA Maven构建时报错:无效的目标发行版17
java·后端·jdk·maven·intellij-idea
白露与泡影13 分钟前
Spring Boot性能提升的核武器,速度提升500%!
java·spring boot·后端
昔我往昔16 分钟前
Spring Boot中的依赖注入是如何工作
java·spring boot·后端
等一场春雨36 分钟前
Spring Boot3 配合ProxySQL实现对 MySQL 主从同步的读写分离和负载均衡
spring boot·mysql·负载均衡
豪宇刘41 分钟前
Redis 安装与 Spring Boot 集成指南
spring boot·redis·缓存
无名38743 分钟前
FreeSWITCH rtp session 的初始化
java·服务器·前端
Java.慈祥44 分钟前
[程序设计]—代理模式
java·设计模式·代理模式·cglib
刘小哈哈哈1 小时前
iOS 中spring动画的使用
java·spring·ios
一决威严-雪雪1 小时前
springboot整合拦截器
java·spring boot·后端
夜半被帅醒1 小时前
【JAVA】Java开发小游戏 - 简单的2D平台跳跃游戏 基本的2D平台跳跃游戏框架,适合初学者学习和理解Java游戏开发的基础概念
java·学习·游戏