怎么向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还提供了其他方式,感兴趣的可以去查阅相关资料。
本文来自博客园,作者:诸葛匹夫,转载请注明原文链接:https://www.cnblogs.com/shenxingzhuge/p/18732260
卡里离冰冷的40个亿还差39多个亿
浙公网安备 33010602011771号