怎么向tomcat注册servlet

这个问题非常简单,我们在学习tomcat的时候就最少介绍过两种方式

第一种:基于xml的配置,第二种基于@WebServlet注解也能将servlet注册到tomcat中

接下来介绍鲜为人知的一些注册servlet操作

 

使用tomcat提供的sci(ServletContainer)机制

这种用法也很简单,实现tomcat提供的一个接口 ServletContainerInitializer,然后实现onStartup方法

 

复制代码
package com.bl;

import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import javax.servlet.annotation.HandlesTypes;
import java.util.Set;

/**
 * Description:
 *
 * @author shihongwei
 * @email 1224028994@qq.com
 */
@HandlesTypes(UserService.class)
public class MyServletContainerInitializer implements ServletContainerInitializer {
    /**
     * 当应用服务器启动的时候,会调用onStartup方法,在这个方法中可以注册Servlet,Filter,Listener
     *
     * @param c   HandlesTypes注解 里面的class对象会在回调onStartup方法中被传入
     * @param ctx
     * @throws ServletException
     */
    @Override
    public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
        MyServlet myServlet = new MyServlet();
        // 注册一个Servlet
        ServletRegistration.Dynamic dy = ctx.addServlet("myServlet", myServlet);
        // 设置tomcat 启动时加载servlet
        dy.setLoadOnStartup(1);
        // 配置servlet路径
        dy.addMapping("/myServlet");
    }
}
复制代码

 

 

然后在你的类路径下建立目录和文件

META-INF\services\javax.servlet.ServletContainerInitializer

文件里面的内容就是你的实现类

 

这样就将servlet注册到tomcat中去了。

 

如果你使用的是springmvc框架,还有种办法能注册servlet

 

复制代码
public class MyWebApplicationInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        MyServlet myServlet = new MyServlet();
        // 注册一个Servlet
        ServletRegistration.Dynamic dy = servletContext.addServlet("myServlet", myServlet);
        // 设置tomcat 启动时加载servlet
        dy.setLoadOnStartup(1);
        // 配置servlet路径
        dy.addMapping("/myServlet");
    }
}
复制代码

 

其实springmvc的org.springframework.web.WebApplicationInitializer接口就是第一种方式提到的HandlesTypes注解中感兴趣的类

springmvc内部也有个类实现了sci,这个类是SpringServletContainerInitializer

 

那么tomcat在启动的时候就会回调SpringServletContainerInitializer的onStartup方法,在这个方法中拿到WebApplicationInitializer的实现类,比如我写的

MyWebApplicationInitializer,然后继续回调WebApplicationInitializer的onStartup方法从而完成servlet的注册。

 

其实说到底还是sci机制,只是springmvc封装了一层,我们无需再次写文件了。

tomcat提供的sci也是springboot没有web.xml文件依然能注册servlet的原因

 

那么如果你使用的是springboot项目,上面的那两种方式将会失效,至于是为什么,我估计是springboot的使用的是内嵌tomcat,内嵌tomcat的启动是用tomcat这个类启动的,这个类可能

没有进行sci的处理,外置的tomcat是通过BootStrap这个门面类来启动的,处理了sci流程。以上只是猜测,等到时候看源码吧。还有很长时间要走。

springboot给我们提供了其他的方式添加servlet等组件,我推荐使用的是ServletComponentScan注解,然后设置扫描的servlet包路径即可

如果扫描的包路径跟扫描的bean路径一样,就可以不用配置包路径,然后还要在servlet上加上

 

@WebServlet(urlPatterns = "/myServlet",loadOnStartup = 2)
public class MyServlet extends HttpServlet

 

这是servlet的原生注解

当然springboot还提供了其他方式,感兴趣的可以去查阅相关资料。

 

posted @   诸葛匹夫  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示