JavaRush /Java Blogu /Random-AZ /Servletlər və jsp istifadə edərək sadə veb tətbiqinin yar...
Стас Пасинков
Səviyyə
Киев

Servletlər və jsp istifadə edərək sadə veb tətbiqinin yaradılması (1-ci hissə)

Qrupda dərc edilmişdir
Məqaləni başa düşmək üçün tələb olunan bilik səviyyəsi: siz artıq Java Core-u az-çox başa düşmüsünüz və JavaEE texnologiyalarına və veb proqramlaşdırmaya baxmaq istərdiniz. Əgər siz hazırda məqaləyə yaxın mövzuları əhatə edən Java Collections axtarışını öyrənirsinizsə, bu, ən məntiqlidir. Bu material mənim IntelliJ Idea Enterprise-də sadə veb layihəsinin yaradılmasıServletlərdən və jsp-dən istifadə edərək sadə veb tətbiqinin yaradılması (1-ci hissə) - 1 məqaləmin məntiqi davamıdır . Orada mən işləyən veb layihə şablonunu necə yaratmağı nümayiş etdirdim. Bu dəfə sizə Java Servlet API və JavaServer Pages API texnologiyalarından istifadə edərək sadə, lakin yaraşıqlı veb proqram yaratmağı göstərəcəyəm. Tətbiqimizin iki keçidi olan ana səhifəsi olacaq:
  • istifadəçinin əlavə səhifəsinə;
  • istifadəçi siyahısına baxmaq səhifəsinə keçin.
Mən hələ də IntelliJ Idea Enterprise Edition, Apache Maven (yalnız bir neçə asılılıq daxil edin) və Apache Tomcat-dan istifadə edəcəyəm. Sonda biz tətbiqimizi W3.CSS çərçivəsindən istifadə edərək “bəzəyəcəyik” . Güman edəcəyik ki, hazırda sizin boş bir layihəniz var, biz onu burada hazırlayacağıq. Əgər yoxsa, birinci məqaləni keçin və düzəldin. Cəmi bir neçə dəqiqə çəkəcək :)

Gələcək tətbiqin strukturu haqqında bir az

Əsas səhifəmiz ( / ) başlıq və iki keçid/düymə ilə ən adi statik html səhifəsi olacaq:
  • yeni istifadəçi əlavə et ( /əlavə göndəriləcək );
  • istifadəçilərin siyahısına baxın ( /listə göndərilir ).
Tomcat bu ünvanlara sorğuları tutacaq və onları hazırlayacağımız iki servletdən birinə göndərəcək (biz xəritələşdirməni web.xml faylında təsvir edəcəyik ). Servletlər isə öz növbəsində sorğuları emal edəcək, məlumatları hazırlayacaq (və ya istifadəçi əlavə olunarsa onu saxlayacaq) və nəticəni artıq “göstərəcək” müvafiq jsp fayllarına nəzarəti ötürəcək. Biz məlumatları ən ümumi siyahıda (Siyahı) saxlayacağıq.

Statik ana səhifə yaradaq

Veb qovluğunuzda index.jsp varsa , onu silin. Bunun əvəzinə bu qovluqda index.html adlı sadə html faylı yaradacağıq :
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>My super project!</title>
</head>
<body>
    <!-- header -->
    <div>
        <h1>Super app!<//h1>
    </div>

    <div>       <!-- content -->
        <div>    <!-- buttons holder -->
            <button onclick="location.href='/list'">List users<//button>
            <button onclick="location.href='/add'">Add user<//button>
        </div>
    </div>
