- 传统 Java Web 项目(Maven 多模块项目):这是学习 Java Web 开发的基础,结构清晰,职责分明。
- Spring Boot 项目:目前业界的主流,结构更简洁,约定大于配置。
传统 Java Web 项目目录结构 (Maven 多模块)
这种结构通常由一个父 POM (pom.xml) 和多个子模块(如 domain, dao, service, web)组成,我们主要关注 web 模块,因为它最终会被打包成 .war 文件并部署到 Tomcat 等服务器上。
一个典型的多模块项目结构如下:
my-web-project/
├── pom.xml # 父 POM,管理所有公共依赖和版本
│
├── my-web-domain/ # 领域层/实体层模块
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── example/
│ └── entity/
│ └── User.java
│
├── my-web-dao/ # 数据访问层模块
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── example/
│ └── dao/
│ └── UserDao.java
│ └── resources/
│ └── mapper/ # MyBatis Mapper XML 文件
│ └── UserMapper.xml
│
├── my-web-service/ # 业务逻辑层模块
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── example/
│ └── service/
│ ├── UserService.java
│ └── impl/
│ └── UserServiceImpl.java
│
└── my-web-web/ # 表现层/Web 层模块 (最终打包成 WAR)
├── pom.xml
└── src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ └── web/
│ │ ├── controller/
│ │ │ └── UserController.java
│ │ ├── filter/
│ │ │ └── CharacterEncodingFilter.java
│ │ └── listener/
│ │ └── MyContextListener.java
│ │
│ ├── resources/
│ │ └── log4j2.xml # 日志配置文件
│ │
│ └── webapp/ # *** 核心:Web 应用根目录 ***
│ ├── WEB-INF/ # *** 核心:存放敏感和配置文件的目录 ***
│ │ ├── web.xml # *** 核心:Web 应用部署描述符 ***
│ │ ├── lib/ # *** 核心:存放项目依赖的 JAR 包 ***
│ │ └── classes/ # *** 核心:存放编译后的 .class 文件 ***
│ │
│ ├── index.html # 静态页面
│ ├── static/
│ │ ├── css/
│ │ ├── js/
│ │ └── images/
│ └── META-INF/
│ └── context.xml
│
└── test/
└── java/
└── com/
└── example/
└── web/
└── controller/
└── UserControllerTest.java
核心目录详解 (以 webapp 为中心)
-
src/main/webapp:- 这是 Web 应用的根目录,所有对外暴露的资源(如 HTML, CSS, JS, 图片等)都放在这里。
- 当你访问
http://yourdomain.com/时,服务器默认会查找此目录下的index.html或index.jsp。
-
webapp/WEB-INF:- 这是一个受保护的目录,客户端无法直接通过 URL 访问该目录下的任何文件。
web.xml: Web 应用部署描述符,在 Servlet 3.0 之前,这是配置 Servlet, Filter, Listener, Session 配置等的核心文件,现在虽然很多配置可以通过注解完成,但web.xml仍然非常重要,尤其是在定义欢迎页面、错误页面、上下文参数等方面。lib/: 存放当前 Web 项目特有的、没有被 Maven 管理的第三方 JAR 包,在现代 Maven/Gradle 项目中,通常依赖都由构建工具管理,这个目录用得较少,但了解其作用很重要。classes/: 存放编译后的 Java 类文件(.class文件)和资源文件(如.properties,.xml),在 Maven 项目中,这个目录是自动生成的,src/main/java下的源代码被编译后会放到这里,src/main/resources下的文件也会被复制到这里。
-
src/main/java:- 存放所有的 Java 源代码文件,如 Controller, Service, DAO 等,这些代码最终会被编译并放入
WEB-INF/classes目录。
- 存放所有的 Java 源代码文件,如 Controller, Service, DAO 等,这些代码最终会被编译并放入
-
src/main/resources:- 存放非代码的资源文件,
- MyBatis 的 Mapper XML 文件
- 数据库连接配置文件 (
jdbc.properties) - 日志配置文件 (
log4j2.xml,logback.xml) - Spring 的 XML 配置文件 (老式项目)
- Maven 在构建项目时,会自动将
resources目录下的所有文件原封不动地复制到WEB-INF/classes目录下。
- 存放非代码的资源文件,
Spring Boot 项目目录结构
Spring Boot 采用“约定大于配置”的原则,目录结构更简洁,它不再需要 webapp 目录和 web.xml 文件,整个项目通常被打包成一个可执行的 JAR 文件。
一个典型的 Spring Boot 项目结构如下:
my-spring-boot-project/
├── pom.xml # Spring Boot 项目的 POM
│
├── mvnw* # Maven Wrapper (可选)
├── mvnw.cmd # Maven Wrapper (可选)
│
└── src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ └── demo/
│ │ ├── DemoApplication.java # *** 核心:启动类 ***
│ │ ├── controller/
│ │ │ └── HelloController.java
│ │ ├── service/
│ │ │ └── HelloService.java
│ │ └── model/
│ │ └── User.java
│ │
│ ├── resources/
│ │ ├── application.properties # *** 核心:全局配置文件 ***
│ │ ├── application.yml # *** 核心:全局配置文件 (YAML格式) ***
│ │ ├── static/ # *** 核心:存放静态资源 ***
│ │ │ ├── css/
│ │ │ ├── js/
│ │ │ └── images/
│ │ ├── templates/ # *** 核心:存放模板文件 (如 Thymeleaf, FreeMarker) ***
│ │ │ └── index.html
│ │ └── application-dev.properties # 开发环境配置文件
│ │
│ └── ... # 其他资源
│
└── test/
└── java/
└── com/
└── example/
└── demo/
└── DemoApplicationTests.java
核心目录详解 (以 resources 为中心)
-
src/main/java:- 存放所有 Java 源代码。
DemoApplication.java: 项目的启动类,这个类必须包含@SpringBootApplication注解,main方法是整个应用的入口,Spring Boot 会自动扫描该类及其子包下的所有组件(如@Controller,@Service)。
-
src/main/resources:application.properties/application.yml: 核心配置文件,用于配置数据源、服务器端口、日志级别、MyBatis/JPA 等各种 Spring Boot 的属性。static/: 存放静态资源,当访问http://yourdomain.com/css/style.css时,Spring Boot 会自动从这里查找style.css文件,这与传统 Web 项目的webapp目录下的静态资源作用类似。- `templates/ 存放模板引擎的文件(如 Thymeleaf, FreeMarker, Velocity),这些文件不能**直接通过 URL 访问,必须通过 Controller 渲染后才能返回给用户。
public/: 存放公共静态资源。static和public目录下有同名文件,public目录下的优先级更高,它和static的作用基本一致。static,public,templates的优先级:templates>static/public。
总结与对比
| 特性 | 传统 Java Web (WAR) | Spring Boot (JAR) |
|---|---|---|
| 核心目录 | src/main/webapp |
src/main/java (启动类) & src/main/resources |
| 配置文件 | web.xml (部署描述符) |
application.properties / application.yml (全局配置) |
| 静态资源 | webapp 目录下 |
src/main/resources/static 或 public 目录下 |
| 模板文件 | webapp 目录下 |
src/main/resources/templates 目录下 |
| 依赖管理 | 手动或在 pom.xml 中声明,依赖最终进入 WEB-INF/lib |
spring-boot-starter-* 依赖,由 Maven/Gradle 统一管理 |
| 部署方式 | 打包成 .war,部署到外部 Tomcat |
打包成可执行 .jar,内嵌 Tomcat,直接运行 java -jar |
| 结构特点 | 模块化,结构清晰,职责分明 | 简洁,约定大于配置,快速开发 |
理解这两种目录结构对于 Java Web 开发至关重要,传统结构让你明白 Web 应用的底层原理,而 Spring Boot 结构则是当前高效开发的实际应用。
