JavaRush /Java Blogu /Random-AZ /Java servletlərindən istifadə edən ilk tətbiqiniz

Java servletlərindən istifadə edən ilk tətbiqiniz

Qrupda dərc edilmişdir
Hamıya salam! Bu yazıda siz servletlərin əsas veb inkişaf konsepsiyası ilə tanış olacaqsınız və onlardan istifadə edərək sadə proqram yaza biləcəksiniz. Java servletlərindən istifadə edən ilk tətbiqiniz - 1Lazımsız addımların qarşısını almaq üçün biz sıfırdan başlamayacağıq və Hibernate haqqında əvvəlki məqaləmdən tətbiqimiz üzərində işləməyə davam edəcəyik . Bununla belə, biz servletlərlə yenicə başladığımız üçün mən Auto sinfi ilə bağlı hər şeyi tətbiqdən sildim və yalnız İstifadəçi sinfini və onun hərəkətlərini tərk etdim. Layihə strukturu belə görünəcək: Java servletlərindən istifadə edən ilk tətbiqiniz - 2Beləliklə, servletlər! Vikipediyada deyilir: "Servlet tətbiqi serverin funksionallığını genişləndirən Java interfeysidir. Servlet sorğu-cavab prinsipi vasitəsilə müştərilərlə qarşılıqlı əlaqədə olur." Və həqiqətən də belədir. Burada ilk olaraq “klient-server tətbiqi arxitekturası” anlayışı ilə qarşılaşırıq. Onun mahiyyəti olduqca sadədir və bir şəkilə uyğundur ( burdan götürülmüşdür ).
Java Servletlərindən istifadə edən ilk tətbiqiniz - 3
Müştəri HTTP sorğusu göndərməklə serverlə əlaqə saxlayır. Server lazımi məlumatları yaradır (məsələn, verilənlər bazasından alır) və müştəriyə qaytarır. Ən sadə misal: müəyyən sosial şəbəkədə siz “Dostlar” düyməsini sıxırsınız və bununla da serverə sorğu göndərirsiniz. Server verilənlər bazasındakı dostlarınızın siyahısını yoxlayır və onu sizə (müştəri) qaytarır. HTTP sorğularının siyahısı olduqca böyükdür, lakin onlarla heç vaxt qarşılaşmamısınızsa, daha yaxşı başa düşmək üçün onlar haqqında oxumaq daha yaxşıdır, məsələn, burada . Bizim vəzifəmiz: Servletlərdən istifadə edərək CRUD proqramı yaradın. Tətbiq HTTP sorğularını emal edən servletdən istifadə edərək verilənlər bazasından istifadəçiləri yarada, dəyişdirə və silə bilməlidir. Hibernate haqqında məqalədəki tətbiqimiz artıq bunu necə edəcəyini bilirdi, lakin o, birbaşa Java kodundan, daha dəqiq desək, main() metodundan idarə olunurdu. Burada sorğular müştəri, yəni siz tərəfindən göndəriləcək :) Bizim etməli olduğumuz ilk şey pom.xml faylımıza yeni asılılıqlar əlavə etməkdir.
<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>
Biz 3 asılılıq əlavə etdik:
  1. javax.servlet-api kitabxanasının özü;
  2. JSTL etiket kitabxanası. Müştəri tərəfini, yəni JSP səhifələrini yaratmaq üçün lazım olacaq;
  3. Spring-WebMVC. Bir az sonra danışacağımız bir Bahar dərsinə ehtiyacımız olacaq.
Servletlərin işləməsi servlet konteyneri tərəfindən idarə olunur. Bizim vəziyyətimizdə Apache Tomcat istifadə edəcəyik. Olduqca məşhur bir şeydir və yəqin ki, bu barədə artıq eşitmisiniz :) Servletin həyat dövrü aşağıdakı addımlardan ibarətdir:
  1. Konteynerdə servlet yoxdursa.
    • Servlet sinfi konteyner tərəfindən yüklənir.
    • Konteyner servlet sinfinin nümunəsini yaradır.
    • Konteyner init() metodunu çağırır. Bu üsul servleti işə salır və servlet sorğulara xidmət etməzdən əvvəl ilk olaraq çağırılır. init() metodu bütün həyat dövrü ərzində yalnız bir dəfə çağırılır.
  2. Müştəri sorğusuna xidmət. Hər bir sorğu öz ayrı-ayrılıqda işlənir. Konteyner hər sorğu üçün service() metodunu çağırır. Bu üsul daxil olan sorğunun növünü müəyyən edir və sorğunun işlənməsi üçün bu tipə uyğun olan metoda paylayır. Servlet tərtibatçısı bu metodlar üçün tətbiqləri təmin etməlidir. Metodun həyata keçirilmədiyi sorğu alınarsa, ana sinfin metodu çağırılır və adətən xətanın sorğuçuya qaytarılması ilə başa çatır.
  3. Konteyner servleti silməli olarsa, o, servleti xidmətdən çıxaran destroy() metodunu çağırır. init() metodu kimi, bu metod da bütün servlet dövrü ərzində bir dəfə çağırılır.
