JavaRush /Java Blog /Random-TW /第 5 部分:Servlet,Java servlet API。編寫一個簡單的 Web 應用程式

第 5 部分:Servlet,Java servlet API。編寫一個簡單的 Web 應用程式

在 Random-TW 群組發布
本資料是「企業發展概論」系列的一部分。上一篇文章: 第 5 部分:Servlet,Java servlet API。 寫一個簡單的 Web 應用程式 - 1您是否已經知道如何編寫將文字輸出到控制台的 Java 應用程序,但仍然不知道如何創建您的第一個 Web 應用程式?太好了,讓自己舒服一點。在本文中,我們將熟悉 servlet 並編寫一個應用程序,您可以向您的朋友展示該應用程序,而無需向他們發送 jarnik 或強迫他們下載 Java。讓我們來寫一個 Web 應用程式。如果您還不熟悉 Web 程式設計中使用的方法,我建議您從「企業開發簡介」系列的第一篇文章開始閱讀。

什麼是 servlet

首先,讓我們弄清楚什麼是 servlet 以及為什麼您經常聽到它。 Java Servlet API是一種標準化 API,設計用於在伺服器上實作並使用請求-回應方案與客戶端配合使用。 Servlet是一個可以接收來自客戶端的請求並向其回傳回應的類別。是的,Java 中的 servlet 正是建構客戶端-伺服器架構的元素。如果您還記得,我們​​已經在該系列的一篇文章中討論過它。我們不要拐彎抹角:讓我們立即寫一些程式碼。

建立 Web 應用程式需要什麼

為了在 Java 中輕鬆使用 servlet,您將需要 Intellij IDEA Ultimate Edition。它是付費的,但您可以啟動 30 天試用期或使用早期存取版本 - 它始終免費。也要安裝我們的應用程式伺服器 - Apache Tomcat。Tomcat 是一個 servlet 容器:它處理來自外部的傳入請求並將它們傳遞到我們的應用程式。您可以從此鏈接下載 Tomcat 。

創建第一個 Web 應用程式

如果一切準備就緒,讓我們建立一個 Maven 專案。如果你對Maven不熟悉,可以追蹤之前的文章。讓我們開始吧!
  1. 在pom.xml中,加入javax.servlet-api依賴並設定打包war:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
    
       <groupId>org.example</groupId>
       <artifactId>servlets</artifactId>
       <version>1.0-SNAPSHOT</version>
       <packaging>war</packaging>
    
       <dependencies>
           <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>javax.servlet-api</artifactId>
               <version>4.0.1</version>
           </dependency>
       </dependencies>
    </project>

    簡單的servlet類別:

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet("/hello")
    public class MainServlet extends HttpServlet {
    
       @Override
       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           resp.setContentType("text/html");
           PrintWriter printWriter = resp.getWriter();
           printWriter.write("Hello!");
           printWriter.close();
       }
    }
  2. 要運行該應用程序,您需要建立 Tomcat 配置:

    第 5 部分:Servlet,Java servlet API。 寫一個簡單的 Web 應用程式 - 2 第 5 部分:Servlet,Java servlet API。 寫一個簡單的 Web 應用程式 - 3

  3. 接下來,我們指定要使用的 Tomcat 版本、存取伺服器的 URL 以及連接埠。你應該得到這樣的東西:

    第 5 部分:Servlet,Java servlet API。 寫一個簡單的 Web 應用程式 - 4
  4. 剩下的就是指定將部署在容器中的工件(將項目組裝到 jar 檔案中)。您可以點擊Fix按鈕並選擇warexploded:這表示專案重建後,工件將自動放置在 servlet 容器中。 第 5 部分:Servlet,Java servlet API。 寫一個簡單的 Web 應用程式 - 5

  5. 預設情況下,應用程式上下文設定為servlets_war_exploded,這表示必須透過以下位置存取應用程式:http://localhost:8080/servlets_war_exploded

    為什麼我們需要額外的文字?讓我們刪除不必要的東西。現在我們的應用程式位址是:http://localhost:8080

    第 5 部分:Servlet,Java servlet API。 寫一個簡單的 Web 應用程式 - 6

  6. 按一下“確定”。我們看到我們現在有機會啟動該應用程式:

    第 5 部分:Servlet,Java servlet API。 寫一個簡單的 Web 應用程式 - 7

    現在,當您啟動應用程式時,瀏覽器應該會開啟並顯示 404 錯誤。這是合乎邏輯的,因為在位址http://localhost:8080/處應該有一個具有「/」映射的 servlet,而我們唯一的 servlet 具有「/hello」映射。

  7. 我們透過http://localhost:8080/hello聯繫它並得到預期的回應 - 字串「Hello」!

如果一切正常,讓我們來看看程式碼。 要從常規類別建立 http servlet,您需要從 HttpServlet 類別繼承它。在類別上方,我們指定了 @WebServlet() 註釋,在該註釋中我們將 servlet 綁定(映射)到特定路徑(“/hello”)。此註解僅出現在 Java Servlet API 3.0 中,因此 Internet 上有許多透過 XML 檔案進行 Servlet 對應的範例。現在這沒有必要了。為了處理 GET 請求,我們重寫 doGet() 方法。請注意方法參數 - HttpServletRequest 和 HttpServletResponse。從 HttpServletRequest 物件中,我們可以獲得有關請求的所有必要信息,在 HttpServletResponse 中,我們可以記錄回應並設定必要的標頭。

使用參數和會話

讓我們改進 servlet,使其能夠處理請求參數並使用會話:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/hello")
public class MainServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       HttpSession session = req.getSession();
       Integer visitCounter = (Integer) session.getAttribute("visitCounter");
       if (visitCounter == null) {
           visitCounter = 1;
       } else {
           visitCounter++;
       }
       session.setAttribute("visitCounter", visitCounter);
       String username = req.getParameter("username");
       resp.setContentType("text/html");
       PrintWriter printWriter = resp.getWriter();
       if (username == null) {
           printWriter.write("Hello, Anonymous" + "<br>");
       } else {
           printWriter.write("Hello, " + username + "<br>");
       }
       printWriter.write("Page was visited " + visitCounter + " times.");
       printWriter.close();
   }
}
servlet 目前正在執行會話,每次造訪頁面時都會增加存取計數器。如果visitCounter屬性尚未建立(第一次造訪頁面時),getAttribute()方法將傳回null,因此您需要檢查是否為null。請求參數也是如此。如果使用者沒有傳遞 username 參數,則其值為 null。在這種情況下,我們將以匿名方式問候該用戶。GET 請求中傳遞參數需要使用路徑變量,即需要存取http://localhost:8080/hello?username=Pavel連結。您可以在本系列的上一篇文章中閱讀有關 http 請求的更多資訊。現在我們的應用程式已經有了最少的邏輯,但是根路徑中的 404 錯誤有點煩人。為了解決這個問題,我們建立另一個 servlet 並將其對應到初始頁面 @WebServlet("/")。該 servlet 的工作是將請求重定向到「/hello」路徑。有兩種方法可以做到這一點:使用轉送或重新導向。也許值得了解它們之間的差異。 轉發- 將請求處理委託給伺服器上的另一個 servlet,客戶端不參與。為此,您需要將以下程式碼新增至新 servlet 的 doGet() 方法:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
在此程式碼中,我們存取 servlet 上下文,從中取得所需 servlet 的請求管理器,並要求它使用指定參數(req、resp)處理特定請求。 重定向-向客戶端返回他需要聯繫以處理其請求的地址。大多數瀏覽器會自動轉到傳輸的連結。要實現重定向,您需要新增以下程式碼:
resp.sendRedirect(req.getContextPath() + "/hello");
在HttpServletResponse中,我們呼叫redirect()方法並向其傳遞客戶端需要聯繫的位址。一個重要的細節:http參數還必須添加在完整重定向路徑的末尾,這不是很方便。在我們的情況下,最好使用轉發,但碰巧使用重定向更好。如果您了解他們工作的差異,您的選擇就不會出錯。新 servlet 的程式碼如下所示:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/")
public class IndexServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        getServletContext().getRequestDispatcher("/hello").forward(req, resp);
       resp.sendRedirect(req.getContextPath() + "/hello");
   }
}

底線

您的第一個 Web 應用程式已準備就緒。在下一篇文章中,您將學習如何在不使用 Intellij IDEA 的情況下部署它。我們編寫了一個僅處理 GET 請求的應用程式。其餘http方法的處理方式相同-重寫父類別對應的方法。使用此類簡單的 servlet,您可以建立複雜、豐富的 Web 應用程式。當然,使用像Spring這樣的大型框架,這更容易做到。但如果你確實想更詳細地深入研究 servlet 的所有功能,你可以閱讀官方規格第 6 部分. Servlet 容器 第 7 部分. MVC(模型-視圖-控制器)模式簡介 第 8 部分. 在 spring-boot 中編寫一個小應用程序
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION