tomcat第1章 tomcat介绍、安装、部署项目

news2024/11/16 21:57:27

一、前言

我们在写javaweb程序的时候有没有考虑如果没有tomcat,我们怎么给客户端返回响应数据?既然能返回响应数据,为什么还要使用tomcat?

什么是tomcat,以及tomcat历史版本发展情况,每个版本servlet规范的支持,相关的许可。

最后再介绍如何下载tomcat、安装tomcat、启动tomcat、运行tomcat以及tomcat目录结构、idea中如何使用tomcat等相关的基础知识点。

二、为什么要使用tomcat?

介绍这个问题之前,我们先来复习一下javaweb编码中不可或缺的http协议。
http (HyperText Transfer Protocol) 超文本传输协议,规定了浏览器和服务之间传输数据的规则
http请求流程
下面演示一个简单得http协议代码,请求本地服务,返回给浏览器msg

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(8080); // 监听指定端口
        System.out.println("server is running...");
        for (;;) {
            Socket sock = ss.accept();
            System.out.println("connected from " + sock.getRemoteSocketAddress());
            Thread t = new Handler(sock);
            t.start();
        }
    }
}
 
class Handler extends Thread {
    Socket sock;
 
    public Handler(Socket sock) {
        this.sock = sock;
    }
 
    public void run() {
        try (InputStream input = this.sock.getInputStream()) {
            try (OutputStream output = this.sock.getOutputStream()) {
                handle(input, output);
            }
        } catch (Exception e) {
            try {
                this.sock.close();
            } catch (IOException ioe) {
            }
            System.out.println("client disconnected.");
        }
    }
 
   private void handle(InputStream input, OutputStream output) throws IOException {
    System.out.println("Process new http request...");
    var reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
    var writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));
    // 读取HTTP请求:
    boolean requestOk = false;
    String first = reader.readLine();
    if (first.startsWith("GET / HTTP/1.")) {
        requestOk = true;
    }
    for (;;) {
        String header = reader.readLine();
        if (header.isEmpty()) { // 读取到空行时, HTTP Header读取完毕
            break;
        }
        System.out.println(header);
    }
    System.out.println(requestOk ? "Response OK" : "Response Error");
    if (!requestOk) {
        // 发送错误响应:
        writer.write("HTTP/1.0 404 Not Found\r\n");
        writer.write("Content-Length: 0\r\n");
        writer.write("\r\n");
        writer.flush();
    } else {
        // 发送成功响应:
        String data = "<html><body><h1>Hello, world!</h1></body></html>";
        int length = data.getBytes(StandardCharsets.UTF_8).length;
        writer.write("HTTP/1.0 200 OK\r\n");
        writer.write("Connection: close\r\n");
        writer.write("Content-Type: text/html\r\n");
        writer.write("Content-Length: " + length + "\r\n");
        writer.write("\r\n"); // 空行标识Header和Body的分隔
        writer.write(data);
        writer.flush();
    }
}
}

这里的核心代码是,先读取HTTP请求,这里我们只处理GET /的请求。当读取到空行时,表示已读到连续两个\r\n,说明请求结束,可以发送响应。发送响应的时候,首先发送响应代码HTTP/1.0 200 OK表示一个成功的200响应,使用HTTP/1.0协议,然后,依次发送Header,发送完Header后,再发送一个空行标识Header结束,紧接着发送HTTP Body,在浏览器输入http://localhost:8080/就可以看到响应页面。

ok,上面我们可以 看到只是单单给浏览器返回一句话,代码量也有不少,别说一个大型的web系统。对于这种情况就有公司对http操作进行封装,使程序员不必对协议再进行操作,让web开发变得便捷,而tomcat就是对http操作的封装。

三、tomcat历史

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。
当前Tomcat存在5个主要版本,分别支持不同版本的规范,其对规范及JDK的版本支持如下
ttomcat版本
Tomcat最后两个版本并不是顺序发布的。2015年11月,Tomcat发布了重要的里程碑版本9.0(目前仍为alpha版本)。在该版本中,Tomcat依赖最新的JDK8,使用了JDK8最新的语法特性,支持最新的Servlet规范 (4.0),并增加了对HTTP/2的支持。2016年3月,考虑到9.0版本的变更范围以及发布进度,Tomcat在8.0的基础上又发布了一个中间版本–8.5.它的主体架构延续自8.0,同时又实现了部分9.0的主要特性,以便用来取代8.0版本。

四、tomcat许可

Tomcat以Apache License许可的方式进行发布,具体许可内容参见http://apache.org/licensesLICENSE-2.0。主要概括如下。

  • Tomcat完全免费,可用于任何商业或者非商业产品,而不必支付任何费用
  • 修改Tomcat并发布变更版本的用户不必公开修改部分的源代码。
  • 修改Tomcat的用户不必将其变更捐献给Apache软件基金会
  • 所有针对Tomcat源代码或二进制文件的重新发布均须包含Apache许可
  • 任何重新发布所包含的资料必须经过Apache软件基金会批准
  • 无Apache基金会的许可,派生自Tomcat源代码的产品不能命名为“Tomcat”、“Apache”、“Jakarta”

五、tomcat基本使用

1、下载、安装、启动、停止

官网下载地址:https://tomcat.apache.org/
选择下载的版本,推荐压缩包的方式直接下载解压即可
ttomcat下载
目录结构
tomca目录结构

启动和运行
双击Tomcat下的bin下的startup.bat启动Tomcat或者命令行在tomcat目录下执行如下命令

D:\apache-tomcat-8.5.82\bin>catalina run

在浏览器的地址栏中输入http://localhost:8080,看到如下页面证明启动成功
tomcat index

启动失败常见问题

点击 startup.bat启动Tomcat启动出现黑窗口一闪而过
主要原因:java环境配置问题,配置java home环境名必须是JAVA_HOME
​停止tomcat

找到bin下的shutdown.bat
如果是窗口启动的,关闭窗口即可停止tomcat

2、端口配置

默认端口是8080,如果出现端口占用,可以通过以下方式修改
1)找到 Tomcat 目录下的 conf 文件夹
2)进入 conf 文件夹里面找到 server.xml 文件
3)打开 server.xml 文件
4)在 server.xml 文件里面找到下列信息

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"redirectPort="8443" />

port="8080"改成你想要的端口,修改完重启tomcat才能生效

3、tomcat部署项目


在Tomcat中部署Web应用的方式主要有如下几种:

1、利用Tomcat的自动部署。把web应用拷贝到webapps目录。Tomcat在启动时会加载目录下的应用,并将编译后的结果放入work目录下。
一般将项目打包成war放到webapps目录下,tomcat会自动解压缩war文件

浏览器输入localhost:8080/项目名即可访问

2、使用Manager App控制台部署。在tomcat主页点击“Manager App” 进入应用管理控制台,可以指定一个web应用的路径或war文件。

3、修改conf/server.xml文件,增加Context节点可以部署应用。

4、在conf/Catalina/localhost/ 路径下增加 abx.xml文件,内容如下,内容是Context节点,可以部署应用

<Context path="/demo" docBase="E:\demo"/>

当浏览器输入访问地址如:

http://ip:port/  

没有工程名时候,默认访问的是ROOT工程
当浏览器输入访问地址如:

http://ip:port/工程名/  

没有资源名,默认访问index.html页面

4、tomcat web项目结构

一个javaweb项目要能够在tomcat下部署运行,需要满足一定的目录结构格式,在tomcat目录下的webapps目录下创建一个mail项目,结构如下,然后启动tomcat,localhost:8080/mail即可访问
tomcat 项目结构
注意:WEB-INF目录是受保护的,外界不能直接访问,想让外界响应到,不要写在WEB-INF内。所以写的网页没有在WEB-INF中

以后创建的java web maven项目,开发完之后,需要package,package完项目的结构也是遵循上面项目结构的,对照如下
maven package

  • 编译后的java字节码文件和resouce的资源文件,放到了WEB-INF下的class目录下
  • pom.xml 中依赖坐标对应的jar包,放入WEB-INF下的lib目录下

六、idea中使用tomcat

1、idea中创建maven web项目

方式1、使用maven骨架方式
1、选择web项目骨架
选择骨架创建
接着填写项目名以及maven坐标,finish即可,我们可以删除pom里面不用的依赖,pom依赖如
pom依赖
2、补齐缺失的目录结构
main下分别创建java和resource目录即可

方式2、不使用maven骨架方式
1、不勾选骨架创建项目
2、pom添加war的打包方式
3、补齐web项目目录结构:webapp目录即可

2、idea集成本地tomcat

上面我们创建好项目之后,如果想要运行将项目部署到tomcat下并运行,之前的方式是首先package,然后将打包好的war包复制到本地tomcat下的webapps即可运行,这个过程还是比较繁琐。
在idea中可以直接继承本地tomcat进行运行项目
如下
添加local tomcat
添加tomcat
选择本地tomcat
部署项目
部署本地项目
选择要部署得项目
选择要部署得项目,然后apply,部署完之后点击运行即可
运行项目

备注:如何是普通的web项目,不是maven项目,如何将第三方jar添加到项目中?
首先在当前项目WEB-INF下创建lib文件夹,将第三方jar复制到lib下
将jar复制到lib下
打开Project structure中
打开structure
添加jar
在这里插入图片描述
apply
apply jar

3、idea使用tomcat 插件

上面2介绍了如何把maven web项目部署到本地tomcat中,并运行起来,接下来介绍不使用本地tomcat,而是用tomcat maven 插件的方式运行maven 项目
tomcat maven 插件

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

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

相关文章

如何与ChatGPT愉快地聊天

原文链接&#xff1a;https://mp.weixin.qq.com/s/ui-O4CnT_W51_zqW4krtcQ 人工智能的发展已经走到了一个新的阶段&#xff0c;在这个阶段&#xff0c;人工智能可以像人一样与我们进行深度的文本交互。其中&#xff0c;OpenAI的ChatGPT是一个具有代表性的模型。然而&#xff0…

JavaFX学习:MVC模式中的PropertyValueFactory

PropertyValueFactory类是“TableColumn cell value factory”,绑定创建列表中的项。示例如下&#xff1a; TableColumn<Person,String> firstNameCol new TableColumn<Person,String>("First Name");firstNameCol.setCellValueFactory(new PropertyVal…

Blender基础入门(3):复杂建模技巧

文章目录 我个人的Blender专栏前言基础属性设置选择循环选择&#xff1a;Alt左键透视选择锁定物体编辑模式123快捷键按下/&#xff08;右侧Shift左边&#xff0c;<>按键右边&#xff09;&#xff0c;锁定物体先在物体模式选择物体&#xff0c;再到编辑模式就只会选择该物…

淘宝订单拉取更新历史状态~需求

&#x1f4da;目录 订单接口api需求问题解决 Map<String,TaobaoOrder> 订单接口api 可自行查询官网文档&#xff0c;点击进入 需求 通过接口中has_next 标识判断该时间断是否还有下一页数据,直到该值数据为false时,表面该时间范围内的订单数据获取完成. 拉取完成后需要对…

Maven工程开发中的继承与聚合

1. 聚合工程概念 设置一个空的maven工程&#xff0c;工程里面只有pom文件&#xff0c;另外将这个工程的打包方式设置为pom。 在聚合工程里面添加聚合工程里面管理的模块 2.聚合总结 3.继承 例如下面02工程继承上面的01工程&#xff0c;在02工程的pom文件中要配置要继承的父工…

分组统计--Pandas

1.groupby 1.1 函数功能 先对数据进行分组&#xff0c;然后在每个分组上运用聚合函数、转换函数 1.2 函数语法 DataFrame.groupby(byNone, axis0, levelNone, as_indexTrue, sortTrue, group_keysTrue, observedFalse, dropnaTrue)1.3 函数参数 参数含义by分组依据axis沿着…

【电子学会】2023年05月图形化一级 -- 找食物

找食物 1. 准备工作 &#xff08;1&#xff09;添加背景&#xff1a;Jungle&#xff1b; &#xff08;2&#xff09;删除小猫角色&#xff0c;添加角色&#xff1a;Dog2、Donut&#xff1b; 2. 功能实现 &#xff08;1&#xff09;点击绿旗&#xff0c;小狗的初始位置在舞…

打家劫舍(力扣)动态规划 JAVA

你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个房屋存放金额的非…

从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145

目录 606. 根据二叉树创建字符串 - 力扣&#xff08;LeetCode&#xff09; 解析代码&#xff1a; 102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 解析代码&#xff1a; 107. 二叉树的层序遍历 II - 力扣&#xff08;LeetCode&#xff09; 解析代码&…

倪海厦针灸大成学习笔记

学习倪海厦老师人纪针灸课程的学习笔记&#xff0c;比较粗糙&#xff0c;不一定准确&#xff0c;分享给大家&#xff0c;大家发现笔记中的错误&#xff0c;欢迎反馈&#xff01; Word文档链接 有需要的欢迎私信

VSCode控制台乱码解决

如果你试过很多方法依然解决不了乱码问题&#xff0c;不妨试试这个 设置完成后重启电脑 开机后查看一下当前的编码 打开VSCode试一下 不得不吐槽一下MS。。。。。。

虚幻引擎程序化资源生成框架PCG 之 UPCGBlueprintElement源码笔记(二)数据流

PCG节点处理的是数据流&#xff0c;也就是点云&#xff0c;点云到底是啥&#xff1f;笼统地说就是一个个携带着信息的点组成的集合。但是在具体是使用过程中&#xff0c;我们还得了解这些”携带着信息的点“是如何被层层包装起来的。本文中老王就和大家一边拆解源代码一边做实验…

以太网数据链路层相关技术(六)

目录 一、概述 二、MAC地址 2.1 概述 2.2 MAC地址的意义 三、共享介质型网络与非共享介质网络 四、VLAN技术 一、概述 在各设备之间的数据传输时&#xff0c;物理层和数据链路层是必不可少的。其中&#xff0c;物理层的通信媒介包括双绞线电缆、同轴电缆、光纤、电波以及…

Springcloud基础(4)-Ribbon负载均衡

负载均衡 1. Ribbon简单描述2. 在SpringCloud中查看相关处理源码3. ribbon的默认策略&#xff0c;懒加载3. 实操中的相关问题 1. Ribbon简单描述 Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具。Ribbon是Netflix发布的开源项目&#xff0…

MySQL第四天作业 单表查询和多表查询

单表查询 创建表 CREATE TABLE emp (empno int(4) NOT NULL,ename varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,job varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,mgr int(4) NULL DEFAULT NULL,hiredate d…

【电子学会】2023年05月图形化一级 -- 舞蹈演出

舞蹈演出 1. 准备工作 &#xff08;1&#xff09;删除小猫角色&#xff1b; &#xff08;2&#xff09;添加角色Ballerina&#xff0c;为角色添加声音Bossa Nova&#xff1b; &#xff08;3&#xff09;添加背景Theater和Concert。 2. 功能实现 &#xff08;1&#xff09…

STC89C52---定时器,中断

目录 一:定时器 1:简历 2:定时器/计数器0/1和相关寄存器 A:介绍 B: 相关寄存器 C:基本原理 3:定时器/计数器控制寄存器TCON 4:定时器/计数器工作模式寄存器TMOD (1)门控制 (2):使用STC-iSP软件生成配置 (2):使用STC-iSP软件定时器 二:中断 1:简历 B:中断寄存器 2…

【电子学会】2023年05月图形化四级 -- 还原轨迹

还原轨迹 1. 准备工作 &#xff08;1&#xff09;删除小猫&#xff1b; &#xff08;2&#xff09;从角色库添加“Butterfly 1”角色&#xff1b; &#xff08;3&#xff09;保留白色背景。 2. 功能实现 &#xff08;1&#xff09;点击绿旗&#xff0c;清除舞台&#xff…

利用Python实现网站内容监控及邮件提醒

目录 一、开启POP3/SMTP服务 二、利用SMTP库实现邮件发送 三、利用requests库监控网页关键字 四、常见问题 一、开启POP3/SMTP服务 以QQ邮箱为例&#xff1a;进入邮箱->设置->账户->开启POP3/SMTP等服务->获取授权码 ①首先进入QQ邮箱后点击设置 ② 点击邮箱…

【机器学习核心总结】什么是梯度下降

什么是梯度下降 根据已有数据的分布来预测可能的新数据&#xff0c;这是回归 希望有一条线将数据分割成不同类别&#xff0c;这是分类 无论回归还是分类&#xff0c;我们的目的都是让搭建好的模型尽可能的模拟已有的数据 除了模型的结构&#xff0c;决定模型能否模拟成功的关键…