JavaRush /Java blogi /Random-UZ /Servletlar va jsp yordamida oddiy veb-ilovani yaratish (2...
fatfaggy
Daraja
Киев

Servletlar va jsp yordamida oddiy veb-ilovani yaratish (2-qism)

Guruhda nashr etilgan
Men servletlar, jsp, Maven va Tomcat yordamida veb-ilovani yaratish jarayonini tasvirlashni davom ettiraman. Agar kerak bo'lsa, maqolaning boshlanishi .
Biz ob'ektlarni yaratamiz.
Keling, ob'ektlar paketida User sinfini yarataylik, unda biz ikkita shaxsiy qator o'zgaruvchilar nomi va parolini yaratamiz. Keling, konstruktorlarni yarataylik (standart va ikkala qiymatni ham qabul qiladigan), oluvchilar/sozlovchilar, har qanday holatda toString() usulini, shuningdek, equals() va hashCode() usullarini bekor qilaylik. 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; } } Endi biz foydalanuvchilar ro'yxatini yaratishni boshlashimiz mumkin, biz o'z foydalanuvchilarimizni qaerga qo'shamiz va ularni qaerdan ko'rsatish uchun olib boramiz. Lekin muammo bor. Biz servlet obyektlarimizni yaratmaymiz; Tomcat ularni biz uchun yaratadi. Ularda biz bekor qiladigan usullar ham biz uchun allaqachon belgilangan va biz parametr qo'sha olmaymiz. Qanday qilib ikkala servletimizda ko'rinadigan umumiy ro'yxatni yaratishimiz mumkin? Agar biz har bir servletda oddiygina o'z ro'yxat ob'ektimizni yaratsak, foydalanuvchilarni bitta ro'yxatga qo'shamiz, lekin ListServlet servletidan foydalanadigan foydalanuvchilar ro'yxatini ko'rsatish butunlay boshqacha bo'ladi. Ma'lum bo'lishicha, bizga ikkala servlet uchun umumiy bo'lgan ob'ekt kerak. Umuman olganda, bizga dasturimizdagi barcha sinflar uchun umumiy bo'ladigan ob'ekt kerak; butun dastur uchun yagona ob'ekt. Umid qilamanki, siz dizayn naqshlari haqida biror narsa eshitgansiz. Va, ehtimol, ba'zilar uchun bu o'z dasturida Singleton shablonidan foydalanishning birinchi haqiqiy ehtiyojidir . Ikki marta tekshirish va sinxronizatsiya yordamida siz ijodiy bo'lishingiz va ajoyib singl yaratishingiz mumkin (ha, bizda ko'p tarmoqli dastur mavjud, chunki Tomcat turli mavzularda servletlarni ishga tushiradi), lekin men variantni erta ishga tushirish bilan ishlataman, chunki bu holda ancha mos.
Model yaratish.
Keyin biz modellar paketida sinf yaratamiz (va unda singleton shablonini qo'llaymiz) va biz uni juda rangli Model deb ataymiz. Keling, unda shaxsiy foydalanuvchilar ro'yxati ob'ektini yarataylik va ikkita usulni yarataylik: biri foydalanuvchi qo'shishingiz uchun, ikkinchisi - shunchaki satrlar ro'yxatini (foydalanuvchi nomlari) qaytarsin. Bizning foydalanuvchi ob'ektimiz nom va paroldan iborat bo'lgani uchun biz foydalanuvchi parollarini "oshkor qilishni" xohlamaymiz, shuning uchun biz faqat ularning nomlari ro'yxatini qaytaramiz. 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 haqida bir oz.
Singleton haqida eshitganingiz uchun, ehtimol siz boshqa dizayn namunasi haqida eshitgansiz - MVC (model-view-controller, yoki ruscha model-view-controller, yoki xuddi inglizcha model-view-controller). Uning mohiyati biznes mantiqini taqdimotdan ajratishdir. Ya'ni, nima qilish kerakligini belgilaydigan kodni qanday ko'rsatishni belgilaydigan koddan ajrating . Ko'rinish (ko'rinish yoki shunchaki ko'rinishlar) ba'zi ma'lumotlar taqdim etiladigan shakl uchun javobgardir. Bizning holatda, ko'rishlar bizning JSP sahifalarimizdir. Shuning uchun men ularni viewlar deb nomlangan papkaga joylashtirdim. Model - bu dastur ishlaydigan haqiqiy ma'lumotlar. Bizning holatda, bu foydalanuvchilar (foydalanuvchilar ro'yxati). Xo'sh, kontrollerlar ular orasidagi bog'lovchi bo'g'indir. Ular modeldan ma'lumotlarni olib, ko'rinishlarga o'tkazadilar yoki Tomcat'dan ba'zi ma'lumotlarni oladilar, qayta ishlaydilar va modelga o'tkazadilar. Biznes mantig'i (ya'ni, nima qilish kerak ) modelda yoki ko'rinishda emas, balki ularda tasvirlangan bo'lishi kerak. Shunday qilib, har kim o'z ishini qiladi:
  • model ma'lumotlarni saqlaydi
  • Ko'rishlar ma'lumotlarning chiroyli tasvirini chizadi
  • boshqaruvchilar ma'lumotlarni qayta ishlaydilar
Bu ularning barchasini juda sodda va parvarish qilish imkonini beradi. Va bitta sinfdagi barcha kodlarning dahshatli axlati emas. MVC nafaqat veb-dasturlash uchun mos, lekin u hali ham bu sohada juda keng tarqalgan (agar har doim bo'lmasa). Bizning holatlarimizda servletlar kontrollerlar vazifasini bajaradi. Ha, bu naqshning juda yuzaki va hatto qo'pol tavsifi, ammo bu maqola dizayn naqshlari haqida emas, balki oddiy veb-ilovani qanday qilish haqida :) Kim ko'proq bilishni xohlaydi - Google hamma narsani biladi ! :) Keling, qarashlarimizga qaytaylik.
Foydalanuvchi qo'shish uchun shakl yarating.
Add.jsp fayliga ikkita matn kiritishdan (biri oddiy, ikkinchisi parol turi) va serverga maʼlumotlarni joʻnatish tugmasidan iborat shakl qoʻshamiz. Bu yerda formada qiymat posti bilan metod atributi mavjud. Bu shuni anglatadiki, ushbu shakldagi ma'lumotlar POST so'rovi shaklida serverga yuboriladi. Harakat atributi ko'rsatilmagan, ya'ni bu so'rov biz ushbu sahifaga kirgan manzilga o'tadi (/qo'shish). Shunday qilib, ushbu manzilga bog'langan bizning servletimiz GET so'rovini olgandan so'ng, ushbu jsp-ni foydalanuvchilarni qo'shish formasi bilan qaytaradi va agar u POST so'rovini qabul qilsa, bu shakl o'z ma'lumotlarini u erga yuborgan (biz uni olib tashlaymiz) doPost() usulidagi so'rov ob'ektidan , uni qayta ishlang va saqlash uchun modelga o'tkazing). Shuni ta'kidlash kerakki, kirishlar bu erda nom parametriga ega (nomli maydon uchun u qiymat nomiga ega, parolli maydon uchun esa qiymat o'tishi mavjud). Bu juda muhim nuqta. Ushbu ma'lumotni (kiritilgan ism va parol) so'rovdan (allaqachon servlet ichida) olish uchun biz aynan shu nom va passdan foydalanamiz. Ammo bu haqda keyinroq. Ma'lumotlarni jo'natish tugmasi yana odatdagidek kiritish emas, balki tugma shaklida amalga oshiriladi. Men bu variant qanchalik universal ekanligini bilmayman, lekin u Chrome'da men uchun ishlaydi :)
Servlet bilan POST so'rovini qayta ishlash.
Keling, AddServlet servletiga qaytaylik. Biz allaqachon bilamizki, bizning servletimiz GET so'rovlarini "ushlay olishi" uchun biz HttpServlet sinfidagi doGet() usulini bekor qildik. Servletimizga POST so'rovlarini ham ushlashni o'rgatish uchun biz doPost() usulini ham bekor qilamiz. U Tomcat-dan shunga o'xshash so'rov va javob ob'ektlarini oladi, biz ular bilan ishlaymiz. Birinchidan, so'rovdan nomni chiqaramiz va forma yuborgan parametrlarni o'tkazamiz (agar siz ularni shaklda boshqacha nomlagan bo'lsangiz, unda bu siz yozgan nomlar). Keyin olingan ma'lumotlardan foydalanib, foydalanuvchi ob'ektimizni yaratamiz. Keyin biz model ob'ektini olamiz va yaratilgan foydalanuvchini modelga qo'shamiz. @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); }
Ma'lumotlarni ko'rinishga o'tkazish.
Endi ListServlet servletiga o'tamiz. Biz allaqachon boshqaruvni list.jsp ko'rinishiga o'tkazadigan doGet() usulini allaqachon joriy qildik. Agar sizda hali bu yo'q bo'lsa, uni AddServlet servletidagi xuddi shu usulga o'xshatib bajaring. Endi modeldan foydalanuvchi nomlari ro'yxatini olish va ularni u erda qabul qiladigan va chiroyli ko'rsatadigan ko'rinishga o'tkazish yaxshi bo'lar edi. Buning uchun biz yana Tomcat-dan olgan so'rov ob'ektidan foydalanamiz. Biz ushbu ob'ektga atribut qo'shib, unga qandaydir nom berishimiz mumkin va aslida biz ko'rinishga o'tkazmoqchi bo'lgan ob'ektning o'zi. Amalga oshirish jarayonini servletdan ko'rinishga o'tkazishda biz u erga servletning o'zi olgan so'rov va javob ob'ektlarini o'tkazamiz, so'ngra so'rov ob'ektiga nomlar ro'yxatini qo'shish orqali biz ushbu so'rovdan foydalanishimiz mumkin. ko'rinishdagi ob'ekt foydalanuvchi nomlari ro'yxatini yarating va oling. Biz ListServlet klassi bilan tugatdik, shuning uchun bu erda butun sinf uchun kod mavjud. 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 fayllarida java kodini bajarish.
Endi list.jsp fayliga o'tamiz. Bu fayl faqat ListServlet bu yerda bajarish jarayonidan o'tganda bajariladi. Bundan tashqari, ushbu servletda biz allaqachon modeldan foydalanuvchi nomlari ro'yxatini tayyorladik va uni so'rov ob'ektiga o'tkazdik. Ismlar ro'yxatini hisobga olsak, biz u orqali for tsiklini ishga tushirishimiz va har bir nomni chop etishimiz mumkin. Yuqorida aytib o'tganimdek, jsp fayllari java kodini bajarishi mumkin (asosan, bu ularni statik html sahifalardan farq qiladi). Ba'zi kodlarni bajarish uchun konstruksiyani kerakli joyga qo'yish kifoya.Bunday <% // java code %> konstruktsiya ichida biz bir nechta o'zgaruvchilarga kirish huquqiga ega bo'lamiz: so'rov - bizning so'rov ob'ektimiz, biz uni servletdan o'tkazdik, u erda oddiygina chaqirildi. req javobi - javob ob'ekti, servletda resp out deb nomlangan - JspWriter tipidagi ob'ekt (odatiy Writerdan meros bo'lib o'tgan), uning yordamida biz to'g'ridan-to'g'ri html sahifasining o'ziga biror narsani "yozishimiz" mumkin. Out.println("Salom dunyo!") System.out.println("Salom dunyo!") ga juda o'xshaydi, lekin ularni chalkashtirmang! out.println() html sahifasiga, System.out.println esa tizim chiqishiga "yozadi". Agar siz jsp kodi bo'lgan bo'lim ichidagi System.out.println() usulini chaqirsangiz, natijalarni siz xohlagan sahifada emas, Tomcat konsolida ko'rasiz :) jsp ichida boshqa mavjud ob'ektlarni qidirishingiz mumkin. Bu yerga . So'rov ob'ekti yordamida biz servletdan uzatilgan nomlar ro'yxatini olishimiz mumkin (biz ushbu ob'ektga tegishli atributni biriktirdik) va out ob'ekti yordamida bu nomlarni ko'rsatishimiz mumkin. Keling, buni hozircha oddiygina html ro'yxati ko'rinishida qilaylik: Agar biz ro'yxatni faqat foydalanuvchilar mavjud bo'lganda ko'rsatishni istasak va aks holda hali foydalanuvchilar yo'qligi haqida ogohlantirishni ko'rsatmoqchi bo'lsak, biz ushbu bo'limni biroz qayta yozishimiz mumkin: Endi biz ma'lumotlarni servletlardan ko'rinishlarga qanday o'tkazishni biling - foydalanuvchi muvaffaqiyatli qo'shilganligi haqida bildirishnoma paydo bo'lishi uchun biz AddServletimizni biroz yaxshilashimiz mumkin. Buning uchun doPost() usulida modelga yangi foydalanuvchi qo‘shgandan so‘ng biz ushbu foydalanuvchi nomini req obyekti atributlariga qo‘shishimiz va boshqaruvni yana add.jsp ko‘rinishiga o‘tkazishimiz mumkin. Va unda allaqachon Java kodi bo'lgan bo'limni yarating, unda siz so'rovda bunday atribut mavjudligini tekshirishingiz mumkin va agar shunday bo'lsa, foydalanuvchi muvaffaqiyatli qo'shilganligi haqida xabarni ko'rsating. Ushbu o'zgarishlardan so'ng AddServlet servletining to'liq kodi quyidagicha ko'rinadi: Bu erda doPost() usuli oxirida modelga qo'shilgan foydalanuvchi nomi bilan atributni o'rnatamiz va keyin doGet( ni chaqiramiz. ) usuli, biz joriy so'rov va javobni o'tkazamiz. Va doGet() usuli allaqachon boshqaruvni ko'rinishga o'tkazadi, u erda atribut sifatida biriktirilgan qo'shilgan foydalanuvchi nomi bilan so'rov ob'ektini yuboradi. Add.jsp faylining o'zini tuzatish uchun qoladi, agar shunday atribut mavjud bo'lsa, u bunday bildirishnomani ko'rsatadi. Yakuniy add.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

    Sahifaning asosiy qismi sarlavhali div dan iborat bo'lib, undan so'ng kontent uchun div konteyneri mavjud bo'lib, unda foydalanuvchi nomi bilan atribut mavjudligini tekshiradi, so'ngra foydalanuvchilarni qo'shish uchun formali div va oxirida. asosiy sahifaga qaytish uchun tugmali altbilgi. Bu juda ko'p divlar kabi ko'rinishi mumkin, lekin biz uslublar qo'shganda ularni keyinroq ishlatamiz :) Yakuniy versiya list.jsp Shunday qilib, bizda foydalanuvchilarni saqlashi va qo'shishi mumkin bo'lgan to'liq ishlaydigan veb-ilova mavjud. ro'yxat sifatida ularning nomlarini ko'rsating. Faqat uni bezash qoladi... :) <%@ 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!

    "); %>
    Uslublarni qo'shish. Biz W3.CSS ramkasidan foydalanamiz.
    Hozirda ilovamiz ishlayapti, lekin mutlaqo aqldan ozish :) Biz fon, matn va tugmalar uchun ranglar, ro'yxatlarni stilize qilish, hizalama qilish, chekinishlar qo'shish, umuman olganda, ko'p narsalarni qo'shishimiz kerak. Agar siz uslublarni qo'lda yozsangiz, bu ko'p vaqt va asablarni talab qilishi mumkin. Shuning uchun men W3.CSS CSS ramkasidan foydalanishni taklif qilaman . U allaqachon uslublar bilan tayyor sinflarga ega; qolgani biz ushbu joylarda qo'llamoqchi bo'lgan CSS sinflarini kerakli joylarga joylashtirishdir. Ularni sahifalarimizga qo'shish uchun avval uslublar bilan faylni kiritishimiz kerak. Buni ikki yo'l bilan amalga oshirish mumkin: 1. sahifalarimizdan o'ting va bosh bo'limga uslublar bilan faylga to'g'ridan-to'g'ri havolani kiriting.Bu parametr doimiy Internet aloqasi bo'lsa mos keladi. Keyin, mahalliy serverda sahifalaringizni ochganingizda, uslublar Internetdan tortib olinadi. 2. Agar siz barcha uslublarga mahalliy bo'lishni istasangiz va Internetga bog'liq bo'lmasangiz, shunchaki uslublar bilan faylni yuklab olishingiz va uni veb-papkaning biror joyiga joylashtirishingiz mumkin (masalan, web/styles/w3.css) va keyin Barcha sahifalarimizni (index.html, add.jsp, list.jsp) ko'rib chiqing va bosh bo'limiga uslublar bilan ushbu faylga havolani kiriting. Shundan so'ng teglar orqali o'ting va ularni o'zingiz yoqtirgan uslublar bilan belgilang. . Men bu haqda batafsil to'xtalmayman, lekin darhol o'zimning uchta faylimning tayyor versiyalarini tartiblangan uslublar sinflari bilan beraman. index.html add.jsp list.jsp Hammasi shu :) Agar sizda hali ham savollaringiz yoki sharhlaringiz bo'lsa yoki aksincha, biror narsa ishlamasa - sharh qoldiring. Xo'sh, men bularning barchasidan bir nechta skrinshotlarni ilova qilaman. Va nihoyat. Agar siz ushbu loyiha bilan shug'ullanmoqchi bo'lsangiz, quyidagilarni sinab ko'rishingiz mumkin: 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" + "
    "); %>
    Ilova bosh sahifasi Foydalanuvchi oynasini qo'shish foydalanuvchilar ro'yxati
    • foydalanuvchini o'chirish uchun servlet va jsp va mavjud foydalanuvchini o'zgartirish/tahrirlash uchun yana ikkitasini yarating. Siz servletlarda haqiqiy CrUD veb-ilovasini olasiz :))
    • Ro'yxatni almashtirish (Ro'yxat ) server qayta ishga tushirilgandan so'ng qo'shilgan foydalanuvchilar yo'qolib qolmasligi uchun ma'lumotlar bazasi bilan ishlash :)
    Omad!
    Izohlar
    TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
    GO TO FULL VERSION