寫在前面
Java Servlet 是 J2EE 規范中一項關於 Web 應用的規范。Tomcat 則是實現 Java Servlet 規范的一個開源項目。本文將一步步創建一個最簡單的 Servlet 項目,並且部署到 Tomcat 上。
項目地址
git clone https://gitee.com/kendoziyu/code-servlet-parent
該目錄下的 javac-servlet 表示的是本文的項目。
基於web.xml開發步驟
- 下載、安裝 Tomcat。
- 編寫一個繼承 HTTPServlet 的 Java 類MyServlet。
- 將 Java 類文件編譯成 Class 文件。
- 建立 Web 應用的目錄結構,並配置 web.xml。
- 部署 Web 應用。
- 啟動 Tomcat。
- 瀏覽器訪問驗證結果。
- 查看 Tomcat 日志。
1 下載、安裝Tomcat
去Tomcat官網(Download Tomcat 9) 下載最新的Tomcat(需下載對應系統版本,請根據實際情況選擇,本文以Windows系統為例)。
下載完成之后解壓即可。
Windows 解壓 zip 包得到 tomcat 目錄效果圖,展開查看

2 編寫DemoServlet類
Servlet 並不是 JDK 中自帶的,屬於拓展包,因此需要額外下載 jar 包,這里是官方下載地址 Servlet3.1
編寫一個DemoServlet類,其繼承HttpServlet類,並復寫其doGet()和doPost()方法。
package coderead.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;
/**
* Java Servlet 示例1
*
* @author kendoziyu
* @since 2020/10/21
*/
public class DemoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("DemoServlet 在處理 get 請求...");
PrintWriter out = resp.getWriter();
resp.setContentType("text/html;charset=utf-8");
out.println("<strong>doGet Demo Servlet!</strong><br>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("DemoServlet 在處理 post 請求...");
PrintWriter out = resp.getWriter();
resp.setContentType("text/html;charset=utf-8");
out.println("<strong>doPost Demo Servlet!</strong><br>");
}
}
我們可以查看一下 HttpServlet 的繼承結構,因為選擇 HttpServlet 實現類就不需要我們來實現 Servlet 接口了,畢竟那不是本文的重點。
3 編譯DemoServlet
下圖展示的是我的項目目錄
3.1 命令行編譯
接着要要在當前項目目錄進行編譯
展開查看 逐步解決javac編譯中出現的錯誤
3.1.1 首先,嘗試直接使用命令 javac 目標java文件路徑:
javac src\coderead\servlet\DemoServlet.java
出現了編碼錯誤:

我們需要求助於javac -help 查看更多參數細節。
-encoding <編碼> 指定源文件使用的字符編碼
3.1.2 接着,我們指定一下源文件的字符編碼,重新編譯
javac -encoding utf-8 src\coderead\servlet\DemoServlet.java
編譯失敗,查找不到 javax.servlet 下的文件,異常如下:
src\coderead\servlet\DemoServlet.java:3: 錯誤: 程序包javax.servlet不存在
import javax.servlet.ServletException;
^
src\coderead\servlet\DemoServlet.java:4: 錯誤: 程序包javax.servlet.http不存在
import javax.servlet.http.HttpServlet;
^
src\coderead\servlet\DemoServlet.java:5: 錯誤: 程序包javax.servlet.http不存在
import javax.servlet.http.HttpServletRequest;
^
src\coderead\servlet\DemoServlet.java:6: 錯誤: 程序包javax.servlet.http不存在
import javax.servlet.http.HttpServletResponse;
^
src\coderead\servlet\DemoServlet.java:16: 錯誤: 找不到符號
public class DemoServlet extends HttpServlet {
^
符號: 類 HttpServlet
src\coderead\servlet\DemoServlet.java:19: 錯誤: 找不到符號
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
^
符號: 類 HttpServletRequest
位置: 類 DemoServlet
src\coderead\servlet\DemoServlet.java:19: 錯誤: 找不到符號
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
^
符號: 類 HttpServletResponse
位置: 類 DemoServlet
src\coderead\servlet\DemoServlet.java:19: 錯誤: 找不到符號
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
^
符號: 類 ServletException
位置: 類 DemoServlet
src\coderead\servlet\DemoServlet.java:27: 錯誤: 找不到符號
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
^
符號: 類 HttpServletRequest
位置: 類 DemoServlet
src\coderead\servlet\DemoServlet.java:27: 錯誤: 找不到符號
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
^
符號: 類 HttpServletResponse
位置: 類 DemoServlet
src\coderead\servlet\DemoServlet.java:27: 錯誤: 找不到符號
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
^
符號: 類 ServletException
位置: 類 DemoServlet
src\coderead\servlet\DemoServlet.java:18: 錯誤: 方法不會覆蓋或實現超類型的方法
@Override
^
src\coderead\servlet\DemoServlet.java:26: 錯誤: 方法不會覆蓋或實現超類型的方法
@Override
^
13 個錯誤
我們再次求助 help:
-classpath <路徑> 指定查找用戶類文件和注釋處理程序的位置
-cp <路徑> 指定查找用戶類文件和注釋處理程序的位置
3.1.3 帶上 classpath 再次執行命令:
javac -encoding utf-8 -cp lib\javax.servlet-api-3.1.0.jar src\coderead\servlet\DemoServlet.java
但是輸出文件 DemoServlet.class 和源文件 DemoServlet.java 在同一文件夾下又有些不妥,於是我們希望指定輸出目錄
-d <目錄> 指定放置生成的類文件的位置
3.1.4 指定輸出目錄為 build 后,再次執行命令
javac -encoding utf-8 -cp lib\javax.servlet-api-3.1.0.jar -d build src\coderead\servlet\DemoServlet.java
但是還是一點小問題:
我們自己在項目根目錄下 創建一下 build 目錄 就好了
然后,我們執行以下命令,即可對 DemoServlet 進行編譯:
javac -encoding utf-8 -cp lib\javax.servlet-api-3.1.0.jar -d build src\coderead\servlet\DemoServlet.java
3.2 使用 IDEA 編譯
首先需要引入 lib 包,步驟如下:
- File -> Project Structure 打開窗口
- 在窗口左側菜單中,找到 Libraries,並選中
- 點擊
+
,彈出 New Project Library,選中 Java,彈出文件夾選擇框 - 選擇 javac-servlet\lib 所在的完整路徑,點擊 Ok
這種情況下,只要點擊
Build -> Build Project 就能自動編譯生成 .class 文件了,輸出文件默認在根目錄 out 文件夾的子文件夾下面可以找到。
4 建立 Web 應用目錄
我們選擇再項目根目錄下創建 DemoWebapp 目錄,按照慣例,目錄結構如下:
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"
metadata-complete="true">
<description> Servlet Example. </description>
<display-name> DemoServlet Example </display-name>
<request-character-encoding>UTF-8</request-character-encoding>
<servlet>
<servlet-name>demoServlet</servlet-name>
<servlet-class>coderead.servlet.DemoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demoServlet</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
</web-app>
5 部署 DemoWebapp
拷貝上一步完成的 DemoWebapp 目錄到 Tomcat\webapps\ 目錄下:
6 啟動 Tomcat
找到 Tomcat 安裝目錄下的 bin 目錄,如果是 Windows 系統,執行 startup.bat;如果是 Linux 系統,則執行 startup.sh
7 瀏覽器訪問
在瀏覽器里訪問這個 URL: http://localhost:8080/DemoWebapp/demo
- DemoWebapp 表示 tomcat\webapps</span> 下的文件夾名稱
- demo 表示 web.xml 文件配置的映射地址:
<servlet-mapping><url-pattern>
對應的路徑
同樣,post方式調用也會得到相類似的結果!
8 查看 Tomcat 日志
在 Linux 系統下,我們可以看下 tomcat/logs/catalina.out 文件,使用以下命令查看相應的日志。
在 Windows 系統下,剛才 startup.bat 會調起一個工作台窗口,這個工作台輸出一些日志: