JavaRush /Java 博客 /Random-ZH /您的第一个使用 Java servlet 的应用程序

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

已在 Random-ZH 群组中发布
大家好!在本文中,您将熟悉 servlet 的基本 Web 开发概念,并能够使用它们编写简单的应用程序。 为了避免不必要的步骤,我们不会从头开始,并将继续从我之前关于 Hibernate 的文章中您的第一个使用 Java servlet 的应用程序 - 1开发我们的应用程序。然而,由于我们刚刚开始使用 servlet,因此我从应用程序中删除了与 Auto 类相关的所有内容,只留下了 User 类及其操作。项目结构将如下所示: 那么,servlet!维基百科说:“Servlet 是一个 Java 接口,其实现扩展了服务器的功能。Servlet 通过请求-响应原则与客户端进行交互。” 确实如此。在这里我们首先遇到“客户端-服务器应用程序架构”的概念。它的本质非常简单,适合一张图片(取自此处)。 您的第一个使用 Java servlet 的应用程序 - 2
您的第一个使用 Java Servlet 的应用程序 - 3
客户端通过发送 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. Spring-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 个方法 - doGet()、doPost()、doPut() 和 doDelete()。它们分别允许我们接收、创建、编辑和删除用户。这些方法将 javax.servlet.http.HttpServletRequest 和 javax.servlet.http.HttpServletResponse 类的输入对象 - 即发送到服务器的请求和客户端收到的响应。在方法内部,执行 UserService 类的必要方法,为客户端生成响应,然后重定向到 /users 地址。例如,在 doGet() 方法中,我们获取所有用户的列表。接下来,我们创建 RequestDispatcher 类的对象,它允许我们在 Http 请求中包含对象,并将其重定向到特定资源(例如,客户端 JSP 页面)。在 doPut() 方法(更新用户数据)中,我们处理 HTTP 请求,从中提取 id、name 和age 参数,找到指定 id 的用户,并为其分配在请求,并返回页面/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,因此我们只需指示“/”。但是,例如,如果我们有一个包含用户及其计算机的应用程序,那么我们可以创建第二个 servlet - SimpleAutoServlet。那么用户 servlet 的映射将是“/users”(即与处理用户相关的请求),而对于 auto servlet 的映射将是“/autos”。最后,<过滤器>。它在内部定义了 org.springframework.web.filter.HiddenHttpMethodFilter 类的对象。文章不涉及Spring,所以就不详细讲了。我只想说,它只是作为附加功能附加到我们的应用程序中。重点是我们将使用 JSP 页面来创建客户端。我们的数据将作为包含用户列表的表格显示在页面上。在 JSP 页面内,将使用 HTML <form/> 标记。并且只能使用 HTTP GET 和 POST 请求从 <form/> 发送数据。也就是说,对于所有三个操作 - 更新、删除和创建用户 - 我们只能使用 POST 请求。我们无法使用 PUT 和 DELETE 请求。而且,原则上,这是非常正常且易于实现的,但 HiddenHttpMethodFilter 类允许我们使用它们。这将使读者更清楚应用程序中操作之间的差异。最后,让我们转向客户端。它由五个 JSP 页面表示。索引.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Здравствуйте!</title>
</head>
<body>
Если вы хотите начать работу с базой данных пользователей - <br>
нажмите кнопку ниже:

<form action = "users" method="get">
    <input type="submit" value="Начать работу с базой данных">
</form>
</body>
</html>
添加用户.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Добавить нового пользователя</title>
</head>
<body>
<form action = "/users" method="post">
    <input required type="text" name="name" placeholder="Name">
    <input required type="text" name="age" placeholder="Возраст">
    <input type="submit" value="Сохранить">
</form>
</body>
</html>
删除用户.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Удалить пользователя</title>
</head>
<body>

