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博客

相关推荐
bing_1583 小时前
ServletComponentScan 注解的作用
servlet
会敲键盘的猕猴桃很大胆5 小时前
Redis实战-基于redis和lua脚本实现分布式锁以及Redission源码解析【万字长文】
java·redis·分布式·spring·lua
设计师小聂!6 小时前
JDBC+HTML+AJAX实现登陆和单表的CRUD
java·ajax·servlet·html·maven
白日依山尽yy8 小时前
spring事务的面试题 —— 事务的特性、传播机制、隔离机制、注解
java·数据库·spring
椰椰椰耶8 小时前
[网页五子棋][匹配模式]创建房间类、房间管理器、验证匹配功能,匹配模式小结
java·websocket·spring
Wilson Chen11 小时前
告别硬编码!用工厂模式优雅构建可扩展的 Spring Boot 应用 [特殊字符]
java·spring boot·spring
洛小豆12 小时前
她问我:JWT里到底能塞多少东西?我说我不知道……
前端·后端·spring
JAdroid14 小时前
spring-boot redis lua脚本实现滑动窗口限流
数据库·spring boot·redis·spring·lua·redisson
Code哈哈笑14 小时前
【基于SpringBoot的图书购买系统】Redis中的数据以分页的形式展示:从配置到前后端交互的完整实现
java·spring boot·redis·后端·spring·交互
abcnull1 天前
mybatis的mapper对应的xml写法
xml·sql·spring·mybatis·mapper