做者:享學課堂King老師java
轉載請聲明出處!web
Tomcat是一個很是流行的Web服務器,用於部署和運行Java Web應用程序。通常狀況下,咱們都是在單獨的Tomcat實例上運行本身的Web應用,其實與這種經典方案相比,咱們能夠將服務器運行時直接集成到應用程序中,從而更加的靈活和方便。apache
要使用嵌入式Tomcat並將其運行時與Java Web應用程序打包,請在Maven的pom.xml 文件中添加如下依賴項瀏覽器
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-logging-juli</artifactId>
<version>${tomcat.version}</version>
</dependency>
複製代碼
其中 tomcat.version 是指向Tomcat實際版本的屬性tomcat
<properties>
<tomcat.version>8.0.48</tomcat.version>
</properties>
複製代碼
核心類是org.apache.catalina.startup.Tomcat服務器
例如,如下代碼建立並啓動在端口號8082上運行的嵌入式Tomcat實例架構
package com.xiangxue.embedded;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.Writer;
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
public class EmbeddedTomcatEx {
public static void main(String[] args) throws LifecycleException, InterruptedException, ServletException {
Tomcat tomcat = new Tomcat();
tomcat.setPort(8082);
Context ctx = tomcat.addContext("/", new File(".").getAbsolutePath());
Tomcat.addServlet(ctx, "Embedded", new HttpServlet() {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Writer w = resp.getWriter();
w.write("Embedded Tomcat servlet.\n");
w.flush();
w.close();
}
});
ctx.addServletMapping("/*", "Embedded");
tomcat.start();
tomcat.getServer().await();
}
}
複製代碼
下面咱們分段解釋以上代碼的做用:app
Tomcat tomcat = new Tomcat();
tomcat.setPort(8082);
複製代碼
Tomcat在端口8082上啓動ide
Context ctx = tomcat.addContext("/", new File(".").getAbsolutePath());
複製代碼
每一個應用程序都映射到上下文。使用該addContext()
方法,咱們建立了一個不是JSP文件且沒有web.xml
文件的應用程序。咱們使用根上下文路徑和文檔庫的當前工做目錄。單元測試
Tomcat.addServlet(ctx, "Embedded", new HttpServlet() {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Writer w = resp.getWriter();
w.write("Embedded Tomcat servlet.\n");
w.flush();
w.close();
}
});
複製代碼
addServlet()
方法添加了一個新的servlet 。servlet中使用流響應一些文本。
ctx.addServletMapping("/*", "Embedded");
複製代碼
servlet mappping控制如何訪問名爲Embedded的servlet。對於咱們的示例,任何URL最終都會調用咱們的servlet。
tomcat.start();
tomcat.getServer().await();
複製代碼
最後Tomcat服務器啓動。
服務器正在偵聽端口8082,所以在Web瀏覽器中鍵入如下URL:
你就能夠看到對應的效果
基本上,咱們用到嵌入式Tomcat主要有如下的目的:
1)對Java組件等Web組件進行快速單元測試
能夠使用嵌入式Tomcat自動進行單元測試,而不是啓動/中止Tomcat服務器並打開Web瀏覽器進行手動單元測試。
2)將Java Web應用程序做爲獨立的Java應用程序提供
最終用戶如今能夠運行JAR文件,該文件啓動託管Web應用程序的嵌入式服務器。無需下載和安裝Tomcat並手動部署Web應用程序。
3)對Tomcat更好的控制
集成嵌入式服務器使您可以以更好地控制服務器,從代碼上控制服務器,並自動執行自行預訂的步驟。
而且如今流行的SpringBoot架構中直接使用Main方法啓動一個也是使用以上的方式實現,只是在實現中用到了更多的嵌入式Tomcat的相關的配置和參數。
你的贊和關注是我繼續創做的動力~