一文彻底搞懂SpringMVC执行流程

1. MVC

MVC(Model-View-Controller)是一种软件架构模式,旨在将应用程序分为三个核心组件:

  • 模型(Model): 模型代表应用程序的数据和业务逻辑。它负责管理数据的状态和行为,并且不直接处理用户界面或用户输入。通常,模型对象用于检索、存储、修改和操作应用程序的数据,以及定义应用程序的业务规则。

  • 视图(View): 视图是模型的可视化表示,负责将数据呈现给用户,并与用户进行交互。视图通常是用户界面的一部分,例如网页、图形界面或移动应用程序的用户界面。视图接收模型的数据,并根据数据呈现用户界面。

  • 控制器(Controller): 控制器是模型和视图之间的中介,负责处理用户输入并更新模型或视图。它接收来自用户的输入(例如请求或命令),然后根据输入调用适当的模型操作或选择合适的视图进行显示。控制器负责应用程序的流程控制和业务逻辑。

MVC 模式的主要目标是将应用程序的不同方面分离开来,以便更好地组织代码、提高代码的可维护性和可扩展性。通过将数据、显示和控制逻辑分离,MVC 模式使得应用程序的各个部分能够相互独立地进行开发、测试和维护。

2. SpringMVC

Spring MVC 是 Spring Framework 的一部分,是一个基于 Java 的开源 Web MVC 框架,用于构建 Web 应用程序。它提供了一种轻量级的、灵活的方式来开发 Web 应用程序,并借助依赖注入和面向切面编程等技术来促进松耦合和高效的开发。

Spring MVC 框架基于 MVC(Model-View-Controller)设计模式,采用了前端控制器(Front Controller)的架构,其核心组件包括:

  • DispatcherServlet(前端控制器):DispatcherServlet 是 Spring MVC 框架的入口点,负责接收所有客户端请求,并将请求分派给合适的处理器(Controller)。它是一个 Servlet,通常配置在 web.xml 文件中,并拦截所有请求。

  • Controller(控制器):控制器负责处理客户端请求,执行相应的业务逻辑,并返回适当的响应给客户端。在 Spring MVC 中,控制器通常是一个 POJO(Plain Old Java Object)类,可以通过注解或 XML 配置来定义。

  • HandlerMapping(处理器映射器):处理器映射器负责将客户端请求映射到相应的控制器处理程序。Spring MVC 提供了多种类型的处理器映射器,如注解映射、路径映射等,以便灵活地配置请求映射规则。

  • ViewResolver(视图解析器):视图解析器负责将逻辑视图名称解析为实际的视图对象,用于呈现给客户端。视图解析器根据视图名称查找视图模板,并返回给 DispatcherServlet 进行渲染。

  • View(视图):视图负责呈现模型数据给用户,并与用户进行交互。视图通常是一个模板文件,如 JSP、Thymeleaf、Freemarker 等,用于生成客户端可视化的页面内容。

  • Model(模型):模型代表应用程序的数据和业务逻辑,负责封装数据并执行业务逻辑操作。控制器可以与模型进行交互,获取或更新数据,并将数据传递给视图进行显示。

Spring MVC 框架还提供了许多功能和特性,如拦截器、数据绑定、表单处理、文件上传、国际化、异常处理等,以便开发者能够更轻松地构建灵活、高效的 Web 应用程序。

3. 执行流程

下图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提供的技术,不需要开发者实现,虚线表示需要开发者实现。

简要分析执行流程:

1.DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求,我们假设请求的url为:http://localhost:9999/SpringMVC/input-product

如上url拆分成三部分:

(1)http://localhost:9999 服务器域名

(2)SpringMVC部署在服务器(http://localhost:9999)上的web站点

(3)input-product表示控制器

通过分析,如上url表示为:请求位于服务器localhost:9999上的SpringMVC站点的input-product控制器

2.HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler

3.HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:input-product

4.HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等

5.HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler

6.Handler让具体的Controller执行

7.Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView

8.HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet

9.DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名

10.视图解析器将解析的逻辑视图名传给DispatcherServlet

11.DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图

12.最终视图呈现给用户。

在这里插入图片描述

4. 配置文件

Spring MVC 的配置文件通常是一个 XML 文件,其中包含了配置 Spring MVC 框架的各种组件和特性。主要的配置文件是 web.xml 和 springmvc-servlet.xml(或者是通过 Java Config 类配置的方式)。下面是一个典型的 Spring MVC 配置文件的示例:

1.web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         id="WebApp_ID" version="4.0">

    <!-- 配置 DispatcherServlet -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置 Spring MVC 的配置文件位置 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/springmvc-servlet.xml</param-value>
        </init-param>
        <!-- 启动时加载 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- 映射 DispatcherServlet 的 URL -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

2.springmvc-servlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 启用注解驱动 -->
    <mvc:annotation-driven/>

    <!-- 扫描控制器包 -->
    <context:component-scan base-package="com.example.controllers"/>

    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

在这个示例中,web.xml 配置了 DispatcherServlet,并指定了其配置文件的位置为 /WEB-INF/springmvc-servlet.xml。而 springmvc-servlet.xml 文件则配置了 Spring MVC 的各种组件,包括启用注解驱动、扫描控制器包、配置视图解析器等。

5. 常用注解

@Controller: 用于标识一个类是 Spring MVC 的控制器,处理用户请求并返回相应的视图或数据。

@RequestMapping: 用于映射请求 URL 到处理方法,可以用在类级别和方法级别,用于指定处理器的访问路径。

@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping: 这些注解是@RequestMapping的快捷方式,用于标识对应的 HTTP 请求方法的处理器方法。

@RequestParam: 用于从请求中获取参数值,可以指定参数的名称、是否必需等。

@PathVariable: 用于将 URL 中的模板变量绑定到处理方法的参数上,用于获取 RESTful 风格的 URL 中的路径参数。

@RequestBody: 用于将请求体中的数据绑定到处理方法的参数上,通常用于处理 POST 请求中的 JSON 或 XML 格式的数据。

@ResponseBody: 用于将处理方法的返回值直接作为 HTTP 响应体返回给客户端,通常用于返回 JSON 或 XML 格式的数据。

@ModelAttribute: 用于将请求参数绑定到处理方法的模型属性上,也可以用于在请求处理之前初始化模型数据。

@SessionAttributes: 用于将模型属性存储到会话中,以便多个请求之间共享数据。

@ExceptionHandler: 用于处理控制器内部抛出的异常,可以将特定类型的异常映射到处理方法上。

@InitBinder: 用于初始化数据绑定器,可以自定义数据绑定规则。

@CrossOrigin: 用于配置跨域资源共享 (CORS)。

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-04-02 21:16:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-02 21:16:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-02 21:16:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-02 21:16:02       20 阅读

热门阅读

  1. 【力扣】80.删除有序数组中的重复项Ⅱ

    2024-04-02 21:16:02       12 阅读
  2. 在Linux或类Unix系统中获取帮助的命令

    2024-04-02 21:16:02       13 阅读
  3. Hibernate之Restrictions的用法

    2024-04-02 21:16:02       14 阅读
  4. Linux 内核中PHY子系统(网络):MDIO 总线

    2024-04-02 21:16:02       15 阅读
  5. P1719 最大加权矩形

    2024-04-02 21:16:02       10 阅读
  6. C++中string非成员函数重载

    2024-04-02 21:16:02       16 阅读