• spring in action 7.1 小结


    0 AbstractAnnotationConfigDispatcherServletInitializer剖析,在Servlet 3.0环境中,容器会在类路径中查找实现ServletContainerInitializer接口的类,如果能发现的话,就用他来配置SErvlet容器。

    Spring提供了这个接口的实现,名为SpringServletContainerInitializer,这个类会查找实现了WebApplicationInitializer接口的类,并将配置任务交给他们来完成。Spring 3.2引入了 便利的WebApplicationInitializer的实现类,就是AbstractAnnotationConfigDispatcherServletInitializer 。如果一个类继承了AbstractAnnotationConfigDispatcherServletInitializer 同时也就实现了WebApplicationInitializer 接口。当部署到Servlet 3.0容器中的时候,容器会自动发现他,并用来配置Servlet 上下文。

    说明:支持Servlet3.0 服务器,如tomcat 7版本及以上

    0.1 两个应用上下文,DispatcherServlet 和 ContextLoaderListener

    DispatcherServlet 加载包含web组件的bean,如控制器、视图解析器以及处理器映射。

    ContextLoaderListener 加载应用中其他的bean,通常是驱动应用后端的中间层和数据层组件。

    DispatcherServlet 在启动的时候会加载重写的如下方法中的配置类中的bean。

    protected Class<?>[] getServletConfigClasses() {
            return new Class[0];
        }

    0.2 自定义 DispatcherServlet  配置

    AbstractAnnotationConfigDispatcherServletInitializer 将 DispatcherServlet 注册到Servlet 容器后,会调用 customizeRegistration(ServletRegistration.Dynamic registration) ,我们可以对该方法进行重载,从而实现额外的配置。

    传进来的Dynamic 对象可以设置 setMultipartConfig() 对 muitipart 的支持,setInitParameter()设置初始化参数。

    1 添加其他的Servlet和Filter,按照AbstractAnnotationConfigDispatcherServletInitializer的定义,它会创建DispatcherServlet和 ContextLoaderListener。如果你想注册其他的Servlet, Filter, Listener。只需创建一个新的初始化器即可。最简单的方式是实现 spring 的 WebApplicationInitializer 接口。

    在方法中

    1)注册Filter/Servlet/Listener

    2)添加映射路径

    public class MyServletInitializer implements WebApplicationInitializer {
        public void onStartup(ServletContext servletContext) throws ServletException {
            ServletRegistration.Dynamic myServlet = servletContext.addServlet("myServlet", MyServlet.class);
            myServlet.addMapping("/custome/**");
    
        }
    
    }

    例如:添加 characterEncodingFilter 使用如下方法

    public class CharacterEncodingFilterInitializer implements WebApplicationInitializer {
        public void onStartup(ServletContext servletContext) throws ServletException {
            FilterRegistration.Dynamic characterEncodingFilter = servletContext.addFilter("CharacterEncodingFilter", CharacterEncodingFilter.class);
            characterEncodingFilter.setInitParameter("encoding","utf-8");
            characterEncodingFilter.addMappingForUrlPatterns(null, false,"/*");
            
        }
    }

    2 如果将应用部署到支持Servlet 3.0的容器中,那么注册Filter/Servlet/Listener有更简单的方式。

    比如要注册Filter,并且该Filter映射到DispatcherServlet,仅需要重载AbstractAnnotationConfigDispatcherServletInitializer的getServletFilters方法。该方法没有为filter配置映射路径,返回的所有Filter都会映射到DispatcherServlet

    @Override
        protected Filter[] getServletFilters() {
            return new Filter[] {new MyFilter()};
        }
  • 相关阅读:
    初学Python,对于开发工具不是很了解?一文带你选择适合你的开发工具
    Python文学家为Python写的一首词?(附中英文版)
    大数据到底怎么学: 数据科学概论与大数据学习误区
    Python写代码的时候为什么要注释?Sun因此被Oracle收购
    大数据分析:大数据时代如何发现身边的大数据?
    大数据经典学习路线(及供参考)之 一
    关于如何获取移动端 touchmove 事件中真正触摸点下方的元素
    webservice
    VS文件后缀名大全详解
    string 转 char* (C#)
  • 原文地址:https://www.cnblogs.com/zhaopengcheng/p/7056676.html
Copyright © 2020-2023  润新知