Java原生启动Tomcat

文章目录

  • 引入依赖
  • 启动Tomcat代码示例
    • 将嵌入式 Tomcat 服务器用于已有的 WAR 文件
    • 为现有的 Java Web 应用程序嵌入 Tomcat 服务器
  • 相关API
    • Tomcat API
    • Contonxt API
  • 启动错误
  • springboot底层Tomcat的实现
  • 学习博客


引入依赖

maven:

<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>
<properties><tomcat.version>8.0.48</tomcat.version>
</properties>

gradle:

dependencies {implementation 'org.apache.tomcat.embed:tomcat-embed-core:9.0.54'implementation 'javax.servlet:jstl:1.2' // 若需要JSTL支持
}

其他 :

如果您不使用 Maven,请 下载 以下 JAR 文件并将其添加到项目的类路径中:

ecj-3.12.3.jar
tomcat-annotations-api-8.0.48.jar
tomcat-embed-core-8.0.48.jar
tomcat-embed-el-8.0.48.jar
tomcat-embed-jasper-8.0.48.jar
tomcat-embed-logging-juli-8.0.48.jar

启动Tomcat代码示例

完整示例:

public static void test() throws LifecycleException {Tomcat tomcat = new Tomcat();tomcat.setBaseDir("/");// 设置服务器工作的基本目录。tomcat.setHostname("127.0.0.1");// 设置默认主机的主机名tomcat.setPort(8090);// 设置默认连接器的端口号Context context = tomcat.addContext("/context-url", null);// 添加上下文,映射路径为'context-url'// add context initialization parameterscontext.addParameter("param1", "value1");context.addParameter("param2", "value2");context.addErrorPage(new ErrorPage());context.setCookies(true);context.setSessionTimeout(30);// 现有的 Java servlet 添加到 Web 应用程序;addServlet要在addServletMappingDecoded之前执行//tomcat.addServlet("/context-url","defaultServlet",new IndexServlet());// 为context上下文添加servlettomcat.addServlet(context,"defaultServlet",new IndexServlet());// 为名称defaultServlet的servlet添加一个映射路径为'v1'context.addServletMappingDecoded("/v1","defaultServlet");//为 servlet 配置 URL 映射tomcat.start();tomcat.getServer().await();//阻塞}

Servlet :

public class IndexServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().print("this is index... tomcat");}}
public class XmlServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {PrintWriter writer = resp.getWriter();writer.println("<html><title>Welcome</title><body>");writer.println("<h1>Have a Great Day!</h1>");writer.println("</body></html>");}}

启动成功 :

103, 2024 3:57:45 下午 org.apache.coyote.AbstractProtocol init
信息: Initializing ProtocolHandler ["http-nio-8090"]
103, 2024 3:57:47 下午 org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
信息: Using a shared selector for servlet write/read
103, 2024 3:57:47 下午 org.apache.catalina.core.StandardService startInternal
信息: Starting service [Tomcat]
103, 2024 3:57:47 下午 org.apache.catalina.core.StandardEngine startInternal
信息: Starting Servlet Engine: Apache Tomcat/8.5.28
103, 2024 3:57:49 下午 org.apache.catalina.util.SessionIdGeneratorBase createSecureRandom
警告: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [1,186] milliseconds.
103, 2024 3:57:49 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-nio-8090"]

访问 :http://127.0.0.1:8090/context-url/v1
在这里插入图片描述

访问 :http://127.0.0.1:8090/context-url/v2
在这里插入图片描述

将嵌入式 Tomcat 服务器用于已有的 WAR 文件

假设您在Bookstore.war文件中打包了一个 Java Web 应用程序,以下程序将创建一个 Tomcat 实例并从 WAR 文件中添加一个 Web 应用程序:

public class RunWarExample {public static void main(String[] args) throws ServletException, LifecycleException {Tomcat tomcat = new Tomcat();tomcat.setBaseDir("temp");tomcat.setPort(8080);String contextPath = "/bookstore";   String warFilePath = "D:\\Web\\Website\\Bookstore.war";tomcat.getHost().setAppBase(".");tomcat.addWebapp(contextPath, warFilePath);tomcat.start();tomcat.getServer().await();}
}

运行此程序,您可以看到 WAR 文件的内容被提取到基本目录,您可以使用指定的上下文路径访问 Web 应用程序。

