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

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

Топта жарияланған
Мақаланы түсіну үшін қажетті білім деңгейі: сіз Java Core бағдарламасын азды-көпті түсіндіңіз және JavaEE технологиялары мен веб-бағдарламалауды қарастырғыңыз келеді. Егер сіз қазір мақалаға жақын тақырыптарды қамтитын Java Collections квестін оқып жатсаңыз, бұл өте мағыналы болады. Бұл материал IntelliJ Idea Enterprise-де қарапайым веб-жобаны құруСервлеттер мен jsp көмегімен қарапайым веб-қосымшаны жасау (1-бөлім) - 1 мақаламның логикалық жалғасы болып табылады . Онда мен жұмыс істейтін веб-жоба үлгісін қалай жасау керектігін көрсеттім. Бұл жолы мен Java Servlet API және JavaServer Pages API технологияларын пайдаланып қарапайым, бірақ әдемі веб-қосымшаны қалай жасау керектігін көрсетемін. Біздің қолданбада екі сілтемесі бар басты бет болады:
  • пайдаланушы қосу бетіне;
  • пайдаланушы тізімін қарау бетіне.
Мен әлі де IntelliJ Idea Enterprise Edition, Apache Maven (бірнеше тәуелділіктерді қосыңыз) және Apache Tomcat қолданамын. Соңында біз W3.CSS негізін қолданып қолданбамызды «безейміз» . Қазіргі уақытта сізде бос жоба бар деп болжаймыз, біз оны осында әзірлейміз. Егер жоқ болса, бірінші мақаланы оқып шығыңыз және оны жасаңыз. Бұл бірнеше minutesты алады :)

Болашақ қосымшаның құрылымы туралы аздап

Біздің басты бет ( / ) тақырыбы және екі сілтемесі/түймелері бар ең қарапайым статикалық html беті болады:
  • жаңа пайдаланушы қосу ( /add мекенжайына жіберіледі );
  • пайдаланушылар тізімін қарау ( /list мекенжайына жібереді ).
Tomcat осы мекенжайларға сұраныстарды қабылдайды және оларды біз жасайтын екі сервлеттің біріне жібереді (біз web.xml файлында салыстыруды сипаттаймыз ). Сервлеттер, өз кезегінде, сұрауларды өңдейді, деректерді дайындайды (немесе пайдаланушы қосылған болса, оны сақтайды) және басқаруды нәтижені «көрсететін» сәйкес jsp файлдарына тасымалдайды. Біз деректерді ең көп таралған тізімде сақтаймыз (Тізім).

Статикалық басты бетті жасайық

Веб қалтаңызда index.jsp болса , оны жойыңыз. Оның орнына бұл қалтада index.html деп аталатын қарапайым html файлын жасаймыз :
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>My super project!</title>
</head>
<body>
    <!-- header -->
    <div>
        <h1>Super app!<//h1>
    </div>

    <div>       <!-- content -->
        <div>    <!-- buttons holder -->
            <button onclick="location.href='/list'">List users<//button>
            <button onclick="location.href='/add'">Add user<//button>
        </div>
    </div>
</body>
</html>
Мұнда күрделі ештеңе жоқ. Тақырыпта біз парақшамыздың тақырыбын көрсетеміз. Беттің негізгі бөлігінде бізде екі негізгі бөлім бар: тақырып (тақырып) және мазмұн (мазмұн). Мазмұнда бізде түймелер үшін ұстағыш бар және іс жүзінде екі түйме басылған кезде тиісті мекенжайларға жіберіледі. Сіз жобаны іске қосып, оның қазір қалай көрінетінін көре аласыз. Түймелерді бассаңыз, 404 қатесі бар беттер ашылады, себебі бізде олар әлі жоқ. Бірақ бұл түймелердің жұмыс істейтінін білдіреді. Бұл ең әмбебап нұсқа емес екенін атап өтейін, себебі сізде кенеттен JavaScript өшірілген болса, бұл түймелердің браузерде еш пайдасы болмайды. Бірақ біз JavaScript-ті ешкім өшірмеген деп есептейміз :). Қарапайым сілтемелерді қолдануға болатыны анық, бірақ мен түймелерді ұнатамын. Сіз өзіңізге ұнайтын нәрсені жасайсыз. Менің мысалдарымда divs көп болатынына қарамаңыз . Содан кейін біз оларды стильдермен толтырамыз және бәрі әдемірек көрінеді :).

Нәтижені көрсету үшін jsp файлдарын жасаңыз

