CodeGym /Java Blog /Toto sisi /您的第一個使用 Java servlet 的應用程序
John Squirrels
等級 41
San Francisco

您的第一個使用 Java servlet 的應用程序

在 Toto sisi 群組發布
大家好!您將熟悉 servlet 作為 Web 開發的基本概念,並且能夠編寫使用它們的簡單應用程序。 您的第一個使用 Java servlet 的應用程序 - 1 為避免不必要的操作,我們不會從頭開始。我們將繼續處理我之前關於 Hibernate 的文章中的應用程序。但是因為我們剛剛開始熟悉 servlet,所以我從應用程序中刪除了與 Auto 類相關的所有內容,只留下了 User 類和涉及它的操作。該項目的結構如下: 您的第一個使用 Java servlet 的應用程序 - 2所以,servlet!維基百科指出:“Java servlet 是一種擴展服務器功能的 Java 軟件組件。雖然 servlet 可以響應多種類型的請求,但它們最常實現用於在 web 服務器上託管 web 應用程序的 web 容器,因此有資格作為服務器-端 servlet Web API。” 這是千真萬確的。在這裡,我們第一次遇到“客戶端-服務器應用程序體系結構”的概念。它的核心非常簡單。客戶端通過發送 HTTP 請求訪問服務器。服務器生成必要的數據(例如,從數據庫中獲取數據)並將其返回給客戶端。最簡單的例子是當你點擊某個社交網絡上的“朋友”按鈕,從而向服務器發送請求。服務器更新數據庫中你的好友列表並返回給你(客戶端)。HTTP 請求列表非常大,所以如果您以前從未遇到過它們,那麼您最好在其他地方閱讀它們,例如,在這裡我們的目標是:使用 servlet 創建一個 CRUD 應用程序。應用程序必須能夠使用處理 HTTP 請求的 servlet 從數據庫中創建、讀取、更新和刪除用戶。我們在 Hibernate 文章中的應用程序已經可以做到這一點,但它是直接從 Java 代碼控制的,更準確地說,是從 main() 方法控制的。這一次,客戶端將發送請求,即您 :) 我們需要做的第一件事是向我們的 pom.xml 文件添加新的依賴項。

 <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>com.itis4</groupId>
     <artifactId>UsersDaoProject</artifactId>
     <version>1.0-SNAPSHOT</version>
 
     <build>
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-war-plugin</artifactId>
                 <version>2.6</version>
             </plugin>
         </plugins>
     </build>
 
     <dependencies>
         <!-- PostgreSQL  -->
         <dependency>
             <groupId>org.postgresql</groupId>
             <artifactId>postgresql</artifactId>
             <version>9.4.1212.jre7</version>
         </dependency>
 
         <!-- Hibernate 5.2.6 Final -->
         <dependency>
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-core</artifactId>
             <version>5.2.6.Final</version>
         </dependency>
 
         <dependency>
             <groupId>jstl</groupId>
             <artifactId>jstl</artifactId>
             <version>1.2</version>
         </dependency>
         <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
             <version>3.1.0</version>
         </dependency>
 
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-webmvc</artifactId>
             <version>4.3.4.RELEASE</version>
         </dependency>
 
     </dependencies>
 
 </project>
 
我們添加了 3 個依賴項:
  1. javax.servlet-api 庫本身
  2. JSTL 標記庫。需要創建客戶端,即 JSP 頁面
  3. 彈簧WebMVC。我們將需要一個 Spring 類,我們將在稍後討論。
Servlet 管理由 servlet 容器處理。在我們的例子中,我們將使用 Apache Tomcat。它非常流行 — 您可能已經聽說過 :) servlet 生命週期包括以下步驟:
  1. 如果容器中沒有servlet:
    • servlet 類由容器加載。
    • 容器創建 servlet 類的一個實例。
    • 容器調用 init() 方法。此方法初始化 servlet 並在 servlet 可以為請求提供服務之前首先調用。在整個生命週期中,init() 方法只被調用一次。
  2. 服務客戶請求。每個請求都在其自己的單獨線程上處理。容器為每個請求調用 service() 方法。此方法確定傳入請求的類型並將其發送到適當的方法進行處理。servlet 開發人員必須為這些方法提供實現。如果請求到達一個未實現的處理程序,則調用父類的方法並通常以向請求者返回錯誤告終。

  3. 如果容器需要刪除 servlet,它會調用 destroy() 方法,使 servlet 停止運行。與 init() 方法一樣,該方法在整個 servlet 週期中也被調用一次。
