将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();