Сол веб- каталогта біз jsp файлдарымызды қоятын қалтаны жасаймыз . Мен оны көріністер деп атадым, тағы да импровизациялауға болады. Бұл қалтада біз екі jsp файлын жасаймыз:
  • add.jsp — пайдаланушыларды қосу беті;
  • list.jsp - пайдаланушылар тізімін көрсетуге арналған бет.
Оларға сәйкес бет тақырыптарын берейік. «Жаңа пайдаланушы қосу» және «Пайдаланушылар тізімі» сияқты нәрсе және біз оны әзірге осылай қалдырамыз.

Екі сервлет жасайық

Сервлеттер Tomcat оларға жіберетін сұрауларды қабылдайды және өңдейді. src/main/java қалтасында біз өзіміздің дереккөздерімізді қамтитын қолданбалар бумасын жасаймыз. Онда бізде әртүрлі пакеттер болады. Сондықтан, бұл пакеттер бір-бірінің ішінде жасалмауы үшін қолданбалар бумасында кейбір сыныпты жасайық (содан кейін оны жойыңыз). Енді қолданбалар бумасында үш түрлі буманы жасайық :
  • нысандар – біздің нысандар осында болады (пайдаланушы нысандарын сипаттайтын сыныптың өзі);
  • модель - біздің модель осында болады (бұл туралы сәл кейінірек);
  • сервлеттер - бұл жерде біздің сервлеттер болады.
Осыдан кейін сіз бұл сыныпты қолданбалар бумасынан қауіпсіз алып тастай аласыз (егер сіз оны жасаған болсаңыз, әрине). Сервлеттер бумасында біз екі класс жасаймыз:
  • AddServlet - /add арқылы алынған сұрауларды өңдейді ;
  • ListServlet - /list арқылы алынған сұрауларды өңдейді .

Maven-де тәуелділіктерді қосу

Tomcat 9.* нұсқасы Servlet нұсқасының 4.0 және JavaServer Pages нұсқасының 2.3 техникалық сипаттамаларын жүзеге асырады. Бұл Tomcat 9 ресми құжаттамасында екінші жолдың бірінші абзацында жазылған. Бұл дегеніміз, егер сіз мен сияқты Tomcat бағдарламасының осы нұсқасын пайдаланып жатсаңыз, біз жазып, іске қосу үшін жіберген code дәл көрсетілген нұсқаларды пайдаланады. Бірақ біз жобамызда осы спецификациялардың болуын қалаймыз, сондықтан оларды қолданатын codeымыз кем дегенде сәтті компиляцияланады. Бұл үшін біз оларды жобамызға жүктеуіміз керек. Бұл жерде Мавен көмекке келеді.

Жалпы ереже мынада: Maven көмегімен жобаңызға бірдеңе қосу қажет болса:

  • Maven репозиторийінің веб-сайтына өтіңіз;
  • қажетті кітапхананы және қажетті нұсқаны сол жерден іздеңіз;
  • pom.xml ішіне енгізу қажет тәуелділік codeын аласыз;
  • салыңыз! :)
Ендеше бастайық. Алдымен, pom файлын дайындаймыз . /нұсқасынан кейін , бірақ /project алдында бір жерде келесіні енгізіңіз:
<dependencies>

</dependencies>
Осылайша, біз осы тегтердің ішінде бізге қажетті тәуелділіктерді тізімдейтінімізді көрсеттік. Енді mvnrepository.com сайтына өтіңіз , жоғарғы жағында іздеу өрісі болады. Біріншіден, іздеуге сервлетті енгізіңіз. Жеті мыңнан астам қолдану мүмкіндігі бар бірінші нәтиже бізге сәйкес келеді. Бізге 4.0 нұсқасы қажет екенін есте ұстаймыз (Tomcat 9 үшін; басқа нұсқалар үшін ескі енгізулер қолайлы болуы мүмкін). Бұл өте жаңа нұсқа, сондықтан пайдалану көп емес, бірақ бізге қажет нұсқа. Әртүрлі пакет менеджерлері үшін осы тәуелділіктің codeын алуға болатын бет ашылады және оны жай ғана жүктеп алуға болады. Бірақ біз оны Maven арқылы қосқымыз келгендіктен, біз Maven қойындысындағы codeты таңдаймыз. Біз тәуелділіктер бөліміндегі pom файлымызға көшіреміз және қоямыз. IDEA бағдарламасының төменгі оң жақ бұрышында автоимпортты қосуды қалайтынымызды сұрайтын хабарландыру пайда болса, біз келісеміз. Егер сіз байқаусызда бас тартсаңыз, «Параметрлер» бөліміне өтіп, автоимпортты қолмен қосыңыз: Параметрлер (Ctrl + Alt + S) -> Құру, орындау, орналастыру -> Maven -> Импорттау Бұл үшін pom файлы мен IDEA конфигурация файлдары сақталады. синхрондалған жоба. Енді сол принципті қолдана отырып, біз JavaServer Pages 2.3 нұсқасын табамыз және қосамыз (іздеуде jsp енгізіңіз). Біз Maven-ді қабылдағандықтан, біздің дереккөздер Java 8 синтаксисіне сәйкес келетінін және оларды бірдей нұсқаның byte codeына құрастыру керек екенін бірден айтайық. Барлық осы манипуляциялардан кейін біздің pom.xml келесідей болады:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>ru.javarush.info.fatfaggy</groupId>
    <artifactId>my-super-project</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>1.8</maven.compile.source>
        <maven.compiler.target>1.8</maven.compile.target>
    </properties>

    <dependencies>
        <!-- Servlet API 4.0 for tomcat 9 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- JavaServer Pages API 2.3 for tomcat 9 -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