Вы действительно хотите удалить пользователя ${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="Удалить">
</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>Список пользователей</title>
</head>
<body>
<table border="2">
    <tr>
        <td>ID</td>
        <td>Name</td>
        <td>Возраст</td>
        <td>Действия</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="Изменить" style="float:left">
                </form>
                <form action="deleteUser.jsp" method="post">
                    <input type="hidden" name="id" value="${user.getId()}">
                    <input type="submit" value="Удалить" style="float:left">
                </form></td>
        </tr>
    </c:forEach>
</table>

<form action = "addUser.jsp">
    <input type="submit" value="Добавить нового пользователя">
</form>
</body>
</html>
更新用户.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Изменить данные пользователя</title>
</head>
<body>

Редактировать пользователя

<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="Обновить">
</form>

</body>
</html>
JSP 页面(Java Server Page)包含两种类型的文本:静态源数据,可以是其中一种文本格式(HTML、SVG、WML 或 XML),以及构造动态内容的 JSP 元素。为了理解 JSP 是什么,我将允许自己复制并粘贴一位作者的一篇非常好的文章(来自此处)。“本质上,JSP 在第一次被访问时被转换为 servlet,并作为 servlet 工作。理解这一点非常重要。JSP不是像 HTML 页面那样的页面- 对于新手程序员来说,清楚地理解这一点非常重要”是另一个 servlet - 您只是不需要对其输出进行编程。您可以简单地绘制它。并在正确的位置替换数据。但是由于 JSP 页面至少在某种程度上类似于 HTML,因此对于设计者来说显然会更容易。我再次强烈告诉初学者 - JSP 是一个 SERVLET。它是用服务器上的所有数据准备的。这是所有数据插入的地方。用户在浏览器中收到一个现成的 HTML 页面,这并不需要任何数据。有没有JAVA的迹象。” 你可以亲眼看到,JSP页面确实是一个servlet,因为每个页面都包含一个需要执行的方法。例如,起始页index.jsp 指出,当您单击“开始使用数据库”按钮时,将执行method="get"。在负责创建新用户的addUser.jsp页面上,当您单击保存按钮时,将执行method="post"。JSP 的其余部分由普通的静态 HTML 标记组成,因此我们不会详细讨论它们 - 这是另一篇文章的主题,Internet 上有很多这样的文章。所以,我们已经创建了我们的应用程序,剩下的就是在行动中测试它!为此,我们需要上面提到的 Apache Tomcat servlet 容器。你可以从官网下载猫(我用的是8版本)。接下来,我们需要在 IDEA 中创建配置以通过 Tomcat 运行我们的应用程序。为此,请打开“编辑配置”选项卡, 您的第一个使用 Java Servlet 的应用程序 - 4创建新配置 您的第一个使用 Java servlet 的应用程序 - 5并选择“Tomcat 服务器本地”。在“应用服务器”选项卡中指定Tomcat所在文件夹的路径, 您的第一个使用 Java Servlet 的应用程序 - 6然后进入“部署”选项卡。 Ваше первое приложение с использованием Java-сервлетов - 7在这里,我们在本地服务器上配置应用程序的部署。点击“+”,选择“Artifact”->您的项目名称:war(我们将把应用程序组装成一个war文件)。 Ваше первое приложение с использованием Java-сервлетов - 8基本上就是这样!在“服务器”页面上,您可以看到相同的应用程序将在“http://localhost:8080/”上运行。保存此配置并为其命名(我的配置名称是“Tommy”)。接下来,在 IDEA 的 Maven 选项卡(右侧)上,我们将使用 war 插件将项目构建为 war 文件(插件 -> war -> war:war)。 Ваше первое приложение с использованием Java-сервлетов - 9Ваше первое приложение с использованием Java-сервлетов - 10成功!起始页已启动。现在单击“开始使用数据库”按钮。我们的 JSP 页面 index.jsp 将生成一个 GET 请求,该请求将由服务器处理。服务器将生成响应并以所有现有用户列表的形式返回给我们(当然,如果它们在数据库中)。他们就在这里! Ваше первое приложение с использованием Java-сервлетов - 12让我们尝试删除其中一个用户: Ваше первое приложение с использованием Java-сервлетов - 13这也有效!因此,我们使用 servlet 编写了第一个应用程序。正如您所看到的,一切都不是那么困难:) 作为家庭作业,您可以将上一篇文章中使用汽车的功能返回到应用程序。那些。为汽车创建单独的 servlet 和 jsp 页面,并教我们的应用程序显示用户汽车的列表、向他添加新车以及编辑和删除它们。PS Servlet 和 JSP 是相当古老的技术,在互联网上您经常可以找到“谁需要这个垃圾?”的评论。答案很简单 - 它主要是那些将在实际项目中工作的人所需要的,在这些项目中很可能会有大量使用它们编写的代码。在不了解其工作原理的情况下将“旧东西”切割成新东西仍然是一种乐趣:) 要更深入地研究 JSP 和 servlet 主题,您可以使用“Head First Servlets and JSP”一书(在仅限英语)。它与著名的超级书籍《Head First Java》是同一作者写的,这对很多人来说可以是质量的保证:)我希望这篇文章对读者有用!如果您想看到新文章,请不要忘记在比赛中通过“喜欢”他来支持作者。或者更好 - “我非常喜欢它”:) 感谢您的关注,祝您学习顺利!
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION