浅谈对Spring mvc的理解和DispatherServlet源码深入分析

本文介绍了Spring MVC的基本概念和体系结构,强调理解其工作流程和组件交互的重要性。详细阐述了Spring MVC请求处理的7个步骤,并深入剖析了DispatcherServlet的源码,特别是doService和doDispatch方法,揭示了如何通过initStrategies方法自动组装Spring MVC组件。
摘要由CSDN通过智能技术生成

简介

Spring mvc是Spring 为展示层提供的一个优秀的Web框架,它基于MVC的设计理念,并采用松耦合、可插拔的组件结构,让它比其他的MVC框架更具有灵活性和扩展性。

体系结构

学习Spring MVC的时候,最重要还是要懂得它里面内部的各个组件是如何运转工作的,我刚开始接触的时候,只想着一门心思去写代码,而忽略了其最精髓的原理理解和逻辑流程,这也导致我在进行Spring mvc配置和编写代码的时候经常出现错误,反而大大地降低了我的开发效率,因此了解Sping mvc的工作流程、体系结构还是对我们非常有帮助的。
下面是spring mvc的一个框架模型图:

这里写图片描述
Spring mvc请求处理过程详解:
(1)首先,客户端向服务器短发送一个HTTP请求,我们的应用服务器接收带这个请求后,先判断是否匹配DispatcherServlet的请求路径映射(这是在配置web.xml的时候指定),匹配成功则进入Spring mvc 的核心组件DispatcherServlet中进行处理
(2)DispatcherServlet接受到请求后,将根据请求信息以及HadlerMapping的路径配置找到处理该请求的处理器Handler(也就是我们写得Controller),在这个 过程中,HandlerMapping相当于一个路由控制器,帮助我们去找到“目标主机”Handler
( 3 )找到Handler后,会通过适配器HandlerAdapter对Handler经行封装,并调用统一的适配器接口调用这个Handler.
(4)处理器完成了业务逻辑后,会返回一个ModelAndView对象给DispatcherServlet,这个对象包含了视图逻辑名和后期用来渲染页面的数据信息。
(5)DispatcherServlet得到这个ModelAndView对象后并不能直接地得到 视图对象,注意上面说地是逻辑视图名,而要获取真正的视图名,DispatcherServlet需要借助视图解析器ViewResolver通过解析得到真正的视图名,从而获得视图对象(比如jsp)
(6)之后DispatcherServlet使用之前的Model数据对这个视图View进行页面渲染。
(7)最后返回客户端,可以是html、pdf、xml、json等。

对DispatcherServlet的源码分析

DispatcherServlet可以说是Spring mvc最核心的一个组件,而Spring是如何将业务层的spring mvc的上下文组件装配在这个统一的DispatcherServlet中的呢?我们可以通过对DispatherServlet的源码分析找到答案,下面是DispatcherServler的一些代码,首先DispatcherServlet是继承FramerworkServlet类,而这个FrameworkServlet类又是继承的HttpServletBean,我们现对这个FrameworkServlet的源码中重要方法进行分析,如下:

protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String method = request.getMethod();
        if (method.equalsIgnoreCase(RequestMethod.PATCH.name())) {
            //这一这里
            processRequest(request, response);
        }
        else {
            super.service(request, response);
        }
    }

@Override
    protected final void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

//注意这里
        processRequest(request, response);
    }

@Override
protected final void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        processRequest(request,
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值