我們的 servlet 看起來很簡單:

 package servlets;
 
 import models.User;
 import services.UserService;
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletConfig;
 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.util.List;
 
 public class UserSimpleServlet extends HttpServlet {
 
     private UserService service = new UserService();
 
     public void init(ServletConfig servletConfig) {
         try {
             super.init(servletConfig);
         } catch (ServletException e) {
             e.printStackTrace();
         }
     }
 
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 
         List<User> users = service.findAllUsers();
         req.setAttribute("users", users);
         RequestDispatcher dispatcher = req.getRequestDispatcher("/showUsers.jsp");
         dispatcher.forward(req, resp);
 
     }
 
     @Override
     protected void doPost(HttpServletRequest req, HttpServletResponse resp)
             throws ServletException, IOException {
 
         String name = req.getParameter("name");
         int age = Integer.parseInt(req.getParameter("age"));
         User user = new User(name, age);
         service.saveUser(user);
         resp.sendRedirect("/users");
 
     }
 
     @Override
     protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         int id = Integer.parseInt(req.getParameter("id"));
         User user = service.findUser(id);
         user.setName(req.getParameter("name"));
         user.setAge(Integer.parseInt(req.getParameter("age")));
         service.updateUser(user);
         resp.sendRedirect("/users");
     }
 
     @Override
     protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
         int id = Integer.parseInt(req.getParameter("id"));
         service.deleteUser(service.findUser(id));
         resp.sendRedirect("/users");
     }
 }
 
如您所見,它包含上面介紹的 init() 方法,並實現了與四個 HTTP 請求一致的 4 個方法:doPost()、doGet()、doPut() 和 doDelete()。它們讓我們創建、讀取、更新和刪除用戶。這些方法接受 javax.servlet.http.HttpServletRequest 和 javax.servlet.http.HttpServletResponse 類的實例作為輸入,即發送到服務器的請求和客戶端接收的響應。在內部,這些方法調用 UserService 類的相關方法,並為客戶端生成響應並將其重定向到 /users URL。例如,在 doGet() 方法中,我們獲取所有用戶的列表。接下來,我們創建一個 RequestDispatcher 對象,它允許我們在 HTTP 請求中包含對象並將其重定向到特定資源(例如,客戶端 JSP 頁面)。在 doPut() 方法(更新用戶數據)中,我們處理一個 HTTP 請求,提取 id、name 和 age 參數,找到具有指定 id 的用戶,為其分配請求中的 name 和 age,並返回到 /users 頁面。但是要使所有這些方法正常工作,我們需要配置 servlet。為此,我們使用 WEB-INF 文件夾中的 web.xml 文件。

 <?xml version="1.0" encoding="UTF-8"?>
 <web-app version="3.1"
          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_3_1.xsd">
 
     <welcome-file-list>
         <welcome-file>index.jsp</welcome-file>
     </welcome-file-list>
 
     <servlet>
         <servlet-name>UserSimpleServlet</servlet-name>
         <servlet-class>servlets.UserSimpleServlet</servlet-class>
     </servlet>
 
     <servlet-mapping>
         <servlet-name>UserSimpleServlet</servlet-name>
         <url-pattern>/</url-pattern>
     </servlet-mapping>
 
     <filter>
         <filter-name>hiddenHttpMethodFilter</filter-name>
         <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
     </filter>
 
     <filter-mapping>
         <filter-name>hiddenHttpMethodFilter</filter-name>
         <servlet-name>UserSimpleServlet</servlet-name>
     </filter-mapping>
 
 </web-app>
 
