zoukankan      html  css  js  c++  java
  • Spring MVC初始化

       整个Spring MVC的初始化,配置了DispatcherServlet和ContextLoaderListener,那么它们是如何初始化Spring IoC容器上下文和映射请求上下文的呢?所以这里的初始化会涉及两个上下文的初始化,只是映射请求上下文是基于Spring IoC上下文扩展出来,以适应JavaWeb工程的需要。

    初始化Spring IoC上下文

      Java Web容器为其生命周期中提供ServletContextListener接口,这个接口可以在Web容器初始化和结束期中执行一定的逻辑,换句话说,通过实现它可以使得在DispatcherServlet初始化前就可以完成Spring IoC容器的初始化,也可以在结束期完成对Spring IoC容器的销毁,只要实现ServletContextListener接口的方法就可以了。

    初始化映射请求上下文

      映射请求上下文是通过DispatcherServlet初始化的,它和普通的Servlet也是一样的,可以根据自己的需要配置它在启动时初始化,或者等待用户第一次请求的时候进行初始化。注意,也许你在Web工程中并没有注册ContextLoaderListener,这个时候DispatcherServlet就会在其初始化的时候进行对Spring IoC容器的初始化。这样你也许会有一个疑问:选择在什么时候初始化DispatcherServle?首先,初始化一个Spring IoC容器是一个耗时的操作,所以这个工作不应该放到用户请求上,没有必要让一个用户陷入长期等待中,因此大部分场景下,都应该让DispatcherServle在服务器启动期间就完成Spring IoC容器的初始化,我们可以在Web容器刚启动的时候,也可以在Web容器载入DispatcherServle的时候进行初始化。笔者的建议是在Web容器刚开始的时候对其初始化,因为在整个Web的初始化中,不只是DispatcherServle需要使用到Spring IoC的资源,其他的组件可能也需要。在最开始就初始化可以让Web中的各个组件共享资源。当然你可以指定Web容器中组件初始化的顺序,让DispatcherServle第一个初始化,来解决这个问题,但是这就加大了配置的复杂度,因此大部分的情况下都建议使用ContextLoaderListener进行初始化。


      从图中可以看出,DispactherServlet的父类是FrameworkServlet,而FrameworkServlet的父类则是HttpServletBean。HttpServletBean继承了Web容器所提供的HttpServlet,所以它是一个可以载入Web容器中的Servlet。

    Spring MVC的核心组件
      •MultipartResolver:文件解析器,用于支持服务器的文件上传。
      •LocaleResolver:国际化解析器,可以提供国际化的功能。
      •ThemeResolver:主题解析器,类似于软件皮肤的转换功能。
      •HandlerMapping:Spring MVC中十分重要的内容,它会包装用户提供一个控制器的方法和对它的一些拦截器,后面会着重谈它,通过调用它就能够运行控制器。
      •handlerAdapter:处理器适配器,因为处理器会在不同的上下文中运行,所以Spring MVC会先找到合适的适配器,然后运行处理器服务方法,比如对于控制器的SimpleControllerHandlerAdapter、对于普通请求的HttpRequestHandlerAdapter等。
      •HandlerExceptionResolver:处理器异常解析器,处理器有可能产生异常,如果产生异常,则可以通过异常解析器来处理它。比如出现异常后,可以转到指定的异常页面,这样使得用户的UI体验得到了改善。
      •RequestToViewNameTranslator:视图逻辑名称转换器,有时候在控制器中返回一个视图的名称,通过它可以找到实际的视图。当处理器没有返回逻辑视图名等相关信息时,自动将请求URL映射为逻辑视图名。
      •ViewResolver:视图解析器,当控制器返回后,通过视图解析器会把逻辑视图名称进行解析,然后定位实际视图。

    使用注解配置方式初始化

      由于在Servlet3.0之后的规范允许取消web.xml配置,只使用注解方式便可以了,所以在Spring3.1之后的版本也提供了注解方式的配置。使用注解方式很简单,首先继承一个名字比较长的类AbstractAnnotationConfigDispatcherServletInitializer,然后实现它所定义的方法。它所定义的内容就不是太复杂,甚至是比较简单的,让我们通过一个类去继承它,如代码清单14-10所示,它实现的是入门实例的功能。
      代码清单14-10:通过注解方式初始化Spring MVC
    package com.ssm.chapter14.config;
    
    import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
    
    public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    
        //Spring IoC容器配置
        //getRootConfigClasses获取Spring IoC容器的Java配置类,用以装载各类Spring Bean。
        @Override
        protected Class<?>[] getRootConfigClasses() {
            //可以返回Spring的Java配置文件数组
            return new Class<?>[]{};
        }
    
        //DispatcherServlet的URI映射关系配置
        //getServletConfigClasses获取各类Spring MVC的URI和控制器的配置关系类,用以生成Web请求的上下文。
        @Override
        protected Class<?>[] getServletConfigClasses() {
            //可以返回Spring的Java配置文件数组
            return new Class<?>[]{WebConfig.class};
        }
    
        //DispatcherServlet拦截内容
        // getServletMappings定义DispatcherServlet拦截的请求。
        @Override
        protected String[] getServletMappings() {
            return new String[]{"*.do"};
        }
    
    }
      MyWebAppInitializer也实现了WebApplicationInitializer接口。ContextLoader和DispatcherServlet的初始化器都是抽象类,通过它们就能初始化Spring IoC上下文和映射关系上下文,这就是只要继承AbstractAnnotationConfigDispatcherServle-tInitializer类就完成了DispatcherServlet映射关系和SpringIoC容器的初始化工作的原因。

      代码清单14-12:WebConfig.java
    package com.ssm.chapter14.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.ViewResolver;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.view.InternalResourceViewResolver;
    
    @Configuration
    //定义扫描的包,加载控制器
    @ComponentScan("com.ssm.chapter14.*")
    //启用Spring Web MVC
    @EnableWebMvc
    public class WebConfig {
    
        /***
         * 创建视图解析器
         *  @return 视图解析器
         */
        @Bean(name = "viewResolver")
        public ViewResolver initViewResolver() {
            InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
            viewResolver.setPrefix("/WEB-INF/jsp/");
            viewResolver.setSuffix(".jsp");
            return viewResolver;
        }
    
    }
      这段代码和Spring IoC使用Java的配置也是一样的,只是多了一个注解@EnableWebMvc,它代表启动Spring MVC框架的配置。和入门实例同样也定义了视图解析器,并且设置了它的前缀和后缀,这样就能获取由控制器返回的视图逻辑名,进而找到对应的JSP文件。
      如果还是使用入门实例进行测试,此时可以把web.xml和所有关于Spring IoC容器所需的XML文件都删掉,只使用上面两个Java文件作为配置便可以了,然后重启服务器 
  • 相关阅读:
    linux安装nginx
    git配置多个SSH密钥
    webpack加载器安装node-sass失败的解决方法
    Vue-cli webpack打包之后index.html缺少引号的问题
    算法:一个数组中所有元素的最小公倍数
    JS 实现一个睡眠函数sleep
    剑指offer 牛客67道题集合
    剑指offer
    剑指offer
    剑指offer
  • 原文地址:https://www.cnblogs.com/ooo0/p/11103548.html
Copyright © 2011-2022 走看看