这种方法对于测试打包在 WAR 文件中的现有 Web 应用程序非常方便,并且您不必接触它们的代码。

对于此类应用程序,以与程序化 Web 应用程序中所述相同的方式生成可执行 JAR 文件。

为现有的 Java Web 应用程序嵌入 Tomcat 服务器

这也许是嵌入式 Tomcat 最常用的特性。这是这样的场景:您正在开发一个 Java Web 应用程序,现在您想要嵌入 Tomcat 以进行单元测试或将 Web 应用程序作为独立的 Java 程序交付。那么如何制作呢?

假设您的 Web 应用程序的文件存储在名为WebContent的目录中,如下所示:
在这里插入图片描述

以下程序启动一个嵌入式 Tomcat 实例来运行 Web 应用程序:

public class EmbeddedTomcatTest {public static void main(String[] args) throws LifecycleException, ServletException {String contextPath = "/UploadApp";String webappDir = new File("WebContent").getAbsolutePath();Tomcat tomcat = new Tomcat();tomcat.setBaseDir("temp");tomcat.setPort(8080);tomcat.addWebapp(contextPath, webappDir);tomcat.start();tomcat.getServer().await();    }
}

现在您可以使用浏览器使用上面程序中指定的端口号和上下文路径访问 Web 应用程序:

http://localhost:8080/UploadApp/upload.jsp

相关API

Tomcat API

  • setBaseDir(String baseDir):设置服务器工作的基本目录。这应该是第一个调用的方法。默认情况下,Tomcat 尝试按以下顺序使用这些系统属性:catalina.base、catalina.home和user.dir。

  • setHostname(String name):设置默认主机的主机名。默认为“本地主机”。

  • setPort(int port):设置默认连接器的端口号。

  • addContext(String contextPath,String docBase) : 向服务器添加上下文
    其中contextPath是 Web 应用程序名称,docBase是应用程序的基本目录。此方法返回一个表示单个 Web 应用程序的Context对象。您可以使用此Context对象来配置 Web 应用程序的各个方面,例如:

// add context initialization parameters
context.addParameter("param1", "value1");
context.addParameter("param2", "value2");context.addErrorPage(new ErrorPage());
context.setCookies(true);
context.setSessionTimeout(30);
  • addServlet(String contextPath, String servletName, Servlet servlet):将现有的 Java servlet 添加到 Web 应用程序。contextPath为context的访问路径,必须在当前Tomcat容器中已经存在。
    • 或者使用下面的静态方法:
Tomcat.addServlet(Context context,String servletName,Servlet servlet)

Contonxt API

  • addServletMappingDecoded(String urlPattern, String servletName):为 servlet 配置 URL 映射,为Context类的方法

使Tomcat异步阻塞等待请求:

tomcat.getServer().await();

在服务启动后,一定要调用 await() 方法异步进行接收请求,否则服务器启动成功就直接关闭了。

启动、停止和销毁服务器:

  • tomcat.start()
  • tomcat.stop()
  • tomcat.destroy()

Tomcat-Java类 官方描述

Tomcat-Java接口 官方API

启动错误

当tomcat为 9.0+ 时,运行最后一直卡在以下步骤运行不起来。

警告: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [773] milliseconds.

解决 : 降低为8.x.x解决

springboot底层Tomcat的实现

创建spring容器并启动Tomcat :

可将已有的Spring+mvc升级成SpringBoot

