前言
Tomcat是一個非常流行的Web服務器,用于部署和運行Java Web應用程序。一般情況下,我們都是在單獨的Tomcat實例上運行自己的Web應用,其實與這種經典方案相比,我們可以將服務器運行時直接集成到應用程序中,從而更加的靈活和方便。
嵌入式Tomcat的Maven依賴
要使用嵌入式Tomcat并將其運行時與Java Web應用程序打包,請在Maven的pom.xml 文件中添加以下依賴項
<groupId>org.apache.tomcat.embedgroupId>
<artifactId>tomcat-embed-coreartifactId>
<version>${tomcat.version}version>
<groupId>org.apache.tomcat.embedgroupId>
<artifactId>tomcat-embed-jasperartifactId>
<version>${tomcat.version}version>
<groupId>org.apache.tomcat.embedgroupId>
<artifactId>tomcat-embed-logging-juliartifactId>
<version>${tomcat.version}version>
其中 tomcat.version 是指向Tomcat實際版本的屬性
<tomcat.version>8.0.48tomcat.version>
Tomcat嵌入式實例
核心類是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();
}
}
下面我們分段解釋以上代碼的作用:
Tomcat tomcat = new Tomcat();
tomcat.setPort(8082);
Tomcat在端口8082上啟動
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:
http://localhost:8082/
你就可以看到對應的效果
總結
基本上,我們用到嵌入式Tomcat主要有以下的目的:
1)對Java組件等Web組件進行快速單元測試
可以使用嵌入式Tomcat自動進行單元測試,而不是啟動/停止Tomcat服務器并打開Web瀏覽器進行手動單元測試。
2)將Java Web應用程序作為獨立的Java應用程序提供
最終用戶現在可以運行JAR文件,該文件啟動托管Web應用程序的嵌入式服務器。無需下載和安裝Tomcat并手動部署Web應用程序。
3)對Tomcat更好的控制
集成嵌入式服務器使您能夠以更好地控制服務器,從代碼上控制服務器,并自動執行自行預訂的步驟。
并且現在流行的SpringBoot架構中直接使用Main方法啟動一個也是使用以上的方式實現,只是在實現中用到了更多的嵌入式Tomcat的相關的配置和參數。
我知道你在看喲
