Spring MVC框架概述

简介: 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
目录
相关文章
|
7天前
|
前端开发 Java Spring
Spring MVC 是如何对对象参数进行校验的
【6月更文挑战第4天】对象参数校验是使用 SpringMVC 时常用的功能,这篇文章尝试分析了,Spring 是如何实现这一功能的。
20 5
|
1天前
|
前端开发 Java Spring
Spring MVC 请求处理流程
Spring MVC 请求处理流程
4 0
|
2天前
|
开发框架 前端开发 Java
Spring概述(1)
Spring概述(1)
20 0
|
4天前
|
Java 数据处理 数据库
Java一分钟之-Spring Batch:批量处理框架
【6月更文挑战第11天】Spring Batch是Spring家族的批处理框架,简化了批量处理任务的开发。它包含Job、Step、ItemReader、ItemProcessor和ItemWriter等核心组件,用于构建数据处理流程。本文讨论了批量处理中的常见问题,如内存溢出、事务管理和异常处理,并提供了相应的解决策略。通过添加相关依赖、定义Job和Steps,以及启动Job的示例代码,帮助开发者开始使用Spring Batch。了解其核心概念和最佳实践,能提升批量处理系统的效率和可靠性。
24 4
|
5天前
|
JSON 前端开发 Java
Spring MVC 级联对象参数校验
【6月更文挑战第6天】在 Spring MVC 的使用过程中,我们会发现很多非常符合直觉的功能特性,但往往我们会习惯这种「被照顾得很好」的开发方式,依靠直觉去判断很多功能特性的用法。
9 1
|
7天前
|
XML 前端开发 Java
Spring3 MVC中使用Swagger生成API文档
Spring3 MVC中使用Swagger生成API文档
10 0
|
7天前
|
JSON 前端开发 API
Apache HttpClient调用Spring3 MVC Restful Web API演示
Apache HttpClient调用Spring3 MVC Restful Web API演示
11 1
|
7天前
|
前端开发 Java 关系型数据库
在Spring3 MVC中五步配置集成注解方式Hibernate3
在Spring3 MVC中五步配置集成注解方式Hibernate3
18 3
|
8天前
|
JSON 前端开发 Java
记录一次让我吐血的spring3 MVC HTTP406 Json转换错误
记录一次让我吐血的spring3 MVC HTTP406 Json转换错误
6 0
|
8天前
|
前端开发 Java Spring
自定义 Spring MVC Controller 方法参数处理
【6月更文挑战第3天】在 Spring MVC Controller 的方法参数,Spring 会自动为我们注入一些特殊的参数值,比如 HttpServletRequest、HttpServletResponse 等对象,或者 HTTP 请求参数。
49 0