1.使用内嵌tomcat
首先导入依赖
<dependencies>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.38</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>9.0.38</version>
</dependency>
</dependencies>
编写main方法
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
public class TestTomcat {
private static int port = 8080;
private static String contextPath = "/";
public static void main(String[] args) throws LifecycleException {
Tomcat tomcat = new Tomcat();
// 设置工作目录
String baseDir = Thread.currentThread().getContextClassLoader().getResource("").getPath();
// 设置端口
tomcat.setPort(port);
// 设置contextPath
tomcat.addWebapp(contextPath, baseDir);
tomcat.enableNaming();
tomcat.start();
// 该tomcat版本在start()时未初始化连接器,需要手动初始化连接器,可能也是为了让用户自己拓展,这里使用默认的
tomcat.getConnector();
// 若不想使用默认的,可以自己创建,并调用tomcat.setConnector(connector)
// Connector connector = new Connector("HTTP/1.1");
// connector.setPort(port);
// tomcat.setConnector(connector);
tomcat.getServer().await();
}
}
启动,看到了我们熟悉的日志
2.tomcat的spi
传统的Servlet注册是配置在/WEB-INF/web.xml下,在容器启动的时候注册Servlet。Servlet3规范为我们又提供了一种更加方便的注册方法。容器启动的时候扫描jar包,找到jar包下一个文件路径为下面这个的文件。
META-INF/services/javax.servlet.ServletContainerInitializer
该文件指定的类会由容器实例化并调用其onStartUp方法,我们可以在其中动态注册servlet,filter等。
- 首先新建该文件,并添加内容
- 创建MyServletContainerInitializer,重写onStartUp方法,注册一个dispatcherServlet和一个dispatcherFilter
import javax.servlet.*;
import java.util.EnumSet;
import java.util.Set;
public class MyServletContainerInitializer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> set, ServletContext servletContext) {
ServletRegistration.Dynamic servletDynamic = servletContext.addServlet("dispatcherServlet", DispatcherServlet.class);
servletDynamic.addMapping("/*");
FilterRegistration.Dynamic filterDynamic = servletContext.addFilter("dispatcherFilter", DispatcherFilter.class);
filterDynamic.addMappingForServletNames(EnumSet.of(DispatcherType.REQUEST),false,"dispatcherServlet");
}
}
- DispatcherServlet
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class DispatcherServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("text/json;charset=UTF-8");
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
System.out.println("dispatcherServlet执行...");
String res ="this is dispatcherServlet!";
out.println(res);
out.flush();
out.close();
}
}
- DispatcherFilter
import javax.servlet.*;
import java.io.IOException;
public class DispatcherFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException, ServletException, IOException {
System.out.println("dispatcherServlet执行前");
chain.doFilter(request,response);
System.out.println("dispatcherServlet执行后");
}
}
启动tomcat并访问
可以看到注册的servlet和filter都已经执行了
3.springmvc与tomcat的spi
打开springmvc的jar包,发现其目录下就有javax.servlet.ServletContainerInitializer文件
不过springboot中springmvc的dispatcherServlet并不是通过这种方式注册的
更多章节及原创Java内容可在小程序查看