</project>

Сервлеттерімізді нақты сервлеттерге айналдыру

Осы кезде біз жасаған сервлеттердің жұбы шын мәнінде қарапайым сыныптар. Олардың ешқандай функционалдығы жоқ. Бірақ қазір біз жобамызға Servlet API қостық, егер солай болса, біз сол жерден сыныптарды пайдалана аламыз. Сервлеттерімізді «нақты» сервлеттер ету үшін оларды HttpServlet сыныбынан мұраға алуымыз керек .

Карталау немесе бөлу

Енді /add сұраулары біздің AddServlet сервлетімен өңделуі үшін , сондықтан /list сұраулары ListServlet сервлеті арқылы өңделуі үшін Tomcat-ке қандай да бір түрде айтқан дұрыс болар еді . Бұл процесс карталау деп аталады . Бұл мына принципке сәйкес web.xml файлында орындалады :
  • алдымен біз сервлетті сипаттаймыз (біраз атау береміз және класстың өзіне жолды көрсетеміз);
  • содан кейін біз бұл сервлетті белгілі бір мекенжайға байланыстырамыз (біз жаңа ғана берген сервлеттің атын көрсетеміз және осы сервлетке сұраулар жіберілетін мекенжайды көрсетеміз).
Сервлетті сипаттайық:
<servlet>
    <servlet-name>add</servlet-name>
    <servlet-class>app.servlets.AddServlet</servlet-class>
</servlet>
Енді біз оны мекенжайға байланыстырамыз:
<servlet-mapping>
    <servlet-name>add</servlet-name>
    <url-pattern>/add</url-pattern>
</servlet-mapping>
Көріп отырғаныңыздай, сервлет атауы екі жағдайда да бірдей. Осының арқасында Tomcat егер сұрау /add мекенжайына келсе, оны app.servlets.AddServlet сервлетіне жіберу керек екенін біледі . Екінші сервлетпен де солай істейміз. Нәтижесінде біздің web.xml шамамен келесі мазмұнға ие:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <!-- add servlet -->
    <servlet>
        <servlet-name>add</servlet-name>
        <servlet-class>app.servlets.AddServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>add</servlet-name>
        <url-pattern>/add</url-pattern>
    </servlet-mapping>

    <!-- list servlet -->
    <servlet>
        <servlet-name>list</servlet-name>
        <servlet-class>app.servlets.ListServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>list</servlet-name>
        <url-pattern>/list</url-pattern>
    </servlet-mapping>
