zoukankan      html  css  js  c++  java
  • Spring中DispatcherServlet的运行机制

    DispatcherServlet是spring的web框架(以下简称SpringWeb)中的核心servlet."Spring的web框架——象其它web框架一样——是一个请求驱动的web框架,其设计围绕一个能将请求分发到控制器的servlet,它也提供其它功能帮助web应用开发。"----《Spring Framework 开发参考手册(中文版)》而在SpringWeb框架中这个servlet就是org.springframework.web.servlet.DispatcherServlet。这个Servlet的继承关系如下图所示:SpringWeb首先将传统的HttpServlet抽象类包装成了Bean;FrameworkServlet抽象出了web框架中的servlets的一些基本行为,比如对application context的访问;DispatcherServlet的主要工作就是将一个request分发到一个合适的处理器上,并将处理返回的ModelAndView绘制出来返回给客户端。

    DispatcherServlet作为一个Servlet那他一定有两个主要的方法:init()和doService()。

    一 init()初始化。DispatcherServlet继承体系中init()方法的实现位于HttpServletBean中,HttpServletBean首先调用initBeanWrapper(),初始化BeanWrapper,然后调用抽象方法initServletBean(),这个方法的实现位于他的子类FrameworkServlet中;FramewordServlet中的initServletBean()方法将调用initWebApplicationContext(),初始化WebApplicationContext,然后同样调用他的抽象方法initFrameworkServlet(),而这个抽象方法的实现位于最终的DispatcherServlet中;DispatcherServlet中的initFrameworkServet()将依次初始化Multipar(用作文件上传)解析器、本地化信息解析器、主题解析器处理器映射等等内容。所以DispatcherServlet的初始化顺序为init();initBeanWrapper();

    initServletBeaninitWebApplicationContext()

    initFramework();initMultipartResolver();initLocaleResolver();initThemeResolver();initHandlerMappings();initHandlerAdapters();initHandlerExceptionResolvers();initViewResolvers();

    二 doService()处理请求。DispatcherServlet中无论是通过post方式还是get方式提交的request,最终都会交由doService()处理。doService()中的处理逻辑大致分以下六个步骤:1.if(request是MultiPart,即文件上传) 则将request解析并包装成MultipartHttpServletRequest2.mappedHandler = getHandler(request)根据request得到相应的处理器3.调用注册的所有拦截器的preHandle方法4.调用处理器    HandlerAdapter ha = new getHandlerAdapter(mappedHandler.getHandler());    ModelAndView mv = ha.handle(req, res, mappedHandler.getHandler())//这里使用了adapter模式5.调用注册的所有拦截器的postHandle方法6.绘制mv

    也许Spring不像Struts、hibernate那样是使用最为广泛的,但他是全面的、轻量级的、足够灵活的、容易替换、容易扩展的。SpringWeb是SpringFramework中的一个部分,而DispatcherServlet又是SpringWeb中的一小部分,要弄懂Spring以及他背后的设计思想,对我等菜鸟而言,还是有很长一段路要走的。但愿在新的一条路出现之前,我们已经走遍了这条路。路漫漫其修远兮,吾将上下而求索。继续研究ing...to be continue...

    参考资料Spring官方网站 http://www.springframework.org/Spring API http://www.springframework.org/docs/api/index.htmlSpring Reference Documentation http://www.springframework.org/docs/reference/index.htmlSpring Framework 开发参考手册(中文版)http://www.jactiongroup.net/reference/html/index.html

  • 相关阅读:
    Leetcode 92. Reverse Linked List II
    Leetcode 206. Reverse Linked List
    Leetcode 763. Partition Labels
    Leetcode 746. Min Cost Climbing Stairs
    Leetcode 759. Employee Free Time
    Leetcode 763. Partition Labels
    搭建数据仓库第09篇:物理建模
    Python进阶篇:Socket多线程
    Python进阶篇:文件系统的操作
    搭建数据仓库第08篇:逻辑建模–5–维度建模核心之一致性维度2
  • 原文地址:https://www.cnblogs.com/chenzhao/p/2749154.html
Copyright © 2011-2022 走看看