JavaRush /Java Blogu /Random-AZ /Servletlərdən və jsp-dən istifadə edərək sadə veb tətbiqi...
fatfaggy
Səviyyə
Киев

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

Qrupda dərc edilmişdir
Servletlər, jsp, Maven və Tomcat istifadə edərək veb tətbiqetmənin yaradılması prosesini təsvir etməyə davam edirəm. Lazım gələrsə, məqalənin başlanğıcı .
Biz qurumlar yaradırıq.
Gəlin varlıqlar paketində İstifadəçi sinfi yaradaq, burada iki özəl sətir dəyişəni ad və parol yaradacağıq. Gəlin konstruktorlar yaradaq (standart və hər iki dəyəri qəbul edən), alıcılar/ayarlayıcılar, hər ehtimala qarşı toString() metodunu, həmçinin equals() və hashCode() metodlarını ləğv edək. public class User { private String name; private String password; public User() { } public User(String name, String password) { this.name = name; this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", password='" + password + '\'' + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; if (name != null ? !name.equals(user.name) : user.name != null) return false; return password != null ? password.equals(user.password) : user.password == null; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + (password != null ? password.hashCode() : 0); return result; } } İndi biz istifadəçilərin siyahısını yaratmağa başlaya bilərik, istifadəçilərimizi hara əlavə edəcəyik və onları haradan nümayiş etdirəcəyik. Amma bir problem var. Biz servlet obyektlərimizi yaratmırıq; Tomcat onları bizim üçün yaradır. Onlarda ləğv etdiyimiz üsullar da bizim üçün artıq müəyyən edilib və biz parametr əlavə edə bilmirik. O zaman biz hər iki servletimizdə görünən ümumi siyahı necə yarada bilərik? Sadəcə olaraq hər bir servletdə öz siyahı obyektimizi yaratsaq, məlum olacaq ki, biz istifadəçiləri bir siyahıya əlavə edəcəyik, lakin ListServlet servletindən istifadə edən istifadəçilərin siyahısını göstərmək tamamilə fərqli olacaq. Belə çıxır ki, bizə hər iki servlet üçün ümumi olan obyekt lazımdır. Ümumiyyətlə, bizə proqramımızda bütün siniflər üçün ümumi olan obyekt lazımdır; bütün proqram üçün yeganə obyekt. Ümid edirəm dizayn nümunələri haqqında bir şey eşitmisiniz. Və bəlkə də bəziləri üçün bu, proqramında Singleton şablonundan istifadə etmək üçün ilk real ehtiyacdır . Siz yaradıcılıq əldə edə və ikiqat yoxlamalar və sinxronizasiya ilə sərin singleton yarada bilərsiniz (bəli, bizdə çox yivli proqram var, çünki Tomcat müxtəlif mövzularda servletlər işlədir), lakin mən bu seçimdən erkən başlanğıcla istifadə edəcəyəm, çünki bu halda olduqca uyğundur.
Modelin yaradılması.
Sonra model paketində bir sinif yaradacağıq (və singleton şablonunu tətbiq edəcəyik) və biz də onu olduqca rəngli Model adlandıracağıq. Gəlin orada şəxsi istifadəçi siyahısı obyekti yaradaq və iki üsul yaradaq: biri istifadəçi əlavə etmək üçün, ikincisi isə sadəcə olaraq sətirlərin (istifadəçi adlarının) siyahısını qaytarsın. İstifadəçi obyektimiz ad və paroldan ibarət olduğundan, biz istifadəçi parollarını “aşkar etmək” istəmirik, ona görə də biz yalnız onların adlarının siyahısını qaytaracağıq. public class Model { private static Model instance = new Model(); private List model; public static Model getInstance() { return instance; } private Model() { model = new ArrayList<>(); } public void add(User user) { model.add(user); } public List list() { return model.stream() .map(User::getName) .collect(Collectors.toList()); } }
mvc haqqında bir az.
Singleton haqqında eşitdiyinizə görə, bu, yəqin ki, başqa dizayn nümunəsi haqqında eşitmisiniz - MVC (model-görüntü-nəzarətçi və ya rus dilində model-görüntü-nəzarətçi və ya ingilis dilində model-görüntü-nəzarətçi kimi). Onun mahiyyəti biznes məntiqini təqdimatdan ayırmaqdır. Yəni, nə edəcəyini təyin edən kodu necə göstəriləcəyini təyin edən koddan ayırın . Görünüş (görünüş və ya sadəcə görünüşlər) bəzi məlumatların təqdim olunduğu forma üçün cavabdehdir. Bizim vəziyyətimizdə baxışlar JSP səhifələrimizdir. Ona görə də mən onları views adlı qovluğa qoyuram. Model proqramın işlədiyi faktiki məlumatdır. Bizim vəziyyətimizdə bunlar istifadəçilərdir (istifadəçilərin siyahısı). Yaxşı, nəzarətçilər onlar arasında birləşdirici əlaqədir. Onlar modeldən məlumatları götürüb görünüşlərə köçürür və ya Tomcat-dan bəzi məlumatları alır, emal edir və modelə ötürürlər. Biznes məntiqi (yəni nə etməli ) modeldə və ya görünüşdə deyil, onlarda təsvir edilməlidir. Beləliklə, hər kəs öz işini görür:
  • model məlumatları saxlayır
  • Baxışlar məlumatların gözəl təsvirini çəkir
  • nəzarətçilər məlumatları emal edir
Bu, onların hamısının kifayət qədər sadə və davamlı olmasına imkan verir. Və bir sinifdə bütün kodların dəhşətli bir zibilliyi deyil. MVC yalnız veb proqramlaşdırma üçün uyğun deyil, lakin bu sahədə hələ də çox yaygındır (həmişə deyilsə). Bizim vəziyyətimizdə servletlər nəzarətçi kimi çıxış edəcəklər. Bəli, bu, bu nümunənin çox səthi və hətta kobud təsviridir, lakin bu məqalə dizayn nümunələri haqqında deyil, sadə bir veb tətbiqetməsini necə etmək haqqındadır :) Kim daha çox bilmək istəyir - Google hər şeyi bilir ! :) Gəlin öz baxışlarımıza qayıdaq.
İstifadəçi əlavə etmək üçün forma yaradın.
Add.jsp faylına iki mətn daxiletməsindən (biri adi, digəri parol növü) və verilənlərin serverə göndərilməsi üçün düymədən ibarət forma əlavə edək. Burada formada dəyər postu ilə metod atributu var. Bu o deməkdir ki, bu formadan verilənlər POST sorğusu şəklində serverə göndəriləcək. Fəaliyyət atributu göstərilməyib, yəni bu sorğu bizim bu səhifəyə getdiyimiz ünvana (/əlavə) gedəcək. Beləliklə, bu ünvana bağlı olan servletimiz GET sorğusu aldıqdan sonra bu jsp-ni istifadəçilərin əlavə edilməsi forması ilə qaytarır və əgər POST sorğusu alırsa, bu forma öz məlumatlarını oraya göndərmişdir (biz onu çıxaracağıq) doPost() metodunda sorğu obyektindən onu emal edin və yadda saxlamaq üçün modelə köçürün). Qeyd etmək lazımdır ki, girişlərin burada ad parametri var (adı olan sahə üçün qiymət adı, parolu olan sahə üçün isə dəyər keçidi var). Bu olduqca vacib bir məqamdır. Bu məlumatları (daxil ediləcək ad və parol) sorğudan (artıq servletin içərisində) əldə etmək üçün biz məhz bu addan istifadə edəcəyik və keçəcəyik. Ancaq bu barədə daha sonra. Məlumatların göndərilməsi üçün düymənin özü adətən adət olduğu kimi giriş deyil, yenidən düymə şəklində hazırlanır. Bu seçimin nə dərəcədə universal olduğunu bilmirəm, amma Chrome-da mənim üçün işləyir :)
Servlet ilə POST sorğusunun işlənməsi.
AddServlet servletinə qayıdaq. Biz artıq bilirik ki, servletimizin GET sorğularını “tuta bilməsi” üçün biz HttpServlet sinfindən doGet() metodunu ləğv etmişik. Servletimizə POST sorğularını da tutmağı öyrətmək üçün biz doPost() metodunu da ləğv edirik. O, işləyəcəyimiz Tomcat-dan oxşar sorğu və cavab obyektlərini alır. Əvvəlcə sorğudan adı çıxaraq və formanın göndərdiyi parametrləri keçirək (əgər onları formada fərqli adlandırmısınızsa, o zaman sizin yazdığınız adlar bunlardır). Sonra alınan məlumatlardan istifadə edərək istifadəçi obyektimizi yaradacağıq. Sonra model obyektini alacağıq və yaradılmış istifadəçini modelə əlavə edəcəyik. @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String name = req.getParameter("name"); String password = req.getParameter("pass"); User user = new User(name, password); Model model = Model.getInstance(); model.add(user); }
Məlumatların görünüşə ötürülməsi.
İndi ListServlet servletinə keçək. Biz artıq doGet() metodunu tətbiq etmişik, o, sadəcə olaraq, idarəetməni list.jsp görünüşünə ötürür. Əgər sizdə bu hələ yoxdursa, AddServlet servletindəki eyni üsulla analoji olaraq bunu edin. İndi modeldən istifadəçi adlarının siyahısını almaq və onları orada qəbul edəcək və gözəl şəkildə göstərəcək görünüşə ötürmək yaxşı olardı. Bunun üçün Tomcat-dan aldığımız sorğu obyektindən yenidən istifadə edəcəyik. Bu obyektə bir atribut əlavə edə bilərik, ona bəzi adlar və əslində görünüşə köçürmək istədiyimiz obyektin özüdür. İcra prosesini servletdən görünüşə köçürərkən biz servletin özünün qəbul etdiyi eyni sorğu və cavab obyektlərini ora ötürməyimizə görə, sonra sorğu obyektinə adlar siyahısımızı əlavə etməklə biz bu sorğudan istifadə edə bilərik. görünüşündəki obyekt istifadəçi adlarımızın siyahısını yaradın və əldə edin. ListServlet sinfi ilə işimiz bitdi, ona görə də bütün sinif üçün kod buradadır. package app.servlets; import app.model.Model; import javax.servlet.RequestDispatcher; 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 ListServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Model model = Model.getInstance(); List names = model.list(); req.setAttribute("userNames", names); RequestDispatcher requestDispatcher = req.getRequestDispatcher("views/list.jsp"); requestDispatcher.forward(req, resp); } }
jsp fayllarında java kodunun icrası.
İndi isə list.jsp faylına keçək. Bu fayl yalnız ListServlet icra prosesini burada keçirdikdə icra ediləcək. Bundan əlavə, həmin servletdə biz artıq modeldən istifadəçi adlarının siyahısını hazırlamışıq və onu sorğu obyektində bura keçirmişik. Adların siyahısını nəzərə alaraq, biz onun vasitəsilə for döngüsünü işlədə və hər adı çap edə bilərik. Artıq dediyim kimi, jsp faylları java kodunu icra edə bilir (prinsipcə, bu onları statik html səhifələrindən fərqləndirir). Hansısa kodu yerinə yetirmək üçün bizə lazım olan yerə konstruksiya yerləşdirmək kifayətdir.Belə <% // java code %> konstruksiya daxilində biz bir neçə dəyişənlərə giriş əldə edirik: sorğu – servletdən keçdiyimiz sorğu obyektimiz, sadəcə olaraq burada adlanırdı. req cavabı - Servletdə cavab obyekti resp out adlanırdı - JspWriter tipli bir obyekt (adi Yazıçıdan miras qalmışdır), onun köməyi ilə biz birbaşa html səhifəsinin özünə nəyisə "yazmaq" olar. Out.println("Salam dünya!") System.out.println("Salam dünya!") ilə çox oxşardır, lakin onları qarışdırmayın! out.println() html səhifəsinə, System.out.println isə sistemin çıxışına "yazır". Bölmə daxilində System.out.println() metodunu jsp kodu ilə çağırsanız, nəticələri istədiyiniz kimi səhifədə deyil, Tomcat konsolunda görəcəksiniz :) jsp daxilində digər mövcud obyektləri axtara bilərsiniz. burada . Sorğu obyektindən istifadə etməklə biz servletdən ötürülən adların siyahısını əldə edə bilərik (biz bu obyektə müvafiq atribut əlavə etdik), out obyektindən istifadə etməklə isə bu adları göstərə bilərik. Hələlik bunu sadəcə olaraq html siyahısı formasında edək: Siyahını yalnız istifadəçilər olduqda göstərmək və əks halda hələ heç bir istifadəçinin olmadığı barədə xəbərdarlıq göstərmək istəsək, bu bölməni bir az yenidən yaza bilərik: İndi biz məlumatların servletlərdən görünüşlərə necə ötürüləcəyini bilirik - biz AddServlet-imizi bir az təkmilləşdirə bilərik ki, istifadəçinin uğurlu əlavə edilməsi haqqında bildiriş göstərilsin. Bunun üçün doPost() metodunda modelə yeni istifadəçi əlavə etdikdən sonra bu istifadəçinin adını req obyektinin atributlarına əlavə edə və nəzarəti yenidən add.jsp görünüşünə ötürə bilərik. Və orada artıq Java kodu olan bir bölmə yaradın, burada belə bir atributun sorğuda olub olmadığını yoxlaya bilərsiniz və əgər belədirsə, istifadəçinin uğurla əlavə edildiyi barədə bir mesaj göstərin. Bu dəyişikliklərdən sonra AddServlet servletinin tam kodu belə görünəcək: Burada, doPost() metodunun sonunda modelə əlavə edilmiş istifadəçinin adı ilə bir atribut təyin edirik və sonra doGet(-ni çağırırıq. ) metodu, hansı ki, biz cari sorğu və cavab veririk. Və doGet() metodu artıq nəzarəti görünüşə ötürür, burada atribut kimi əlavə edilmiş istifadəçinin adı ilə sorğu obyekti göndərir. Add.jsp-nin özünü düzəltmək qalır ki, belə bir atribut varsa, belə bir bildiriş göstərsin. Son əlavə.jsp
    <% List names = (List ) request.getAttribute("userNames"); if (names != null && !names.isEmpty()) { for (String s : names) { out.println("
  • " + s + "
  • "); } } %>
<% List names = (List ) request.getAttribute("userNames"); if (names != null && !names.isEmpty()) { out.println(" "); for (String s : names) { out.println("
  • " + s + "
  • "); } out.println("
    "); } else out.println("

    There are no users yet!

    "); %>
    package app.servlets; import app.entities.User; import app.model.Model; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class AddServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { RequestDispatcher requestDispatcher = req.getRequestDispatcher("views/add.jsp"); requestDispatcher.forward(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String name = req.getParameter("name"); String password = req.getParameter("pass"); User user = new User(name, password); Model model = Model.getInstance(); model.add(user); req.setAttribute("userName", name); doGet(req, resp); } } <%@ page contentType="text/html;charset=UTF-8" language="java" %> Add new user

    Super app!

    <% if (request.getAttribute("userName") != null) { out.println("

    User '" + request.getAttribute("userName") + "' added!

    "); } %>

    Add user

    Səhifənin gövdəsi başlığı olan div-dən ibarətdir, ondan sonra məzmun üçün div konteyneri var, orada istifadəçi adı olan bir atributun mövcud olub-olmadığını yoxlayır, sonra istifadəçiləri əlavə etmək üçün forma olan bir div və sonunda əsas səhifəyə qayıtmaq üçün düyməsi olan altbilgi. Çox div var kimi görünə bilər, lakin biz üslubları əlavə etdikdə onlardan sonra istifadə edəcəyik :) Yaxşı, son versiya list.jsp-dir.Beləliklə , bizim istifadəçiləri saxlaya və əlavə edə bilən tam işləyən veb proqramımız var. adlarını siyahı kimi göstərin. Yalnız onu bəzəmək qalır... :) <%@ page import="java.util.List" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> Users

    Super app!

    Users

    <% List names = (List ) request.getAttribute("userNames"); if (names != null && !names.isEmpty()) { out.println(" "); for (String s : names) { out.println("
  • " + s + "
  • "); } out.println("
    "); } else out.println("

    There are no users yet!

    "); %>
    Üslubların əlavə edilməsi. Biz W3.CSS çərçivəsindən istifadə edirik.
    Hal-hazırda tətbiqimiz işləyir, amma tamamilə çılğın :) Bizə fon, mətn və düymələr üçün rənglər əlavə etmək, siyahıları stilizasiya etmək, hizalama etmək, abzaslar əlavə etmək, ümumiyyətlə, çox şey lazımdır. Üslubları əl ilə yazsanız, bu, çox vaxt və əsəb apara bilər. Buna görə də, mən W3.CSS CSS çərçivəsini istifadə etməyi təklif edirəm . Artıq üslubları olan hazır dərsləri var; qalan yalnız bu yerlərdə tətbiq etmək istədiyimiz CSS dərslərini lazımi yerlərdə yerləşdirməkdir. Onları səhifələrimizə əlavə etmək üçün əvvəlcə üslubları olan bir fayl daxil etməliyik. Bu iki yolla edilə bilər: 1. səhifələrimizi keçin və başlıq bölməsində üslubları olan fayla birbaşa keçid daxil edin.Bu seçim daimi İnternet bağlantınız varsa uyğundur. Sonra, yerli serverdə səhifələrinizi açdığınız zaman üslublar İnternetdən çıxarılacaq. 2. Əgər bütün üslublara yerli olaraq sahib olmaq və İnternet bağlantısından asılı olmamaq istəyirsinizsə, sadəcə olaraq üslubları olan faylı yükləyə və veb qovluğunda (məsələn, web/styles/w3.css) yerləşdirə və sonra bütün səhifələrimizə keçin (index.html, add.jsp, list.jsp) və başlıq bölməsində üslubları olan bu fayla keçid daxil edin. Bundan sonra sadəcə teqləri keçin və onları bəyəndiyiniz üslublarla işarələyin. . Mən bu barədə ətraflı danışmayacağam, amma dərhal tərtib edilmiş üslub sinifləri ilə üç faylımın hazır versiyalarını verəcəyəm. index.html add.jsp list.jsp Hamısı budur :) Hələ hər hansı bir sualınız və ya şərhiniz varsa və ya əksinə, bir şey alınmırsa - şərhinizi yazın. Yaxşı, hamısından çıxanların bir neçə ekran görüntüsünü əlavə edəcəyəm. Və nəhayət. Bu layihə ilə məşq etmək istəyirsinizsə, cəhd edə bilərsiniz: Super app!

    Super app!

    <%@ page contentType="text/html;charset=UTF-8" language="java" %> Add new user

    Super app!

    <% if (request.getAttribute("userName") != null) { out.println("
    \n" + " ×\n" + "
    User '" + request.getAttribute("userName") + "' added!
    \n" + "
    "); } %>

    Add user

    <%@ page import="java.util.List" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> Users list

    Super app!

    Users

    <% List names = (List ) request.getAttribute("userNames"); if (names != null && !names.isEmpty()) { out.println("
      "); for (String s : names) { out.println("
    • " + s + "
    • "); } out.println("
    "); } else out.println("
    \n" + " ×\n" + "
    There are no users yet!
    \n" + "
    "); %>
    Tətbiqin ana səhifəsi İstifadəçi pəncərəsi əlavə edin istifadəçilərin siyahısı
    • bir istifadəçini silmək üçün bir servlet və jsp, mövcud istifadəçini dəyişdirmək/redaktə etmək üçün isə bir neçə daha yaradın. Servletlərdə əsl CrUD veb tətbiqi əldə edəcəksiniz :))
    • əvəz siyahısı (Siyahı ) verilənlər bazası ilə işləmək üçün server yenidən işə salındıqdan sonra əlavə edilmiş istifadəçilər yoxa çıxmasın :)
    Uğurlar!
    Şərhlər
    TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
    GO TO FULL VERSION