</web-app>
Айтпақшы, біз мұнда негізгі бетке белгілеу жасамадық ( / бойынша ). Шындығында, бұл жағдайда бізге қажет емес. Біздің басты бетіміз екі түймені көрсететін қарапайым html файлы . Динамикалық мазмұн жоқ, сондықтан оған / мекенжайынан сұраулар жіберілетін және кейбір jsp файлына орындаудан басқа ешнәрсе жасамайтын (ол да болуы керек) бөлек сервлет жасаудың мағынасы жоқ. жасалды), ол сурет салады Егер бізде екі түйме болса болды. Бізге бұл қажет емес; біз статикалық ресурсқа ризамыз. Tomcat сұрауды алған кезде, мұндай мекенжайда сұрауды өңдей алатын бірде-бір сервлет жоқ екенін тексереді, содан кейін ол осы мекенжайда іс жүзінде дайын html файлы бар екенін көреді , оны сәтті жібереді. . Біз қолданбамызды қайтадан іске қоса аламыз (serverді қайта іске қосыңыз немесе қалауыңыз бойынша қайта орналастырыңыз) және басты беттің көрсетілгеніне, ештеңе бұзылмағанына, түймелерді басқан кезде ауысулар орын алғанына көз жеткізіңіз, бірақ қазір қате де бар. жазылған. Айтпақшы, егер бұрын бізде 404 қатесі болса, енді бізде 405. Бұл салыстыру жұмыс істеді, сервлеттер табылды, бірақ оларда сұрауды өңдеудің қолайлы әдістері болмады. Егер осы кезеңде бәрі дұрыс орындалғанына қарамастан, сіз әлі де 404 қатесін алсаңыз, идеядағы орналастыру конфигурациясын түзетуіңіз керек болуы мүмкін. Ол үшін конфигурацияларды өңдеу (бастау түймешігінің жоғарғы жағында) тармағына өту керек, терезенің оң жағындағы Орналастыру қойындысына өтіп, Қолданба контекстінде оның жай ғана көрсетілгеніне көз жеткізіңіз /

Қысқаша лирикалық шегініс: «қапшық астында» не болып жатыр?

