浅谈Spring MVC的DispatcherServlet


DispatcherServlet(前端控制器)简介

首先我们先看看DispatcherServlet这个类的继承关系

DispatcherServlet

DispatcherServlet在我们熟知的HttpServlet上继续封装了很多方法,但依旧遵顼Servlet的传统

核心方法就是封装的doService和doDispatch方法来处理请求的处理和分发

工作流程

首先我们先看一看官方给出的流程图解

process

结合图中的流程和简单的demo,我们大致梳理一下DispatcherServlet的工作流程

1.将DispatcherServlet配置到web.xml中

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
这里我们将Spring MVC封装好的的DispatcherServlet添加到项目中来

它在Spring容器内部将根据WebApplicationContext所继承的bean来自动分配请求

这也就免去了我们以前手写servlet的配置地狱,不至于每个请求都单独去写Mapping映射

接下来DispatcherServlet就会根据HandlerMapping映射器来处理请求了

2.解析springmvc-servlet.xml配置文件

    <!--处理器映射器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!--处理器适配器-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    <bean id="/hello" class="com.sbc.controller.HelloController"/>
    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <property name="prefix" value="WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
我们这里为了方便理解,采用比较简单的BeanNameUrlHandlerMapping来处理映射

它可以根据bean的名字来处理请求,所以下方写了id为"/hello"的bean来指明映射地址

而适配器主要功能就是处理Servlet中的Handler,它和映射器也是多种多样这里就不展开了

ViewResolver作为视图解析器就承担了处理请求和返回中ModelAndView的作用,拼接返回的view地址

当然实际开发中,我们不会去自己编写这些东西,我们把这些都交给配置文件,也就是下面这种写法
    <!--自动扫描包-->
    <context:component-scan base-package="com.sbc.controller"/>
    <!--不处理静态资源-->
    <mvc:default-servlet-handler/>
    <!--上面两个配置的注入-->
    <mvc:annotation-driven/>

    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
这里有个小坑,配置文件中头部引入的依赖可能不全,这里需要注意是否引入完整

3.Controller具体配置方法

@Controller
public class HelloController {
//  @RequestMapping(name = "/hello", method = RequestMethod.POST)
    @GetMapping("/hello/{a}/{b}")
    public String hello(Model modele, @PathVariable int a, @PathVariable int b) {
        // 封装数据
        modele.addAttribute("msg", "hello anno!");
        modele.addAttribute("sum", a + b);
        return "test";
    }
}
@RequestMapping获得到请求的路径之后通过ModelAndView中的view返回给ViewResolver拼接路由

之后就可以访问web资源了,如果访问不到,则需要检查路径是否正确,和确保网页资源存在

总结

DispatcherServlet作为学习Spring MVC的重要一环,承担了替代Servlet的臃肿配置

在学习Sping的过程中如果只知道使用框架带给我们的便利方式而忽视底层原理,很容易眼高手低

无论是懒人神器LomBok还是注解的引入都是为了开发的便捷性,但还是推荐大家从基础学起才能高屋建瓴

文章如果存在问题欢迎在评论区斧正和评论,各自努力,你我最高处见

posted @ 2021-11-05 10:15  21岁还不是架构师  阅读(208)  评论(0编辑  收藏  举报