D:\Java\jdk-17。D:\Java\apache-tomcat-9.0.80。JAVA_HOME=D:\Java\jdk-17CATALINA_HOME=D:\Java\apache-tomcat-9.0.80PATH=%JAVA_HOME%\bin;%CATALINA_HOME%\bin;%PATH%CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar 現代 JDK 不再需要,但舊項目兼容可保留。> java -version
> javac -version
> startup.bat
# 瀏覽器訪問 https://localhost:8080 看到 Tomcat 首頁即成功
> shutdown.bat
webapps/
└── myapp/
├── index.jsp
├── WEB-INF/
│ ├── web.xml
│ ├── classes/ # 編譯後的 .class 文件
│ │ └── com/example/ # 包結構
│ └── lib/ # 依賴 Jar 包
└── META-INF/ # 可選,context.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://xmlns.jcp.org/xml/ns/javaee
https://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<display-name>My Web Application</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
<%@ page contentType="text/html;charset=UTF-8" %>
<html><body><h2>Hello, JSP!</h2>
當前時間:<%= new java.util.Date() %>
</body></html>
src/com/example/HelloServlet.java):package com.example;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/hello") // 註解配置,無需 web.xml
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
req.setAttribute("msg", "來自 Servlet 的問候");
req.getRequestDispatcher("/show.jsp").forward(req, resp);
}
}
javac -cp %CATALINA_HOME%\lib\servlet-api.jar -d webapps\myapp\WEB-INF\classes src\com\example\HelloServlet.javahttps://localhost:8080/myapp/hello 驗證。src/com/example/UserBean.java):package com.example;
public class UserBean {
private String name;
private int age;
// getter/setter 省略
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
WEB-INF/classes。<jsp:useBean id="user" class="com.example.UserBean" scope="session" />
<jsp:setProperty name="user" property="*" /> <!-- 自動綁定請求參數 -->
<h3>歡迎,<jsp:getProperty name="user" property="name" /> (<jsp:getProperty name="user" property="age" /> 歲)</h3>
| 問題 | 解決 |
|---|---|
| 端口 8080 被佔用 | 修改 conf/server.xml <Connector port="8081" .../> |
| 中文亂碼 | 1) <%@ page pageEncoding="UTF-8"%> 2) server.xml Connector 添加 URIEncoding="UTF-8" 3) 配置編碼 Filter |
| 修改 JSP 不生效 | Tomcat 默認開發模式自動重編譯;生產模式需觸發重新部署或設置 development="true" |
| Session 丟失 | 檢查 Cookie 域/路徑、負載均衡 Sticky Session、context.xml <Manager pathname="" /> 禁用持久化 |
| 類加載衝突 | 遵循「父優先」委派模型;WebApp 私有 Jar 放 WEB-INF/lib,勿放入 Tomcat 共享 lib |
systemd/Windows Service 管理 Tomcat 進程。server.xml SSL Connector 或反向代理 (Nginx) 終結 SSL。set CATALINA_OPTS=-Xms2g -Xmx4g -XX:+UseG1GC (在 setenv.sh/bat 中)。work/、temp/、logs/ 目錄。掌握 JDK/Tomcat 安裝、目錄規範、web.xml/註解配置、Servlet/JavaBean 編譯部署,是 Java Web 開發的基礎功。建議新手從手動部署開始理解原理,隨後遷移至 Maven/Gradle + IDE 一鍵部署,最終採用容器化 (Docker) 交付。