JavaWeb项目结构解析
环境:
Eclipse: 2023-12Maven: apache-maven-3.6.1Tomcat: apache-tomcat-9.0.86- JDK: 11.0.18
本次的项目为制作一个简易登录系统,项目名称为 login-system
选择的项目骨架(archetype)是
| Group Id | Artifact Id | Version |
|---|---|---|
| org.apache.maven.archetypes | maven-archetype-webapp | 1.0 |
第一次创建后的项目目录结构如下
1 | login-system |
其中这个target目录没什么用,暂时不考虑
这些目录有什么作用呢,等会讲
其实这个骨架并不完整,我们还需要添加自己添加一些目录使其完整
1 | login-system |
像这样,其实只是在login-system/src/main/目录下添加了一个java目录,在整个项目中这个目录会被自动标记为 Source Folder 也就是java编译的起点就是在这里(后面web.xml中配置<servlet>的<servlet-class>也是以这个目录为起点)。其实呢,如果不添加这个目录,eclipse还不让你新建 Servlet,它指明了需要在一个java目录下写 Servlet
(好像完整的骨架在 main目录下还有个 test目录,自己加一下吧)
在 ./src/main目录下新建的目录都会被自动标记为 Source Folder,此后这些目录下的 .java文件都被编译为 .class文件,然后存放在 tomcat/webapps/[webapp]/WEB-INF/classes目录下
当然,resources作为 Source Folder,其目录下的资源文件会被直接放在classes目录下
然后我还添加了一个servlet包,目的是为了分类,在这个包下的类都是 Servlet类
在了解整个项目各个目录,各个文件夹的作用前,我们需要先了解tomcat目录下各个文件夹的作用,因为整个项目最终是要部署在tomcat下的
1 | tomcat |
这里为了更好的解释,我对整个tomcat的项目结构做了删改和顺序调整,tomcat下的一级目录以及各个作用这里我就不多做解释,我们这次的重点是webapps目录
在这个目录下除了自带的ROOT目录外还有刚刚创建的login-system项目,这里我要挑明的说
tomcat为什么称为容器,我觉得关键就在于这个webapps目录。我们写的项目可以说是一个webapp,这个 webapp需要依托在tomcat下才能展示出来,一个tomcat不可能只运行一个 webapp,那样太浪费资源了,所以从这里可以看出来,一个tomcat可以运行多个 webapp,在这里ROOT是一个 webapp,login-system也是一个 webapp,它们都被放在tomcat的webapps目录下。
这些 webapp被挂在了tomcat的webapps中,所以说tomcat是一个容器,它容纳了这些 webapp
让我们仔细看一下这个文件目录结构
1 | webapps |
将其中的login-system模块与我们的源项目进行比较
1 | login-system |
会发现极其的相似,这个转化过程是这样的。
我们写一个项目,总会有一个输出结果,而现在这个项目输出结果的重点就是 webapp目录
在转换为能够挂载在tomcat下的 webapp前,eclipse做的工作就是处理java目录(所有 Source Folder),将这里面的 .java文件全部编译为 .class文件后把这些字节码文件一起存放在一个新建的classes目录下,保持原先各个包的结构,然后将整个 classes目录移到与main同级的webapp目录下的WEB-INF目录下。然后将我们写的项目中的webapp目录提取出来,把这个目录名改为项目名。最后把这个login-system目录作为一个 webapp迁移到 tomcat的webapps目录下
这是项目的最终结构
1 | login-system/ |
最后挂载到tomcat
1 | webapps/ |
