`
Donald_Draper
  • 浏览: 951878 次
社区版块
存档分类
最新评论

Spring-DispatcherServlet请求处理

阅读更多
Spring-DispatcherServlet初始化详解:http://donald-draper.iteye.com/blog/2325394
Spring的DefaultAnnotationHandlerMapping详解:http://donald-draper.iteye.com/blog/2325453
前面我们已经探究过DispatcherServlet的初始化,下面我们来看看
DispatcherServlet如何处理web请求
//DispatcherServlet
 public class DispatcherServlet extends FrameworkServlet
{
}

从DispatcherServlet我们看不到任何请求处理入口再来看FrameworkServlet
public abstract class FrameworkServlet extends HttpServletBean
    implements ApplicationContextAware
{
 public FrameworkServlet(WebApplicationContext webApplicationContext)
    {
        contextClass = DEFAULT_CONTEXT_CLASS;
        contextInitializers = new ArrayList();
        publishContext = true;
        publishEvents = true;
        threadContextInheritable = false;
        dispatchOptionsRequest = false;
        dispatchTraceRequest = false;
        webApplicationContextInjected = false;
        refreshEventReceived = false;
        this.webApplicationContext = webApplicationContext;
    }
    //在这里我们发现了处理请求的方法,默认方法
     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);
    }
    //GET
    protected final void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        processRequest(request, response);
    }
    //POST
    protected final void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        processRequest(request, response);
    }
    //PUT
    protected final void doPut(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        processRequest(request, response);
    }
    //DELETE
    protected final void doDelete(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        processRequest(request, response);
    }
    //实际处理请求方法
    protected final void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        try
        {
	   //处理请求
            doService(request, response);
        }
    }
    //带子类DispatcherServlet扩展
     protected abstract void doService(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)
        throws Exception;
    public static final String DEFAULT_NAMESPACE_SUFFIX = "-servlet";
    public static final Class DEFAULT_CONTEXT_CLASS = org/springframework/web/context/support/XmlWebApplicationContext;
    public static final String SERVLET_CONTEXT_PREFIX = (new StringBuilder()).append(org/springframework/web/servlet/FrameworkServlet.getName()).append(".CONTEXT.").toString();
    private static final String INIT_PARAM_DELIMITERS = ",; \t\n";
    private String contextAttribute;
    private Class contextClass;
    private String contextId;
    private String namespace;
    private String contextConfigLocation;
    private final ArrayList contextInitializers;
    private String contextInitializerClasses;
    private boolean publishContext;
    private boolean publishEvents;
    private boolean threadContextInheritable;
    private boolean dispatchOptionsRequest;
    private boolean dispatchTraceRequest;
    private WebApplicationContext webApplicationContext;
    private boolean webApplicationContextInjected;
    private boolean refreshEventReceived;
}

我们来看DispatcherServlet
public class DispatcherServlet extends FrameworkServlet
{
 public DispatcherServlet(WebApplicationContext webApplicationContext)
    {
        super(webApplicationContext);
        detectAllHandlerMappings = true;
        detectAllHandlerAdapters = true;
        detectAllHandlerExceptionResolvers = true;
        detectAllViewResolvers = true;
        throwExceptionIfNoHandlerFound = false;
        cleanupAfterInclude = true;
    }
    //处理请求
     protected void doService(HttpServletRequest request, HttpServletResponse response)
        throws Exception
    {
        //设置请求属性,web上下文,本地化,主题
        request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
        request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, localeResolver);
        request.setAttribute(THEME_RESOLVER_ATTRIBUTE, themeResolver);
        request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
        FlashMap inputFlashMap = flashMapManager.retrieveAndUpdate(request, response);
        if(inputFlashMap != null)
            request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
        request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
        request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, flashMapManager);
	//委托给doDispatch
        doDispatch(request, response);
        
    }

    protected void doDispatch(HttpServletRequest request, HttpServletResponse response)
        throws Exception
    {
        HttpServletRequest processedRequest;
        HandlerExecutionChain mappedHandler;
        boolean multipartRequestParsed;
        WebAsyncManager asyncManager;
        processedRequest = request;
        mappedHandler = null;
        multipartRequestParsed = false;
        asyncManager = WebAsyncUtils.getAsyncManager(request);
        ModelAndView mv;
        Exception dispatchException;
        mv = null;
        dispatchException = null;
        processedRequest = checkMultipart(request);
        multipartRequestParsed = processedRequest != request;
	//获取控制器处理器链
        mappedHandler = getHandler(processedRequest);
        HandlerAdapter ha;
        //获取控制器方法适配器
        ha = getHandlerAdapter(mappedHandler.getHandler());
	//获取处理视图
        mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
	//返回视图
        applyDefaultViewName(request, mv);
    }
   //获取控制器处理器链
   protected HandlerExecutionChain getHandler(HttpServletRequest request)
        throws Exception
    {   
       //List<HashMap<String,HandlerMapping>>
        for(Iterator iterator = handlerMappings.iterator(); iterator.hasNext();)
        { 
            HandlerMapping hm = (HandlerMapping)iterator.next();
            if(logger.isTraceEnabled())
                logger.trace((new StringBuilder()).append("Testing handler map [").append(hm).append("] in DispatcherServlet with name '").append(getServletName()).append("'").toString());
            HandlerExecutionChain handler = hm.getHandler(request);
            if(handler != null)
                return handler;
        }
    }
    //获取控制器方法适配器
    protected HandlerAdapter getHandlerAdapter(Object handler)
        throws ServletException
    {
        //List<HashMap<String,HandlerAdapter>>
        for(Iterator iterator = handlerAdapters.iterator(); iterator.hasNext();)
        {
            HandlerAdapter ha = (HandlerAdapter)iterator.next();
            if(logger.isTraceEnabled())
                logger.trace((new StringBuilder()).append("Testing handler adapter [").append(ha).append("]").toString());
            if(ha.supports(handler))
                return ha;
        }
    }
    private List handlerMappings;//List<HashMap<String,HandlerMapping>>,Key为beanName,value值为HandlerMapping实例
    private List handlerAdapters;//List<HashMap<String,HandlerAdapter>>,Key为beanName,value值为HandlerAdapter实例
    private List handlerExceptionResolvers;
    private List viewResolvers;

    static 
    {
        try
        {
	    //加载默认配置文件
            ClassPathResource resource = new ClassPathResource("DispatcherServlet.properties", org/springframework/web/servlet/DispatcherServlet);
            defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
        }
    }
}

总结:
DispatcherServlet处理请求实际上是通过FrameworkServlet的Service()和do*类方法,
而这些方式实际的处理逻辑在DispatcherServlet的doService和doDispatch中,doDispatch
先找出控制器处理器,然后再找出控制器方法适配器,通过控制器方法适配器,来处理具体请求。
0
0
分享到:
评论

相关推荐

    SpringMVC源码剖析(四)- DispatcherServlet请求转发的实现1

    如果说将Spring上下关联到Servlet容器中,是SpringMVC框架的第个亮点,那么在请求转发流程中,SpringMVC对各种处理环节编程元素的抽象,就

    Spring MVC学习之DispatcherServlet请求处理详析

    主要给大家介绍了关于Spring MVC学习教程之DispatcherServlet请求处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    springboot2 配置多个DispatcherServlet 处理.do .htm请求,Controller分离,集成druid和mybatis

    Springboot 2.4.4 网上搜到的配置多个DispatcherServlet 都有坑,自己避坑写的一个demo,处理.do .htm请求,Controller分离不会出现一个Controller可以处理.do也处理.htm可自己扩展.action .json等,适合分离前台...

    spring-mvc与xfire的集成

    spring-mvc与xfire的集成 对于这样的集成,看看里面的配置文件就行了 一个简单的接口,对应一个...DispatcherServlet本身会管理xfire的请求 配置文件中配置的key可以理解为Controller里面的 RequestMapping的value。

    springweb3.0MVC注解(附实例)

    org.springframework.web.servlet.DispatcherServlet &lt;/servlet-class&gt; &lt;load-on-startup&gt;2&lt;/load-on-startup&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;annomvc&lt;/servlet-name&gt; &lt;url-pattern&gt;*.do...

    SSM框架原理 spring-mvc执行流程

    使用spring MVC负责请求的转发和视图管理 spring实现业务对象管理,mybatis作为数据对象的持久化引擎 springMVC执行流程: 1. 客户端将请求统一提交到DispatcherServlet; 2. DispatcherServlet会将请求交给...

    Spring源码学习十:DispatcherServlet请求分发源码分析1

    总结:首先,SpringMVC框架在启动的时候会遍历Spring容器中的所有bean,对标注了@Controller或并,使用@RequestMapping注解

    SSM+MAVEN+MYSQL框架整合原理+源码

    2.通过核心控制器DispatcherServlet调用请求解析器:HandlendMapping对请求进行解析,通过映射关系匹配到Controller层 3.在控制层调用业务逻辑层(service),数据持久层(DAO)返回控制层,请求完成获取一个结果,...

    Spring MVC 教程 快速入门 深入分析

    十五、spring mvc 处理ajax请求 十六、spring mvc 关于写几个配置文件的说明 十七、spring mvc 如何取得Spring管理的bean 十八、spring mvc 多视图控制器 十九、 &lt;mvc:annotation-driven /&gt; 到底做了什么工作

    Spring MVC入门教程

    十五、spring mvc 处理ajax请求 十六、spring mvc 关于写几个配置文件的说明 十七、spring mvc 如何取得Spring管理的bean 十八、spring mvc 多视图控制器 十九、 &lt;mvc:annotation-driven /&gt; 到底做了什么工作 二十、...

    Spring MVC之DispatcherServlet详解_动力节点Java学院整理

    DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处。 具体请参考第二章的图2-1。  ...

    spring-playground:Spring游乐场

    为loadOnStartup配置DispatcherServlet:不要通过初始化延迟第一个请求。 自ErrorController( sample.service.error.CustomErrorHandler ):更换白色标签错误页面。 自ErrorAdvice( sample.service.error....

    SpringMVC框架架构介绍

    十五、spring mvc 处理ajax请求 十六、spring mvc 关于写几个配置文件的说明 十七、spring mvc 如何取得Spring管理的bean 十八、spring mvc 多视图控制器 十九、 &lt;mvc:annotation-driven /&gt; 到底做了什么工作 二十...

    Spring MVC 入门实例

    然后我们再配置 Servlet 映射(servlet-mapping 标签), 也就是你希望哪些请求被DispatcherServlet处理. 这里, 我们设置后缀名为 do(*.do) 的所有URL请求都被名为 ideawu 的 DispatcherServlet 的程序处理. 选择 .do ...

    spring-demo:手写实现Spring核心功能

    配置如下:scanPackage=top.jinjinz.springweb.xml 配置配置自定义Servlet DispatcherServlet及设置匹配请求&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;web-app xmlns:xsi=...

    Spring MVC之DispatcherServlet_动力节点Java学院整理

    拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller(我们写的Action)来处理。  “某某规则”:是根据你使用了哪个HandlerMapping接口的实现类的不同而不同。  ...

    spring mvc 思维导图

    Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还能支持文件上传。...

    java spring mvc

    首先客户端发出spring mvc请求,请求到达DispatcherServlet主控制器处理(前端控制器) b.主控制器调用HandlerMapping组件,根据请求不同调用Controller处理器 c.主控制器调用Controller方法处理请求,(对DB操作可以...

    入门案例-SpringMVC技术架构图

    Spring MVC以DispatcherServlet为核心,众多组件如HandlerMapping为辅助,为用户封装了请求映射等底层逻辑,让用户可以更专注与业务逻辑的处理。本文会对Spring MVC整体结构做简单介绍。 Spring MVC结构图 Spring ...

    Spring面试题

    1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。 2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller. 3....

Global site tag (gtag.js) - Google Analytics