將tomcat作為應用的一部分集成到應用中,使得應用可以直接開啟http服務,對外提供接口。此時應用程序不必再遵守j2ee中的文件目錄格式要求。
此種方式改變了以往先部署tomcat容器,再按照j2ee標准目錄格式部署應用的做法,簡化了網絡應用的部署工作,也方便了將現有模塊功能網絡化訪問的需求。
建立maven工程
pom.xml文件,其中使用了tomcat8.5.9版本,jdk1.8。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.founder</groupId> <artifactId>embed-tomcat</artifactId> <version>8.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>tomcat</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <tomcat.version>8.5.9</tomcat.version> <!-- <tomcat.version>7.0.32</tomcat.version> --> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-util</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-servlet-api</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-juli</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jsp-api</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jdbc</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jasper-el</artifactId> <version>${tomcat.version}</version> </dependency> <!-- --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jasper</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-i18n-ja</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-i18n-fr</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-i18n-es</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-el-api</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-dbcp</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-coyote</artifactId> <version>${tomcat.version}</version> </dependency> <!-- tomcat.version must be greater than 8.*.* <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jni</artifactId> <version>${tomcat.version}</version> </dependency> --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-api</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-annotations-api</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-catalina-ws</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-catalina-ha</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-catalina-ant</artifactId> <version>${tomcat.version}</version> </dependency> <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> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
Tomcat組成結構
建立tomcat啟動類
public class TomcatStarter { public static void main(String[] args) throws LifecycleException { Tomcat tomcat = new Tomcat(); // tomcat.setBaseDir("/temp"); Server server = tomcat.getServer(); // server.setPort(8080); Service service = tomcat.getService(); service.setName("Tomcat-embbeded"); Connector connector = tomcat.getConnector(); // connector.setPort(8888); Context context = tomcat.addContext("", "/"); tomcat.addServlet("", "test", new MyServlet()); context.addServletMappingDecoded("/*", "test"); server.start(); server.await(); } }
實例初始化
tomcat
因為Tomcat啟動時,需要指定它的工作目錄(此原因還未深究),所以在建立Tomcat實例后,使用
tomcat.setBaseDir("/temp");
設置此目錄。如果為設置過此目錄,則默認會是“tomcat.8080”。8080是tomcat實例中設置的port值,默認為8080。
此外此目錄中,要確保有“webapps”目錄(此原因還未深究)。
server
通過
tomcat.getServer();
可獲得一個Server實例,並可以設置此server的port值,在此端口上監聽server關閉請求。
service
通過
tomcat.getService();
可獲得service實例,其真實類型為StandardService。
此service實際為上述創建的server中的service;
connector
通過
tomcat.getConnector();
可獲得一個connector實例,默認protocol為“HTTP/1.1”。
此connector實際上為上述創建的service中的connector。
connector.setPort(8888);
用於設置監聽的端口,即http請求時訪問的端口。
context
tomcat.addContext("", "/");
創建context時,會將默認的engine、host一同創建,因此在TomcatStarter中可以忽略其創建。
addContext中的兩個參數分別是contextPath和docBase。
contextPath:即網絡請求是的路徑;
docBase:即在tomcatBaseDir/webapps目錄下的目錄,可以不包含任何文件,但必須存在(此原因還未深究)。
這里同server.xml中的配置相似。
servlet
tomcat.addServlet("", "test", new MyServlet());
用於向指定的context添加servlet。
context.addServletMappingDecoded("/*", "test");
用於完成servlet在context中的映射配置。
這里同web.xml中的配置相似。
注意:context的顯示創建是不可以忽略的。
- context用於映射網絡請求到具體的程序;
注意:service、connector、engine、host的顯式創建可以忽略。
- engine、host會在context創建時創建;
- server會在engine創建時創建;
- service會在server創建時創建;
- 如果沒有顯式創建connector,需要使用tomcat實例去設置port值,使用tomcat實例啟動服務時,會創建connector;
簡化后的TomcatStarter可以為
public class TomcatStarter { public static void main(String[] args) throws LifecycleException { Tomcat tomcat = new Tomcat(); tomcat.setPort(8080); Context context = tomcat.addContext("", "/"); tomcat.addServlet("", "test", new MyServlet()); context.addServletMappingDecoded("/*", "test"); tomcat.start(); tomcat.getServer().await(); } }
啟動
server.start(); // 或者tomcat.start();
server.await(); //或者tomcat.getServer().await();