@Target(ElementType.TYPE)  //类注解
@Retention(RetentionPolicy.RUNTIME)  //运行时
@Documented
@Inherited
@ComponentScan  //springboot扫描bean,内部spring容器就会有独赢controller的bean
public class MySpringApplication {public static void run(Class clazz){//创建一个spring容器AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();applicationContext.register(clazz);  //配置类applicationContext.refresh();//启动tomcatstartTomcat(applicationContext);}/*** 配置tomcat* WebApplicationContext:spring容器*/public static void startTomcat(WebApplicationContext applicationContext){Tomcat tomcat = new Tomcat();Server server = tomcat.getServer();Service service = server.findService("Tomcat");Connector connector = new Connector();connector.setPort(8081);StandardEngine engine = new StandardEngine();engine.setDefaultHost("localhost");StandardHost host = new StandardHost();host.setName("localhost");String contextPath = "";Context context = new StandardContext();context.setPath(contextPath);context.addLifecycleListener(new Tomcat.FixContextListener());host.addChild(context);engine.addChild(host);service.setContainer(engine);service.addConnector(connector);//关键:向tomcat容器添加dispatcherServlet的servlet,DispatcherServlet需要很具接受的请求去匹配某个controller中的对应方法tomcat.addServlet(contextPath, "dispatcher",new DispatcherServlet(applicationContext));  //SpringMVC中的DispatcherServlet,其中还有所有controller和注解,applicationContext就是所有Controller的所有的beancontext.addServletMappingDecoded("/*","dispatcher");  //接收的所有请求交给dispatcher处理try {tomcat.start();} catch (LifecycleException e) {e.printStackTrace();}}
}

启动类:

@MySpringBootApplication
public class MyApplication {public static void main(String[] args) {MySpringApplication.run(MyApplication.class);}
}

测试类:

@RestController
public class UserController {@GetMappingpublic String test(){return "xuyu";}
}

学习博客

当前博客的参考及示例博客原文

Tomcat中<Context>标签的使用方式和注意事项

Tomcat的xml基础配置

SpringBoot中整合Tomcat源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/593313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 深度学习 记录遇到的报错问题10

本篇继python 深度学习 解决遇到的报错问题9_module d2l.torch has no attribute train_ch3-CSDN博客 一、CUDA error: no kernel image is available for execution on the device CUDA kernel errors might be asynchronously reported at some other API call,so the stackt…

数据结构【图篇】

数据结构【图篇】 文章目录 数据结构【图篇】前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f; 目录一、图(一)、图的存储(二)、图的基本操作(三)、最短路径问题 二、拓扑排序三、结语 前言 为什么突然想学算法了&#xff1f; > 用较为“官方…

【PHP】判断字符串是否是json类型,并判断是否是有效数组

要在 PHP 中判断给定的字符串是否是 JSON&#xff0c;可以使用 json_decode() 函数和检查返回值的类型。以下是一个示例&#xff0c;展示了如何判断给定的字符串是否是 JSON&#xff0c;以及如何判断它是数组还是字符串&#xff1a; <?phpfunction isJson($string) {json_…

金融追梦者,向着春天出发——社科院与美国杜兰大学金融管理硕士

随着时代的进步和社会的变迁&#xff0c;教育已经不再是单纯的学生时代的事情&#xff0c;而是贯穿人的一生。特别是在金融行业&#xff0c;由于其变幻莫测的特性&#xff0c;在职继续攻读硕士学位的人越来越多。他们希望通过进一步的学习和研究&#xff0c;提升自己的专业素养…

transformers Trainer自定义optimizer和scheduler

1.需求 我自定义了一个evaluate方法&#xff0c;想在每一轮训练过后都执行一次。如果只是在TrainingArguments里设置warmup_steps100&#xff0c;那么每轮都会重置学习率&#xff0c;也就是每一轮开始的时候都会按照warmup刚开始的学习率进行训练&#xff0c;这就很头疼。 2.…

【双指针算法】-- 左右指针

左右指针 前言一、双指针算法二、左右指针1.用于在已排序数组中找到两个数使其和为特定值2.在字符串中判断是否为回文 总结 前言 今天在刷Leetcode的时候觉得自己双指针掌握的还是不错的记录一下,写个学习笔记,也方便以后翻阅,如果也帮助到你了,那真是太好啦! 本篇介绍的是左右…

js创建服务器,以及对接口的理解和创建

// 创建服务 const app http.createServer((req, res)>{ // 设置给前端返回信息的字符编码 res.setHeader(content-type, text/html; charsetutf-8) let address req.url.split(?)[0] //首先创建一个数组&#xff0c;后面把它的数据放在JSON文件 let…

医院配电能效监管方案

摘要:本文以医院能源监管系统为研究对象,采用智能化技术组建数据库、构建智能化的能耗信息管理系统,实现对医院的能源利用状况进行实时、准确的动态监管。具体而言,该系统建设的主要功能是对医院的能源消耗进行采集、上报、汇总与分析,并生成动态的数据和报表曲线,以及利用分析…

js实现将一张红色透明图改成黑色

获取到像素点&#xff0c;遇到255红色rgb的改为黑色0 ps:红色的rgb为255 0 0 function test(base64) {// 创建一个Canvas元素var canvas document.createElement("canvas");var context canvas.getContext("2d");var redStamp new Image();redStamp.src…

如何在Windows Redis中设置密码?

https://www.python100.com/html/3NQ9A968M2JX.html springboot 工程配置文件 application.yml 中配置如下 redis: timeout: 50000 port: 6379 host: 127.0.0.1 password: 123456 注意 password: 123456 冒号后有空格

SAP ABAP ZPL打印

前言 本文用于简单介绍在SAP中使用ZPL语言进行打印的开发步骤&#xff0c;由于对ZPL语言并不是很熟悉&#xff0c;所以ZPL相关的部分并不会很深入&#xff0c;主要介绍在SAP端如何动态填充ZPL内容及预览、打印。 什么是ZPL ZPL是斑马条码打印机工业型号用的编程语言。利用这些…

M3u8视频地址如何转为mp4视频

在当今数字化的时代&#xff0c;视频格式的转换已成为日常需求。M3u8格式的视频由于其分段的特性&#xff0c;常常给播放和编辑带来不便。而MP4格式则因其通用性和高质量而广受欢迎。那么&#xff0c;如何将M3u8视频地址转换为MP4格式呢&#xff1f;接下来&#xff0c;我们将为…

JRT代码结构调整和示例

之前一直没建表专门使用ORM的api&#xff0c;做模板设计器需要建表&#xff0c;就一边开发设计器一般测试和调整ORM的api&#xff0c;只有做业务才能知道哪些api使用别扭&#xff0c;写了设计器之后改进了ORM的api以方便业务操作数据库。新写法差不多是ORM操作数据库的稳定api了…

向日葵远程控制软件MySQL5.7的安装与配置

目录 一. 向日葵远程控制软件 1.1 简介 1.2 选择原因 1.3 安装及使用 1.4 使用场景 二. MySQL5.7 安装与配置 2.1 什么是MySQL 2.2 安装 MySQL5.7 2.2.1 安装步骤 2.2.2 内部连接 2.2.3 外部连接 三. 思维导图 一. 向日葵远程控制软件 1.1 简介 向日葵电脑版是一款拥有多年…

通信领域常见缩写说明

一、通信通用指标 QoS&#xff1a;Quality of Service(服务质量) 服务质量&#xff08;Quality of Service&#xff0c;QoS&#xff09;是指网络或通信系统为满足用户对服务质量的要求而采取的措施和技术。QoS描述了网络或通信系统在提供服务时对各种性能指标的控制和保证。它…

Java基础-----集合类(四)

文章目录 1. Iterator和ListIterator1.1 简介1.2 常用方法 2. remove方法2.1 比较foreach方式和迭代器方式删除元素2.2 找原因 -- 迭代器删除操作源码 1. Iterator和ListIterator 1.1 简介 1.Iterator 可以遍历List集合&#xff0c;也可以遍历Set集合&#xff1b; ListIterat…

05-SpringCloud-RabbitMQ-概述

RabbitMQ 1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&am…

常用开源渗透测试工具

信息搜集工具 ARL 资产侦察灯塔https://github.com/TophantTechnology/ARLAsamF 资产收集工具https://github.com/Kento-Sec/AsamFshuize信息搜集https://github.com/0x727/ShuiZe_0x727ENScan 企业信息搜集https://github.com/wgpsec/ENScan_GOEHole 指纹探测工具https://git…

HarmonyOS简介

HarmonyOS的起源 HarmonyOS的诞生可以追溯到华为对物联网时代的探索和布局。随着物联网技术的快速发展&#xff0c;华为看到了一个更加互联互通的世界的潜力&#xff0c;并决定开发一个全新的分布式操作系统来满足物联网设备的需求。因此&#xff0c;HarmonyOS在2019年由华为正…

从Windows 1.0到Windows 10的旅程:探索Windows系统的起源和第一个版本特点

学习目标&#xff1a; 了解Windows系统的发展历程和重要版本。理解每个版本的特点和改进。掌握每个版本的发布时间和重要功能。了解Windows系统对于个人用户和企业用户的市场影响。探索Windows系统在用户界面、性能优化和安全性方面的改进。理解Windows系统的持续创新和用户反…