使用内嵌的Tomcat暴露一个请求 - 第346篇_Tomcat

前言

       对于Tomcat我们并不陌生,在使用SpringBoot框架构建项目的时候,对于初学者容易产生错觉,没有添加web server怎么就能发布http服务呢?后面在慢慢深入学习了就会发现实际上是使用了内嵌的方式进行启动了tomcat等web server容器。

       这一节我们来看看,我们使用main的方式来进行使用一下tomcat。

 

一、Tomcat的常规使用

       在之前,我们大部分人使用Tomcat的方式是这样子的:

(1)到apache的官网下载tomcat.zip包;

(2)下载tomccat.zip包之后,就可以解压使用了,使用bin下的启动文件就可以发布应用。

(3)如果是开发项目的话,我们会创建web app,然后添加tomcat server进行调试。

       在学习了Spring Boot项目之后,我们发现我们已经不用上面的这种方式了,那么Spring Boot是如何搞的呢? 就是内嵌了Tomcat。

 

二、内嵌Tomcat的使用

2.1使用说明

       使用起来是很简单的,基本的一个思路就是添加tomcat的依赖包,在main方法中启动一个Tomcat。

 

2.2使用步骤

(1)添加依赖包:tomcat-embed-websocket;

(2)创建一个Servlet处理请求;

(3)创建一个启动Tomcat的类;

(4)使用main方法进行测试启动;

 

2.3 实战演练

(1)添加依赖包:tomcat-embed-websocket;

       创建一个项目:EmbedTomcatDemo,然后在pom.xml文件中添加依赖:

  •  
<dependency>    <groupId>org.apache.tomcat.embed</groupId>    <artifactId>tomcat-embed-websocket</artifactId>    <version>8.5.61</version></dependency>

 

(2)创建一个Servlet处理请求;

       创建一个类DispatcherServlet,接收处理请求,(*^▽^*),是不是有点像SpringMVC的这个前端控制器DispatcherServlet:

  •  
package com.kfit;
import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;
/** * * DispatcherServlet 处理请求,这里只是简单打印信息,然后返回hello,tomcat. * * @author 悟纤「公众号SpringBoot」 * @date 2021-02-02 * @slogan 大道至简 悟在天成 */public class DispatcherServlet extends HttpServlet {
@Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //super.service(req, resp); //处理请求 //打印信息:/user/getById,参数:id=1 System.out.println(req.getRequestURI()+",参数:"+req.getQueryString()); resp.getWriter().println("hello,tomcat"); }}

 

(3)创建一个启动Tomcat的类;

       接下里就是Tomcat服务的核心,编写一个类EmbedTomcatServer:

  •  
package com.kfit;
import org.apache.catalina.Context;import org.apache.catalina.Host;import org.apache.catalina.LifecycleException;import org.apache.catalina.connector.Connector;import org.apache.catalina.startup.Tomcat;
/** * 使用内嵌的方式进行使用Tomcat * * @author 悟纤「公众号SpringBoot」 * @date 2021-02-02 * @slogan 大道至简 悟在天成 */public class EmbedTomcatServer { private Tomcat tomcat = new Tomcat();
/** * 运行tomcat */ public void run(){ //创建连接器 Connector connector = tomcat.getConnector(); connector.setPort(8080);//设置端口 connector.setURIEncoding("UTF-8");//设置编码
//设置Host Host host = tomcat.getHost(); host.setAppBase("webapps");
// 获取目录绝对路径 String classPath = System.getProperty("user.dir");
// 配置tomcat上下文 Context context = tomcat.addContext(host,"/", classPath);

// 配置请求拦截转发 tomcat.addServlet("/", "dispatcherServlet",new DispatcherServlet() ); context.addServletMappingDecoded("/*", "dispatcherServlet");
//启动tomcat try { tomcat.start(); tomcat.getServer().await(); } catch (LifecycleException e) { e.printStackTrace(); }
}
}

       这里的类关系可以参考Tomcat的一个组件图:

使用内嵌的Tomcat暴露一个请求 - 第346篇_Tomcat_02

(4)使用main方法进行测试启动;

       使用main启动一下就可以进行测试了:

  •  
package com.kfit;
/** * main方法启动 * * @author 悟纤「公众号SpringBoot」 * @date 2021-02-02 * @slogan 大道至简 悟在天成 */public class App { public static void main(String[] args) { EmbedTomcatServer embedTomcatServer = new EmbedTomcatServer(); embedTomcatServer.run(); }}

       运行main方法,然后通过浏览器进行访问,随便输入一个地址,比如:

http://127.0.0.1:8080/user/getById?id=1

那么控制台就会打印信息,浏览器返回hello,tomcat:

使用内嵌的Tomcat暴露一个请求 - 第346篇_Tomcat_03

       控制台红色的打印信息是不是很熟悉,你细看,是不是就是我们启动外部tomcat的时候的信息打印。

 

三、结束语

       像Spring Boot、Dubbo这样的框架都是支持内嵌Tomcat容器的,这样我们就可以直接main发布web服务,打包成一个jar包之后,也是可以使用的。

我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。

 

 

SpringBoot视频:http://t.cn/A6ZagYTi

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

ShardingJDBC分库分表:http://t.cn/A6ZarrqS

分布式事务解决方案:http://t.cn/A6ZaBnIr

JVM内存模型调优实战:http://t.cn/A6wWMVqG

Spring入门到精通:https://t.cn/A6bFcDh4

大话设计模式之爱你:https://dwz.cn/wqO0MAy7