</body>
</html>
Burada mürəkkəb bir şey yoxdur. Başlıqda səhifəmizin başlığını göstəririk. Səhifənin mətnində iki əsas bölməmiz var: başlıq (başlıq) və məzmun (məzmun). Məzmunda düymələrimiz üçün tutucumuz var və əslində iki düymə var ki, onlar kliklədikdə müvafiq ünvanlara göndərilir. Siz layihəni işlədə və onun indi necə göründüyünü görə bilərsiniz. Düymələrə klikləsəniz, 404 xətası olan səhifələr açılır, çünki onlar hələ bizdə yoxdur. Ancaq bu, düymələrin işlədiyini göstərir. Qeyd edim ki, bu, ən universal variant deyil, çünki birdən JavaScript-ni söndürsəniz, bu düymələrin brauzerdə heç bir faydası olmayacaq. Ancaq heç kimin JavaScript-i söndürmədiyini güman edəcəyik :). Aydındır ki, sadə keçidlərdən istifadə etmək olar, amma mən düymələrə üstünlük verirəm. Ən çox bəyəndiyinizi edirsiniz. Və nümunələrimdə çoxlu divlərin olacağına baxmayın . Sonra onları üslublarla dolduracağıq və hər şey daha gözəl görünəcək :).

Nəticəni göstərmək üçün jsp faylları yaradın

Eyni veb kataloqda jsp fayllarımızı yerləşdirəcəyimiz bir qovluq yaradacağıq . Mən bunu baxışlar adlandırdım və yenə də improvizasiya edə bilərsiniz. Bu qovluqda iki jsp faylı yaradacağıq:
  • add.jsp — istifadəçiləri əlavə etmək üçün səhifə;
  • list.jsp - istifadəçilərin siyahısını göstərmək üçün səhifə.
Gəlin onlara uyğun səhifə başlıqlarını verək. "Yeni istifadəçi əlavə et" və "İstifadəçilər siyahısı" kimi bir şey və biz onu hələlik belə buraxacağıq.

Gəlin iki servlet yaradaq

Servletlər Tomcat-ın onlara ötürəcəyi sorğuları qəbul edəcək və emal edəcək. Src/main/java qovluğunda biz öz mənbələrimizi ehtiva edən proqram paketi yaradacağıq. Orada daha fərqli paketlərimiz olacaq. Buna görə də, bu paketlərin bir-birinin içində yaradılmaması üçün tətbiq paketində bir sinif yaradaq (sonra onu silək). İndi proqram paketində üç fərqli paket yaradaq :
  • obyektlər - bu, bizim qurumlarımızın yatacağı yerdir (istifadəçi obyektlərini təsvir edəcək sinifin özü);
  • model - modelimiz burada olacaq (bu barədə bir az sonra daha ətraflı);
  • servletlər - yaxşı, burada bizim servletlərimiz olacaq.
Bundan sonra siz həmin sinfi proqram paketindən təhlükəsiz şəkildə silə bilərsiniz (əlbəttə ki, onu yaratmısınızsa). Servletlər paketində iki sinif yaradacağıq:
  • AddServlet - /add ünvanında alınan sorğuları emal edəcək ;
  • ListServlet - /list ünvanında qəbul edilən sorğuları emal edəcək .

Maven-də asılılıqların əlaqələndirilməsi

Tomcat versiyası 9.* Servlet versiyası 4.0 və JavaServer Pages versiyası 2.3 spesifikasiyalarını həyata keçirir. Bu, Tomcat 9-un rəsmi sənədlərində ikinci sətirdəki birinci abzasda yazılmışdır. Bu o deməkdir ki, siz də mənim kimi Tomcat-ın bu versiyasından istifadə edirsinizsə, o zaman yazdığımız və işə salmaq üçün göndərdiyimiz kod tam olaraq göstərilən versiyalardan istifadə edəcək. Amma biz istərdik ki, layihəmizdə bu spesifikasiyalar olsun ki, onlardan istifadə edən kodumuz heç olmasa uğurla tərtib etsin. Bunun üçün onları layihəmizə yükləməliyik. Maven xilasetmə üçün burada gəlir.

Ümumi qayda belədir: Maven istifadə edərək layihənizə nəyisə qoşmaq lazımdırsa:

  • Maven repozitorunun veb saytına daxil olun;
  • orada sizə lazım olan kitabxananı və sizə lazım olan versiyanı axtarın;
  • pom.xml-ə daxil edilməli olan asılılıq kodunu alırsınız;
  • daxil edin! :)
Beləliklə, başlayaq. Əvvəlcə pom faylı hazırlayaq . /versiyadan sonra , lakin /project-dən əvvəl bir yerə aşağıdakıları daxil edin:
<dependencies>

</dependencies>
Beləliklə, qeyd etdik ki, bu teqlərin içərisində bizə lazım olan asılılıqları sadalayacağıq. İndi mvnrepository.com saytına gedin , yuxarıda axtarış sahəsi olacaq. Əvvəlcə axtarışa servlet daxil edin. Yeddi mindən çox istifadənin olduğu ilk nəticə bizə uyğun gəlir. Xatırlayırıq ki, bizə 4.0 versiyası lazımdır (Tomcat 9 üçün; digər versiyalar üçün köhnə tətbiqlər uyğun ola bilər). Bu, kifayət qədər yeni versiyadır, ona görə də çox istifadə yoxdur, lakin bizə lazım olan budur. Müxtəlif paket menecerləri üçün bu asılılığın kodunu əldə edə biləcəyiniz bir səhifə açılacaq və hətta onu yükləyə bilərsiniz. Amma biz onu Maven-dən istifadə etməklə qoşmaq istədiyimiz üçün Maven sekmesinde kodu seçirik. Asılılıqlar bölməsindəki pom faylımıza kopyalayıb yapışdırırıq. IDEA-nın aşağı sağ küncündə avtomatik idxalı aktiv etmək istəməyimizlə bağlı bildiriş görünsə, razılaşırıq. Təsadüfən imtina etmisinizsə, "Parametrlər"ə keçin və avtomatik idxalı əl ilə aktivləşdirin: Parametrlər (Ctrl + Alt + S) -> Quraşdırma, İcra, Yerləşdirmə -> Maven -> İdxal Bu, pom faylını və IDEA konfiqurasiya fayllarını saxlayacaq. layihə sinxronlaşdırılır. İndi eyni prinsipdən istifadə edərək, JavaServer Pages 2.3 versiyasını tapıb birləşdirəcəyik (axtarışda jsp daxil edin). Maven-i artıq qəbul etdiyimiz üçün dərhal deyək ki, mənbələrimiz Java 8 sintaksisinə uyğundur və onların eyni versiyanın bayt koduna yığılması lazımdır. Bütün bu manipulyasiyalardan sonra bizim pom.xml belə görünəcək:
<?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>ru.javarush.info.fatfaggy</groupId>
    <artifactId>my-super-project</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>1.8</maven.compile.source>
        <maven.compiler.target>1.8</maven.compile.target>
    </properties>

    <dependencies>
        <!-- Servlet API 4.0 for tomcat 9 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- JavaServer Pages API 2.3 for tomcat 9 -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

</project>

Servletlərimizi real servletlərə çevirmək

Bu nöqtədə, yaratdığımız bir neçə servlet əslində adi siniflərdir. Onların heç bir funksionallığı yoxdur. Ancaq indi biz Servlet API-ni layihəmizə bağladıq və əgər belədirsə, oradan dərslərdən istifadə edə bilərik. Servletlərimizi “real” servlet etmək üçün sadəcə olaraq onları HttpServlet sinfindən miras almalıyıq .

Xəritəçəkmə və ya bölmə

İndi birtəhər Tomcat-a bildirmək yaxşı olardı ki, /add- dan gələn sorğular bizim AddServlet servletimiz tərəfindən idarə olunsun və buna görə də /listdən gələn sorğular ListServlet servlet tərəfindən idarə olunsun . Bu proses xəritələşdirmə adlanır . Bu, web.xml faylında bu prinsipə uyğun olaraq edilir :
  • əvvəlcə servleti təsvir edirik (biz bir ad veririk və sinfin özünə gedən yolu göstəririk);
  • sonra biz bu servleti konkret ünvana bağlayırıq (biz indicə ona verdiyimiz servletin adını göstəririk və sorğuların bu servletə göndərilməli olduğu ünvanı göstəririk).
