一、基本介绍
嵌入式 Tomcat 作为嵌入 Java 应用程序的库
作为最基本的依赖, 你需要以下几个库
- Tomcat Embed Core
- Tomcat Embed Logging JULI
- Tomcat Annotations API
二、maven坐标引入
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
</dependency>
这里选择了热门的tomcat9
三、入门demo
目录结构
简单的servlet测试类
package cn.elead.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyWeb extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");
System.out.println("进入请求");
PrintWriter writer = resp.getWriter();
writer.println("<h1>Hello World</h1>");
}
}
嵌入式的tomcat有2种加载servlet的模式
-
1.直接从代码里创建对象,加入容器
-
2.和外部的tomcat一样,从WEB-INF目录下的web.xml文件中加载,这里我把 target目录当做应用根目录,自然要手动创建.当然也可以手动指定web.xml的路径,这里后面会提及. 这也是为什么我要在target目录下创建WEB-INF的原因了
tomcat结构图
通过上面的结构图发现tomcat下有一个server,一个server下有多个service,然后一个service下有多个connector(连接器,用于接收请求),一个Container(正真处理请求的)
同样的结构在tomcat的 conf/server.xml 配置文件里也可以体现
其中配置文件里的Engine就是Container
根据这个关系,可以构建一个最简单的项目结构
Tomcat tomcat = new Tomcat();
// Server server = tomcat.getServer();
// 看源码发现,他只能设置一个service,直接拿默认的
Service service = tomcat.getService();
// 创建连接器,并且添加对应的连接器,同时连接器指定端口
Connector connector = new Connector();
connector.setPort(8888);
service.addConnector(connector);
// 创建一个引擎,放入service中
Engine engine = new StandardEngine();
service.setContainer(engine);
engine.setDefaultHost("localhost");
engine.setName("myTomcat");
// 添加host
Host host = new StandardHost();
engine.addChild(host);
host.setName("localhost");
别看API挺多,其实对照着 server.xml 文件可以很轻易写出来,
然后就是把我们的项目挂载上去了.
用过tomcat都知道,tomcat的挂载方式,这里我们也对应把xml文件翻译成对应的java代码
<Context>代表了运行在<Host>上的单个Web应用一个<Host可以有多个<Context>元素,每个Web应用必须有唯一的URL路径,这个URL路径在<Context>中的属性path中设定。
<Context>元素
-
path:指定访问该Web应用的URL入口,path必须以 "/" 开头,否则会报错。 -
docBase:指定Web应用的文件路径,可以给定绝对路径,也可以给定相对于<Host>的appBase属性的相对路径,如果Web应用采用开放目录结构,则指定Web应用的根目录,非webapps下,如果Web应用是个war文件,则指定war文件的路径。 -
reloadable:如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用。
在开发阶段将reloadable属性设为true,有助于调试servlet和其它的class文件,但这样用加重服务器运行负荷,建议在Web 应用的发存阶段将reloadable设为false。
如在我的地址栏中为 在地址栏中输入的为 localhost:8080/demo即可
<Host>
<Context path="/前缀" docBase="项目路径" reloadable="true开启热更新">
</Host>
String workspace = System.getProperty("user.dir");
String webapp = new File(workspace,"src/main/webapp").getPath();
// 在对应的host下面创建一个 context 并制定他的工作路径,会加载该目录下的所有class文件,或者静态文件
tomcat.getHost().setAppBase("webapp");
StandardContext context = (StandardContext) tomcat.addContext(host, "/", webapp);
这里我直接把我整个项目的编译路径当做项目路径挂载去了tomcat
servlet在tomcat运行
- 1.把自己写的servlet加入进去.
// 创建一个servlet
Wrapper myservlet = new StandardWrapper();
myservlet.setServlet(new MyWeb());
myservlet.setName("myServlet");
// 把servlet加入到contxt中
context.addChild(myservlet);
// 这里注意,要先添加到contxt中在映射路径,不然会空指针
myservlet.addMapping("/web1");
- 2.启动tomcat
//tomcat启动
tomcat.start();
//保持主线程不退出
tomcat.getServer().await();
- 3.测试浏览器输入
到这里最简单的demo完成.