Spring MVC框架概述

Spring MVC框架概述

一. 介绍

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

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

二. 层次

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

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

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



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

三. 核心组件

前端控制器 (DispatcherServlet)

  • 接收请求,处理结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。

    不需要程序员开发

scss 复制代码
Spring Web 模型-视图-控制器 (MVC) 框架是围绕处理所有 HTTP 请求和响应的 DispatcherServlet 设计的 。

以下是对应于对 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中必须包含某些参数值是,才让该方法处理

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

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

css 复制代码
	在类定义处添加,也可以单独在方法中添加,表示直接将业务方法的返回值响应给客户端,不加的话返回的话,会将返回值传递给DispatcherServlet,再由DispatcherServlet调用ViewResolver对值进行解析,映射到一个jsp资源或html资源。
  1. RequestParam : 用于在SpringMVC后台控制层获取参数
ini 复制代码
它有三个常用参数:defaultValue = "0", required = false, value = "isApp"
arduino 复制代码
defaultValue 表示设置默认值
required 通过boolean设置是否是必须要传入的参数
value 值表示接受的传入的参数类型
  1. PathVariable: 用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。

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

    所有的Controller继承BaseController,即可实现在调用Controller时,先执行 此方法

  3. SessionAttributes : 将值放到session作用域中,写在class上面

七. 乱码处理

  1. 解决post请求乱码问题:
  • 在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8

    xml 复制代码
    <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>
  1. 解决get请求乱码问题(2取其1):

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

ini 复制代码
<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

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

javascript 复制代码
String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

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

八. SpringMVC的全局处理异常

处理异常的方式

  1. 编程式异常处理
go 复制代码
  ```
javascript 复制代码
  	指在代码中显式地编写处理异常的逻辑。它通常涉及到对异常类型的检测及其处理,例如使用 try-catch 块来捕获异常,然后在 catch 块中编写特定的处理代码,或者在 finally 块中执行一些清理操作。在编程式异常处理中,开发人员需要显式地进行异常处理,异常处理代码混杂在业务代码中,导致代码可读性较差。
  ```
  1. 声明式异常处理
less 复制代码
  ```
  	将异常处理的逻辑从具体的业务逻辑中分离出来,通过配置等方式进行统一的管理和处理。在声明式异常处理中,开发人员只需要为方法或类标注相应的注解(如 @Throws 或 @ExceptionHandler),就可以处理特定类型的异常。相较于编程式异常处理,声明式异常处理可以使代码更加简洁、易于维护和扩展。 (通常使用声明式异常处理)
  ```

九. 拦截器

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

概念

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

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

  1. 网络请求拦截器:在发送网络请求之前,可以使用拦截器对请求进行拦截和修改,例如添加请求头、验证用户身份等操作。
  2. 响应拦截器:在接收到网络响应之后,可以使用拦截器对响应进行拦截和处理,例如解析响应数据、统一处理错误等操作。
  3. 方法拦截器:在调用某个方法之前或之后,可以使用拦截器对方法进行拦截和处理,例如日志记录、性能监测等操作。
markdown 复制代码
	拦截器通常由一个链式结构组成,每个拦截器都可以决定是否将请求或响应传递给下一个拦截器。这种链式结构可以实现多个拦截器的有序执行,并且每个拦截器都可以对请求或响应进行修改或处理。

拦截器的好处

  1. 代码复用:通过拦截器可以将一些通用的逻辑抽离出来,实现代码的复用和统一管理。

  2. 解耦合:拦截器可以将业务逻辑与具体的操作解耦,使代码更加清晰和可维护。

  3. 增强功能:通过拦截器可以方便地添加额外的功能,如权限验证、日志记录等。


  1. 硬核!springmvc全面详解,包含各种核心知识点!_springmvc的核心知识点-CSDN博客
  2. Spring Framework
相关推荐
鼠爷ねずみ15 小时前
SpringCloud前后端整体开发流程-以及技术总结文章实时更新中
java·数据库·后端·spring·spring cloud
从心归零18 小时前
springboot-jpa的批量更新方法
java·spring boot·spring
LiamTuc18 小时前
Hibernate‌
spring
小许学java21 小时前
Spring事务和事务传播机制
java·数据库·spring·事务
这是程序猿1 天前
基于java的ssm框架经典电影推荐网站
java·开发语言·spring boot·spring·经典电影推荐网站
jiayong231 天前
海外求职平台与策略指南
java·spring
SadSunset1 天前
(37)全注解式开发AOP
java·spring
子超兄1 天前
Bean生命周期
java·spring
Mr.朱鹏1 天前
超时订单处理方案实战指南【完整版】
java·spring boot·redis·spring·rabbitmq·rocketmq·订单
Lisonseekpan1 天前
RBAC 基于角色的访问控制模型详解与实践指南
java·服务器·网络·后端·spring·log4j