本資料是「企業發展概論」系列的一部分。上一篇文章:
您是否已經知道如何編寫將文字輸出到控制台的 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不熟悉,可以追蹤之前的文章。讓我們開始吧!-
在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(); } }
-
要運行該應用程序,您需要建立 Tomcat 配置:
-
接下來,我們指定要使用的 Tomcat 版本、存取伺服器的 URL 以及連接埠。你應該得到這樣的東西:
-
剩下的就是指定將部署在容器中的工件(將項目組裝到 jar 檔案中)。您可以點擊Fix按鈕並選擇warexploded:這表示專案重建後,工件將自動放置在 servlet 容器中。
-
預設情況下,應用程式上下文設定為servlets_war_exploded,這表示必須透過以下位置存取應用程式:http://localhost:8080/servlets_war_exploded。
為什麼我們需要額外的文字?讓我們刪除不必要的東西。現在我們的應用程式位址是:http://localhost:8080。
-
按一下“確定”。我們看到我們現在有機會啟動該應用程式:
現在,當您啟動應用程式時,瀏覽器應該會開啟並顯示 404 錯誤。這是合乎邏輯的,因為在位址http://localhost:8080/處應該有一個具有「/」映射的 servlet,而我們唯一的 servlet 具有「/hello」映射。
-
我們透過http://localhost:8080/hello聯繫它並得到預期的回應 - 字串「Hello」!
使用參數和會話
讓我們改進 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");
}
}
GO TO FULL VERSION