在 Tomcat 上部署你的第一個 Servlet 應用


寫在前面

Java Servlet 是 J2EE 規范中一項關於 Web 應用的規范。Tomcat 則是實現 Java Servlet 規范的一個開源項目。本文將一步步創建一個最簡單的 Servlet 項目,並且部署到 Tomcat 上。

項目地址

git clone https://gitee.com/kendoziyu/code-servlet-parent

該目錄下的 javac-servlet 表示的是本文的項目。

基於web.xml開發步驟

  1. 下載、安裝 Tomcat。
  2. 編寫一個繼承 HTTPServlet 的 Java 類MyServlet。
  3. 將 Java 類文件編譯成 Class 文件。
  4. 建立 Web 應用的目錄結構,並配置 web.xml。
  5. 部署 Web 應用。
  6. 啟動 Tomcat。
  7. 瀏覽器訪問驗證結果。
  8. 查看 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 包,步驟如下:

  1. File -> Project Structure 打開窗口
  2. 在窗口左側菜單中,找到 Libraries,並選中
  3. 點擊 + ,彈出 New Project Library,選中 Java,彈出文件夾選擇框
  4. 選擇 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 會調起一個工作台窗口,這個工作台輸出一些日志:

參考博客

Servlet與Tomcat運行示例


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM