• SpringMVC执行原理


    SpringMVC执行原理

    SpringMVC执行流程图

    1. 前端控制器:DispatcherServlet

    位于 /WEB-INF/web.xml

    <!--1.注册DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--关联一个springmvc的配置文件:【servlet-name】.xml-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!--启动级别-1:和服务器同时启动-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- 在SpringMVC中: -->
    <!-- /   匹配所有的请求,但不匹配.jps文件-->
    <!-- /*  匹配所有的请求,并且匹配.jsp文件-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    
    • DispatcherServlet表示前端控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接受请求并拦截请求。

    1.1springmvc-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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    
        <!--视图解析器: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>
    
        <!--Handler-->
        <bean id="/hello" class="com.ssozh.controller.HelloController"/>
    </beans>
    

    2. 处理器映射器:Handler Mapping

    位于classpath:springmvc-servlet.xml

     <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    
    • DispatcherServlet调用HandlerMapping,HandlerMapping根据URL查找handler

    3. 具体的Handler:HandlerExecution

    • 图中未表示,代码中也不需要配置,属于SpringMVC内部的一个类。
    • HandlerExecution的主要作用是根据URL查找控制器

    4. 处理器适配器:Handler Apdater

    位于classpath:springmvc-servlet.xml

     <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    
    • 按照其特定的规则去执行Handler

    5. 页面控制器处理器:实现了Controller接口的实体类

    public class HelloController implements Controller {
        @Override
        public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
            //ModelAndView 模型和视图
            ModelAndView mv = new ModelAndView();
    
            //封装对象,放在ModelAndView中。Model
            mv.addObject("msg","HelloSpringMVC!");//将HellowSpirngMVC字符串传递给msg变量。
            //封装要跳转的视图,放在ModelAndView中
            mv.setViewName("hello"); //: /WEB-INF/jsp/hello.jsp
            return mv;
        }
    }
    

    6. 模型(DAO层和Service层)

    7. 视图解析器

    位于classpath:springmvc-servlet.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>
    
    • 位于springmvc-servlet.xml中配置的bean
    • 作用:处理dispatcherServlet给他的ModelAndView
      • 获取ModelAndView的数据
      • 解析ModelAndView的视图名字
      • 拼接视图名字,找到对应的视图 /WEB=INF/jsp/hello.jsp
      • 将数据渲染到这个视图上
    • 最后DispatherServlet根据视图解析器的视图结果,调用具体的视图。最终视图呈现给用户。
  • 相关阅读:
    一个例子讲明爬虫请求库requests
    SpringBoot【六】 Shiro
    SpringBoot【五】 Spring Security
    SpringBoot【四】 任务
    Swagger
    SpringBoot【三】 整合 JDBC、Druid、MyBatis
    SpringBoot【二】 SpringBoot 配置
    SpringBoot【一】入门程序及原理分析
    SpingBoot 相关问题:启动 web 项目之后出现 java.lang.UnsatisfiedLinkError: D:Tomcatapache-tomcat-9.0.36in cnative-1.dll
    SpringBoot 相关问题:IDEA 创建 SpringBoot 项目时出现 Initialization failed for 'https://start.spring.io' 问题
  • 原文地址:https://www.cnblogs.com/SsoZhNO-1/p/12424947.html
Copyright © 2020-2023  润新知