SpringMVC核心类DispatcherServlet

配置DispatcherServlet

要使用SpringMVC,必须在web.xml中配置好这个DispatcherServlet类

<!-- spring框架必须定义ContextLoaderListener,在启动Web容器时,自动装配Spring applicationContext.xml的配置信息 -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
  <context-param><!-- 指定Spring上下文配置文件 -->
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:applicationContext.xml</param-value>
  </context-param>
  
  <servlet>
    <servlet-name>Dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <!-- 指定SpringMVC配置文件 -->
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/springmvc.xml</param-value>
    </init-param>
  </servlet>
  
  <servlet-mapping>
      <!-- 指定请求的后缀,可以随意写,这里用.html作为请求后缀 -->
    <servlet-name>Dispatcher</servlet-name>
    <url-pattern>*.html</url-pattern>
  </servlet-mapping>

 

DispatcherServlet有一些配置参数,默认情况下我们不用指定,如果需要可通过的指定:
• namespace
• contextConfigLocation
• publishContext
• publishEvents

DispatcherServlet的体系结构

•   DispatcherServlet的核心本质:是一个Servlet
•   init方法在整个系统启动时运行,且只运行一次
•   service方法在系统运行的过程中处于侦听模式,侦听并处理所有的Web请求

DispatcherServlet类的继承体系:

•   依次继承FrameworkServlet和HttpServletBean
•   HttpServletBean是Spring对于Servlet最低层次的抽象
•   FrameworkServlet则是在HttpServletBean的基础之上的进一步抽象。通过FrameworkServlet真正初始化了一个Spring的容器(WebApplicationContext),并引入到Servlet对象之中
•   DispatcherServlet通过initStrategies方法查找并装配Spring容器中用户定义的组件Bean

查看各个类的源码:

HttpServletBean类的初始化源码:

@Override
    public final void init() throws ServletException {
        if (logger.isDebugEnabled()) {
            logger.debug("Initializing servlet '" + getServletName() + "'");
        }

        // Set bean properties from init parameters.
        try {
            PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
            BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);//这句是关键,HttpServletBean利用了Servlet的init()方法的执行特性,将一个普通的Servlet与Spring容器联系在一起,
            ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
            bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, getEnvironment()));
            initBeanWrapper(bw);
            bw.setPropertyValues(pvs, true);
        }
        catch (BeansException ex) {
            logger.error("Failed to set bean properties on servlet '" + getServletName() + "'", ex);
            throw ex;
        }

        // Let subclasses do whatever initialization they like.
        initServletBean();

        if (logger.isDebugEnabled()) {
            logger.debug("Servlet '" + getServletName() + "' configured successfully");
        }
    }

 

FrameworkServlet类的初始化源码:

@Override
    protected final void initServletBean() throws ServletException {
        getServletContext().log("Initializing Spring FrameworkServlet '" + getServletName() + "'");
        if (this.logger.isInfoEnabled()) {
            this.logger.info("FrameworkServlet '" + getServletName() + "': initialization started");
        }
        long startTime = System.currentTimeMillis();

        try {
            this.webApplicationContext = initWebApplicationContext();
            initFrameworkServlet();//注意这句代码
        }
        catch (ServletException ex) {
            this.logger.error("Context initialization failed", ex);
            throw ex;
        }
        catch (RuntimeException ex) {
            this.logger.error("Context initialization failed", ex);
            throw ex;
        }

        if (this.logger.isInfoEnabled()) {
            long elapsedTime = System.currentTimeMillis() - startTime;
            this.logger.info("FrameworkServlet '" + getServletName() + "': initialization completed in " +
                    elapsedTime + " ms");
        }
    }

 

DispatcherServlet类的初始化源码:

protected void initStrategies(ApplicationContext context) {
        initMultipartResolver(context); //初始化上传文件解析器
        initLocaleResolver(context); //初始化本地解析器
        initThemeResolver(context); //初始化主题解析器
        initHandlerMappings(context); //初始化处理器映射器
        initHandlerAdapters(context); //初始化处理器适配器
        initHandlerExceptionResolvers(context); //初始化处理器异常解析器
        initRequestToViewNameTranslator(context); //初始化请求到视图名翻译器
        initViewResolvers(context); //初始化视图解析器
        initFlashMapManager(context); //初始化FlashMap管理器
    }

 

posted @ 2016-04-22 01:48  Mac.Manon  阅读(505)  评论(0编辑  收藏  举报