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

相关推荐
鼠爷ねずみ8 小时前
SpringCloud前后端整体开发流程-以及技术总结文章实时更新中
java·数据库·后端·spring·spring cloud
从心归零10 小时前
springboot-jpa的批量更新方法
java·spring boot·spring
LiamTuc11 小时前
Hibernate‌
spring
小许学java14 小时前
Spring事务和事务传播机制
java·数据库·spring·事务
这是程序猿16 小时前
基于java的ssm框架经典电影推荐网站
java·开发语言·spring boot·spring·经典电影推荐网站
jiayong2316 小时前
海外求职平台与策略指南
java·spring
SadSunset16 小时前
(37)全注解式开发AOP
java·spring
子超兄17 小时前
Bean生命周期
java·spring
Mr.朱鹏17 小时前
超时订单处理方案实战指南【完整版】
java·spring boot·redis·spring·rabbitmq·rocketmq·订单
Lisonseekpan18 小时前
RBAC 基于角色的访问控制模型详解与实践指南
java·服务器·网络·后端·spring·log4j