本材料是“企业发展概论”系列的一部分。上一篇文章:
您是否已经知道如何编写将文本输出到控制台的 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