Bu material “Müəssisələrin İnkişafına Giriş” seriyasının bir hissəsidir. Əvvəlki məqalələr: Hissə 5. Servletlər, Java servlet API.  Sadə veb proqramın yazılması - 1Konsola mətn çıxaran Java proqramlarını necə yazacağınızı artıq bilirsiniz, lakin hələ də ilk veb tətbiqinizi necə yaratacağınızı bilmirsiniz? Əla, rahat ol. Bu yazıda biz servletlərlə tanış olacağıq və dostlarınıza jarnik göndərmədən və ya Java yükləməyə məcbur etmədən göstərə biləcəyiniz proqram yazacağıq. Gəlin veb tətbiqi yazaq . Əgər veb proqramlaşdırmada istifadə olunan yanaşmalarla hələ tanış deyilsinizsə, sizə “ Müəssisələrin İnkişafına Giriş ” seriyasının birinci məqaləsindən oxumağa başlamağı məsləhət görürəm .

Servlet nədir

Əvvəlcə servletin nə olduğunu və niyə bu barədə tez-tez eşitdiyinizi anlayaq. Java Servlet API serverdə həyata keçirmək və sorğu-cavab sxemindən istifadə edərək müştəri ilə işləmək üçün nəzərdə tutulmuş standartlaşdırılmış API-dir. Servlet, müştəridən sorğu qəbul edə və ona cavabları qaytara bilən sinifdir. Bəli, Java-da servletlər müştəri-server arxitekturasının qurulduğu elementlərdir. Xatırlayırsınızsa, biz artıq silsilədəki məqalələrin birində bu haqda danışmışdıq. Gəlin kolun ətrafında döyməyək: dərhal bəzi kod yazaq.

Veb tətbiqi yaratmaq üçün nə lazımdır

Java-da servletlərlə rahat işləmək üçün sizə Intellij IDEA Ultimate Edition lazımdır. Ödənişlidir, lakin siz 30 günlük sınaq müddətini aktivləşdirə və ya erkən giriş versiyasından istifadə edə bilərsiniz - həmişə pulsuzdur. Həmçinin proqram serverimizi - Apache Tomcat-ı quraşdırın. Tomcat bir servlet konteyneridir: xaricdən daxil olan sorğuları emal edən və onları tətbiqimizə ötürəndir. Tomcat-ı bu linkdən yükləyə bilərsiniz .

İlk veb tətbiqinin yaradılması

Hər şey hazırdırsa, Maven layihəsi yaradaq. Maven ilə tanış deyilsinizsə, əvvəlki məqaləyə diqqət yetirin . Başlayaq!
  1. Pom.xml-də javax.servlet-api asılılığını əlavə edin və qablaşdırma müharibəsini təyin edin:

    <?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>

    Sadə servlet sinfi:

    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();
       }
    }
  2. Proqramı işə salmaq üçün Tomcat konfiqurasiyasını yaratmalısınız:

    Hissə 5. Servletlər, Java servlet API.  Sadə veb proqramın yazılması - 2 Hissə 5. Servletlər, Java servlet API.  Sadə veb proqramın yazılması - 3

  3. Sonra Tomcat-ın hansı versiyasını istifadə edəcəyimizi, serverə daxil ola biləcəyimiz URL-i və portu göstəririk. Bu kimi bir şey almalısınız:

    Hissə 5. Servletlər, Java servlet API.  Sadə veb proqramın yazılması - 4
  4. Qalan şey konteynerə yerləşdiriləcək artefaktı (bir banka arxivinə yığılmış layihə) müəyyən etməkdir. Siz "Düzelt" düyməsini klikləyərək müharibənin partladıldığını seçə bilərsiniz : bu o deməkdir ki, layihə yenidən qurulduqdan sonra artefakt avtomatik olaraq servlet konteynerinə yerləşdiriləcək. Hissə 5. Servletlər, Java servlet API.  Sadə veb proqramın yazılması - 5

  5. Tətbiq konteksti defolt olaraq servlets_war_exploded olaraq təyin olunub , bu o deməkdir ki, proqrama http://localhost:8080/servlets_war_exploded ünvanından daxil olmaq lazımdır .

    Niyə bizə əlavə mətn lazımdır? Gəlin lazımsız şeyləri çıxaraq. İndi bizim müraciət ünvanımız: http://localhost:8080 .

    Hissə 5. Servletlər, Java servlet API.  Sadə veb proqramın yazılması - 6

  6. OK düyməsini basın. İndi tətbiqi işə salmaq imkanımız olduğunu görürük:

    Hissə 5. Servletlər, Java servlet API.  Sadə veb proqramın yazılması - 7

    İndi proqramı işə saldığınız zaman brauzer açılmalı və 404 xətası göstərməlidir. Bu məntiqlidir, çünki http://localhost:8080/ ünvanında “/” xəritələməsi olan servlet olmalıdır və bizim yeganə servletimizdə “/hello” xəritələməsi var .

  7. Biz onunla http://localhost:8080/hello ünvanında əlaqə saxlayıb gözlənilən cavabı - “Salam” sətrini alırıq!

Hər şey işləyirsə, koda baxaq. Adi sinifdən http servlet etmək üçün onu HttpServlet sinfindən miras almalısınız. Sinifdən yuxarı @WebServlet() annotasiyasını təyin edirik, burada servleti müəyyən bir yola (“/salam”) bağlayırıq (xəritə edirik). Bu annotasiya yalnız Java Servlet API 3.0-da ortaya çıxdı, buna görə də İnternetdə servlet xəritələşdirilməsinin XML faylı vasitəsilə baş verdiyi bir çox nümunə var. İndi bu lazım deyil. GET sorğularını emal etmək üçün biz doGet() metodunu ləğv edirik. Metod arqumentlərinə diqqət yetirin - HttpServletRequest və HttpServletResponse. HttpServletRequest obyektindən sorğu ilə bağlı bütün lazımi məlumatları götürə bilərik, HttpServletResponse-də cavabımızı qeyd edə və lazımi başlıqları təyin edə bilərik.

Parametrlər və sessiya ilə işləmək

Servletimizi təkmilləşdirək ki, o, sorğu parametrlərini emal edə və sessiya ilə işləyə bilsin:
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 hazırda seansı idarə edir, səhifəyə hər dəfə daxil olanda visitCounter-i artırır. Əgər visitCounter atributu hələ yaradılmayıbsa (səhifəyə ilk dəfə daxil olanda), getAttribute() metodu null qaytaracaq, ona görə də null-u yoxlamaq lazımdır. Eyni şey sorğu parametrlərinə də aiddir. İstifadəçi istifadəçi adı parametrini keçməyibsə, onun dəyəri sıfır olacaq. Bu halda istifadəçini anonim olaraq salamlayacağıq. GET sorğusunda parametri ötürmək üçün yol dəyişənlərindən istifadə olunur, yəni http://localhost:8080/hello?username=Pavel linkinə daxil olmaq lazımdır . Http sorğuları haqqında daha ətraflı silsilənin əvvəlki məqaləsində oxuya bilərsiniz . İndi tətbiqimiz minimal məntiqə malikdir, lakin kök yolundakı 404 xətası bir az bezdiricidir. Bunu düzəltmək üçün başqa bir servlet yaradaq və onu @WebServlet("/") ilkin səhifəsinə uyğunlaşdıraq. Bu servletin işi sorğuları “/salam” yoluna yönləndirməkdir. Bunun iki yolu var: irəli və ya yönləndirmədən istifadə etməklə. Bəlkə də aralarındakı fərqin nə olduğunu anlamağa dəyər. irəli - nümayəndələr serverdəki başqa servletə emal tələb edir, müştəri iştirak etmir. Bunun üçün yeni servletin doGet() metoduna aşağıdakı kodu əlavə etməlisiniz:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
Bu kodda biz servlet kontekstinə daxil oluruq, ondan istədiyimiz servletin sorğu menecerini alırıq və ondan müəyyən edilmiş parametrlərlə (req, resp) xüsusi sorğunu emal etməyi xahiş edirik. yönləndirmə - sorğusunu icra etmək üçün əlaqə saxlamalı olduğu ünvanı müştəriyə qaytarır. Əksər brauzerlər avtomatik olaraq ötürülən linkə keçir. İstiqamətləndirməni həyata keçirmək üçün bu kodu əlavə etməlisiniz:
resp.sendRedirect(req.getContextPath() + "/hello");
HttpServletResponse-də biz redirect() metodunu çağırırıq və ona müştərinin əlaqə saxlaması lazım olan ünvanı ötürürük. Əhəmiyyətli bir detal: http parametrləri də tam yönləndirmə yolunun sonuna əlavə edilməlidir, bu çox rahat deyil. Bizim vəziyyətimizdə irəlidən istifadəyə üstünlük verilir, lakin belə olur ki, yönləndirmədən istifadə etmək daha yaxşıdır. Onların işindəki fərqi başa düşsəniz, seçiminizdə səhv etməyəcəksiniz. Yeni servlet üçün kod belə görünür:
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");
   }
}

Alt xətt

İlk veb tətbiqiniz hazırdır. Növbəti məqalədə siz onu Intellij IDEA-dan istifadə etmədən necə yerləşdirməyi öyrənəcəksiniz. Biz yalnız GET sorğularını emal edən bir proqram yazdıq. Qalan http metodları eyni şəkildə işlənir - ana sinifin müvafiq metodlarını üstələyir. Belə sadə servletlərdən istifadə edərək siz mürəkkəb, zəngin veb proqramlar yarada bilərsiniz. Əlbəttə ki, Spring kimi böyük çərçivələrdən istifadə edərək bunu etmək daha asandır. Ancaq həqiqətən servletlərin bütün imkanlarını daha ətraflı öyrənmək istəyirsinizsə, rəsmi spesifikasiyanı oxuya bilərsiniz . Hissə 6. Servlet konteynerləri Hissə 7. MVC (Model-View-Controller) nümunəsinə giriş Hissə 8. Spring-boot-da kiçik proqramın yazılması