CodeGym /Java 博客 /随机的 /您的第一个使用 Java servlet 的应用程序
John Squirrels
第 41 级
San Francisco

您的第一个使用 Java servlet 的应用程序

已在 随机的 群组中发布
大家好!您将熟悉 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