JavaRush /Блоги Java /Random-TG /Эҷоди як барномаи оддии веб бо истифода аз сервлетҳо ва j...
fatfaggy
Сатҳи
Киев

Эҷоди як барномаи оддии веб бо истифода аз сервлетҳо ва jsp (қисми 2)

Дар гурӯҳ нашр шудааст
Ман тавсифи раванди эҷоди веб-барномаро бо истифода аз servlets, jsp, Maven ва Tomcat идома медиҳам. Оғози мақола , агар лозим бошад.
Мо an objectҳо эҷод мекунем.
Биёед дар бастаи an objectҳо синфи корбар эҷод кунем, ки дар он мо ду тағирёбандаи сатри хусусии ном ва паролро эҷод мекунем. Биёед конструкторҳоро эҷод кунем (пешфарз ва яке, ки ҳарду арзишро қабул мекунад), қабулкунанда/танзимкунанда, усули toString()-ро дар ҳар сурат, инчунин усулҳои equals() ва hashCode() бекор кунем. 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; } } Ҳоло мо метавонем ба эҷоди рӯйхати корбарон шурӯъ кунем, ки мо корбарони худро дар он ҷо илова мекунем ва аз куҷо онҳоро барои намоиш медиҳем. Аммо як мушкилот вуҷуд дорад. Мо an objectҳои сервлети худро эҷод намекунем; Tomcat онҳоро барои мо эҷод мекунад. Усулҳое, ки мо дар онҳо аз байн мебарем, аллакай барои мо муайян шудаанд ва мо наметавонем параметр илова кунем. Пас чӣ гуна мо метавонем рӯйхати умумиеро созем, ки дар ҳарду сервлетҳои мо намоён бошанд? Агар мо танҳо дар ҳар як сервлет an objectи рӯйхати шахсии худро эҷод кунем, маълум мешавад, ки мо корбаронро ба як рӯйхат илова мекунем, аммо намоиши рӯйхати корбароне, ки аз сервлети ListServlet истифода мебаранд, комилан дигар хоҳад буд. Маълум мешавад, ки ба мо an objectе лозим аст, ки барои ҳарду сервлет умумӣ бошад. Умуман, ба мо an objectе лозим аст, ки барои ҳамаи синфҳои барномаи мо умумӣ бошад; an objectи ягона барои тамоми барнома. Ман умедворам, ки шумо дар бораи намунаҳои тарроҳӣ чизе шунидаед. Ва шояд барои баъзеҳо ин аввалин зарурати воқеии истифодаи қолаби Singleton дар барномаи худ аст. Шумо метавонед эҷодкор бошед ва бо санҷишҳои дукарата ва синхронизатсия як синглтони олӣ созед (бале, мо як барномаи бисёр ришта дорем, зеро Tomcat сервлетҳоро дар риштаҳои гуногун иҷро мекунад), аммо ман ин вариантро бо оғози ибтидоӣ истифода хоҳам кард, зеро дар ин ҳолат он хеле мувофиқ.
Эҷоди модел.
Сипас, мо дар бастаи намунавӣ синф эҷод мекунем (ва қолаби синглтонро дар он татбиқ мекунем) ва мо инчунин онро хеле рангин Модел меномем. Биёед дар он an objectи рӯйхати корбарони хусусиро эҷод кунем ва ду усул созем: яке то шумо метавонед корбарро илова кунед ва дуюм - бигзор он танҳо рӯйхати сатрҳоро (номҳои корбар) баргардонад. Азбаски an objectи корбарии мо аз ном ва парол иборат аст, мо намехоҳем паролҳои корбарро "ифшо кунем", аз ин рӯ мо танҳо рӯйхати номҳои онҳоро бармегардонем. 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.
Азбаски шумо дар бораи синглтон шунидаед, ин маънои онро дорад, ки шумо эҳтимол дар бораи намунаи дигари тарроҳӣ шунидаед - MVC (модел-намоиш-назораткунанда ё дар русии модел-назар-назораткунанда, ё мисли забони англисӣ модел-view-controller). Моҳияти он ҷудо кардани мантиқи тиҷорат аз муаррифӣ аст. Яъне codeеро, ки чӣ кор карданро муайян мекунад , аз codeе, ки чӣ тавр намоиш додани . Намоиш (намоиш ё танҳо намудҳо) барои шакле, ки дар он баъзе маълумотҳо пешниҳод мешаванд, масъул аст. Дар ҳолати мо, намоишҳо саҳифаҳои JSP-и мо мебошанд. Аз ин рӯ, ман онҳоро дар папкае гузоштам, ки манзара ном дорад. Модел ин маълумотест, ки барнома бо он кор мекунад. Дар ҳолати мо, инҳо истифодабарандагон (рӯйхати истифодабарандагон) мебошанд. Хуб, контроллерҳо пайванди пайвасткунандаи байни онҳо мебошанд. Онҳо маълумотро аз модел гирифта, ба намоишҳо интиқол медиҳанд ё аз Tomcat баъзе маълумотро мегиранд, коркард мекунанд ва ба модел интиқол медиҳанд. Мантиқи тиҷорӣ (яъне чӣ кор кардан лозим аст ) бояд дар онҳо тасвир карда шавад, на дар модел ё намуди. Ҳамин тариқ, ҳар кас кори худро мекунад:
  • модел маълумотро нигоҳ медорад
  • Намоишҳо тасвири зебои маълумотро ҷалб мекунанд
  • назоратчиён маълумотро коркард мекунанд
Ин ба ҳамаи онҳо имкон медиҳад, ки хеле содда ва нигоҳ дошта шаванд. Ва на як партовгоҳи даҳшатноки ҳама рамзҳо дар як синф. MVC на танҳо барои барномасозии веб мувофиқ аст, аммо он дар ин соҳа ҳоло ҳам хеле маъмул аст (агар на ҳамеша). Дар ҳолати мо, сервлетҳо ҳамчун контроллер амал мекунанд. Бале, ин тавсифи хеле рӯякӣ ва ҳатто дағалонаи ин намуна аст, аммо ин мақола на дар бораи намунаҳои тарроҳӣ, балки дар бораи чӣ гуна сохтани як барномаи оддии веб аст :) Кӣ бештар донист - Google ҳама чизро медонад ! :) Биёед ба назари худ бармегардем.
Барои илова кардани корбар форма эҷод кунед.
Биёед ба файли add.jsp форма илова кунем, ки аз ду вуруди матнӣ (яке муқаррарӣ, дигаре навъи парол) ва тугма барои фиристодани маълумот ба server иборат аст. Дар ин ҷо форма дорои атрибути метод бо пости арзиш аст. Ин маънои онро дорад, ки маълумот аз ин шакл ба server дар шакли дархости POST фиристода мешавад. Аттрибути амал муайян карда нашудааст, яъне ин дархост ба ҳамон суроғае меравад, ки мо ба ин саҳифа рафтаем (/add). Ҳамин тариқ, сервлети мо, ки ба ин суроға пайваст аст, пас аз гирифтани дархости GET, ин jsp-ро бо шакл барои илова кардани корбарон бармегардонад ва агар дархости POST гирад, пас ин форма маълумоти худро ба он ҷо фиристодааст (ки мо онро аз он мегирем) an objectи дархостро дар усули doPost() коркард кунед ва онро ба модел барои захира интиқол диҳед). Қобor зикр аст, ки вурудҳо дар ин ҷо параметри ном доранд (барои майдоне, ки ном дорад, номи арзиш дорад ва барои майдоне, ки парол дорад, пасандози арзиш дорад). Ин як нуктаи хеле муҳим аст. Азбаски барои гирифтани ин маълумот (ном ва парол, ки ворид карда мешавад) аз дархост (аллакай дар дохor сервлет), мо маҳз ин ном ва гузаришро истифода мебарем. Аммо дар ин бора баъдтар. Тугмаи фиристодани маълумот боз дар шакли тугма сохта мешавад, на вуруд, чунон ки маъмулан маъмул аст. Ман намедонам, ки ин хосият то чӣ андоза универсалӣ аст, аммо он барои ман дар Chrome кор мекунад :)
Коркарди дархости POST бо сервлет.
Биёед ба сервлети AddServlet баргардем. Мо аллакай медонем, ки барои он ки сервлети мо дархостҳои GET-ро "сайд" кунад, мо усули doGet()-ро аз синфи HttpServlet бекор мекунем. Барои таълим додани сервлети мо инчунин гирифтани дархостҳои POST, мо инчунин усули doPost()-ро бекор мекунем. Он аз Tomcat an objectҳои шабеҳи дархост ва посухро мегирад, ки мо бо онҳо кор хоҳем кард. Аввалан, биёед аз дархост ном ва параметрҳоеро, ки форма фиристодааст, барорем (агар шумо онҳоро дар шакли дигар номгузорӣ карда бошед, пас ин номҳое ҳастанд, ки шумо менависед). Он гоҳ мо бо истифода аз маълумоти гирифташуда an objectи корбарии худро эҷод мекунем. Сипас, мо an objectи моделиро мегирем ва корбари сохташударо ба модел илова мекунем. @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); }
Интиқоли маълумот ба намоиш.
Акнун биёед ба сервлети ListServlet гузарем. Мо аллакай усули doGet()-ро амалӣ кардаем, ки он танҳо назоратро ба намуди list.jsp интиқол медиҳад. Агар шумо ҳоло ин корро надошта бошед, онро бо ҳамон усул аз сервлети AddServlet муқоиса кунед. Ҳоло хуб мебуд, ки рӯйхати корбаронро аз модел ба даст оред ва онҳоро ба намоиш гузаронед, ки онҳоро дар он ҷо қабул мекунад ва ба таври зебо намоиш медиҳад. Барои ин, мо боз an objectи дархостеро, ки аз Tomcat гирифтаем, истифода мебарем. Мо метавонем атрибутеро ба ин an object илова карда, ба он номе диҳем ва дар асл худи an objectе, ки мо мехоҳем ба намоиш интиқол диҳем. Аз сабаби он, ки ҳангоми интиқоли раванди иҷро аз сервлет ба намоиш, мо ба он ҷо ҳамон an objectҳои дархост ва посухро, ки худи сервлет гирифта буд, интиқол медиҳем, пас бо илова кардани рӯйхати номҳои худ ба an objectи дархост, мо метавонем аз ин дархост an object дар намуди рӯйхати номҳои корбарони моро эҷод кунед ва ба даст оред. Мо бо синфи ListServlet анҷом ёфтем, аз ин рӯ codeи тамоми синф аст. 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); } }
Иҷрои рамзи java дар файлҳои jsp.
Акнун биёед ба файли list.jsp гузарем. Ин файл танҳо вақте иҷро мешавад, ки ListServlet раванди иҷроро дар ин ҷо мегузарад. Илова бар ин, дар он сервлет мо аллакай рӯйхати номҳои корбаронро аз модел омода кардаем ва онро ба ин ҷо дар an objectи дархост интиқол додем. Бо назардошти рӯйхати номҳо, мо метавонем даври for-ро тавассути он иҷро кунем ва ҳар як номро чоп кунем. Тавре ки ман аллакай гуфтам, файлҳои jsp метавонанд рамзи java-ро иҷро кунанд (аслан, ин он чизест, ки онҳоро аз саҳифаҳои статикии html фарқ мекунад). Барои иҷро кардани ягон code, дар ҷои лозима ҷойгир кардани конструксия кифоя аст.Дар <% // java code %> дохor чунин конструксия мо ба якчанд тағирёбандаҳо дастрасӣ пайдо мекунем: дархост - an objectи дархости мо, ки мо онро аз сервлет интиқол додем, ки дар он ҷо танҳо номида мешуд. req посух - an objectи посух, дар Сервлет resp out номида шуд - an objectи навъи JspWriter (мерос аз Writer муқаррарӣ), ки бо ёрии он мо метавонем чизеро мустақиман ба худи саҳифаи html "нависем". Out.println("Салом ҷаҳон!") ба System.out.println("Салом ҷаҳон!") хеле монанд аст, аммо онҳоро ошуфта накунед! out.println() ба саҳифаи html "менависад" ва System.out.println - ба баромади система. Агар шумо усули System.out.println()-ро дар дохor бахш бо рамзи jsp даъват кунед, шумо натиҷаҳоро дар консоли Tomcat хоҳед дид, на дар саҳифа, тавре ки шумо мехоҳед :) Шумо метавонед an objectҳои мавҷударо дар дохor jsp ҷустуҷӯ кунед. Ин ҷо . Бо истифода аз an objectи дархост мо метавонем рӯйхати номҳоеро, ки аз сервлет интиқол дода шудаанд, гирем (мо атрибути мувофиқро ба ин an object замима кардем) ва бо истифода аз an objectи берун мо метавонем ин номҳоро нишон диҳем. Биёед ҳоло ин корро танҳо дар шакли рӯйхати html анҷом диҳем: Агар мо хоҳем, ки рӯйхатро танҳо ҳангоми мавҷуд будани корбарон намоиш диҳем ва дар акси ҳол огоҳие нишон диҳем, ки то ҳол корбарон вуҷуд надоранд, мо метавонем ин қисмро каме аз нав нависем: Акнун, ки мо бидонед, ки чӣ гуна маълумотро аз сервлетҳо ба намоишҳо интиқол додан мумкин аст - мо метавонем AddServlet-и худро каме такмил диҳем, то огоҳинома дар бораи бомуваффақияти илова кардани корбар нишон дода шавад. Барои ин дар усули doPost() пас аз илова кардани корбари нав ба модел, мо метавонем номи ин корбарро ба атрибутҳои an objectи req илова кунем ва назоратро дубора ба намуди add.jsp гузаронем. Ва дар он аллакай бахшеро бо codeи Java созед, ки дар он шумо метавонед тафтиш кунед, ки оё чунин атрибут дар дархост мавҷуд аст ва агар ин тавр бошад, пас паёмеро нишон диҳед, ки корбар бомуваффақият илова карда шудааст. Пас аз ин тағирот, рамзи пурраи сервлети AddServlet чунин хоҳад буд: Дар ин ҷо, дар охири усули doPost() мо атрибутеро бо номи корбаре, ки ба модел илова карда шудааст, насб мекунем ва сипас ба doGet() занг мезанем. ) усуле, ки мо ба он дархост ва посухи ҷорӣ мегузарем. Ва усули doGet() аллакай назоратро ба намоиш интиқол медиҳад, ки дар он an objectи дархостро бо номи корбари иловашуда ҳамчун атрибут замима мекунад. Он барои ислоҳ кардани худи add.jsp боқӣ мемонад, то ин ки агар чунин атрибут мавҷуд бошад, чунин огоҳиномаро намоиш диҳад. Ниҳоии 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

    Ҷисми саҳифа аз div бо сарлавҳа иборат аст, ки пас аз он контейнери div барои мундариҷа мавҷуд аст, ки дар он тафтиш мекунад, ки оё атрибут бо номи корбар мавҷуд аст, пас div бо форма барои илова кардани корбарон ва дар охири он. поён бо тугма барои баргаштан ба саҳифаи асосӣ. Чунин ба назар мерасад, ки divҳо аз ҳад зиёданд, аммо мо онҳоро баъдтар ҳангоми илова кардани сабкҳо истифода хоҳем кард :) Хуб, versionи ниҳоӣ list.jsp аст.Ҳамин тавр , мо веб-барномаи пурра коркунанда дорем, ки метавонад корбаронро захира ва илова кунад. ҳамчун рӯйхат номҳои онҳоро нишон диҳед. Танҳо ороиш додани он боқӣ мемонад... :) <%@ 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!

    "); %>
    Илова кардани услубҳо. Мо чаҳорчӯбаи W3.CSS -ро истифода мебарем.
    Дар айни замон, замимаи мо кор мекунад, аммо комилан девона :) Ба мо лозим аст, ки замина, рангҳо барои матн ва тугмаҳо, услуби рӯйхатҳо, ҳамоҳангсозӣ, илова кардани абзорҳо ва умуман чизҳои зиёдеро илова кунем. Агар шумо услубҳоро дастӣ нависед, он метавонад вақти зиёд ва асабҳоро талаб кунад. Аз ин рӯ, ман тавсия медиҳам, ки чаҳорчӯбаи CSS W3.CSS -ро истифода барем . Он аллакай дарсҳои тайёри дорои услубҳо дорад; танҳо он аст, ки дар ҷойҳои дуруст ҷойгир кардани синфҳои CSS, ки мо мехоҳем дар ин ҷойҳо татбиқ кунем. Барои илова кардани онҳо ба саҳифаҳои мо, аввал мо бояд файлеро бо сабкҳо дохил кунем. Инро бо ду роҳ анҷом додан мумкин аст: 1. аз саҳифаҳои мо гузаред ва дар қисмати сар пайванди мустақими файлро бо сабкҳо ҷойгир кунед.Ин хосият мувофиқ аст, агар шумо пайвасти доимии интернет дошта бошед. Пас, вақте ки шумо саҳифаҳои худро дар serverи маҳаллӣ мекушоед, сабкҳо аз Интернет кашида мешаванд. 2. Агар шумо хоҳед, ки ҳамаи услубҳоро ба таври маҳаллӣ дошта бошед ва аз пайвасти интернет вобаста набошед, шумо метавонед танҳо файлро бо услубҳо зеркашӣ кунед ва онро дар ҷое дар дохor ҷузвдони веб ҷойгир кунед (масалан web/styles/w3.css) ва сипас дар тамоми саҳифаҳои мо (index.html, add.jsp, list.jsp) гузаред ва истиноди ин файлро бо сабкҳо дар қисми сарлавҳа ворид кунед.Баъд аз ин, танҳо тегҳоро аз назар гузаронед ва онҳоро бо услубҳое, ки ба шумо маъқуланд, нишон диҳед. . Ман дар ин бора ба таври муфассал таваққуф намекунам, аммо дарҳол versionҳои тайёри се файли худро бо синфҳои услуби тартибдодашуда медиҳам. index.html add.jsp list.jsp Ҳамааш ҳамин аст :) Агар шумо то ҳол ягон савол дошта бошед ё шарҳе дошта бошед, ё баръакс, чизе кор намекунад - шарҳ диҳед. Хуб, ман якчанд скриншотҳоро аз он чизе, ки аз ин ҳама ба даст омадааст, замима мекунам. Ва ниҳоят. Агар шумо хоҳед, ки бо ин лоиҳа машқ кунед, шумо метавонед кӯшиш кунед: 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" + "
    "); %>
    Саҳифаи асосии барнома Иловаи равзанаи корбар рӯйхати истифодабарандагон
    • сервлет ва jsp-ро барои нест кардани корбар ва чанде дигар барои тағир/таҳрири корбари мавҷуда созед. Шумо як веб-барномаи воқеии CrUD мегиред :) дар сервлетҳо))
    • иваз кардани рӯйхат (Рӯйхат ) барои кор кардан бо пойгоҳи додаҳо, то корбарони иловашуда пас аз бозоғоз шудани server нопадид нашаванд :)
    Барори кор!
    Шарҳҳо
    TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
    GO TO FULL VERSION