zoukankan      html  css  js  c++  java
  • Spring 4 官方文档学习(十一)Web MVC 框架之编码式Servlet容器初始化

    后面又写了一篇类似的,可以看看 捋一捋Spring Web的源码思路


    在Servlet 3.0+ 环境中,你可以编码式配置Servlet容器,用来代替或者结合 web.xml文件。下面是注册DispatcherServlet :

    import org.springframework.web.WebApplicationInitializer;
    
    public class MyWebApplicationInitializer implements WebApplicationInitializer {
    
        @Override
        public void onStartup(ServletContext container) {
            XmlWebApplicationContext appContext = new XmlWebApplicationContext();
            appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
    
            ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(appContext));
            registration.setLoadOnStartup(1);
            registration.addMapping("/");
        }
    
    }

    WebApplicationInitializer 是由Spring MVC提供的一个接口,可以让你的实现被探测到,并被自动用于初始化任何Servlet 3 容器。 它的一个抽象基类实现是 AbstractDispatcherServletInitializer,可以更容易的注册DispatcherServlet -- 只需要重写相应的方法、指定servlet的映射、指定DispatcherServlet配置的位置即可。

    在基于Java的Spring配置中推荐这样做:

    public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    
        @Override
        protected Class<?>[] getRootConfigClasses() {
            return null;
        }
    
        @Override
        protected Class<?>[] getServletConfigClasses() {
            return new Class[] { MyWebConfig.class };
        }
    
        @Override
        protected String[] getServletMappings() {
            return new String[] { "/" };
        }
    
    }

    如果使用基于XML的Spring配置,应该直接继承AbstractDispatcherServletInitializer (注意,基于Java的配置是继承的AbstractAnnotationConfigDispatcherServletInitializer):

    public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
    
        @Override
        protected WebApplicationContext createRootApplicationContext() {
            return null;
        }
    
        @Override
        protected WebApplicationContext createServletApplicationContext() {
            XmlWebApplicationContext cxt = new XmlWebApplicationContext();
            cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
            return cxt;
        }
    
        @Override
        protected String[] getServletMappings() {
            return new String[] { "/" };
        }
    
    }

    AbstractDispatcherServletInitializer 还提供了一种便捷的方式来添加Filter实例,并让它们自动被映射到DispatcherServlet (就是添加到DispatcherServlet映射的链路上):

    public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
    
        // ...
    
        @Override
        protected Filter[] getServletFilters() {
            return new Filter[] { new HiddenHttpMethodFilter(), new CharacterEncodingFilter() };
        }
    
    }

    注意,添加的每个filter都有一个默认的name -- 基于其类型,且会被自动映射到DispatcherServlet。

    AbstractDispatcherServletInitializer 的isAsyncSupported protected method,可以用来启用DispatcherServlet和所有映射到它的filters的异步支持。默认,已启用,true。

    最后,如果你需要更进一步的定制DispatcherServlet,你可以重写 createDispatcherServlet method。

    官方文档地址:

    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-container-config

  • 相关阅读:
    仿IOS中下拉刷新的“雨滴”效果
    BZOJ 4216 Pig 分块乱搞
    mybatis学习笔记(10)-一对一查询
    关于人性,我是这么看的——“唯进化”论!
    IDEA引MAVEN项目jar包依赖导入问题解决
    IntelliJ IDEA 缓存和索引介绍和清理方法
    springboot整合mybatis使用阿里(阿里连接池)和xml方式
    Intellij 如何在新窗口中打开项目
    intellij idea 在什么地方打开终端Terminal
    Spring Boot 集成MyBatis
  • 原文地址:https://www.cnblogs.com/larryzeal/p/6160426.html
Copyright © 2011-2022 走看看