怎么向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还提供了其他方式,感兴趣的可以去查阅相关资料。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构