JavaRush /Java блогы /Random-KK /Сервлеттер мен jsp көмегімен қарапайым веб-қосымшаны жаса...
fatfaggy
Деңгей
Киев

Сервлеттер мен jsp көмегімен қарапайым веб-қосымшаны жасау (2-бөлім)

Топта жарияланған
Сервлет, jsp, Maven және Tomcat көмегімен веб-қосымшаны жасау процесін сипаттауды жалғастырамын. Қажет болса, мақаланың басы .
Біз нысандарды жасаймыз.
Нысандар бумасында Пайдаланушы сыныбын жасайық, онда біз екі жеке жол айнымалысы аты мен құпия сөзін жасаймыз. Конструкторларды (әдепкі және екі мәнді де қабылдайтын біреуін), қабылдағыштарды/қондырғыштарды, 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; } } Енді біз пайдаланушылар тізімін жасауды бастай аламыз, онда біз өз пайдаланушыларымызды қосамыз және оларды көрсету үшін қай жерден аламыз. Бірақ мәселе бар. Біз сервлет нысандарын жасамаймыз; Tomcat оларды біз үшін жасайды. Оларда біз қайта анықтайтын әдістер де біз үшін анықталған және біз параметрді қоса алмаймыз. Екі сервлетте де көрінетін жалпы тізімді қалай жасауға болады? Егер біз жай ғана әрбір сервлетте өз тізім нысанымызды жасасақ, біз бір тізімге пайдаланушыларды қосатын боламыз, бірақ ListServlet сервлетін пайдаланатын пайдаланушылар тізімін көрсету мүлдем басқаша болады. Бізге екі сервлетке ортақ болатын нысан керек болып шықты. Жалпы айтқанда, бізге бағдарламамыздағы барлық сыныптарға ортақ болатын an object қажет; бүкіл бағдарлама үшін жалғыз an object. Сіз дизайн үлгілері туралы бірдеңе естідіңіз деп үміттенемін. Мүмкін кейбіреулер үшін бұл Singleton үлгісін өз бағдарламасында пайдаланудың бірінші нақты қажеттілігі . Сіз шығармашылықпен айналыса аласыз және қос тексерулер мен синхрондау арқылы керемет синглтон жасай аласыз (иә, бізде көп ағынды қолданба бар, өйткені Tomcat әртүрлі ағындардағы сервлеттерді іске қосады), бірақ мен опцияны ерте инициализациямен қолданамын, өйткені бұл жағдайда ол әбден қолайлы.
Модель құру.
Содан кейін біз үлгі бумасында класс жасаймыз (және онда синглтон үлгісін енгіземіз) және біз оны өте түрлі-түсті Модель деп атаймыз. Онда жеке пайдаланушы тізімінің нысанын жасайық және екі әдісті жасайық: біреуі пайдаланушыны қоса алатындай етіп, екіншісі - жолдар тізімін (пайдаланушы аттары) қайтаруға мүмкіндік береді. Біздің пайдаланушы нысанымыз атау мен құпия сөзден тұратындықтан, біз пайдаланушы құпия сөздерін «ашқымыз» келмейді, сондықтан біз олардың атауларының тізімін ғана қайтарамыз. 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ге жіберу түймешігінен тұратын пішінді қосамыз. Мұнда пішінде мән посты бар әдіс атрибуты бар. Бұл осы пішіндегі деректер serverге POST сұрауы түрінде жіберілетінін білдіреді. Әрекет атрибуты көрсетілмеген, яғни бұл сұрау біз осы бетке өткен мекенжайға (/қосу) барады. Осылайша, осы мекенжайға байланыстырылған біздің сервлет GET сұрауын алғаннан кейін, пайдаланушыларды қосу пішінімен осы jsp қайтарады және егер ол POST сұрауын алса, онда бұл пішін өз деректерін сол жерге жіберген (біз оны шығарып аламыз) doPost() әдісіндегі сұрау нысанынан оны өңдеңіз және сақтау үшін үлгіге тасымалдаңыз). Бұл жерде енгізулердің атау параметрі бар екенін атап өткен жөн (атауы бар өріс үшін оның мән атауы, ал құпия сөзі бар өріс үшін мәннің өтуі болады). Бұл өте маңызды нүкте. Бұл деректерді (енгізілетін атау мен құпия сөзді) сұраудан алу үшін (сервлет ішінде) біз дәл осы атауды және рұқсатты қолданамыз. Бірақ бұл туралы кейінірек. Деректерді жіберу түймесі әдетте әдеттегідей енгізу емес, қайтадан түйме түрінде жасалады. Мен бұл опцияның қаншалықты әмбебап екенін білмеймін, бірақ ол мен үшін 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 сервлетіне көшейік. Біз басқаруды list.jsp көрінісіне жай ғана тасымалдайтын doGet() әдісін енгіздік. Егер сізде бұл әлі жоқ болса, оны AddServlet сервлетіндегі бірдей әдіске ұқсас етіп жасаңыз. Енді модельден пайдаланушы аттары тізімін алып, оларды сол жерде қабылдайтын және әдемі көрсететін көрініске жіберген жақсы болар еді. Мұны істеу үшін біз Tomcat-тен алған сұрау нысанын қайтадан қолданамыз. Біз осы нысанға атрибут қоса аламыз, оған қандай да бір атауды және іс жүзінде көрініске тасымалдағымыз келетін нысанның өзін бере аламыз. Орындау процесін сервлеттен көрініске тасымалдау кезінде біз сол сервлеттің өзі алған сұраныс пен жауап нысандарын жібереміз, содан кейін сұрау нысанына атаулар тізімін қосу арқылы біз осы сұраудан аламыз. Көріністегі нысан пайдаланушы аттары тізімін жасаңыз және алыңыз. Біз 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 орындау процесін осы жерден өткізгенде ғана орындалады. Бұған қоса, сол сервлетте біз үлгідегі пайдаланушы аттары тізімін дайындап қойдық және оны осында сұрау нысанында жібердік. Аттардың тізімін ескере отырып, біз ол арқылы for циклін іске қосып, әрбір атауды басып шығара аламыз. Жоғарыда айтқанымдай, jsp файлдары java codeын орындай алады (негізінде бұл оларды статикалық html беттерінен ерекшелендіреді). Қандай да бір codeты орындау үшін құрылысты қажет жерге орналастыру жеткілікті.Мұндай <% // java code %> конструкцияның ішінде біз бірнеше айнымалыларға қол жеткіземіз: сұрау – біздің сұраныс an objectісі, біз оны сервлеттен өткіздік, мұнда ол жай ғана аталды. req жауап - жауап нысаны, сервлетте 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 ішінен басқа қолжетімді нысандарды іздеуге болады. Мұнда . Сұраныс нысанын пайдалана отырып, біз сервлеттен жіберілген атаулар тізімін аламыз (бұл нысанға сәйкес атрибутты тіркедік), ал out нысанын пайдалану арқылы біз бұл атауларды көрсете аламыз. Мұны әзірше html тізімі түрінде жасайық: Егер біз тізімді пайдаланушылар болған кезде ғана көрсеткіміз келсе және әйтпесе әлі пайдаланушылар жоқ екендігі туралы ескертуді көрсеткіміз келсе, біз бұл бөлімді аздап қайта жаза аламыз: Енді біз деректерді сервлеттерден көріністерге қалай тасымалдау керектігін біліңіз - пайдаланушының сәтті қосылғаны туралы хабарландыру көрсетілу үшін біз AddServlet-ті аздап жақсарта аламыз. Ол үшін doPost() әдісінде модельге жаңа пайдаланушыны қосқаннан кейін біз осы пайдаланушының атын req нысанының атрибуттарына қосып, басқаруды add.jsp көрінісіне қайтара аламыз. Онда Java codeы бар бөлімді жасаңыз, онда мұндай атрибуттың сұрауда бар-жоғын тексеруге болады, егер солай болса, пайдаланушы сәтті қосылғаны туралы хабарламаны көрсетеді. Осы өзгерістерден кейін AddServlet сервлетінің толық codeы келесідей болады: Мұнда, doPost() әдісінің соңында модельге қосылған пайдаланушы атымен атрибут орнатамыз, содан кейін doGet( деп атаймыз. ) әдісі, оған біз ағымдағы сұраныс пен жауапты береміз. Және doGet() әдісі басқаруды көрініске әлдеқашан тасымалдайды, мұнда ол атрибут ретінде тіркелген қосылған пайдаланушы атымен сұрау нысанын жібереді. Ол 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 бар сияқты көрінуі мүмкін, бірақ біз стильдерді қосқанда оларды кейінірек пайдаланамыз :) Ал, соңғы нұсқасы 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. беттерімізді аралап, бас бөліміне стильдері бар файлға тікелей сілтемені енгізіңіз.Бұл опция тұрақты интернет байланысы болған жағдайда қолайлы. Содан кейін беттерді жергілікті serverде ашқанда, стильдер Интернеттен алынады. 2. Барлық стильдердің жергілікті болуын қаласаңыз және Интернет қосылымына тәуелді болмасаңыз, жай ғана мәнерлері бар файлды жүктеп алып , оны веб-қалтаның бір жеріне (мысалы, web/styles/w3.css), содан кейін Біздің барлық беттерімізді (index.html, add.jsp, list.jsp) қарап шығыңыз және бас бөлімнің ішіне мәнерлері бар осы файлға сілтемені енгізіңіз. Содан кейін тегтерді аралап өтіп, оларды өзіңізге ұнайтын стильдермен белгілеңіз. . Мен бұл туралы егжей-тегжейлі тоқталмаймын, бірақ реттелген стиль сыныптары бар үш файлымның дайын нұсқаларын дереу беремін. 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