SpringMVC-执行流程

目录

前言

一、SpringMVC执行流程

[SpringMVC 主要组件](#SpringMVC 主要组件)

[SpringMVC 的执行流程](#SpringMVC 的执行流程)

简要分析执行流程

总结


前言

理解SpringMVC的执行流程是学习SpringMVC工作原理的重要一步。

项目内容参考:SpringMVC-简介及入门-CSDN博客


一、SpringMVC执行流程

SpringMVC 主要组件

  • 前端控制器 DispatcherServlet:用户发出请求,DispatcherServlet接收请求并拦截请求,帮我们处理映射关系
  • 处理器映射器 HandlerMapping:根据请求的 URL 来查找 Handler(HelloController类)并将Handler封装到
  • 处理器适配器 HandlerAdapter:负责执行 Handler(执行HelloController中的handleRequest方法)
  • 处理器 Handler:处理业务逻辑的 Java 类(HelloController类)
  • 视图解析器 ViewResolver:进行视图解析,获取ModelAndView对象中的数据及响应路径
  • 视图 View:View 是一个接口, 它的实现类支持不同的视图类型,如 JSP、freemarker...

SpringMVC 的执行流程

简要分析执行流程

步骤1:**DispatcherServlet 表示前端控制器,是整个SpringMVC的控制中心。** DispatcherServlet实现了Servlet接口,就是一个Servlet类

前端控制器通过注册Servlet实现获取前端所有请求。

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--1.注册DispatcherServlet:SpringMVC核心。请求分发器,前端控制器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--DispatcherServlet要绑定Spring的配置文件-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

步骤2:通过web.xml读取springmvc-servlet.xml配置文件,通过springmvc-servlet.xml配置文件加载处理器映射器:BeanNameUrlHandlerMapping,映射器主要用于,查找处理请求的HelloController

XML 复制代码
<!--DispatcherServlet要绑定Spring的配置文件-->
<init-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
XML 复制代码
<!--处理映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
 

步骤3:通过处理器映射器:BeanNameUrlHandlerMapping对象将 URL 请求的路径映射到 HelloController上。 具体来说,映射器会根据URL请求的路径、请求参数等信息,确定需要执行哪个处理程。获取到HelloController对象**,并将HelloController封装到HandlerExecutionChain对象中返回给前端控制器。**

XML 复制代码
<!--BeanNameUrlHandlerMapping:bean-->
<bean id="/hello" class="com.zlh.controller.HelloController"/>

步骤4:通过springmvc-servlet.xml配置文件加载处理器适配器SimpleControllerHandlerAdapter对象。 前端控制器将HandlerExecutionChain对象交给处理器适配器。 处理器适配器主要确认HandlerExecutionChain对象中封装的HelloController类的实现方式,根据不同的实现方式执行不同的方法。 例如:HelloController实现了Controller接口,适配器就需要执行handleRequest方法。

注:还可以实现HttpRequestHandler接口或使用@RequestMapping注解实现处理请求,所以适配器需要根据不同的实现方式执行不同的方法

XML 复制代码
<!--处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
java 复制代码
public class HelloController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mv = new ModelAndView();
        //业务代码
        String result="Hello QiYu";
        mv.addObject("msg",result);
        //视图跳转
        mv.setViewName("test");
        return mv;
    }
}

**步骤5:**适配器执行HelloController中的handleRequest方法,handleRequest方法中包含需要执行的具体业务。

**步骤6:**适配器调用handleRequest方法,返回ModelAndView对象

**步骤7:**适配器将HelloController返回的ModelAndView对象交给前端控制器

步骤8:前端控制器将ModelAndView对象交给视图解析器:ViewResolver。 通过springmvc-servlet.xml配置文件加载视图解析器

XML 复制代码
    <!--视图解析器:DispatcherServlet给他的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

我们在HelloController中给ModelAndView对象设置了视图跳转

java 复制代码
//视图跳转
mv.setViewName("test");

视图解析器,可以根据配置文件,将视图跳转地址解析为:/WEB-INF/jsp/test.jsp

XML 复制代码
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>

/WEB-INF/jsp/test.jsp就对于了我们的test.jsp文件地址

**步骤9:**视图解析器将解析的逻辑视图名传给前端控制器。

步骤10:前端控制器根据视图解析器解析的视图结果,调用具体的视图:/WEB-INF/jsp/test.jsp

**步骤11:**最终视图(test.jsp)呈现给用户。


总结

这样SpringMVC的执行流程就梳理完毕了,对于过于细节的地方不用在意,流程图还是要自己画一遍,自己想一遍才能知道自己哪里不明白。

至此鸣谢:SpringMVC 执行流程_springmvc的内部流程-CSDN博客

相关推荐
中东大鹅39 分钟前
SpringBoot配置文件
java·spring boot·spring
笑衬人心。1 小时前
后端项目中大量 SQL 执行的性能优化
sql·spring·性能优化
中东大鹅2 小时前
SpringBoot配置外部Servlet
spring boot·后端·servlet
RealmElysia5 小时前
SpringCache
java·spring·bootstrap
汤姆大聪明7 小时前
SSM框架中关于Spring MVC的技术问题
java·spring·mvc
alien爱吃蛋挞7 小时前
【JavaEE】Spring Web MVC(上)
前端·spring·java-ee
Code季风10 小时前
Java 高级特性实战:反射与动态代理在 spring 中的核心应用
java·spring boot·spring
Code季风10 小时前
深入 Spring 性能调优:反射机制与动态代理的优化策略
java·spring·性能优化
丶小鱼丶11 小时前
Spring之【Bean后置处理器】
java·spring
艺杯羹14 小时前
MyBatis 之缓存机制核心解析
java·后端·spring·mybatis