JavaRush /Java блогу /Random-KY /Сервлеттерди жана jspди колдонуу менен жөнөкөй веб-тиркем...
fatfaggy
Деңгээл
Киев

Сервлеттерди жана jspди колдонуу менен жөнөкөй веб-тиркеме түзүү (2-бөлүк)

Группада жарыяланган
Мен сервлеттерди, jsp, Maven жана Tomcat аркылуу веб-тиркеме түзүү процессин сүрөттөп берем. Керек болсо макаланын башталышы .
Биз субъекттерди түзөбүз.
Келгиле, an objectтер пакетинде User классын түзөлү, анда биз эки жеке сап өзгөрмөлөрүнүн аты жана сырсөзүн түзөбүз. Келгиле, конструкторлорду түзөлү (демейки жана эки маанини тең кабыл ала турган), алуучуларды/жөндөөчүлөрдү, бардык учурда 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 (модель-көзөмөлдөөчү, же орусча моделди-көзөмөлдөөчү, же англисче модел-көзөмөлдөөчү сыяктуу). Анын маңызы бизнес логикасын презентациядан бөлүүдө турат. Башкача айтканда, эмне кылууну аныктаган codeду кантип көрсөтүүнү аныктаган codeдон бөлүңүз . Көрүнүш (көрүү же жөн гана көрүнүштөр) кээ бир маалыматтар берилген форма үчүн жооптуу. Биздин учурда, көрүнүштөр биздин JSP баракчаларыбыз. Ошондуктан мен аларды көрүнүштөр деп аталган папкага салдым. Модель - бул программа иштеген чыныгы маалыматтар. Биздин учурда, бул колдонуучулар (колдонуучулардын тизмеси). Ооба, контроллерлор алардын ортосундагы байланыштыруучу звено болуп саналат. Алар моделден маалыматтарды алып, аны көрүүлөргө өткөрүп беришет, же Tomcatтан кээ бир маалыматтарды алышат, аны иштеп чыгышат жана моделге өткөрүп беришет. Бизнес логикасы (башкача айтканда, эмне кылуу керек ) моделде же көрүнүштө эмес, аларда сүрөттөлүшү керек. Ошентип, ар ким өз ишин кылат:
  • модель маалыматтарды сактайт
  • Көрүүлөр маалыматтардын кооз көрүнүшүн тартат
  • контроллерлор маалыматтарды иштеп чыгуу
