0%

web项目的目录结构

Java Web 项目目录结构:规范与最佳实践

Java Web 项目的目录结构遵循一定的规范,合理的目录组织不仅便于开发维护,还能确保应用在不同 Servlet 容器(如 Tomcat、Jetty)中正常运行。本文将详细解析标准 Web 项目的目录结构、各目录的作用及配置要点。

Web 应用的根目录

Web 应用的根目录(通常称为上下文路径,Context Path)是应用部署到容器后的访问入口(如 http://localhost:8080/myapp 中的 myapp 即为根目录)。根目录下的文件和子目录可分为两类:公开资源(客户端可直接访问)和私有资源WEB-INF 目录,客户端不可直接访问)。

核心目录与文件详解

WEB-INF 目录(私有资源)

WEB-INF 是 Web 应用的核心私有目录,存放应用的配置文件、类文件和依赖库,客户端无法通过 URL 直接访问(需通过 Servlet 或 JSP 转发访问)。

(1)WEB-INF/web.xml

Web 应用的部署描述符,用于配置 Servlet、过滤器(Filter)、监听器(Listener)、初始化参数、错误页面等。
示例配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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">

<!-- Servlet 配置 -->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.example.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>

<!-- 错误页面配置 -->
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
</web-app>
(2)WEB-INF/classes

存放 Web 应用的编译后的 class 文件(包括 Servlet、工具类、实体类等),目录结构需与 Java 包结构一致(如 com/example/HelloServlet.class)。

  • 该目录是 Web 应用的类加载路径,容器会优先从这里加载类;
  • Maven/Gradle 项目中,编译后的 class 文件会自动输出到该目录。
(3)WEB-INF/lib

存放 Web 应用依赖的第三方 JAR 包(如 commons-fileupload.jarmysql-connector-java.jar 等)。

  • 容器会自动加载该目录下的所有 JAR 包,供应用中的类调用;
  • classes 目录相比,lib 用于管理外部依赖,classes 用于存放应用自身代码。
(4)WEB-INF/其他配置文件

web.xml 外,其他配置文件(如 Spring 配置 applicationContext.xml、日志配置 log4j.properties)通常也放在 WEB-INF 目录下,通过类路径加载:

1
2
3
4
5
// 加载 WEB-INF/classes 下的配置文件
InputStream is = getClass().getResourceAsStream("/config.properties");

// 加载 WEB-INF 下的配置文件(需通过 ServletContext)
InputStream is = getServletContext().getResourceAsStream("/WEB-INF/spring.xml");

根目录下的公开资源

根目录下(与 WEB-INF 同级)的文件和目录为公开资源,客户端可通过 URL 直接访问,包括:

(1)静态资源
  • HTML 文件(如 index.html);
  • CSS 样式表(如 css/style.css);
  • JavaScript 文件(如 js/script.js);
  • 图片资源(如 images/logo.png)。

示例访问路径:http://localhost:8080/myapp/index.htmlhttp://localhost:8080/myapp/css/style.css

(2)JSP 页面

JSP 页面可直接放在根目录或子目录中(如 login.jspuser/profile.jsp),客户端可直接访问(需注意权限控制):

1
2
3
4
<!-- 根目录下的 login.jsp -->
<form action="/myapp/login" method="post">
<!-- 表单内容 -->
</form>
(3)自定义子目录

可根据功能划分自定义目录,如:

  • static/:统一存放静态资源(CSS、JS、图片);
  • pages/:存放 JSP 页面;
  • upload/:存放用户上传的文件(需配置读写权限)。

Maven 管理的 Web 项目结构

使用 Maven 构建的 Web 项目遵循更规范的目录结构,便于自动化构建和依赖管理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
myapp/                   # 项目根目录
├── src/
│ ├── main/
│ │ ├── java/ # Java 源代码(Servlet、工具类等)
│ │ │ └── com/
│ │ │ └── example/
│ │ │ └── HelloServlet.java
│ │ ├── resources/ # 资源文件(配置文件、日志模板等)
│ │ │ └── config.properties
│ │ └── webapp/ # Web 应用根目录
│ │ ├── index.jsp
│ │ ├── static/
│ │ │ ├── css/
│ │ │ └── js/
│ │ └── WEB-INF/
│ │ ├── web.xml
│ │ ├── classes/ # 编译后的 class 文件(Maven 自动生成)
│ │ └── lib/ # 依赖 JAR 包(Maven 自动复制)
│ └── test/ # 测试代码
│ └── java/
├── pom.xml # Maven 配置文件(依赖管理、构建配置)
└── target/ # 构建输出目录(Maven 自动生成)
└── myapp.war # 打包后的 WAR 文件
  • 编译与打包:Maven 会自动将 src/main/java 编译到 WEB-INF/classes,将依赖 JAR 包复制到 WEB-INF/lib,最终打包为 WAR 文件;
  • 资源文件src/main/resources 下的文件会被自动复制到 WEB-INF/classes,可通过类路径直接访问。

关键注意事项

  1. WEB-INF 的访问限制
    客户端无法直接访问 WEB-INF 下的资源(如 http://localhost:8080/myapp/WEB-INF/login.jsp 会返回 404),需通过 Servlet 转发:

    1
    2
    // 在 Servlet 中转发到 WEB-INF 下的 JSP
    request.getRequestDispatcher("/WEB-INF/pages/login.jsp").forward(request, response);
  2. 类加载顺序
    容器加载类的优先级为:WEB-INF/classes > WEB-INF/lib > 容器自身的类库,避免依赖冲突(如同一 JAR 包的不同版本)。

  3. WAR 包结构
    部署到容器时,Web 应用通常打包为 WAR 文件(Web Application Archive),其内部结构与上述目录结构一致,容器会自动解压并识别。

  4. 版本控制
    通常不将 WEB-INF/classesWEB-INF/lib 等编译生成的目录纳入版本控制,只需管理源代码和配置文件。

欢迎关注我的其它发布渠道