該文件中的所有標籤都相當直觀,但讓我們按順序瀏覽它們。<welcome-file-list> - 表示 JSP 起始頁,應用程序啟動時將首先打開該頁。在我們的例子中,這是 index.jsp。<servlet> - 將我們的 UserSimpleServlet 類註冊為 servlet。<servlet-mapping> - 一個非常重要的標籤。它定義將由 servlet 處理的 URL。在我們的例子中,它都是 URL,所以我們簡單地指示“/”。但是如果我們有一個涉及用戶和他們的汽車 (autos) 的應用程序,那麼我們可以創建第二個 servlet (SimpleAutoServlet)。那麼用戶 servlet 的映射將是“/users”(即關於用戶的請求),auto servlet 的映射將是“/autos”。最後,<過濾器>。在內部,它定義了 org 的一個實例。springframework.web.filter.HiddenHttpMethodFilter 類。這篇文章不是關於 Spring 的,所以我不會詳細描述它。我只會說它只是作為附加功能附加到我們的應用程序中。問題是我們將使用 JSP 頁面來創建客戶端。我們的數據將以帶有用戶列表的表格形式顯示在頁面上。在 JSP 頁面內部,將使用 <form/> HTML 標記。但只有 HTTP GET 和 POST 請求可用於從 <form/> 發送數據。換句話說,對於所有三個操作——更新、刪除和創建用戶——我們只能使用 POST 請求。使用 PUT 和 DELETE 請求對我們來說不是一個選擇。原則上,這是很正常且易於實現的,但是 HiddenHttpMethodFilter 類允許我們使用它們。這樣,讀者會更清楚地看到應用程序中操作之間的區別。最後,讓我們繼續進行客戶端。它由五個 JSP 頁面表示。索引.jsp。

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <html>
 <head>
     <title>Hello!</title>
 </head>
 <body>
 If you want to start working with the user database,<br>
 click the button below:
 
 <form action = "users" method="get">
     <input type="submit" value="Start working with database">
 </form>
 </body>
 </html>
 
添加用戶.jsp

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <html>
 <head>
     <title>Add new user</title>
 </head>
 <body>
 <form action = "/users" method="post">
     <input required type="text" name="name" placeholder="Name">
     <input required type="text" name="age" placeholder="Age">
     <input type="submit" value="Save">
 </form>
 </body>
 </html>
 
 
刪除用戶.jsp

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <html>
 <head>
     <title>Delete user</title>
 </head>
 <body>
 
 Are you sure you want to delete the user ${param.id}?
 
 &lform action="/users/${param.id}" method="post">
     <input type="hidden" name="id" value="${param.id}">
     <input type="hidden" name="_method" value="delete">
     <input type="submit" value="Delete">
 </form>
 
 </body>
 </html>
 
 
顯示用戶.jsp

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 <html>
 <head>
     <title>User list</title>
 </head>
 <body>
 <table border="2">
     <tr>
         <td>ID</td>
         <td>Name</td>
         <td>Age</td>
         <td>Actions</td>
     </tr>
     <c:forEach items="${users}" var = "user">
         <tr>
             <td>${user.getId()}</td>
             <td>${user.getName()}</td>
             <td>${user.getAge()}</td>
             <td>
                 <form action = "updateUser.jsp" method="post">
                     <input type="hidden" name="id" value="${user.getId()}">
                     <input type="hidden" name="name" value="${user.getName()}">
                     <input type="hidden" name="age" value="${user.getAge()}">
                     <input type="submit" value="Modify" style="float:left">
                 </form>
                 <form action="deleteUser.jsp" method="post">
                     <input type="hidden" name="id" value="${user.getId()}">
                     <input type="submit" value="Delete" style="float:left">
                 </form></td>
         </tr>
     </c:forEach>
 </table>
 
 <form action = "addUser.jsp">
     <input type="submit" value="Add new user">
 </form>
 </body>
 </html>
更新用戶.jsp

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <html>
 <head>
     <title>Modify user data</title>
 </head>
 <body>
 
 Edit user
 
 <form action="/users/${param.id}" method="post">
     <input type="hidden" name = "id" value="${param.id}">
     <input type="text" name="name" value="${param.name}" placeholder=${param.name}>
     <input type="text" name="age" value="${param.age}" placeholder=${param.age}>
     <input type="hidden" name="_method" value="put">
     <input type="submit" value="Update">
 </form>
 
 </body>
 </html>
 
