4.2 Web 应用目录结构


文档摘要

4.2 Web 应用目录结构 第四章 Web 应用部署:4.2 Web 应用目录结构详解 4.2.1 Web 应用目录结构概述 当 Tomcat 部署一个 Web 应用时,无论是通过 WAR (Web Application Archive) 文件还是展开的目录,都需要遵循一定的目录结构规范。这种结构是 Java Servlet 规范定义的标准,Tomcat 作为 Servlet 容器,自然也严格遵循这一规范。 一个典型的 Web 应用目录结构,在根目录下主要包含以下内容: 静态资源文件: 例如 HTML 文件 ( , )、CSS 文件 ( )、JavaScript 文件 ( )、图片文件 ( , , ) 等。这些文件直接对外提供访问,构成 Web 应用的用户界面。

4.2 Web 应用目录结构

第四章 Web 应用部署:4.2 Web 应用目录结构详解

4.2.1 Web 应用目录结构概述

当 Tomcat 部署一个 Web 应用时,无论是通过 WAR (Web Application Archive) 文件还是展开的目录,都需要遵循一定的目录结构规范。这种结构是 Java Servlet 规范定义的标准,Tomcat 作为 Servlet 容器,自然也严格遵循这一规范。

一个典型的 Web 应用目录结构,在根目录下主要包含以下内容:

  • 静态资源文件: 例如 HTML 文件 (.html, .htm)、CSS 文件 (.css)、JavaScript 文件 (.js)、图片文件 (.jpg, .png, .gif) 等。这些文件直接对外提供访问,构成 Web 应用的用户界面。

  • WEB-INF 目录: 这是一个非常特殊的目录,客户端无法直接访问 WEB-INF 目录下的任何内容。它用于存放 Web 应用的配置信息、Java 类文件、库文件等敏感或重要的资源。WEB-INF 目录是 Web 应用安全性的重要组成部分。

  • META-INF 目录 (可选): 用于存放 Web 应用的元数据信息,例如 MANIFEST.MF 文件,以及用于定义应用上下文配置的 context.xml 文件 (在某些场景下)。

可以用 Mermaid 的 graph TD 图来直观地表示 Web 应用的基本目录结构:

接下来,我们将详细解析每个目录和文件的作用及其代码实践。

4.2.2 根目录:Web 应用的入口

Web 应用的根目录是部署的入口点。当用户通过浏览器访问 Web 应用时,Tomcat 会从根目录开始寻找对应的资源。根目录下可以直接存放静态资源文件,这些文件可以通过相对路径直接被访问。

代码实践:

假设我们有一个简单的 Web 应用,需要在根目录下放置一个 index.html 文件作为应用的首页。

index.html 内容:

<!DOCTYPE html> <html> <head> <title>欢迎来到我的 Web 应用</title> </head> <body> <h1>你好,世界!</h1> <p>这是一个简单的 Web 应用示例。</p> <img src="https://www.aiknowledge.cn/images/Tomcat/tomcat_logo.png" alt="Tomcat Logo"> </body> </html>

同时,我们可以在根目录下创建一个 images 目录,存放图片资源,例如 tomcat_logo.png

目录结构:

webapp-root/ ├── index.html └── images/ └── tomcat_logo.png

访问方式:

假设 Web 应用部署在 Tomcat 的 webapp-root 目录下,并且 Tomcat 运行在 localhost:8080。那么,用户可以通过浏览器访问 http://localhost:8080/webapp-root/ 或者 http://localhost:8080/webapp-root/index.html 来访问这个首页。图片资源 tomcat_logo.png 可以通过 http://localhost:8080/webapp-root/https://www.aiknowledge.cn/images/Tomcat/tomcat_logo.png 访问。

内容详解:

  • 静态资源: 根目录主要用于存放静态资源,这些资源无需服务器端处理,可以直接由浏览器解析和渲染。

  • 默认首页: 通常 index.htmlindex.jsp 等文件会被配置为默认首页。当用户访问应用的根路径时,服务器会自动返回默认首页的内容。

  • 路径访问: 根目录下的文件和子目录可以通过相对于 Web 应用根路径的 URL 进行访问。

4.2.3 WEB-INF 目录:核心与安全之地

WEB-INF 目录是 Web 应用目录结构中最重要的组成部分。它包含了 Web 应用的部署描述符、Java 类文件、库文件等关键信息。任何位于 WEB-INF 目录下的资源,都不能被客户端直接访问。这是 Web 应用安全性的重要保障。

WEB-INF 目录下通常包含以下子目录和文件:

  • web.xml: Web 应用的部署描述符 (Deployment Descriptor),是 Web 应用的核心配置文件。

  • classes 目录: 用于存放编译后的 Java 类文件,例如 Servlet、Filter、Listener 等。目录结构应与 Java 包结构保持一致。

  • lib 目录: 用于存放 Web 应用依赖的 JAR 库文件,例如第三方库、数据库驱动等。

  • jsp 目录: (Tomcat 内部使用,不推荐手动创建)Tomcat 在运行时会将 JSP 页面编译成 Servlet,并可能将编译后的 Servlet 类文件存放在 WEB-INF/jsp 目录下。开发者通常不需要手动创建和管理 WEB-INF/jsp 目录

4.2.3.1 web.xml:部署描述符

web.xml 文件是 Web 应用的部署描述符,位于 WEB-INF 目录下。它是一个 XML 文件,用于配置 Web 应用的各种组件和行为,包括:

  • Servlet 配置: 定义 Servlet 的名称、类、初始化参数、加载时机等。

  • Filter 配置: 定义 Filter 的名称、类、映射规则、初始化参数等。

  • Listener 配置: 定义 ServletContextListener、HttpSessionListener 等监听器。

  • 欢迎文件列表 (Welcome File List): 指定默认首页文件列表。

  • 错误页面 (Error Pages): 配置错误状态码或异常类型对应的错误页面。

  • 会话配置 (Session Configuration): 设置会话超时时间等。

  • 安全约束 (Security Constraints): 定义资源访问权限、认证方式等。

  • JSP 配置 (JSP Configuration): 配置 JSP 页面相关的属性。

  • MIME 类型映射 (MIME Mapping): 定义文件扩展名与 MIME 类型的映射关系。

  • 资源引用 (Resource Environment References): 配置 JNDI 资源引用。

  • 上下文参数 (Context Parameters): 定义全局的上下文参数。

代码实践:

创建一个简单的 web.xml 文件,配置一个 Servlet 和一个欢迎文件列表。

WEB-INF/web.xml 内容:

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <display-name>MyWebApp</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.example.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>

内容详解:

  • <web-app>: web.xml 文件的根元素,定义了 XML 命名空间和版本。

  • <display-name>: Web 应用的显示名称,通常用于管理工具显示。

  • <welcome-file-list>: 欢迎文件列表,指定了当用户访问根路径时,服务器依次查找的文件名。这里配置了 index.htmlindex.jsp

  • <servlet>: 定义一个 Servlet。

    • <servlet-name>: Servlet 的名称,用于在 web.xml 中引用 Servlet。

    • <servlet-class>: Servlet 类的完全限定名 (包名 + 类名)。

  • <servlet-mapping>: 将 Servlet 映射到 URL 模式。

    • <servlet-name>: 引用之前定义的 Servlet 名称。

    • <url-pattern>: URL 模式,指定哪些 URL 请求会被映射到该 Servlet。这里 /hello 表示访问 /hello 路径会由 HelloServlet 处理。

4.2.3.2 classes 目录:Java 类文件

WEB-INF/classes 目录用于存放编译后的 Java 类文件,例如 Servlet、Filter、Listener、JavaBean 等。Tomcat 会自动加载 classes 目录下的类文件。目录结构必须与 Java 包结构保持一致

代码实践:

假设我们在 web.xml 中配置了 com.example.servlet.HelloServlet,那么我们需要在 WEB-INF/classes 目录下创建相应的包路径和 Java 类文件。

目录结构:

webapp-root/ └── WEB-INF/ ├── web.xml └── classes/ └── com/ └── example/ └── servlet/ └── HelloServlet.class

com/example/servlet/HelloServlet.java 源代码 (编译后生成 HelloServlet.class):

package com.example.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=UTF-8"); PrintWriter out = resp.getWriter(); out.println("<!DOCTYPE html>"); out.println("<html><head><title>Hello Servlet</title></head><body>"); out.println("<h1>你好,Servlet!</h1>"); out.println("<p>这是由 HelloServlet 生成的页面。</p>"); out.println("</body></html>"); } }

访问方式:

配置完成后,访问 http://localhost:8080/webapp-root/hello 将会执行 HelloServlet,并在浏览器中显示 "你好,Servlet!" 的页面。

内容详解:

  • 包结构: classes 目录下的目录结构必须与 Java 类的包结构一致,这样 Tomcat 才能正确加载类文件。

  • Servlet、Filter、Listener: 所有 Servlet、Filter、Listener 的类文件都需要放在 classes 目录下对应的包路径下。

  • JavaBean: 自定义的 JavaBean 类也可以放在 classes 目录下,供 Web 应用使用。

4.2.3.3 lib 目录:JAR 库文件

WEB-INF/lib 目录用于存放 Web 应用依赖的 JAR (Java Archive) 库文件。这些 JAR 文件包含了 Web 应用运行时需要的第三方库、数据库驱动、或其他依赖的 Java 代码。Tomcat 会自动加载 lib 目录下的所有 JAR 文件,并将 JAR 文件中的类添加到 Web 应用的类路径中。

代码实践:

假设我们的 HelloServlet 需要使用一个第三方库,例如 commons-lang3-3.12.0.jar。我们需要将这个 JAR 文件放到 WEB-INF/lib 目录下。

目录结构:

webapp-root/ └── WEB-INF/ ├── web.xml ├── classes/ │ └── com/ │ └── example/ │ └── servlet/ │ └── HelloServlet.class └── lib/ └── commons-lang3-3.12.0.jar

修改 HelloServlet.java 使用 commons-lang3 库:

package com.example.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import org.apache.commons.lang3.StringUtils; // 引入 commons-lang3 库 public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=UTF-8"); PrintWriter out = resp.getWriter(); out.println("<!DOCTYPE html>"); out.println("<html><head><title>Hello Servlet</title></head><body>"); out.println("<h1>你好,Servlet!</h1>"); String message = "使用 commons-lang3 库进行字符串操作: " + StringUtils.reverse("Hello"); // 使用 StringUtils.reverse() out.println("<p>" + message + "</p>"); out.println("</body></html>"); } }

内容详解:

  • 依赖管理: lib 目录是 Web 应用依赖管理的重要方式。将 JAR 文件放入 lib 目录即可方便地引入第三方库。

  • 类路径: Tomcat 会将 lib 目录下的 JAR 文件添加到 Web 应用的类路径中,使得 Web 应用中的类可以访问 JAR 文件中的类。

  • 版本冲突: 需要注意不同 JAR 文件之间的版本冲突问题。Tomcat 的类加载机制有一定的优先级,需要仔细管理依赖关系。

4.2.3.4 jsp 目录 (Tomcat 内部使用)

WEB-INF/jsp 目录在 Tomcat 中主要用于存放 Tomcat 内部生成的 JSP 页面对应的 Servlet 类文件。 当 Tomcat 首次接收到对 JSP 页面的请求时,它会将 JSP 页面编译成 Servlet 类,并可能将编译后的 Servlet 类文件存放在 WEB-INF/jsp 目录下。

开发者通常不需要手动创建和管理 WEB-INF/jsp 目录。 Tomcat 会自动处理 JSP 页面的编译和 Servlet 类的生成。

4.2.4 META-INF 目录:元数据信息 (可选)

META-INF 目录是 Web 应用目录结构中可选的目录,用于存放 Web 应用的元数据信息。它通常包含以下文件:

  • MANIFEST.MF: JAR 文件的清单文件,用于描述 JAR 文件的元数据信息,例如版本号、创建者、依赖关系等。在 Web 应用中,WAR 文件也可能包含 MANIFEST.MF 文件。

  • context.xml (可选): Tomcat 特定的上下文配置文件,用于配置 Web 应用的上下文参数、资源、会话管理器等。context.xml 文件可以放在多个位置,包括 META-INF 目录下、Tomcat 的 conf/[enginename]/[hostname] 目录下,以及 conf/Catalina/localhost 目录下。放在 META-INF 目录下时,通常用于 WAR 文件部署,提供 Web 应用级别的上下文配置。

4.2.4.1 MANIFEST.MF 文件

MANIFEST.MF 文件是一个纯文本文件,位于 JAR 或 WAR 文件的 META-INF 目录下。它包含了关于 JAR 或 WAR 文件的元数据信息,例如:

  • Manifest-Version: Manifest 文件的版本。

  • Created-By: 创建 Manifest 文件的工具和版本。

  • Built-By: 构建 JAR/WAR 文件的构建工具和版本。

  • Class-Path: 指定 JAR 文件依赖的其他 JAR 文件的相对路径。

  • 自定义属性: 可以添加自定义的属性,例如版本号、项目名称等。

代码实践:

一个简单的 MANIFEST.MF 文件示例:

Manifest-Version: 1.0 Created-By: 1.8.0_291 (Oracle Corporation) Built-By: Maven 3.8.1 Implementation-Version: 1.0.0 Project-Name: MyWebApp

内容详解:

  • 元数据描述: MANIFEST.MF 文件提供了关于 JAR/WAR 文件的元数据描述,方便管理和识别。

  • 类路径配置: Class-Path 属性可以用于配置 JAR 文件依赖的其他 JAR 文件,但通常在 Web 应用中,依赖的 JAR 文件直接放在 WEB-INF/lib 目录下即可,无需在 MANIFEST.MF 中配置 Class-Path

  • WAR 文件: WAR 文件通常会包含 MANIFEST.MF 文件,用于描述 Web 应用的元数据信息。

4.2.4.2 context.xml 文件 (可选)

context.xml 文件是 Tomcat 特定的上下文配置文件,用于配置 Web 应用的上下文环境。它可以配置的项包括:

  • 资源 (Resources): 例如数据源 (DataSource)、JMS 连接工厂 (ConnectionFactory) 等 JNDI 资源。

  • 会话管理器 (Manager): 配置会话管理器的实现类、持久化策略等。

  • 会话 Cookie 配置 (Session Cookie Config): 配置会话 Cookie 的属性,例如名称、域、路径、安全标志等。

  • Loader: 配置 Web 应用的类加载器。

  • Realm: 配置安全 Realm,用于用户认证和授权。

  • 参数 (Parameters): 定义 Web 应用级别的上下文参数,可以在整个 Web 应用中访问。

代码实践:

一个简单的 META-INF/context.xml 文件示例,配置一个 JNDI 数据源:

<?xml version="1.0" encoding="UTF-8"?> <Context> <Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC" username="username" password="password" maxActive="20" maxIdle="10"/> </Context>

内容详解:

  • Tomcat 特有: context.xml 是 Tomcat 特有的配置文件,用于配置 Web 应用的 Tomcat 上下文环境。

  • 灵活配置: 通过 context.xml 文件,可以灵活地配置 Web 应用的资源、会话管理、安全等方面的属性。

  • 部署位置: context.xml 可以放在多个位置,放在 META-INF 目录下时,通常用于 WAR 文件部署,提供 Web 应用级别的上下文配置。

4.2.5 总结

Web 应用的目录结构是 Tomcat 部署 Web 应用的基础。理解和遵循规范的目录结构,能够确保 Web 应用在 Tomcat 中正确运行,并方便开发和维护。

关键要点回顾:

  • 根目录: 存放静态资源文件,作为 Web 应用的入口。

  • WEB-INF: 核心目录,存放部署描述符 (web.xml)、Java 类文件 (classes)、库文件 (lib) 等,客户端无法直接访问。

  • META-INF: 可选目录,存放元数据信息,例如 MANIFEST.MFcontext.xml

  • web.xml: 部署描述符,配置 Web 应用的各种组件和行为。

  • classes: 存放编译后的 Java 类文件,目录结构与包结构一致。

  • lib: 存放 Web 应用依赖的 JAR 库文件。

  • 安全性: WEB-INF 目录下的资源无法直接访问,保障了 Web 应用的安全性。

掌握 Web 应用目录结构,是成为一名合格的 Java Web 开发者的重要一步。在实际开发中,应该严格按照规范组织 Web 应用的目录结构,并充分利用 web.xmlcontext.xml 等配置文件,灵活地配置 Web 应用的各项属性,以满足实际需求。

希望本章节的详细讲解和代码实践能够帮助你深入理解 Tomcat Web 应用的目录结构,并在实际开发中灵活运用。


发布者: 作者: 转发
评论区 (0)
U