美文网首页
关于Servlet3.0新增特性ServletContainer

关于Servlet3.0新增特性ServletContainer

作者: 呓语的风 | 来源:发表于2019-02-21 18:31 被阅读0次
简介
  • Servlet容器启动会扫描当前应用里面每一个jar包的ServletContainerInitializer实现。
  • 实现类必须绑定在META-INF/services/javax.servlet.ServletContainerInitializer的文件中,文件的内容就是实现类的全类名。


    配置文件的位置
使用方式:

ServletContext增加filter或listener,容器会自动加载,可以直接使用,不需要在web.xml中配置,如果做框架就省去了配置web.xml的步骤

public class StrutsContainerInitializer implements ServletContainerInitializer {
    private static final Logger logger = 
LoggerFactory.getLogger(StrutsContainerInitializer.class);

    public void onStartup(Set<Class<?>> initializerClasses, ServletContext ctx) 
throws ServletException {
        ctx.addFilter("StrutsFilter", StrutsFilter.class);
        logger.debug("ServletContext start up with a struts filter");
                ctx.addListener(SessionListener.class); //Session监听
    }

}

使用@HandlesTypes注解后,Servlet容器会扫描到当前应用里我们自己实现的类,然后把它们放在initializerClasses集合里,这样我们就可以在容器初始化时写一些需要预加载的代码

@HandlesTypes(WebInitializer.class)
public class StrutsContainerInitializer implements ServletContainerInitializer {
    private static final Logger logger = 
LoggerFactory.getLogger(StrutsContainerInitializer.class);

    public void onStartup(Set<Class<?>> initializerClasses, ServletContext ctx) 
throws ServletException {
        if (initializerClasses == null || initializerClasses.isEmpty()) {
            logger.debug("No web initializer classes");
            return;
        }

        for (Class<?> clazz : initializerClasses) {
            try {
                ((WebInitializer) clazz.newInstance()).onStartup(ctx);
                logger.debug("WebInitializer {} started", clazz.getName());
            } catch (InstantiationException | IllegalAccessException e) {
                logger.error("WebInitializer start faild", e);
            }
        }
    }

}

有兴趣的童鞋可以亲自尝试一下。

相关文章

网友评论

      本文标题:关于Servlet3.0新增特性ServletContainer

      本文链接:https://www.haomeiwen.com/subject/liydyqtx.html