JSP(JavaServer Page)頁麵包含兩種類型的文本:可以格式化為文本(HTML、SVG、WML 或 XML)的靜態源數據,以及用於構造動態內容的 JSP 元素。為了幫助您理解什麼是 JSP 頁面,我從一篇非常好的文章中復制了一段話。“基本上,第一次請求 JSP 時,它會變成一個 servlet 並作為一個 servlet 運行。理解這一點非常重要。JSP 頁面不同於HTML 頁面——初學者必須清楚地了解這是另一個 servlet — 只是你不必編寫程序來顯示它的顯示方式。它可以簡單地繪製。並在必要時添加數據。但是因為 JSP 頁面讓人聯想到 HTML,設計人員顯然會發現它更容易。再一次強烈強調初學者,一個 JSP 頁面是一個 SERVLET. 它是在服務器上生成的,包括添加所有數據。這是插入所有數據的地方。而在瀏覽器中,用戶得到的是完成的 HTML 頁面,這個頁面沒有 Java 的痕跡。”你可以肯定 JSP 頁面確實是一個 servlet,因為每個頁面都有一個需要執行的方法。例如,index .jsp表示當你點擊“Start working with the database”按鈕時,會執行get方法(method = "get") 負責創建新用戶的addUser.jsp頁面執行post方法(method = "post") 當您單擊保存按鈕時。JSP 頁面的其餘部分由常規靜態 HTML 標記組成,因此我們不會詳述它。這是另一篇文章的主題,並且有很多關於此的內容互聯網上的話題。所以,我們 我們已經創建了我們的應用程序!現在我們需要實際測試一下!為此,我們需要上面提到的 Apache Tomcat servlet 容器。你可以下載容器來自官方網站(我使用版本 8)。接下來,我們需要在 IDEA 中創建一個配置,以通過 Tomcat 運行我們的應用程序。為此,打開“Edit Configurations”選項卡, 您的第一個使用 Java servlet 的應用程序 - 3創建一個新配置, 您的第一個使用 Java servlet 的應用程序 - 4然後選擇“Tomcat Server Local”。在“Application Server”選項卡上,指定 Tomcat 文件夾的路徑 您的第一個使用 Java servlet 的應用程序 - 5接下來,轉到“Deployment”選項卡。 您的第一個使用 Java servlet 的應用程序 - 6在這裡,我們在本地服務器上配置應用程序的部署。按“+”,選擇“Artifact”-> YourProjectName:war(我們會將應用程序構建到 war 文件)。 您的第一個使用 Java servlet 的應用程序 - 7這就是總結!在“服務器”頁面上,您可以看到我們的應用程序將運行在 http://localhost:8080/。保存配置並為其命名(我稱我的配置為“Tommy”)。接下來,在 IDEA 的 Maven 選項卡上(右側),我們將使用 war 插件將我們的項目構建為 war 文件(Plugins -> war -> war: war)。 您的第一個使用 Java servlet 的應用程序 - 8構建完成後,運行應用程序並等待。成功!啟動頁面已啟動。現在我們點擊“開始使用數據庫”按鈕。我們的 index.jsp 將生成一個 GET 請求,該請求將由服務器處理。服務器將生成一個響應,並以所有現有用戶列表的形式返回給我們(當然,假設數據庫中有用戶)。他們就在那裡!你有它!您使用 Java servlet 編寫了您的第一個應用程序。 您的第一個使用 Java servlet 的應用程序 - 9那還不錯,不是嗎?:) 作為作業,您可以恢復上一篇文章中的汽車功能. 換句話說,為汽車創建一個單獨的 servlet 和 JSP 頁面,並教會應用程序如何列出用戶的汽車、向用戶添加新汽車以及編輯和刪除它們。PS Servlets 和 JavaServer Pages 是相當古老的技術。在 Internet 上,您經常可以找到“誰需要這個舊垃圾?”之類的評論。答案很簡單:主要是從事實際項目的人,他們很可能會遇到大量使用這些技術的代碼。即使不了解它是如何工作的,將“舊垃圾”分割成新東西仍然很有趣 :) 要更深入地研究 JSP 和 servlet,您可以參考《Head First Servlets and JSP》一. 它與著名的超級書籍“Head First Java”的作者相同,許多人將其視為質量保證:)希望本文對您有所幫助!感謝您的關注,祝學習順利!
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION