Spring MVC框架概述

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 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
目录
相关文章
|
19天前
|
缓存 Java 开发工具
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
三级缓存是Spring框架里,一个经典的技术点,它很好地解决了循环依赖的问题,也是很多面试中会被问到的问题,本文从源码入手,详细剖析Spring三级缓存的来龙去脉。
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
|
19天前
|
缓存 安全 Java
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
|
19天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
9天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
527 5
|
6天前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
7天前
|
XML 前端开发 Java
控制spring框架注解介绍
控制spring框架注解介绍
|
7天前
|
存储 NoSQL Java
Spring Session框架
Spring Session 是一个用于在分布式环境中管理会话的框架,旨在解决传统基于 Servlet 容器的会话管理在集群和云环境中的局限性。它通过将用户会话数据存储在外部介质(如数据库或 Redis)中,实现了会话数据的跨服务器共享,提高了应用的可扩展性和性能。Spring Session 提供了无缝集成 Spring 框架的 API,支持会话过期策略、并发控制等功能,使开发者能够轻松实现高可用的会话管理。
Spring Session框架
|
14天前
|
Java 应用服务中间件 开发者
深入探索并实践Spring Boot框架
深入探索并实践Spring Boot框架
25 2
|
14天前
|
机器学习/深度学习 数据采集 JavaScript
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
ADR药品不良反应监测系统是一款智能化工具,用于监测和分析药品不良反应。该系统通过收集和分析病历、处方及实验室数据,快速识别潜在不良反应,提升用药安全性。系统采用Java开发,基于SpringBoot框架,前端使用Vue,具备数据采集、清洗、分析等功能模块,并能生成监测报告辅助医务人员决策。通过集成多种数据源并运用机器学习算法,系统可自动预警药品不良反应,有效减少药害事故,保障公众健康。
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
|
23天前
|
运维 NoSQL Java
SpringBoot接入轻量级分布式日志框架GrayLog技术分享
在当今的软件开发环境中,日志管理扮演着至关重要的角色,尤其是在微服务架构下,分布式日志的统一收集、分析和展示成为了开发者和运维人员必须面对的问题。GrayLog作为一个轻量级的分布式日志框架,以其简洁、高效和易部署的特性,逐渐受到广大开发者的青睐。本文将详细介绍如何在SpringBoot项目中接入GrayLog,以实现日志的集中管理和分析。
100 1
下一篇
无影云桌面