Біздің қосымшамыз Tomcat-те қалай жұмыс істейтіні туралы ойлаған боларсыз? Онда не болып жатыр? Негізгі() әдісі қайда ? Браузерге localhost:8080 деп теріп , осы мекенжайға кірген бойда браузер http протоколы арқылы осы мекенжайға сұрау жібереді . Сұраныстар әртүрлі «түрлерде» болуы мүмкін екенін білесіздер деп үміттенемін, олардың ең танымалы GET және POST . Әрбір өтініштің жауабы болуы керек. GET сұрауы жауап ретінде оған дайын html codeы беріледі деп күтеді , ол браузерге қайтарылады және браузер бұл codeты әр түрлі әріптермен, түймелермен және пішіндермен әдемі ауыстырады. POST сұрауы біршама қызықтырақ, өйткені ол өзімен бірге кейбір ақпаратты да қамтиды. Мысалы, пайдаланушыны тіркеу немесе авторизация пішінінде деректеріңізді енгіздіңіз және «жіберу» түймесін басыңыз. Осы сәтте serverге POST сұрауы жіберілді, оның ішінде сіздің жеке ақпаратыңыз бар. Сервер бұл ақпаратты қабылдады, оны өңдеді және қандай да бір жауап қайтарды (мысалы, профиліңіз бар html беті ). Олардың арасындағы түбегейлі айырмашылық мынада: GET сұраулары тек serverден деректерді алуға арналған, ал POST сұраулары өздерімен бірге кейбір ақпаратты алып жүреді және serverдегі деректер өзгеруі мүмкін (мысалы, фотосуретті serverге жүктегенде, ол POST сұрауында ұшады және server оны дерекқорға қосады, яғни кейбір өзгерістер орын алады.Енді Tomcat-қа оралайық.Ол клиенттен кейбір сұрауларды алғанда, ол addressке қарайды.Өз деректерін іздейді. мұндай мекенжайға (немесе бірден қайтаруға болатын дайын ресурс) сұраныстарды өңдейтін сәйкес сервлет бар-жоғын қараңыз.Егер ол қайтаратын ештеңе таппаса, ол html бетімен емес, жауап береді. 404 жауабымен.Егер ол осы мекенжайда «отыратын» сәйкес сервлетті тапса, ол қандай сұрау түрін алғанын (GET, POST немесе басқа) қарайды, содан кейін сервлеттен оның әдісі бар-жоғын сұрайды. Бұл сұрау түрін өңдей алады.Егер сервлет бұл түрді өңдей алмайтынын айтса, Tomcat клиентке 405 codeы арқылы жауап береді. Бұл бізбен болған оқиға. Бірақ егер қолайлы сервлет табылса және оның қолайлы әдісі болса, Tomcat осы сервлеттің нысанын жасайды, оны жаңа ағында ( жіп ) іске қосады, бұл сервлетке бөлек ағында жұмыс істеуге мүмкіндік береді және Tomcat одан әрі жұмысын жалғастырады. өз бетінше, сұрауларды қабылдау және жіберу. Сонымен қатар, Tomcat тағы екі нысанды жасайды: біреуі HttpServletRequest типті (мен оны болашақта қысқаша сұрау деп атаймын) және екіншісі HttpServletResponse түріндегі(Мен оны жауап деп атаймын). Бірінші нысанда ол клиенттен сұрауда алған барлық деректерді орналастырады, сондықтан барлық деректерді осы нысаннан шығаруға болады. Осының бәрінен кейін ол осы екі нысанды бөлек ағында жұмыс істейтін сервлеттің сәйкес әдісіне береді. Сервлет жұмысын аяқтағаннан кейін және клиентке жіберуге дайын жауап болған кезде, ол Tomcat-қа жалаушаны көтеріп, «Мен біттім, бәрі дайын» ​​деп айтады. Tomcat жауапты қабылдайды және оны клиентке жібереді. Бұл Tomcat-қа сұрауларды қабылдауға және жауаптарды үзіліссіз жіберуге мүмкіндік береді, ал барлық жұмысты бөлек ағындарда жұмыс істейтін сервлеттер жасайды. Сәйкесінше, сервлет codeын жазғанда орындалатын жұмысты анықтаймыз. Иә, сіз main() әдісін Tomcat-тың өзінде (иә, ол Java тілінде жазылған) және Tomcat-ты «іске қосқанда» main().

Біз сервлеттермен GET әдістерін ұстаймыз және қарапайым жауаптарды жібереміз

Қазіргі уақытта біздің сервлеттерде қолайлы әдістер (GET) жоқ, сондықтан Tomcat бізге 405 қатесін қайтарады. Оларды жасайық! Сервлеттерімізді иеленетін HttpServlet сыныбы әртүрлі әдістерді анықтайды . Әдістердің кейбір codeын орнату үшін біз оларды жай ғана қайта анықтаймыз. Бұл жағдайда екі сервлеттегі doGet() әдісін қайта анықтауымыз керек .
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

}
Көріп отырғаныңыздай, бұл әдіс екі нысанды қабылдайды: req (сұрау) және жауап (жауап). Бұл Tomcat осы сервлеттегі сәйкес әдісті шақырған кезде біз үшін жасайтын және толтыратын нысандар. Алдымен, ең қарапайым жауаптарды жасайық. Ол үшін resp нысанын алып , одан жауаптарды құрастыру үшін пайдалануға болатын PrintWriter нысанын алыңыз. Оны пайдалану арқылы біз қарапайым жолды басып шығарамыз.
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    PrintWriter writer = resp.getWriter();
    writer.println("Method GET from AddServlet");
}
Біз ListServlet сервлетінде ұқсас нәрсені жасаймыз , содан кейін serverімізді қайта іске қосамыз. Көріп отырғаныңыздай, бәрі жұмыс істейді! Түймелерді басқан кезде біз PrintWriter көмегімен «жазған» мәтіні бар беттер ашылады . Жауаптары бар беттерді жасау үшін дайындаған біздің jsp ешбір жағдайда қолданылмайды. Өйткені, өлім жазасы оларға жетпейді. Серверлеттің өзі енді жауапты жасайды және Tomcat-қа клиентке дайын жауап бар екенін білдіретін жұмысын аяқтайды. Tomcat бұл жауапты жай ғана қабылдайды және оны клиентке жібереді. Біз басқаруды сервлеттерден jsp-ге тасымалдаймыз. Әдістеріміздің codeын осылай өзгертейік:
  • сұрау an objectісінен сұрауды басқару an objectісін аламыз, онда біз басқаруды тасымалдағымыз келетін беттің jsp мекенжайын береміз;
  • алынған нысанды пайдалана отырып, біз басқаруды көрсетілген jsp бетіне тасымалдаймыз және оған Tomcat-тен алған сұрау мен жауап нысандарын тіркеуді ұмытпаңыз.
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    RequestDispatcher requestDispatcher = req.getRequestDispatcher("views/add.jsp");
    requestDispatcher.forward(req, resp);
}
Jsp беттерінің негізгі бөлігінде (дене тегінің ішінде) біз қай беттің көрсетіліп жатқанын анық көру үшін бірдеңе жаза аламыз. Осыдан кейін біз serverді қайта іске қосып, тексереміз. Негізгі беттегі түймелер басылады, беттер ашылады, яғни сұраулар сервлеттерге жіберіледі, содан кейін басқару қазірдің өзінде көрсетілген jsp беттеріне беріледі. Бар болғаны. Мақаланың келесі бөлімінде біз қолданбамыздың функционалдығымен айналысамыз.

Тағы не оқу керек:

IntelliJ Idea Enterprise бағдарламасында қарапайым веб-жоба жасау. Біртіндеп, суреттермен


Менің чатым
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION