JavaWeb 复习讲义
原始讲义
第六部分 自测与附录

附录D 环境与依赖清单

这一节记录让项目运行起来需要哪些条件。版本号只是参考,实际以你机器上装好的为准,但大版本要匹配:Tomcat 10 用 jakarta.* 包名,Tomcat 9 及以前用 javax.*,混用必报 ClassNotFoundException。

D.1 软件清单

软件建议版本用途验证方式
JDK8 / 11 / 17编译与运行java -version
Tomcat9.x(配 JDK 8+)Servlet 容器启动后访问 http://localhost:8080
MySQL5.7 / 8.0数据库mysql -u root -p
Maven3.6+依赖管理mvn -v
IDEA2021+开发工具能识别 web 目录
浏览器Chrome / Edge调试F12 打开开发者工具

D.2 项目目录结构

项目名
├── src
│   └── main
│       ├── java            ← Java 源码(Servlet、Service、Dao、实体类)
│       ├── resources       ← 配置文件(jdbc.properties、mybatis-config.xml)
│       └── webapp          ← Web 资源根目录
│           ├── WEB-INF
│           │   ├── web.xml ← 部署描述符
│           │   └── lib     ← 手动导入的 jar(用 Maven 时不需要)
│           ├── css
│           ├── js
│           ├── jsp
│           └── index.jsp
└── pom.xml

【易错点】WEB-INF 目录下的资源不能被浏览器直接访问,只能通过 Servlet 转发进入。正因为如此,JSP 通常放进 WEB-INF:防止用户绕过登录直接输入 JSP 地址。

D.3 pom.xml 参考

<dependencies>
    <!-- Servlet API:作用域必须是 provided,因为 Tomcat 自带 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>

    <!-- JSP API -->
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>javax.servlet.jsp-api</artifactId>
        <version>2.3.3</version>
        <scope>provided</scope>
    </dependency>

    <!-- JSTL:运行期需要,不能 provided -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

    <!-- MySQL 驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>

    <!-- Druid 连接池 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.20</version>
    </dependency>
</dependencies>

【对比】Servlet 与 JSP 的 API 包为什么要写 provided?因为 Tomcat 运行时已经提供这两个包,如果你的 war 包里也打进去一份,就会出现"两份同名类",启动时报 ClassCastException 或 LinkageError。而 JSTL 是 Tomcat 不自带的,必须打进包里,所以不能写 provided。这一条是新手部署失败最常见的原因。

D.4 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">

    <!-- Servlet 配置示例(用 @WebServlet 注解时可省略) -->
    <servlet>
        <servlet-name>demoServlet</servlet-name>
        <servlet-class>com.itheima.web.DemoServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>demoServlet</servlet-name>
        <url-pattern>/demo</url-pattern>
    </servlet-mapping>

    <!-- 会话超时(分钟) -->
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
</web-app>

注意 xsi:schemaLocation 是"命名空间 + 空格 + xsd 地址"成对出现,少写一半会报 cvc-complex-type.2.4.a 之类的校验错误。

D.5 JDBC 连接参数

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/db1?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8&useUnicode=true
username=root
password=1234

三个容易漏的参数:useSSL=false(否则 8.0 版本会警告)、serverTimezone(不写可能报时区错误)、characterEncoding=utf8(不写中文可能乱码)。