02_JavaWeb中的Tomcat(详解)

文章目录

  • Tomcat
  • 1, 概述
    • 1.1 安装
    • 1.2 目录结构
    • 1.3 启动/停止
  • 2, 资源部署
    • 2.1 直接部署: 主要和重要的方式
    • 2.2 虚拟映射: 重要
      • 2.2.1 方式一:
      • 2.2.1 方式二:
    • 2.3 原理解析
  • 3, Tomcat组件
    • 3.1 Connector
    • 3.2 Engine
      • 3.2.1 Host
        • 3.2.1.1 Context
  • 4, 其它: 重要
    • 4.1 设置

Tomcat

1, 概述

web服务器有很多种。在大多数情况下,我们会选择Tomcat。

Tomcat是一个服务器:

- 在这这个Tomcat的服务器的概念, 指的是具有监听别的用户请求和响应用户请求功能的一个运行在电脑上的程序.

1.1 安装

Tomcat的官网: https://tomcat.apache.org/

Tomcat直接解压缩到某个盘符根目录即可,不要放置在很深的目录结构中,同时也建议不要放置在中文目录下,以防出现一些问题。(不仅仅针对Tomcat,对其他软件也是如此)

注意自己的计算机要拥有JAVA_HOME配置, 才能运行Tomcat

(如果电脑上没有配置JAVA_HOME, 启动Tomcat会一闪而过)

(注意是否端口占用)

1.2 目录结构

目录结构

- bin目录:二进制文件存放目录,启停tomcat的文件均位于该目录下
-  conf目录:配置文件的存放目录
-  logs目录:日志存放目录,tomcat正常启动及错误启动的日志信息均会记录在此目录中。可以作为tomcat启动失败时一个调试方式。
 (面试中问题: 线上出了BUG,你是怎么解决的/定位的?Tomcat的日志信息, 报了什么错, 定位错误代码, 修改)


// webapps目录:在tomcat中部署资源的目录
(如果我们要使用Tomcat, 只需要把  后端代码 or 前端代码  放到Tomcat的webapps下面, 然后启动Tomcat -> 这种行为称为"部署应用")
(面试中问到的问题: Java项目是怎么部署和上线的?    方式1,java项目写好了->编译(class)打包(war)-> 把这个打成的war, 放到云服务中的Tomcat的webapps下面, 启动Tomcat, 结束.     )
(上面面试回答的补充: 1, Tomcat -> 意味有云服务安装了JVM;  2, 安装数据库 3,买域名->dns解析  )



- lib目录:tomcat运行时依赖的jar包存放于此
- temp目录:临时文件的存放目录
- work目录:tomcat工作时的工作目录

在这里插入图片描述

1.3 启动/停止

启动Tomcat

// 1, Tomcat的bin目录下点击执行startup.bat文件
// 2, Tomcat的bin目录下唤出cmd,输入startup  或者 startup.bat 执行

注意: 如果启动过程,Tomcat窗口一闪而过,那是JAVA_HOME没有配置正确

停止Tomcat

// 1, Tomcat的bin目录下执行shutdown.bat文件
// 2, Tomcat的bin目录下唤出cmd,执行shutdown
// 3, 在tomcat启动成功的窗口,按住ctrl键,多次按c键,也可以停止 (不建议)

2, 资源部署

应用 = 项目: 部署应用(应用当成一个项目 或者 一个代码模块), 部署项目

需要注意的是tomcat最小单位是应用, 一个Tomcat容器中可以包含多个应用,资源文件必须放置在应用中,应用有两个属性,应用名和应用路径

2.1 直接部署: 主要和重要的方式

创建目录部署

// 直接在tomcat的webapps目录下新建一个目录,当tomcat运行时便会将webapps目录下这个新建目录解析成为一个应用/一个项目。
// 资源文件放置在该目录内内部, 访问时只需要通过如下路径来访问:
http://主机:端口号/应用名(目录的名称)/相对应用内部的一个相对路径构成

在这里插入图片描述

// 如图: 如果需要访问1.txt,那么访问的地址为http://localhost:8080/hello/1.txt

War包部署

// 我们可以通过部署java项目的war包的形式(war包是一个Java项目经过编译压缩之后的一个压缩包格式),当Tomcat运行的时候,  Tomcat会将webapps下的war包会自动解压缩成目录(原理上和上面是等价的),访问方式同上。

2.2 虚拟映射: 重要

虚拟映射, 我们可能不会直接使用. (1, 用到, 给idea配置tomcat)

所谓虚拟映射, 就是把应用部署到tomcat目录之外,通过一些虚拟的方式把这个项目映射到Tomcat的webapps目录中

2.2.1 方式一:

配置文件: conf/Catalina/localhost目录下新建一个xml文件,并配置

在这里插入图片描述

<!-- 配置映射资源的来源文件地址 -->
<Context docBase="D:\appname" />

该配置项表示的含义是配置了一个叫做/app的应用(应用名为xml文件的名称),即/app, 该应用指向的路径即应用路径为D:\app2,如果希望访问该目录下某个文件,则通过如下方式来访问:

http://主机:端口号/app/app2目录内文件路径

2.2.1 方式二:

配置文件: conf/server.xml文件中

<!-- 在Host节点下配置Context节点 -->
<!-- path代表应用名, docBase代表映射的资源位置 -->
<Context path="/appName" docBase="D:\appPath" />

访问方式(同方式一): eg: http://localhost:8080/app3/12.jpg

2.3 原理解析

要明确一点的是,静态资源服务器的本质其实就是把用户在浏览器地址栏输入的一个网络路径加以解析转换成服务器主机硬盘路径

在明确上述问题之后,那么部署资源的方式就容易理解了。tomcat中最小的单位是应用,任何一个资源文件都必须放置在应用中。

在这里插入图片描述

当我们使用直接部署时,假设tomcat位于D:/tomcat目录下,而后我们在webapps目录下新建一个hello目录,在该目录下存放资源文件,那么当我们访问http://localhost:8080/hello时,尝试解析/hello对应的硬盘路径为D:/tomcat/webapps/hello,而后访问http://localhost:8080/hello/1.txt时,对应的文件路径为D:/tomcat/webapps/hello/1.txt,文件恰好位于该路径,那么便可以获取到文件的输入流,随后将文件响应出去

当我们使用虚拟映射时,tomcat的存放路径依然是D:/tomcat目录下,此时我们的文件位于D:/app2目录下,紧接着我们进行了虚拟映射的配置,配置应用的名称为/app3,应用的路径为D:/app2,当输入的地址http://localhost:8080/app3时,此时关联到的硬盘路径为D:/app2目录,随后如何访问某个文件,只需要写出该文件相对D:/app2目录的一个相对路径关系即可。

3, Tomcat组件

Tomcat组件-> Tomcat的内部的构成

有点抽象(认为设计的东西, 非现实中的抽象)

Tomcat是由一系列可以配置的组件所构成。组件元素位于conf/server.xml文件中。当tomcat启动时,会读取server.xml文件里面的内容,按照xml文件的设置,生成相应的组件对象。也就是说,如果我们希望tomcat运行时的组件发生变化,只需要对server.xml文件进行修改即可。Tomcat组件中有一个比较核心的组件需要我们重点关注。

<?xml version="1.0" encoding="UTF-8"?>

<!-- 整个Tomcat是一个Server(整一个Tomcat服务) --> 
<Server port="8005" shutdown="SHUTDOWN">


 <!-- 一个Server可以包含多个Service(多个服务空间)  -->
 <Service name="Catalina">

	<!-- 一个Service可以有多个Connector(功能和端口不能重复):Connector监听的请求全部要触发到Engine中   -->
   <Connector port="8080" protocol="HTTP/1.1"
              connectionTimeout="20000"
              redirectPort="8443" />
	<Connector port="443" protocol="HTTP/1.0"
              connectionTimeout="20000"
              redirectPort="8443" />
  
   <!-- 一个Service 只能包含一个Engine --> 
   <Engine name="Catalina" defaultHost="localhost">


	  <!-- 一个Engine可以包含多个 Host(虚拟主机) --> 
	  <!-- appBase 用来标识这个虚拟主句Host管理的文件夹(这个文件夹里面放到都是这个虚拟主机管理的项目) -->
     <Host name="www.baidu.com"  appBase="webapps"
           unpackWARs="true" autoDeploy="true">
			
			<!-- 一个Host虚拟主机里面可以包含多个Context(一个Context代表一个应用/项目)  --> 
			
			<!-- path:代表虚拟映射项目的名字, docBase: 指向某一个被映射的目录  -->
			<Context path="/app3" docBase="C:\Users\snow\Desktop\d" />

     </Host>
	  
	  <  <!-- 一个Engine可以包含多个 Host(虚拟主机) --> 
     <Host name="www.taobao.com"  appBase="webapps"
           unpackWARs="true" autoDeploy="true">
			
	  </Host>
   </Engine>
 </Service>
 
</Server>

在这里插入图片描述

3.1 Connector

Connector:负责接收客户端的请求以及对客户端做出响应。主要职责是负责持续不断监听某一端口号,将客户端传递过来的请求报文解析转换成request对象,同时还会提供一个response对象,将这两个对象传递给Engine。

3.2 Engine

负责接收Connector传递过来的request对象以及response对象,并进一步传递给Host

3.2.1 Host

负责接收Engine传递过来的request对象以及response对象,并挑选一个合适的Context对象进行进一步传递

3.2.1.1 Context

负责处理具体的业务逻辑。比如利用应用路径拼接请求资源路径,接下来在硬盘上查找该文件是否存在,并且写入数据到reponse中,最终Connector会读取response中的数据

4, 其它: 重要

4.1 设置

默认端口设置

当我们在访问http://www.baidu.com时,我们发现请求的地址中没有端口号,为什么没有端口号,是因为没有使用端口号吗?不是的。而是当前服务器使用的是 当前协议的默认端口号,对于http协议来说,默认端口号是80。所以如果希望你的tomcat在访问时也不携带端口号,那么需要设置你的tomcat监听80端口号即可。

<!-- conf/server.xml文件 -->
<Connector port="80" protocol="HTTP/1.1"
              connectionTimeout="20000"
              redirectPort="8443" />

缺省应用: 默认应用-> ROOT

观察webapps目录下的应用,有一个非常特殊,ROOT,访问该目录下的资源文件时,不能通过/ROOT/1.html来访问,需要去掉应用名。ROOT应用为tomcat的缺省应用,意思是当找不到合适的应用来处理时,会将请求交给缺省应用来处理。访问缺省应用下的资源文件时,不需要携带应用名。

如何设置应用为缺省应用?
// 方式一:在webapps目录下的应用,目录名改为ROOT  (这种更合适)
// 方式二:在conf/Catalina/localhost目录下配置ROOT.xml文件  (平时实际操作不建议)
// 方式三: 在conf/server.xml配置  (不要让path="/ROOT" -> 定义一个项目名叫ROOT, 而不是所谓的默认应用)

欢迎页面

在某些场景下,我们发现请求的资源地址最终指向的是目录而不是一个具体的资源文件,那么访问的是哪个文件呢?实际上访问的是当前应用下的欢迎页面。

<!-- conf/web.xml文件中有配置 --> 
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
  <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

比如访问http://localhost:8080/application

地址指向的是一个应用,而不是一个具体的资源,那么tomcat会去加载哪个页面呢?依次按照welcome-file中的设置,一个一个在当前应用下去查找文件是否存在,首先查找index.html、index.htm、index.jsp如果查找到,则结束,如果没有查找到,则进入到下一个,如果全部都没有找到,则最终返回404.

思考题:设置Tomcat: 通过ip地址就可以直接访问到某个 png图片文件,应该如何设置?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OSPF - 链路状态路由协议

IGP 外部网关路由协议&#xff1a; OSPF &#xff0c; IS-IS EGP 内部网关路由协议&#xff1a; BGP 协议算法&#xff1a; 距离矢量路由协议 链路状态路由协议 lsdb:链路状态数据库 - 存放lsa的地址 RIP&#xff1a;有方向的矢量&#xff0c;距离矢量路由协议&#xf…

通过Maven导入本地jar包

1.创建lib文件夹&#xff0c;把jar包放到文件夹里面 2.在pom里导入依赖 导入完成

政安晨:【深度学习神经网络基础】(九)—— 在深度学习神经网络反向传播训练中理解梯度

目录 简述 理解梯度 什么是梯度 计算梯度 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 简述 在深度…

基于Zookeeper 简单实现分布式任务协调组件

一、什么是 Zookeeper ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。 它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维…

死磕GMSSL通信-java/Netty系列(二)

死磕GMSSL通信-java/Netty系列(二) 在上一篇文章中,我们探讨了如何利用C/C++实现国密通信。而本文将聚焦于Java环境下,特别是基于Netty框架,如何实现与国密系统的安全通信。为了确保新项目遵循最新的国密标准,我们将优先推荐使用GB/T 38636-2020(TLCP)协议。对于Java开…

[C++][算法基础]二分图的最大匹配(匈牙利算法)

给定一个二分图&#xff0c;其中左半部包含 n1 个点&#xff08;编号 1∼n1&#xff09;&#xff0c;右半部包含 n2 个点&#xff08;编号 1∼n2&#xff09;&#xff0c;二分图共包含 m 条边。 数据保证任意一条边的两个端点都不可能在同一部分中。 请你求出二分图的最大匹配…

天池酒瓶瑕疵检测数据集分析及完整baseline

以下内容为还没思路的小伙伴牵个头提供一个demo,大佬勿喷,线上成绩0.7,留空间给小伙伴们发挥自己的力量 ps:markdown不怎么熟悉,代码中如有明显缩进问题,自行斟酌改正,编辑好几次都改不过来,请原谅.... 数据分析瑕疵大类: 瓶盖瑕疵、标贴瑕疵、喷码瑕疵、瓶身瑕疵、酒液瑕疵瑕…

会议室预约小程序开源版开发

会议室预约小程序开源版开发 支持设置免费预约和付费预约、积分兑换商城、积分签到等 会议室类目&#xff0c;提供多种类型和设施的会议室选择&#xff0c;满足不同会议需求。 预约日历&#xff0c;展示会议室预约情况&#xff0c;方便用户选择空闲时段。 预约记录&#xff0…

机器学习实验------决策树

第1关&#xff1a;什么是决策树 任务描述 本关任务&#xff1a;根据本节课所学知识完成本关所设置的选择题。 第2关&#xff1a;信息熵与信息增益 任务描述 本关任务&#xff1a;掌握什么是信息增益&#xff0c;完成计算信息增益的程序设计。 import numpy as npdef calcIn…

聚道云软件连接器助力企业实现滴滴出差报销自动化

一、客户介绍 某机械有限公司是一家在机械设备制造领域拥有深厚底蕴和卓越实力的企业。自公司成立以来&#xff0c;该公司始终秉承创新、务实、高效的发展理念&#xff0c;专注于机械设备的研发、生产和销售。经过多年的发展&#xff0c;公司已成为国内机械行业的佼佼者&#…

在Qt中如何简单设计一个文件和图像浏览器

文本浏览器 设计一个文本浏览器程序&#xff0c;可以打开、显示 txt、html等文件。 1.在Qt Designer中设计一个菜单其中包含打开和退出选项&#xff1a; 2. 在 QMainWindow 构造函数中把 textBrower 设为主窗口的中心部件&#xff0c;这样整个窗口就成了包含 textBrower 的单文…

书生·浦语2.0(InternLM2)大模型实战--Day04 XTuner微调 | 1.8B 多模态Agent

视频地址&#xff1a; https://b23.tv/QUhT6ni课程文档&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/xtuner/readme.md作业文档&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/xtuner/homework.md XTuner 微调个人小助手认知 在本节课中讲一步…

SQL刷题---2021年11月每天新用户的次日留存率

解题思路&#xff1a; 1.首先算出每个新用户注册的日期,将其命名为表a select uid,min(date(in_time)) dt from tb_user_log group by uid2.计算出每个用户登录的天数,将其命名为表b select uid,date(in_time) dt from tb_user_log union select uid,date(out_time) dt fro…

linux C -- 消息队列

linux C -- 消息队列 前言一、System V(IPC)消息队列接口调用主要涉及到 msgget、msgsnd、msgrcv 和 msgctl 四个接口&#xff1a; 1、创建消息队列 msgget2、发送消息到队列3、从队列接收信息4、控制消息队列 msgctl5、删除消息队列 二、代码编写1、发送部分的代码2、代码完成…

扭蛋机市场如何?全新淘宝扭蛋机小程序发展前景

近几年&#xff0c;扭蛋机市场发展的非常迅速&#xff0c;市场发展前景也在不断扩大。随着人们的生活水平提高&#xff0c;对娱乐消费也更加青睐&#xff0c;尤其是具有刺激性、惊喜性的消费模式。而扭蛋机具备的优势刚好符合大众对娱乐消费的要求&#xff0c;因此&#xff0c;…

Kafka服务端(含Zookeeper)一键自启软件

1. 前言 本文介绍了一款集成图形化界面配置和一键自启功能的Kafka与Zookeeper服务管理软件。该软件通过直观易用的图形界面&#xff0c;使用户能够轻松完成Kafka和Zookeeper的配置工作&#xff0c;有效避免了手动编辑配置文件可能带来的错误和不便。同时&#xff0c;软件还提供…

TCP网络程序

上一章我们基于UDP实现了几个网络程序&#xff0c;这一章我们开始使用TCP。 先简单复习一下TCP和UDP的特点&#xff1a; TCP特点 传输层协议有连接可靠传输面向字节流 UDP特点 传输层协议无连接不可靠传输面向数据报 可以看到TCP是有链接的&#xff0c;而UDP是无连接的&#…

简单3步,OpenHarmony上跑起ArkUI分布式小游戏

标准系统新增支持了方舟开发框架&#xff08;ArkUI&#xff09;、分布式组网和 FA 跨设备迁移能力等新特性&#xff0c;因此我们结合了这三种特性使用 ets 开发了一款如下动图所示传炸弹应用。 打开应用在通过邀请用户进行设备认证后&#xff0c;用户须根据提示完成相应操作&am…

2024-14.python前端+Django

第四篇 web前端 第1章 、Web的基本概念 前端基础总共分为三部分&#xff1a;html、css和js。 1.3、HTTP协议 1.3.1 、http协议简介 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于万维网&#xff08;WWW:World Wide Web &am…

神经网络压缩图像

简介 典型的压缩管道由四个组件组成&#xff1a; 编码&#xff1a;输入图像 x x x通过编码器函数 ε \varepsilon ε&#xff0c;将其转换为潜在表示 z z z。 量化&#xff1a;截断 z z z以丢弃一些不重要的信息 熵编码&#xff1a;使用某种形式的熵编码&#xff08;例如&…
最新文章