Spring MVC框架概述

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: Spring MVC 是一个基于Java的轻量级Web框架,采用MVC设计模型实现请求驱动的松耦合应用开发。框架包括DispatcherServlet、HandlerMapping、Handler、HandlerAdapter、ViewResolver核心组件。DispatcherServlet协调这些组件处理HTTP请求和响应,Controller处理业务逻辑,Model封装数据,View负责渲染。通过注解@Controller、@RequestMapping等简化开发,支持RESTful请求。Spring MVC具有清晰的角色分配、Spring框架集成、多种视图技术支持以及异常处理等优点。

Spring MVC框架概述


一. 介绍

​ Spring Web MVC 框架提供了模型-视图-控制器架构和现成的组件,可用于开发灵活且松散耦合的 Web 应用程序。MVC 模式导致分离应用程序的不同方面(输入逻辑、业务逻辑和 UI 逻辑),同时在这些元素之间提供松散耦合。

    SpringMVC是一种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于SpringFrameWork的后续产品。它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口。同时还支持Restful编程风格的请求。

二. 层次

  • Model :封装了应用程序数据,一般来说,它们将由 POJO 组成。

  • View :负责渲染模型数据,一般来说,它生成客户端浏览器可以解释的 HTML 输出。

  • Controller:负责处理用户请求构建合适的模型,并将其传递给视图进行渲染。

MVC设计模型.png

Controller接收用户请求,调用Model生成业务数据,传递给View

三. 核心组件

前端控制器 (DispatcherServlet)

  • 接收请求,处理结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
不需要程序员开发
 Spring Web 模型-视图-控制器 (MVC) 框架是围绕处理所有 HTTP 请求和响应的 DispatcherServlet 设计的 。

spring_dispatcherservlet请求处理流程.png

以下是对应于对 DispatcherServlet 的传入 HTTP 请求的事件序列 −

  • 收到 HTTP 请求后,DispatcherServlet 会咨询 HandlerMapping 以调用适当的 Controller。
  • 控制器接受请求并根据使用的 GETPOST 方法 调用适当的服务方法。服务方法将根据定义的业务逻辑设置模型数据,并将视图名称返回给 DispatcherServlet。
  • DispatcherServlet 将获得 ViewResolver 的帮助来获取请求的定义视图。
  • 一旦视图完成,DispatcherServlet 将模型数据传递给视图,最终在浏览器上呈现。

上述所有组件,即 HandlerMapping、Controller 和 ViewResolver 都是 WebApplicationContext 的一部分,它是普通 ApplicationContext 的扩展,具有 Web 应用程序所需的一些额外功能。

处理器 (Handler)

  • 处理请求的具体过程。完成具体的业务逻辑,相当于servlet或action。
需要程序员开发

处理器映射器 ( HandleMapping )

  • 根据url找到 handler
不需要程序员开发

处理器适配器 ( HandlerAdapter )

  • Handler执行业务方法之前,需要进行一系列的操作,如表单数据的验证,数据类型的转换,将表单数据封装成JavaBean等,因此开发者只需将注意力集中到业务逻辑的处理上,DispatcherServlet通过HandlerAdapter执行不同的Handler。
适配器模式
  • 注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以 正确的去执行Handler。

视图解析器 ( ViewResolver )

  • DispatcherServlet通过它将逻辑视图转换为物理视图,最终将渲染结果响应给客户端。
不需要程序员开发

处理器拦截器( HandlerInterceptor )

  • 是一个接口,如果需要完成拦截处理,实现该接口。
不需要程序员开发

处理器执行链( HandlerExecutionChain )

  • 处理器执行链,包含两部分,HandlerInterceptor和Handler

四. 工作流程

  1. 客户端请求被DispatcherServlet接收。
  2. 根据HandlerMapping映射到Handler
  3. 生成HandlerHandlerInterceptor
  4. HandlerHandlerInterceptorHandlerExecutionChain的形式一并返回给DispatcherServlet
  5. DispatcherServlet通过HandlerAdapter调用Handler的方法完成业务逻辑处理。
  6. Handler返回一个ModerAndView对象给DispatcherServlet
  7. DispatcherServlet将获取的ModerAndView对象传给ViewResolver视图解析,将逻辑视图解析为物理视图View。
  8. ViewResolver返回一个View给DispatcherServlet
  9. DispatcherServlet根据View进行视图渲染(将模型数据Model填充到视图View中)
  10. DispatcherServlet将渲染后的结果响应给客户端。

五. SpringMVC的优点

  1. 可以支持各种视图技术,而不仅仅局限于JSP。
  2. 与Spring框架集成(如IoC容器、AOP等)。
  3. 清晰的角色分配:前端控制器(dispatcherServlet) , 请求到处理器映射(handlerMapping), 处理器适配器(HandlerAdapter), 视图解析器(ViewResolver)。
  4. 支持各种请求资源的映射策略。

六. 常用注解

  1. Controller : 用于定义控制类

  2. RequestMapping : 用来处理请求地址映射的注解,可以作用于类和方法上。

    相关参数:

    value: 指定请求的实际地址, 是@RequestMapping的默认值。 指定的地址可以是URI Template 模式

    method: 指定请求的method类型, GET、POST、PUT、DELETE等

    consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;

    produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

    params: 指定request中必须包含某些参数值是,才让该方法处理

     *headers*: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
    
  3. ResponseBody : 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

    ​ 使用时机:返回的数据不是html标签的页面,而是其他某 种格式的数据时(如json、xml等)使用。

        在类定义处添加,也可以单独在方法中添加,表示直接将业务方法的返回值响应给客户端,不加的话返回的话,会将返回值传递给DispatcherServlet,再由DispatcherServlet调用ViewResolver对值进行解析,映射到一个jsp资源或html资源。
    
  4. RequestParam : 用于在SpringMVC后台控制层获取参数

    它有三个常用参数:defaultValue = “0”, required = false, value = “isApp”
    
    defaultValue 表示设置默认值
    required 通过boolean设置是否是必须要传入的参数
    value 值表示接受的传入的参数类型
    
  1. PathVariable: 用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。

  2. ModelAttribute : 定义一个方法,该方法专门用来返回要填充到模型数据中的对象

    所有的Controller继承BaseController,即可实现在调用Controller时,先执行 此方法
    
  3. SessionAttributes : 将值放到session作用域中,写在class上面

七. 乱码处理

  1. 解决post请求乱码问题:

    • 在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8

      <filter>
          <filter-name>CharacterEncodingFilter</filter-name>
          <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
          <init-param>
              <param-name>encoding</param-name>
              <param-value>utf-8</param-value>
          </init-param>
      </filter>
      
      <filter-mapping>
          <filter-name>CharacterEncodingFilter</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>
      
  2. 解决get请求乱码问题(2取其1):

    (1)修改tomcat配置文件添加编码与工程编码一致

    <ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
    

    (2)对参数进行重新编码

    String userName = new String(request.getParamter(“userName”).getBytes(“ISO8859-1”),“utf-8”)
    

    注: ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。

八. SpringMVC的全局处理异常

处理异常的方式

  1. 编程式异常处理

        指在代码中显式地编写处理异常的逻辑。它通常涉及到对异常类型的检测及其处理,例如使用 try-catch 块来捕获异常,然后在 catch 块中编写特定的处理代码,或者在 finally 块中执行一些清理操作。在编程式异常处理中,开发人员需要显式地进行异常处理,异常处理代码混杂在业务代码中,导致代码可读性较差。
    
  2. 声明式异常处理

        将异常处理的逻辑从具体的业务逻辑中分离出来,通过配置等方式进行统一的管理和处理。在声明式异常处理中,开发人员只需要为方法或类标注相应的注解(如 @Throws 或 @ExceptionHandler),就可以处理特定类型的异常。相较于编程式异常处理,声明式异常处理可以使代码更加简洁、易于维护和扩展。 (通常使用声明式异常处理)
    

九. 拦截器

       拦截器(Interceptor)是一种常见的编程模式,它用于在执行某个操作前后插入额外的逻辑。在软件开发中,拦截器通常用于对请求、响应或方法调用进行预处理或后处理。

概念

​ 使用拦截器在请求到达具体 handler 方法前,统一执行检测,检测成功就通过,进行后面的操作,检测不成功的就不通过 。

拦截器可以在以下情况下发挥作用:

  1. 网络请求拦截器:在发送网络请求之前,可以使用拦截器对请求进行拦截和修改,例如添加请求头、验证用户身份等操作。
  2. 响应拦截器:在接收到网络响应之后,可以使用拦截器对响应进行拦截和处理,例如解析响应数据、统一处理错误等操作。
  3. 方法拦截器:在调用某个方法之前或之后,可以使用拦截器对方法进行拦截和处理,例如日志记录、性能监测等操作。

     拦截器通常由一个链式结构组成,每个拦截器都可以决定是否将请求或响应传递给下一个拦截器。这种链式结构可以实现多个拦截器的有序执行,并且每个拦截器都可以对请求或响应进行修改或处理。
    

拦截器的好处

  1. 代码复用:通过拦截器可以将一些通用的逻辑抽离出来,实现代码的复用和统一管理。
  2. 解耦合:拦截器可以将业务逻辑与具体的操作解耦,使代码更加清晰和可维护。
  3. 增强功能:通过拦截器可以方便地添加额外的功能,如权限验证、日志记录等。

  1. 硬核!springmvc全面详解,包含各种核心知识点!_springmvc的核心知识点-CSDN博客
  2. Spring Framework
目录
相关文章
|
24天前
|
XML 安全 Java
|
27天前
|
缓存 NoSQL Java
什么是缓存?如何在 Spring Boot 中使用缓存框架
什么是缓存?如何在 Spring Boot 中使用缓存框架
41 0
|
1月前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
2月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
60 4
|
2月前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
48 0
|
2天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
10天前
|
IDE Java 测试技术
互联网应用主流框架整合之Spring Boot开发
通过本文的介绍,我们详细探讨了Spring Boot开发的核心概念和实践方法,包括项目结构、数据访问层、服务层、控制层、配置管理、单元测试以及部署与运行。Spring Boot通过简化配置和强大的生态系统,使得互联网应用的开发更加高效和可靠。希望本文能够帮助开发者快速掌握Spring Boot,并在实际项目中灵活应用。
27 5
|
10天前
|
设计模式 前端开发 Java
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
24 4
|
20天前
|
缓存 Java 数据库连接
Spring框架中的事件机制:深入理解与实践
Spring框架是一个广泛使用的Java企业级应用框架,提供了依赖注入、面向切面编程(AOP)、事务管理、Web应用程序开发等一系列功能。在Spring框架中,事件机制是一种重要的通信方式,它允许不同组件之间进行松耦合的通信,提高了应用程序的可维护性和可扩展性。本文将深入探讨Spring框架中的事件机制,包括不同类型的事件、底层原理、应用实践以及优缺点。
49 8
|
1月前
|
存储 Java 关系型数据库
在Spring Boot中整合Seata框架实现分布式事务
可以在 Spring Boot 中成功整合 Seata 框架,实现分布式事务的管理和处理。在实际应用中,还需要根据具体的业务需求和技术架构进行进一步的优化和调整。同时,要注意处理各种可能出现的问题,以保障分布式事务的顺利执行。
51 6