Servletimiz olduqca sadə görünəcək:
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");
    }
}
Gördüyünüz kimi, o, yuxarıda təsvir edilmiş init() metodunu ehtiva edir və dörd HTTP sorğusu ilə üst-üstə düşən 4 metodu tətbiq edir - doGet(), doPost(), doPut() və doDelete(). Onların hər biri bizə müvafiq olaraq istifadəçiləri qəbul etmək, yaratmaq, redaktə etmək və silmək imkanı verəcək. Metodlar javax.servlet.http.HttpServletRequest və javax.servlet.http.HttpServletResponse siniflərinin giriş obyektləri kimi qəbul edilir - yəni serverə göndərilən sorğu və müştərinin aldığı cavab. Metodların içərisində UserService sinifinin lazımi metodları yerinə yetirilir, müştəri üçün cavab yaradılır və sonra /users ünvanına yönləndirilir. Məsələn, doGet() metodunda biz bütün istifadəçilərin siyahısını alırıq. Sonra, biz Http sorğusuna obyektləri daxil etməyə, həmçinin onu xüsusi resursa (məsələn, müştəri JSP səhifəsinə) yönləndirməyə imkan verən RequestDispatcher sinifinin obyektini yaradırıq. DoPut() metodunda (istifadəçi məlumatlarının yenilənməsi) biz HTTP sorğusunu emal edirik, ondan id, ad və yaş parametrlərini çıxarırıq, göstərilən id ilə istifadəçini tapırıq, ona onunla birlikdə gələn adı və yaşı təyin edirik. tələb edin və səhifəyə / istifadəçilərə qayıdın. Lakin bütün bu üsulların düzgün işləməsi üçün servleti konfiqurasiya etməliyik. Bunun üçün biz WEB-INF qovluğunda olan web.xml faylından istifadə edirik.
<?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>
Bu fayldakı bütün etiketlər, prinsipcə, intuitivdir, lakin gəlin onları ardıcıllıqla nəzərdən keçirək. <welcome-file-list> - proqram işə salındıqda ilk olaraq açılacaq başlanğıc JSP səhifəsi müəyyən edilir. Bizim vəziyyətimizdə bu, index.jsp səhifəsidir. <servlet> - UserSimpleServlet sinfimizi servlet kimi qeydiyyatdan keçiririk. <servlet-mapping> çox vacib teqdir. Servlet tərəfindən işlənəcək URL-ləri müəyyən edir. Bizim vəziyyətimizdə bunlar hamısı URL-lərdir, ona görə də biz sadəcə olaraq “/” işarəsini göstəririk. Lakin, məsələn, istifadəçilər və onların maşınları ilə bir proqramımız olsaydı, o zaman ikinci bir servlet yarada bilərdik - SimpleAutoServlet. Sonra istifadəçi servleti üçün xəritəçəkmə “/users” (yəni istifadəçilərin işlənməsi ilə bağlı sorğular), avtomatik servlet üçün isə “/autos” olacaqdır. Və nəhayət, <filtr>. O, daxili olaraq org.springframework.web.filter.HiddenHttpMethodFilter sinfinin obyektini müəyyən edir. Məqalə Bahara aid deyil, ona görə də bu barədə ətraflı danışmayacağam. Sadəcə onu deyim ki, o, bizim tətbiqimizə yalnız əlavə xüsusiyyət kimi əlavə olunub. Məsələ ondadır ki, biz müştəri tərəfini yaratmaq üçün JSP səhifələrindən istifadə edəcəyik. Məlumatlarımız səhifədə istifadəçilərin siyahısı ilə cədvəl şəklində göstəriləcək. JSP səhifələrində HTML <form/> teqləri istifadə olunacaq. Və yalnız HTTP GET və POST sorğuları <form/>-dan məlumat göndərmək üçün istifadə edilə bilər. Yəni, hər üç əməliyyat üçün - yeniləmə, silmə və istifadəçi yaratmaq - yalnız POST sorğularından istifadə etməli olardıq. PUT və DELETE sorğularından istifadə bizim üçün əlçatan olmayacaq. Və prinsipcə, bu olduqca normaldır və həyata keçirilməsi asandır, lakin HiddenHttpMethodFilter sinfi onlardan istifadə etməyə imkan verir. Bu, tətbiqdəki əməliyyatlar arasındakı fərqləri oxucuya daha aydın göstərəcək. Nəhayət, müştəri tərəfinə keçək. Beş JSP səhifəsi ilə təmsil olunur. index.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>
addUser.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>
silUser.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>
showUsers.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>
updateUser.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 səhifəsi (Java Server Səhifəsi) iki növ mətndən ibarətdir: mətn formatlarından birində (HTML, SVG, WML və ya XML) ola bilən statik mənbə məlumatları və dinamik məzmunu yaradan JSP elementləri. JSP-nin nə olduğunu başa düşmək üçün özümə bir müəllifin çox yaxşı məqaləsini kopyalayıb yapışdırmağa icazə verəcəyəm ( buradan ). "Əsasən, JSP ilk dəfə daxil olanda servletə çevrilir və servlet kimi işləyir. Bunu başa düşmək çox vacibdir. JSP HTML səhifəsi kimi bir səhifə DEYİL - təcrübəsiz bir proqramçının aydın şəkildə başa düşməsi vacibdir ki, bu başqa bir servletdir - sadəcə onun çıxışını proqramlaşdırmağa ehtiyac yoxdur.Onu sadəcə çəkə bilərsiniz.Və verilənləri lazımi yerlərdə əvəz edə bilərsiniz.Lakin JSP səhifəsi heç olmasa bir şəkildə HTML-yə bənzədiyindən dizayner üçün aydın olacaq. Və mən bir daha yeni başlayanlara qəti şəkildə deyirəm - JSP bir SERVLETdir.O , serverdəki bütün verilənlərlə hazırlanır.Bura bütün məlumatlar daxil edilir.İstifadəçi isə brauzerdə hazır HTML səhifəsini alır ki,bu da bunu etmir. JAVA əlamətləri var." JSP səhifəsinin həqiqətən də servlet olduğunu özünüz görə bilərsiniz, çünki hər bir səhifə icra edilməli olan metodu ehtiva edir. Məsələn, index.jsp başlanğıc səhifəsində qeyd olunur ki, siz “Verilənlər bazası ilə işə başla” düyməsini kliklədiyiniz zaman method="get" yerinə yetiriləcək. Yeni istifadəçinin yaradılmasına cavabdeh olan addUser.jsp səhifəsində saxla düyməsini sıxdığınız zaman method="post" yerinə yetiriləcək. JSP-nin qalan hissəsi adi statik HTML işarələrindən ibarətdir, buna görə də biz onlara ətraflı toxunmayacağıq - bu, İnternetdə çox olan ayrı bir məqalənin mövzusudur. Beləliklə, tətbiqimizi yaratdıq, qalan şey onu hərəkətdə sınamaqdır! Bunun üçün yuxarıda qeyd olunan Apache Tomcat servlet konteynerinə ehtiyacımız olacaq. Siz pişiyi rəsmi internet saytından yükləyə bilərsiniz (mən versiya 8-dən istifadə edirəm). Sonra, Tomcat vasitəsilə tətbiqimizi işə salmaq üçün IDEA-da konfiqurasiya yaratmalıyıq. Bunu etmək üçün "Konfiqurasiyaları redaktə et" sekmesini açın, Java Servletlərindən istifadə edən ilk tətbiqiniz - 4yeni konfiqurasiya yaradın Java Servletlərindən istifadə edən ilk tətbiqiniz - 5və Tomcat Server Local seçin. Tətbiq Serveri sekmesinde Tomcat-ın yerləşdiyi qovluğa gedən yolu göstərin.Daha Java Servletlərindən istifadə edən ilk tətbiqiniz - 6sonra Yerləşdirmə tabına keçin. Java Servletlərindən istifadə edən ilk tətbiqiniz - 7Burada tətbiqimizin yerli serverdə yerləşdirilməsini konfiqurasiya edirik. "+" düyməsinə klikləyin, "Artifakt" seçin -> Layihənizin adı: müharibə (biz tətbiqi müharibə faylına yığacağıq). Java Servletlərindən istifadə edən ilk tətbiqiniz - 8Əsasən budur! "Server" səhifəsində eyni proqramın "http://localhost:8080/" ünvanında işləyəcəyini görə bilərsiniz. Bu konfiqurasiyanı yadda saxlayın və ona nəsə ad verin (mənim konfiqurasiya adım “Tommy”dir). Sonra IDEA-dakı Maven sekmesinde (sağ tərəfdə) layihəmizi müharibə faylına çevirmək üçün war plaginindən istifadə edəcəyik (Plugins -> war -> war:war). Java servletlərindən istifadə edən ilk tətbiqiniz - 9Java servletlərindən istifadə edən ilk tətbiqiniz - 10Uğurlar! Başlanğıc səhifəsi fəaliyyətə başlayıb. İndi "Verilənlər bazası ilə işə başla" düyməsini basın. JSP səhifəmiz index.jsp server tərəfindən emal ediləcək GET sorğusu yaradacaq. Server cavab yaradacaq və onu bütün mövcud istifadəçilərin siyahısı şəklində bizə qaytaracaq (əlbəttə ki, onlar verilənlər bazasındadırsa). Və buradadırlar! Java servletlərindən istifadə edən ilk tətbiqiniz - 12İstifadəçilərdən birini silməyə çalışaq: Java servletlərindən istifadə edən ilk tətbiqiniz - 13O da işləyir! Beləliklə, servletlərdən istifadə edərək ilk tətbiqimizi yazdıq. Gördüyünüz kimi, hər şey o qədər də çətin olmadığı ortaya çıxdı :) Ev tapşırığı olaraq, məsələn, əvvəlki məqalədən avtomobillərlə işləmə funksiyasını tətbiqə qaytara bilərsiniz. Bunlar. avtomobillər üçün ayrıca servlet və jsp səhifələri yaradın və tətbiqimizə istifadəçinin avtomobillərinin siyahısını göstərməyi, ona yeni avtomobillər əlavə etməyi, həmçinin onları redaktə etməyi və silməyi öyrədin. PS Servlets və JSP olduqca qədim texnologiyalardır və İnternetdə tez-tez "bu zibil kimə lazımdır?" ruhunda şərhlər tapa bilərsiniz. Cavab olduqca sadədir - bu, ilk növbədə real layihələrdə işləyəcək şəxslərə lazımdır ki, onlardan istifadə edərək çoxlu kod yazılması mümkündür. Və necə işlədiyini başa düşmədən "köhnə əşyaları" yeni bir şeyə çevirmək hələ də xoşdur :) JSP və servletlər mövzusunu daha ətraflı öyrənmək üçün "Head First Servlets və JSP" kitabından istifadə edə bilərsiniz . Yalnız ingiliscə). Çoxları üçün keyfiyyətin qarantiyası ola bilən məşhur "Head First Java" super kitabı ilə eyni müəlliflər tərəfindən yazılmışdır :) Ümid edirəm ki, bu məqalə oxucular üçün faydalı oldu! Yeni məqalələr görmək istəyirsinizsə, müsabiqədə müəllifə "Bəyən" edərək dəstək olmağı unutmayın. Və ya daha yaxşısı - “Çox xoşuma gəlir” :) Diqqətinizə görə təşəkkür edirik, dərslərinizdə uğurlar!
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION