Spring MVC框架概述

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 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
目录
相关文章
|
6天前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
18天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
33 4
|
20天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
111 1
|
15天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
27 0
|
10天前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
31 1
Spring 框架:Java 开发者的春天
|
2天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
9 2
|
2天前
|
消息中间件 NoSQL Java
springboot整合常用中间件框架案例
该项目是Spring Boot集成整合案例,涵盖多种中间件的使用示例,每个案例项目使用最小依赖,便于直接应用到自己的项目中。包括MyBatis、Redis、MongoDB、MQ、ES等的整合示例。
41 1
|
10天前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
16天前
|
人工智能 开发框架 Java
总计 30 万奖金,Spring AI Alibaba 应用框架挑战赛开赛
Spring AI Alibaba 应用框架挑战赛邀请广大开发者参与开源项目的共建,助力项目快速发展,掌握 AI 应用开发模式。大赛分为《支持 Spring AI Alibaba 应用可视化调试与追踪本地工具》和《基于 Flow 的 AI 编排机制设计与实现》两个赛道,总计 30 万奖金。
|
17天前
|
人工智能 Java API
阿里云开源 AI 应用开发框架:Spring AI Alibaba
近期,阿里云重磅发布了首款面向 Java 开发者的开源 AI 应用开发框架:Spring AI Alibaba(项目 Github 仓库地址:alibaba/spring-ai-alibaba),Spring AI Alibaba 项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。本文将详细介绍 Spring AI Alibaba 的核心特性,并通过「智能机票助手」的示例直观的展示 Spring AI Alibaba 开发 AI 应用的便利性。示例源