Servleti təsvir edək:
<servlet>
    <servlet-name>add</servlet-name>
    <servlet-class>app.servlets.AddServlet</servlet-class>
</servlet>
İndi onu ünvana bağlayırıq:
<servlet-mapping>
    <servlet-name>add</servlet-name>
    <url-pattern>/add</url-pattern>
</servlet-mapping>
Gördüyünüz kimi, servlet adı hər iki halda eynidir. Bunun sayəsində Tomcat bilir ki, əgər /add ünvanına sorğu gələrsə, onun app.servlets.AddServlet servletinə ötürülməsi lazımdır . İkinci servletlə də eyni şeyi edirik. Nəticədə, bizim web.xml təxminən aşağıdakı məzmuna malikdir:
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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"
         version="3.1">

    <!-- add servlet -->
    <servlet>
        <servlet-name>add</servlet-name>
        <servlet-class>app.servlets.AddServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>add</servlet-name>
        <url-pattern>/add</url-pattern>
    </servlet-mapping>

    <!-- list servlet -->
    <servlet>
        <servlet-name>list</servlet-name>
        <servlet-class>app.servlets.ListServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>list</servlet-name>
        <url-pattern>/list</url-pattern>
    </servlet-mapping>
</web-app>
Yeri gəlmişkən, biz burada əsas səhifə üçün işarələmə yaratmamışıq ( / ünvanında ). Fakt budur ki, bu halda bizə ehtiyac yoxdur. Əsas səhifəmiz sadəcə iki düyməni göstərən sadə html faylıdır . Dinamik məzmun yoxdur, ona görə də onun üçün ayrıca bir servlet yaratmağın mənası yoxdur, hansı ünvana sorğular göndəriləcək , hansı bir jsp- yə köçürmə icrasından başqa heç nə etməyəcək (bu da olmalıdır). yaradılmışdır), hansını çəkərdik, əgər iki düyməmiz olsaydı. Buna ehtiyacımız yoxdur; biz statik resursdan məmnunuq. Tomcat sorğu aldıqda, belə bir ünvanda sorğunu emal edə biləcək bir servletin olmadığını yoxlayacaq və sonra bu ünvanda həqiqətən hazır bir html faylının olduğunu görəcək və onu uğurla göndərəcəkdir. . Tətbiqimizi yenidən işə sala bilərik (serveri yenidən başladın və ya istədiyiniz kimi yenidən yerləşdirin) və əsas səhifənin göstərildiyinə, heç bir şeyin pozulmadığına, düymələrə basdıqda keçidlərin baş verdiyinə əmin ola bilərik, lakin indiyə qədər bir səhv də var. yazılıb. Yeri gəlmişkən, əgər əvvəllər 404 səhvimiz var idisə, indi bizdə 405 var. Bu o deməkdir ki, xəritəçəkmə işlədi, servletlər tapıldı, lakin onların sorğunu emal etmək üçün heç bir uyğun üsulları yox idi. Bu mərhələdə hər şey düzgün aparılsa da, hələ də 404 səhvi alırsınızsa, bəlkə də fikirdəki yerləşdirmə konfiqurasiyasını düzəltməlisiniz. Bunu etmək üçün konfiqurasiyaları redaktə et (başlama düyməsinin yanında yuxarıda), pəncərənin sağ tərəfindəki Yerləşdirmə sekmesine keçməlisiniz və Tətbiq kontekstində sadəcə olaraq göstərildiyinə əmin olun /

Qısa bir lirik ekskursiya: "başlıq altında" nə baş verir?

Tətbiqimizin Tomcat-da necə işlədiyini yəqin ki, artıq merak etmisiniz? Orada nə baş verir? Bəs main() metodu haradadır ? Brauzerinizə localhost:8080 yazıb bu ünvana daxil olan kimi brauzer http protokolu vasitəsilə bu ünvana sorğu göndərir . Ümid edirəm ki, sorğuların müxtəlif “növlərdə” ola biləcəyindən xəbərdarsınız, ən populyarları GETPOST-dur . Hər bir müraciətin cavabı olmalıdır. GET sorğusu ona cavab olaraq brauzerə qaytarılacaq hazır html kodunun veriləcəyini gözləyir və brauzer bu kodu hər cür hərflər, düymələr və formalarla gözəl şəkildə əvəz edəcək. POST sorğusu bir az daha maraqlıdır, çünki özü ilə bəzi məlumatları da daşıyır. Məsələn, istifadəçi qeydiyyatı və ya avtorizasiya formasında məlumatlarınızı daxil etdiniz və “göndər” düyməsini kliklədiniz. Bu anda şəxsi məlumatlarınızla serverə POST sorğusu göndərildi. Server bu məlumatı qəbul etdi, onu emal etdi və bir növ cavab qaytardı (məsələn, profilinizlə html səhifəsi ). Onların arasındakı əsas fərq ondan ibarətdir ki, GET sorğuları yalnız serverdən məlumat almaq üçün nəzərdə tutulub, POST sorğuları isə özləri ilə bəzi məlumatları daşıyır və serverdəki məlumatlar dəyişə bilər (məsələn, fotoşəkilinizi serverə yüklədiyiniz zaman POST sorğusunda uçacaq və server onu verilənlər bazasına əlavə edəcək yəni müəyyən dəyişiklik baş verəcək.İndi isə Tomcat-a qayıdaq.Müştəridən bəzi sorğu alanda o ünvana baxır.Məlumatlarını axtarıb tapır. belə bir ünvana (yaxud dərhal geri qaytarıla bilən hazır resurs) sorğuları emal edəcək uyğun servletin olub-olmamasına baxın.Əgər o, qaytarılacaq heç nə tapmasa, html səhifəsi ilə deyil, cavab verir. 404 cavabı ilə.Bu ünvanda "oturan" uyğun servlet taparsa, o, hansı növ sorğu qəbul etdiyinə (GET, POST və ya başqa bir şey) baxır və sonra servletdən metodunun olub olmadığını soruşur. bu tip sorğunu idarə edə bilərdi.Əgər servlet bu növü emal edə bilməyəcəyini deyirsə, Tomcat müştəriyə 405 kodu ilə cavab verir. Lakin uyğun servlet tapılarsa və onun uyğun metodu varsa, Tomcat bu servletin obyektini yaradır, onu yeni başlıqda ( thread ) işə salır və bu, servletin ayrıca iplikdə işləməsinə imkan verir və Tomcat daha da işləməyə davam edir. sorğuları qəbul etmək və göndərmək. Bundan əlavə, Tomcat daha iki obyekt yaradır: biri HttpServletRequest tipli (mən bunu gələcəkdə qısaca sorğu adlandıracağam) və ikincisi HttpServletResponse tipli(Mən bunu cavab adlandıracağam). Birinci obyektdə o, müştəridən sorğuda aldığı bütün məlumatları yerləşdirir, beləliklə, bütün bu məlumatlar bu obyektdən çıxarıla bilər. Yaxşı, bütün bunlardan sonra, bu iki obyekti ayrıca bir ipdə işləyən servletin uyğun metoduna keçir. Servlet işini bitirən kimi və müştəriyə göndərilməyə hazır cavabı olan kimi Tomcat-a bayraq qaldırır və deyir ki, “Mən bitmişəm, hər şey hazırdır”. Tomcat cavabı qəbul edir və müştəriyə göndərir. Bu Tomcat-a sorğuları qəbul etməyə və cavabları fasiləsiz göndərməyə imkan verir, halbuki bütün işlər ayrı-ayrı mövzularda işləyən servletlər tərəfindən həyata keçirilir. Buna uyğun olaraq servlet kodunu yazarkən yerinə yetiriləcək işi müəyyənləşdiririk. Bəli, siz main() metodunu Tomcat-ın özündə olduğu kimi düşünə bilərsiniz (bəli, Java-da yazılmışdır) və biz Tomcat-a “başladığımız” zaman main().

Servletlərlə GET üsullarını tuturuq və sadə cavablar göndəririk

Hazırda servletlərimizdə uyğun metodlar (GET) yoxdur, ona görə də Tomcat bizə 405 xətası qaytarır. Gəlin onları yaradaq! Servletlərimizi miras aldığımız HttpServlet sinfi müxtəlif metodları müəyyən edir . Metodlar üçün bəzi kodlar təyin etmək üçün biz sadəcə onları ləğv edirik. Bu halda, hər iki servletdə doGet() metodunu ləğv etməliyik .
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

}
Gördüyünüz kimi, bu üsul iki obyekti qəbul edir: req (sorğu) və resp (cavab). Bunlar Tomcat-ın bu servletdə uyğun metodu çağırdığı zaman bizim üçün yaradacaq və dolduracağı obyektlərdir. Əvvəlcə ən sadə cavabları edək. Bunu etmək üçün resp obyektini götürün və ondan cavabları tərtib etmək üçün istifadə edilə bilən PrintWriter obyektini əldə edin. Yaxşı, ondan istifadə edərək bəzi sadə simli çap edəcəyik.
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    PrintWriter writer = resp.getWriter();
    writer.println("Method GET from AddServlet");
}
ListServlet servletində oxşar bir şey edəcəyik , bundan sonra serverimizi yenidən işə salacağıq. Gördüyünüz kimi, hər şey işləyir! Düymələrə kliklədiyiniz zaman, PrintWriter ilə "qeyd etdiyimiz" mətnlə səhifələr açılır . Sadəcə, cavabları olan səhifələr yaratmaq üçün hazırladığımız jsp- imiz heç bir şəkildə istifadə edilmir. Bunun səbəbi, edamın sadəcə onlara çatmamasıdır. Serverlet özü indi cavab yaradır və Tomcat-a müştəri üçün hazır cavabı olduğunu bildirərək işini bitirir. Tomcat sadəcə olaraq bu cavabı alır və müştəriyə geri göndərir. Biz idarəetməni servletlərdən jsp-ə köçürür. Gəlin metodlarımızın kodunu bu şəkildə dəyişək:
  • sorğu obyektindən sorğu meneceri obyektini alırıq, burada nəzarəti ötürmək istədiyimiz səhifənin jsp ünvanını ötürürük ;
  • alınan obyektdən istifadə edərək, idarəni göstərilən jsp səhifəsinə köçürür və Tomcat-dan aldığımız sorğu və cavab obyektlərini ora əlavə etməyi unutmayın.
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    RequestDispatcher requestDispatcher = req.getRequestDispatcher("views/add.jsp");
    requestDispatcher.forward(req, resp);
}
jsp səhifələrinin mətnində (bədən etiketinin içərisində) hansı səhifənin göstərildiyini aydın görmək üçün bir şey yaza bilərik. Bundan sonra serveri yenidən işə salırıq və yoxlayırıq. Əsas səhifədəki düymələr sıxılır, səhifələr açılır, bu o deməkdir ki, sorğular servletlərə göndərilir, bundan sonra idarəetmə artıq göstərilən jsp səhifələrinə ötürülür. Hamısı budur. Məqalənin növbəti hissəsində tətbiqimizin funksionallığı ilə məşğul olacağıq.

Başqa nə oxumaq lazımdır:

IntelliJ Idea Enterprise-də sadə veb layihəsinin yaradılması. Şəkillərlə addım-addım


Mənim söhbətim
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION