嵌入式Tomcat

嵌入式Tomcat:非传统的部署方式,将Tomcat嵌入到主程序中进行运行。

优点:灵活部署、任意指定位置、通过复杂的条件判断。

发展趋势:SpringBoot默认集成的是Tomcat容器。

SpringBoot中Maven引入Tomcat:

org.springframework.boot spring-boot-starter-tomcat provided

Maven集成Tomcat插件:

org.apache.tomcat.maven tomcat7-maven-plugin 2.2

插件运行:

  • 选择pom.xml文件,点击右键——>选择 Run As——> Maven build;
  • 在Goals框加加入以下命令: tomcat7:run。

Maven集成Tomcat插件启动Tomcat是常用的Tomcat嵌入式启动。

Maven集成Tomcat插件启动分析:

  1. 分析它的启动:Tomcat7RunnerCli是引导类;
  2. 进一步分析:Tomcat7RunnerCli主要依靠Tomcat7Runner;
  3. 分析结论:原来嵌入式启动就是调用了Tomcat的API来实现的。

Tomcat本身提供了外部可以调用的API,它是实现嵌入式Tomcat的基础。

Tomcat类:

image-20201116170754039

  1. 位置:org.apache.catalina.startup.Tomcat;
  2. 该类是public的;
  3. 该类有Server、Service、Engine、Connector、Host等属性;
  4. 该类有init()、start()、stop()、destroy()等方法。

手写嵌入式Tomcat思路分析:

image-20201116171025020

  1. 新建一个Tomcat对象;
  2. 设置Tomcat的端口号;
  3. 设置Context目录;
  4. 添加Servlet容器;
  5. 调用Tomcat对象start();
  6. 强制Tomcat等待。

手写嵌入式Tomcat实现步骤:

  1. 准备好一个简单的Servlet项目;
  2. 新建一个手写嵌入式Tomcat工程;
  3. Tomcat工程中使用一个类完成手写嵌入式Tomcat的功能;
  4. 调用该类的main方法执行;
  5. 效果演示和分析。

示例Servlet:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class DemoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html><html>");
out.println("<head>");
out.println("<meta charset=\"UTF-8\" />");
out.println("<title></title>");
out.println("</head>");
out.println("<body bgcolor=\"white\">");
out.println("<h1>Oliver King</h1>");
out.println("</body>");
out.println("</html>");
}
}

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 把目录的绝对的路径获取到
String classpath = System.getProperty("user.dir");
System.out.println(classpath);
// 创建一个Tomcat Server
Tomcat tomcat = new Tomcat();

// 设置Tomcat的端口
Connector connector = tomcat.getConnector();
connector.setPort(8080);
// 设置Host
Host host = tomcat.getHost();
// 根据xml配置文件来
host.setName("localhost");
host.setAppBase("webapps");
// 要把class加载进来,把启动的工程加入进来了
Context context =tomcat.addContext(host, "/", classpath);

// 把Servlet设置进去
Wrapper wrapper = tomcat.addServlet("/", "DemoServlet", new DemoServlet());
wrapper.addMapping("/hello");

// Tomcat跑起来
tomcat.start();
// 强制Tomcat Server等待,避免Main线程执行结束后关闭
tomcat.getServer().await();