Бул алардын бардыгын бир кыйла жөнөкөй жана тейлөөгө мүмкүндүк берет. Жана бир класстагы бардык codeдордун коркунучтуу таштандысы эмес. MVC веб-программалоо үчүн гана ылайыктуу эмес, бирок бул чөйрөдө дагы эле кеңири таралган (эгер дайыма болбосо). Биздин учурда, сервлеттер контроллер катары иштешет. Ооба, бул абдан үстүртөн жана ал тургай, бул үлгүнүн одоно сүрөттөлүшү, бирок бул макала дизайн үлгүлөрү жөнүндө эмес, жөнөкөй веб-тиркемени кантип жасоо керектиги жөнүндө :) Ким көбүрөөк билгиси келет - Google баарын билет ! :) Келгиле, көз караштарыбызга кайрылалы.
Колдонуучуну кошуу үчүн форма түзүңүз.
Add.jsp файлына эки текст киргизүүдөн (бири кадимки, экинчиси сырсөз түрү) жана serverге маалыматтарды жөнөтүү баскычынан турган форманы кошолу. Бул жерде формада баалуу пост менен метод атрибуту бар. Бул бул формадагы маалыматтар POST сурамы түрүндө serverге жөнөтүлөт дегенди билдирет. Иш-аракет атрибуту көрсөтүлгөн эмес, демек, бул сурам биз бул баракка барган дарекке барат (/кошуу). Ошентип, бул дарекке байланган биздин сервлет, GET өтүнүчүн алгандан кийин, бул jsp'ди колдонуучуларды кошуу формасы менен кайтарат жана эгерде ал POST өтүнүчүн алса, анда бул форма өзүнүн маалыматтарын ошол жакка жөнөткөн (биз аны кайра алабыз. doPost() методундагы суроо an objectисин иштетип, аны иштеп чыгып, сактоо үчүн моделге өткөрүп бериңиз). Белгилей кетчү нерсе, киргизүүлөр бул жерде ат параметрине ээ (аты бар талаа үчүн ал маанинин аталышына ээ, ал эми сырсөзү бар талаа үчүн өтүүчү маани бар). Бул абдан маанилүү пункт болуп саналат. Бул маалыматты (киргизиле турган аты жана паролду) суроо-талаптан (сервлеттин ичинде) алуу үчүн, биз дал ушул аталышты жана өткөрүүнү колдонобуз. Бирок бул тууралуу кийинчерээк. Маалыматтарды жөнөтүү баскычы адаттагыдай эле киргизүү эмес, кайра баскыч түрүндө жасалат. Бул параметр канчалык универсалдуу экенин билбейм, бирок ал Chrome'до мен үчүн иштейт :)
POST өтүнүчүн сервлет менен иштетүү.
AddServlet сервлетине кайрылып көрөлү. Биздин сервлет GET суроо-талаптарын “кармап” алышы үчүн HttpServlet классынан doGet() ыкмасын жокко чыгарганыбызды билебиз. Биздин сервлетти POST сурамдарын да кармоого үйрөтүү үчүн, ошондой эле doPost() ыкмасын жокко чыгарабыз. Ал Tomcatтан окшош суроо-талаптарды жана жоопторду алат, биз алар менен иштейбиз. Биринчиден, келгиле, өтүнүчтөн форма жөнөткөн атын жана параметрлерин өткөрүп алалы (эгерде сиз аларды формада башкача атасаңыз, анда булар сиз жазган ысымдар). Андан кийин биз алынган маалыматтарды колдонуу менен колдонуучу 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 сервлетинен бир эле ыкмага окшоштуруңуз. Эми модельден колдонуучу аттары тизмесин алып, аларды ошол жерден кабыл алып, жакшы көрсөтө турган көрүнүшкө өткөрүп берсеңиз жакшы болмок. Бул үчүн, биз кайрадан Tomcatтан алган суроо-талап an objectисин колдонобуз. Биз бул 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); } }
jsp файлдарында java codeун аткаруу.
Эми list.jsp файлына өтөбүз. Бул файл ListServlet бул жерде аткаруу процессинен өткөндө гана аткарылат. Кошумчалай кетсек, ошол сервлетте биз мурунтан эле модельден колдонуучу аттары тизмесин даярдап, аны бул жерде суроо-талап an objectисине өткөрүп бергенбиз. Аттардын тизмесин эске алып, биз ал аркылуу for циклин иштетип, ар бир атты басып чыгара алабыз. Мен буга чейин айткандай, jsp файлдары java codeун аткара алат (негизинен, бул аларды статикалык html баракчаларынан айырмалап турат). Кандайдыр бир codeду аткаруу үчүн конструкцияны керектүү жерге жайгаштыруу жетиштүү.Мындай <% // java code %> конструкциянын ичинде биз бир нече өзгөрмөлөргө мүмкүнчүлүк алабыз: request - биздин суроо-талап an objectибиз, аны биз сервлеттен өткөрүп жибердик, ал жерде ал жөн эле аталып калган. req жооп - жооп an objectи, сервлетте resp out деп аталды - JspWriter тибиндеги an object (кадимки Writerден тукум кууп өткөн), анын жардамы менен биз түз эле html баракчасынын өзүнө бир нерсени "жаза" алабыз. Out.println("Салам дүйнө!") System.out.println("Салам дүйнө!") менен абдан окшош, бирок аларды чаташтырбаңыз! out.println() html баракчасына, ал эми System.out.println - системанын чыгышына "жазат". Jsp codeу бар бөлүмдүн ичинде System.out.println() ыкмасын чакырсаңыз, натыйжаларды сиз каалагандай бетте эмес, Tomcat консолунда көрөсүз :) jsp ичинде башка жеткorктүү an objectтерди издесеңиз болот. бул жерде . Сурам an objectинин жардамы менен биз сервлеттен өтүп кеткен аттардын тизмесин ала алабыз (биз бул an objectке тиешелүү атрибутту тиркедик), ал эми out an objectинин жардамы менен бул аталыштарды көрсөтө алабыз. Келгиле, муну азырынча жөн гана html тизмеси түрүндө жасайлы: Эгерде биз тизмени колдонуучулар бар болгондо гана көрсөткүсү келсе, жана башка учурда колдонуучулар жок деген эскертүүнү көрсөткүсү келсе, анда бул бөлүмдү бир аз кайра жазсак болот: Эми биз Сервлеттерден көрүүлөргө берorштерди кантип өткөрүүнү билебиз - колдонуучунун ийгorктүү кошулганы жөнүндө эскертме көрсөтүлүшү үчүн биз AddServletибизди бир аз жакшыртсак болот. Бул үчүн, doPost() методунда, моделге жаңы колдонуучуну кошкондон кийин, биз бул колдонуучунун атын req an objectинин атрибуттарына кошуп, башкарууну кайра add.jsp көрүнүшүнө өткөрүп алабыз. Анда Java codeу бар бөлүм түзүлөт, анда сурамда мындай атрибут бар же жок экенин текшере аласыз, эгер ошондой болсо, анда колдонуучу ийгorктүү кошулду деген билдирүүнү көрсөтөт. Бул өзгөртүүлөрдөн кийин, AddServlet сервлетинин толук codeу төмөнкүдөй болот: Бул жерде, doPost() методунун аягында, моделге кошулган колдонуучунун аты менен атрибут орнотуп, анан doGet( деп атайбыз. ) ыкмасы, ага биз учурдагы суроо-талапты жана жоопту өткөрүп беребиз. Жана doGet() методу мурунтан эле башкарууну көрүнүшкө өткөрүп берет, ал жерде атрибут катары тиркелген кошулган колдонуучунун аты менен суроо-талап an objectисин жөнөтөт. Ал мындай атрибут бар болсо, мындай эскертмени көрсөтүү үчүн add.jsp өзүн тууралоо үчүн калат. Final 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 жана аягында негизги бетке кайтуу үчүн баскычы бар колонтитул. Бул өтө көп divs сыяктуу сезorши мүмкүн, бирок биз аларды кийинчерээк стилдерди кошкондо колдонобуз :) Ооба, акыркы 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 алкагын колдонобуз.
    Учурда биздин тиркеме иштеп жатат, бирок таптакыр жинди :) Бизге фон, текст жана баскычтар үчүн түстөрдү кошуу, тизмелерди стилдөө, тегиздөө, чегинүүлөрдү кошуу, жалпысынан көп нерселер керек. Эгерде сиз стилдерди кол менен жазсаңыз, бул көп убакытты жана нервдерди талап кылышы мүмкүн. Ошондуктан, мен W3.CSS CSS алкагын колдонууну сунуштайм . Анын стилдери бар даяр класстары бар; биз бул жерлерде колдонгубуз келген CSS класстарын керектүү жерлерге жайгаштыруу гана калды. Аларды биздин баракчаларга кошуу үчүн алгач стилдери бар файлды камтышыбыз керек. Муну эки жол менен жасоого болот: 1. Биздин баракчаларды карап чыгып, баш бөлүмгө стилдери бар файлга түз шилтемени киргизиңиз.Бул опция сизде туруктуу Интернет байланышы бар болсо ылайыктуу. Андан кийин, сиз жергorктүү serverде баракчаларыңызды ачканыңызда, стилдер Интернеттен чыгарылат. 2. Эгерде сиз бардык стилдердин локалдуу болушун кааласаңыз жана Интернетке көз каранды болбоңуз, анда сиз жөн гана стилдери бар файлды жүктөп алып , аны веб папканын ичинде бир жерге (мисалы, 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