Featured image of post Tomcat目录结构学习

Tomcat目录结构学习

Tomcat目录结构学习,WEB-INF重点补充

Tomcat

基本信息暂时不作过多介绍了,本文聚焦于Tomcat的目录结构理解

目录结构一览

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Tomcat
├── bin
│   ├── bootstrap.jar
│   ├── catalina-tasks.xml
│   ├── catalina.bat
│   ├── service.bat
│   ├── shutdown.bat
│   ├── startup.bat
│   ├── tomcat11.exe
│   ├── tomcat11w.exe
│   ├── version.sh
|	├── .........
|
├── conf	# 用来存放tomcat的一些配置文件
|   ├── Catalina				# Catalina 为一个目录,可以设置默认加载的项目,初始状态下可能不存在
│   ├── catalina.properties
│   ├── context.xml				# context.xml 可以用来配置数据源之类的
│   ├── logging.properties
│   ├── server.xml				# server.xml 可以设置端口号、设置域名或IP、默认加载的项目、请求编码 
│   ├── tomcat-users.xml		# tomcat-users.xml 用来配置管理tomcat的用户与权限 
│   ├── tomcat-users.xsd
│   └── web.xml					# web.xml 可以设置tomcat支持的文件类型 
├── lib		# lib目录主要用来存放tomcat运行需要加载的jar包,建议只把Tomcat需要的jar包放到这个目录下
# 例如,像连接数据库的jdbc的包(mysql-connector-java-8.0.16.jar)我们可以加入到lib目录中来
│   ├── annotations-api.jar
│   ├── catalina-storeconfig.jar
│   ├── tomcat-i18n-es.jar
│   ├── .......
|
├── logs	# 顾名思义,一些日志的保存点
|
├── src		# 并非自带,笔者同时下载了源码zip包,自行创建的目录,放入了源码
│   └── apache-tomcat-11.0.0-src.zip
|
├── temp	# temp目录用户存放tomcat在运行过程中产生的临时文件。(清空不会对tomcat运行带来影响) 
│   └── safeToDelete.tmp 
|
├── webapps
│   ├── ROOT
│   ├── ........ # 稍后重点介绍
├── work	# work 目录用来存放tomcat在运行时的编译后文件,例如运行时生成的文件,最终运行的文件都在这里。通过webapps中的项目生成的!
|			# 可以把这个目录下的内容删除,再次运行时会生再次生成work目录。
|			# 当客户端用户访问一个JSP文件时,Tomcat会通过JSP生成Java文件,然后再编译Java文件生成class文件
|			# 生成的java和class文件都会存放到这个目录下。
|			# 清空work目录,然后重启tomcat,可以达到清除缓存的作用。
|			# 可以把这个目录下的内容删除,再次运行时会生再次生成work目录
|
├── LICENSE				# 许可证
└── NOTICE				# 说明文件

其他没有列出的根目录下的普通文件不重要

Webapps

Tomcat的目录结构中,最值得关注的目录这个是发布和访问目录

webapps目录用来存放应用程序,当tomcat启动时会去加载webapps目录下的应用程序。

可以以文件夹war包jar包的形式发布应用。

也可以把应用程序放置在磁盘的任意位置,在配置文件中映射好就行,如下

其中又分为ROOT目录和其他目录

ROOT

默认情况下,没有访问路径的请求,会被映射到ROOT目录中

举例:如果访问http://localhost:8080/的话,就回去查找ROOT目录

证明:

image-20241206154055568

12133.txt内容如下

image-20241206154133213

这时候,如果访问http://127.0.0.1:8080/12133.txt,结果如下

image-20241206154216194

App目录

其他目录一般遵循一个标准结构,我们统称这种目录为App目录

下图中的前4个目录都可以称为App目录

image-20241206154333019

例如:访问http://127.0.0.1:8080/examples/,那么默认访问的是http://127.0.0.1:8080/examples/index.html

效果如下

image-20241206154513479

index.html内容如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<!DOCTYPE HTML><html lang="en"><head>
<meta charset="UTF-8">
<title>Apache Tomcat Examples</title>
</head>
<body>
<p>
<h3>Apache Tomcat Examples</H3>
<p></p>
<ul>
<li><a href="servlets">Servlets examples</a></li>
<li><a href="jsp">JSP Examples</a></li>
<li><a href="websocket/index.xhtml">WebSocket Examples</a></li>
</ul>
</body></html>

完全对应了

App目录标准结构

Tomcat 自带的 App目录的目录内容如下

1
2
3
4
5
6
7
examples/
├── META-INF
├── WEB-INF
├── index.html
├── jsp
├── servlets
└── websocket

其中,WEB-INF是必要的重要目录,且必须是这个名字!

WEB-INF

WEB-INF 一般是受保护的资源目录,浏览器通过url不可以直接访问的目录

  • /WEB-INF/web.xml Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。 必要文件,web项目的基本配置文件。(较新的版本中可以没有该文件,但是学习过程中还是需要该文件)
  • /WEB-INF/classes/ 包含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中。 web项目中如果没有源码则该目录不会出现
  • /WEB-INF/lib/ 存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件。 web项目要是没有依赖任何jar则该目录不会出现
  • /WEB-INF/src/ 源码目录,按照包名结构放置各个 Java 文件。
  • /WEB-INF/database.properties 数据库配置文件
  • /WEB-INF/tags/ 存放了自定义标签文件 该目录并不一定为 tags,可以根据自己的喜好和习惯为自己的标签文件库命名,当使用自定义的标签文件库名称时,在使用标签文件时就必须声明正确的标签文件库路径。例如:当自定义标签文件库名称为 simpleTags 时,在使用 simpleTags 目录下的标签文件时,就必须在 jsp 文件头声明为:<%@ taglibprefix="tags" tagdir="/WEB-INF/simpleTags" % >
  • /WEB-INF/jsp/ jsp 文件的存放位置。改目录没有特定的声明,同样,可以根据自己的喜好与习惯来命名。此目录主要存放的是 jsp 1.2 以下版本的文件,为区分 jsp 2.0 文件,通常使用 jsp 命名,当然你也可以命名为 jspOldEdition 。

META-INF

  • jar文件

开发中可以直接使用java class文件来运行程序,不过这样不太方便,所以出现了jar文件来提供发布和运行,jar文件实际上是class文件的zip压缩存档,有很多工具都可以操纵这种格式的文件,

但是jar文件本身并不能表达应用程序的便签信息,于是出现了META-INF目录

jar文件中有一个特定的目录来存放标签信息:META-INF目录

为了提供存档的便签信息,出现了META-INF/Manifest.mf文件,它包含了jar文件的内容描述,在应用程序运行时向JVM提供应用程序的信息。

jar文件都有一个默认产生的META-INF目录和其中的manifest.mf文件

使用jar命令可以直接产生META-INF目录和manifest.mf文件

Manifest.mf文件示例:

1
2
3
4
Manifest-Version: 1.0
Created-By: IntelliJ IDEA
Built-By: Dan
Build-Jdk: Oracle OpenJDK 17.0.11

解析

1
2
3
4
5
6
7
Manifest-Version:生成的manifest.mf文件的版本

Created-By:文件的生成者,一般由jar命令行工具生成,这里显示的是:IDEA

Built-By:文件的创建用户命名,在IDEA的配置文件中可以设置

Bulid-Jdk:所使用的JDK环境

其实manifest.mf文件中的配置信息除了上面的四个之外,还是有很多的,以下是几个常见的属性:

一般属性

  1. Signature-Vresion:定义jar文件的签名版本
  2. Class-Path:内部的类搜索路径,提供给应用程序或者类装载器

应用程序的相关属性

  1. Main-Class:定义jar文件的入口类,该类必须可执行!一旦定义了该属性就可以使用java -jar 程序名.jar来运行该jar文件

Manifest.mf文件格式要求

manifest文件中的每一行都是 key-value 对应的;

属性名开头,接着是 “:” ,然后是属性值;

每行最多72个字符,如果需要增加,可以在下一行续行,续行以空格开头,以空格开头的行都会被视为前一行的续行。

其他位置文件映射

找到conf/server.xml文件中的 host 标签,在 host 标签内定义子标签Context

Context标签必须定义 docBase(实际文件所在文件夹路径:例F:\test)属性,path(访问虚拟路径:例/files)属性

举例

1
2
3
4
5
6
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
          # 下列是重点
            <Context docBase="F:\test" path="/files"></Context>
        .....
      </Host>

配置好后,访问路径 localhost:8080/files/css.txt 即可访问到实际路径 F:\test\css.txt 文件

conf\Catalina

这个目录由上可知,这个目录的配置有关于默认加载的项目

而大名鼎鼎的IDEA,即是通过控制conf\Catalina\localhost下的*.xml文件,来映射设置Tomcat与项目output目录之间的关系

image-20241206170721412

上图可以看到,内容其实与conf/server.xml中的配置内容无二,只是这个无需考虑放入到指定位置

补充:

xml 文件内容含义如下:

  • path 表示工程的访问路径:/jndidemo_war_exploded

  • docBase 表示实际的工程目录在哪里,也就是我们需要访问jndidemo_war_exploded文件夹在我们主机上的全路径

注意:这个地方path的参数即/jndidemo_war_exploded要与配置文件名称相一致,可以看到配置文件为jndidemo_war_exploded.xml,其文件名称与path的参数即/jndidemo_war_exploded相一致

Ref

https://blog.csdn.net/m0_68988603/article/details/124285667

https://blog.csdn.net/Helen_1997_1997/article/details/131935349

https://blog.csdn.net/u011479200/article/details/108244382

https://blog.csdn.net/qq_38449518/article/details/82414069

https://blog.csdn.net/MrYushiwen/article/details/113383917

Dan❤Anan
Built with Hugo
主题 StackJimmy 设计