zoukankan      html  css  js  c++  java
  • SpringMVC之DispatcherServlet详解

    SpringMVC是一种基于请求启动的WEB框架,并且使用了前端控制器的设计模式,所有满足【WEB-INF/web.xml】文件中的【url-pattern】的匹配条件的请求,这些满足的请求都会交给这个前端控制器。而这个前端控制器就是【DispatcherServlet,然后再由这个前端控制器转交给满足URL匹配的页面控制器,这个前端控制器就是提供一个统一的访问点。

    概念:

    • DispatcherServlet(前端控制器)
    • HandleMapping(控制器映射器)
    • HandleExecutionChain(处理器执行链,包括若干拦截器和一个处理器)
    • HandleAdapter(处理器映射器)
    • Handle(处理器)
    • Model(模型数据)
    • View(视图)
    • ModelAndView(包括Model和View)
    • ViewResolver(视图解析器)

    一、SpringMVC的一个请求的流程图:

     步骤:

    • 用户发起请求到DispatcherServlet
    • DispatcherServlet通过HandleMapping根据url查找Handle,最终返回给DispatcherServlet一个HandleExecutionChain
    • DispatcherServlet通过HandleAdapter执行Handle,最终返回给DispatcherServlet一个ModelAndView
    • DispatcherServlet通过ViewResolver进行视图解析,最终返回给DispatcherServlet一个View
    • DispatcherServlet进行视图渲染,将模型数据填充到request域
    • DispatcherServlet返回响应结果

    二、DispatcherServlet的功能:

    • DispatcherServlet通过HandlerMapping,将请求映射到一个页面处理器上(返回一个HandlerExecutionChain,它包括多个HandlerInterceptor连接器,和一个Handler处理器)
    • DispatcherServlet通过HandlerAdapter支持多种类型的处理器(例如:SimpleControllerHandlerAdapter,   AnnotationMethodHandlerAdapter等等)
    • 通过ViewResolver解析逻辑视图名到具体的视图名
    • 渲染具体的视图
    • 在执行过程中,如果遇到异常HandlerExceptionResolver处理
    • 文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析。

    三、DispatcherServlet在web.xml文件中的配置参数

        <servlet>
                <!--servlet的一个名称-->
                <servlet-name>do</servlet-name>
                <!--Dispatcherservlet所在的类路径-->
                <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
                <!--下面可以不写,他有一个默认的contextConfigLocation配置,默认的param-value是<servlet-name>的值-servlet.xml文件-->
                <init-param>
                    <param-name>contextConfigLocation</param-name>
                    <param-value>/WEB-INF/do-servlet.xml</param-value>
                </init-param>
                <!--在服务器启东时,初始化改servlet-->
                <load-on-startup>1</load-on-startup>
            </servlet>
            <servlet-mapping>
                <servlet-name>do</servlet-name>
                <url-pattern>*.do</url-pattern>
            </servlet-mapping>

    这个servlet就是设置DispatcherServlet的。

    • load-on-startup就是在启动服务器的时候,初始化该servlet
    • init-param就是这个DispatcherServlet的属性值,可以自己配置初始化参数,这样就会把默认的参数值覆盖掉:其中param-name就是属性名,而param-value就是对应的属性值

    主要参数有:

    参数

    描述

    contextClass

    实现WebApplicationContext接口的类,当前的servlet用它来创建上下文。如果这个参数没有指定, 默认使用XmlWebApplicationContext。

    contextConfigLocation

    传给上下文实例(由contextClass指定)的字符串,用来指定上下文的位置。这个字符串可以被分成多个字符串(使用逗号作为分隔符) 来支持多个上下文(在多上下文的情况下,如果同一个bean被定义两次,后面一个优先)。他有一个默认值:servlet的name-servlet.xml的配置文件,如果设置的话,就会覆盖默认值

    namespace

    WebApplicationContext命名空间。默认值是[server-name]-servlet。


    四、上下文的关系:

    集成WEB环境的通用配置,在web.xml文件中设置:

        <context-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>/WEB-INF/applicationContext.xml</param-value>
                <!--默认值是:applicationContext.xml-->
            </context-param>
            
            <!--作用就是在启动web服务器时,自动装配ApplicationContext的配置信息-->
            <listener>
                <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
            </listener>

    如上设置是Spring集成WEB框架的通用配置,一般用于加载除了WEB层的Bean,例如(DataSource,dao,service等等)的Bean以便于与其他任何WEB框架的集成

    • contextConfigLocation,用于设置Spring的配置文件。有一个默认值,是applicationContext.xml。
    • contextClass:用于设置加载Bean的ApplicationContext的实现类,默认值是WebApplicationContext。
    • listener监听器,就是在服务器启动时,自动装配applicationContext的配置信息。


    五、ContextLoaderListener初始化的上下文和DispatcherServlet初始化的上下文的关系:

    从图中可以看出:

    • ContextLoadListener配置的上下文加载的Bean是对整个应用程序所共享,不管使用什么表现层技术,一般如dao,service,dataSource等等。
    • DispatcherServlet配置的上下文加载的Bean只能是Spring-WEB-MVC有效的Bean,例如controller,handlerMapping,handlerAdapter等等。

    六、初始化默认的上下文参数:

    在DispatcherServlet中的initStrategies方法中,初始化使用的策略:

        public class DispatcherServlet extends FrameworkServlet {
             //实现子类的onRefresh()方法,该方法委托为initStrategies()方法。
            @Override
            protected void onRefresh(ApplicationContext context) {
               initStrategies(context);
            }
         
            //初始化默认的Spring Web MVC框架使用的策略(如HandlerMapping)
            protected void initStrategies(ApplicationContext context) {
               initMultipartResolver(context);
               initLocaleResolver(context);
               initThemeResolver(context);
               initHandlerMappings(context);
               initHandlerAdapters(context);
               initHandlerExceptionResolvers(context);
               initRequestToViewNameTranslator(context);
               initViewResolvers(context);
               initFlashMapManager(context);
            }
        ……
        }

    DispatcherServlet在启动时,会进行我们在Spring-MVC的中设置了init-param的属性值配置,就是用指定的属性值,如果没有设置就是用默认的属性。

    默认的属性值在:Spring-webmvcjar包下的org.springframework.web.servlet.DispatcherServlet.properties中配置。例如:

    org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
    
    org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
    
    org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,
        org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
    
    org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,
        org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,
        org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
    
    org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,
        org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,
        org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
    
    org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
    
    org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
    
    org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

    如上的Bean配置,会在DispatcherServlet启动时,会自动配置这些特殊的Bean,如果我们设置就不会自动装配对应的Bean,而是会加载你在xml文件中设置的bean

    七、DispatcherServlet的特殊的Bean:

    • controller:就是页面控制器,可以使用@controller注解方式,可以实现Controller接口的方式。
    • HandlerMapping:就是请求处理器的映射。默认值就是【上面代码的第3条】,可以通过注解,Bean的name值等等。
    • HandlerAdapter:HandlerAdapter会将处理器包装成适配器。默认值就是【上面代码的第4条】.例如:如SimpleControllerHandlerAdapter将对实现了Controller接口的Bean进行适配,执行处理器的handleRequest方法进行功能。
    • ViewResolver:用于将逻辑视图名传话为集体的视图名。默认值就是【上面代码的倒数第2条】。需要设置他的前缀,和后缀等信息。
    • LocalResover:用于本地序列化,支持国际化。
    • ThemeResovler:主题解析。
    • MultipartResolver:文件上传解析,用于支持文件上传。
    • HandlerExceptionResolver:处理器异常解析,可以将异常映射到相应的统一错误界面,从而显示用户友好的界面。
    • RequestToViewNameTranslator:当处理器没有返回逻辑视图名等相关信息时,自动将请求URL映射为逻辑视图名。

    ---------------------
    作者:cw_hello1
    来源:CSDN
    原文:https://blog.csdn.net/cw_hello1/article/details/51325122
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    如何在页面加载完成后再去做某事?什么方法可以判断当前页面加载已完成?
    让MySQL支持Emoji表情
    mysql utf8mb4与emoji表情
    移动前端手机输入法自带emoji表情字符处理
    统计网站的每日访问量
    yii中登录后跳转回登录前请求的页面
    YII相关资料(干货)
    [2014-08-24]为 Xamarin Studio 创建的 Asp.Net Mvc 项目配置 gitignore
    [2014-08-28]Mac系统上的几个命令解释器(控制台)
    [2014-08-18]初尝 AspNet vNext On Mac
  • 原文地址:https://www.cnblogs.com/caozx/p/10174666.html
Copyright © 2011-2022 走看看