• 【SpringMVC】深度理解DispatcherServlet


    什么是DispatcherServlet

    springMVC中的控制器DispatcherServlet,是springMVC的核心

    HelloSpringMVC

    下面通过一个demo理解DispatcherServlet

    1.确保导入SpringMVC相关jar包并且添加web框架支持

    相关jar包可参考下列:

    <dependencies>
            <dependency>//单元测试
                <groupId>junitgroupId>
                <artifactId>junitartifactId>
                <version>4.13.2version>
                <scope>testscope>
            dependency>
            <dependency>//springMVC基于spring框架
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-webmvcartifactId>
                <version>5.3.1version>
            dependency>
            <dependency>//servlet
                <groupId>javax.servletgroupId>
                <artifactId>servlet-apiartifactId>
                <version>2.5version>
            dependency>
            <dependency>//jsp
                <groupId>javax.servlet.jspgroupId>
                <artifactId>jsp-apiartifactId>
                <version>2.2version>
            dependency>
            <dependency>//jsp的标准库
                <groupId>javax.servlet.jsp.jstlgroupId>
                <artifactId>jstl-apiartifactId>
                <version>1.2version>
            dependency>
        dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    2.在web.xml下配置DispatcherServlet

    
        <servlet>
            <servlet-name>springmvcservlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
            
            <init-param>
                <param-name>contextConfigLocationparam-name>
                <param-value>classpath:springmvc-servlet.xmlparam-value>
            init-param>
            
            <load-on-startup>1load-on-startup>
        servlet>
        
        
        <servlet-mapping>
            <servlet-name>springmvcservlet-name>
            <url-pattern>/url-pattern>
        servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3.编写springmvc-servlet.xml(spring管理的配置文件)

    
    <beans xmins="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"/>
        
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
            
            <property name="prefix" value="/WEB-INF/jsp/"/>
            
            <property name="suffix" value=".jsp"/>
        bean>
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4.自定义HelloController类(处理器)并注入到spring

    public class HelloController implements Controller {
       @Override
       public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
           ModelAndView modelAndView = new ModelAndView();
           //模型视图添加一个对象:属性名:msg,属性值:HelloSpringMVC!
           modelAndView.addObject("msg","HelloSpringMVC!");
           //设置视图的名字(路径)对应hello.jsp中的hello
           modelAndView.setViewName("hello");// /jsp/hello.jsp
           return modelAndView;
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    你会发现HelloController类是灰色的,是没有引用的意思,否则就相当于没有写这个类。因此我们需要注入到spring容器里,也就是在springmvc-servlet.xml(spring管理的配置文件)注册bean。

    <bean id="/hello" class="com.kxy.controller.HelloController"/>
    
    • 1

    5.创建output root组件下的WEBINF/lib目录

    在这里插入图片描述

    这是因为老版的springMVC架构里web项目jar包都是由lib管理的,但是idea没有lib文件夹。如果报404,应该是依赖找不到。因此需要手动配置依赖。

    6.启动tomcat服务器 输入地址/hello

    在这里插入图片描述

    理一下思路

    首先,不再是像原生的MVC那样,每写一个servlet就需要在web.xml注册servlet。在这里,web.xml里注册的是DispatcherServlet。
    然后在spring容器里注入四个bean:
    1.处理器映射器(HandlerMapping):通过用户请求的url(/hello)来找到对应的处理器,如本demo中的Hellocontroller。生成处理器执行链HandlerExecutionChain并返回。
    2.处理器适配器(HandlerAdapter):适配并执行处理器(Hellocontroller)返回一个modelAndView对象。
    3.视图解析器ViewReslover (注入视图对应文件路径的前缀和后缀):根据视图名称,解析视图对象,返回视图对象。
    springMVC这三大组件完成他们的工作后,都要把对象返回给DispatcherServlet。
    4.controller处理器:封装模型和视图对象modelAndView,返回modelAndView,交给HandlerAdapter。

    DispatcherServlet的工作流程其实就是这样的:
    在这里插入图片描述
    这张图中我用了两种颜色的块状区域来表示,绿色表示 MVC 部分,橘色表示 SpringMVC 三大组件,这里共划分出了 11 个步骤,这里对这 11 个步骤进行一下说明:

    1)用户发送请求至前端控制器 DispatcherServlet。

    2)DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。

    3) 处理器映射器根据请求 url 找到具体的处理器,生成处理器执行链HandlerExecutionChain(处理器对象和处理器拦截器(如果有则生成))一并返回给 DispatcherServlet。

    4) DispatcherServlet 通过 HandlerAdapter 处理器适配器调用处理器。

    5) HandlerAdapter 执行处理器(handler,也叫后端控制器)。

    6) Controller 执行完成返回 ModelAndView。

    7) HandlerAdapter 将 handler 执行结果 ModelAndView 返回给 DispatcherServlet。

    8) DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器。

    9) ViewReslover 解析后返回具体 View 对象。

    10) DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中)。

    11) DispatcherServlet 响应用户。

    下面我们通过注解来简化以上的springMVC架构:

    链接: 【SpringMVC】使用注解实现SpringMVC框架

  • 相关阅读:
    图片怎么批量重命名从1到50?
    Jenkins教程-5-gitee自动化测试任务构建
    ensp搭建IPv6
    【海南大学】2022年土木与海洋工程国际会议(JCCME 2022)
    【考研数学】线性代数第六章 —— 二次型(2,基本定理及二次型标准化方法)
    【排序算法】插入排序(希尔排序)
    java 项目管理工具gradle
    五面阿里巴巴回来分享面经总结,定级P7架构师
    Window.onload事件绑定
    ajax样式演示
  • 原文地址:https://blog.csdn.net/qq_53635765/article/details/126564070