Tomcat長生不老之術——嵌入式

做者:享學課堂King老師java

轉載請聲明出處!web

前言

Tomcat是一個很是流行的Web服務器,用於部署和運行Java Web應用程序。通常狀況下,咱們都是在單獨的Tomcat實例上運行本身的Web應用,其實與這種經典方案相比,咱們能夠將服務器運行時直接集成到應用程序中,從而更加的靈活和方便。apache

嵌入式Tomcat的Maven依賴

要使用嵌入式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>
複製代碼

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();
    }
}
複製代碼

下面咱們分段解釋以上代碼的做用: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:

http://localhost:8082/

你就能夠看到對應的效果

總結

基本上,咱們用到嵌入式Tomcat主要有如下的目的:

1)對Java組件等Web組件進行快速單元測試

能夠使用嵌入式Tomcat自動進行單元測試,而不是啓動/中止Tomcat服務器並打開Web瀏覽器進行手動單元測試。

2)將Java Web應用程序做爲獨立的Java應用程序提供

最終用戶如今能夠運行JAR文件,該文件啓動託管Web應用程序的嵌入式服務器。無需下載和安裝Tomcat並手動部署Web應用程序。

3)對Tomcat更好的控制

集成嵌入式服務器使您可以以更好地控制服務器,從代碼上控制服務器,並自動執行自行預訂的步驟。

而且如今流行的SpringBoot架構中直接使用Main方法啓動一個也是使用以上的方式實現,只是在實現中用到了更多的嵌入式Tomcat的相關的配置和參數。

你的贊和關注是我繼續創做的動力~

相關文章
相關標籤/搜索