JavaRush /Блоги Java /Random-TG /Барномаи веб дар Java
Viacheslav
Сатҳи

Барномаи веб дар Java

Дар гурӯҳ нашр шудааст
Барномаи веб дар Java - 1

Муқаддима

Як замоне, Java мавқеъи худро бо сабаби он, ки барномаҳои вебро ҳамчун афзалият интихоб кард, мустаҳкам кард. Аз рӯзҳои аввали худ Java барои ёфтани роҳи худ мубориза мебурд. Аввалан, ман апплетҳоро пешниҳод кардам. Ин барои таҳиягарон барои эҷоди мундариҷаи динамикӣ дар саҳифаҳои HTML статикӣ имкониятҳои зиёд фароҳам овард. Бо вуҷуди ин, апплетҳо бо сабабҳои зиёд ба интизориҳо мувофиқат намекарданд: амният, хароҷот ва ғайра. Сипас таҳиягарони забони Java алтернативаи - Servlet API -ро пешниҳод карданд . Ва ин карори дуруст баромад. Сервлет API мушаххасотест, ки дар он ҳама гуна веб-барномаи Java сохта шудааст, хоҳ он замимаи веб асосёфта ё хидмати вебе, ки маълумотро мувофиқи дархост бармегардонад. Аз ин рӯ, роҳи фаҳмидани он ки чӣ тавр кор кардани барномаҳои веби Java аз фаҳмидани API Servlet оғоз мешавад.
Барномаи веб дар Java - 2

API servlet

Ҳамин тавр, API Servlet он чизест, ки таҳиягарони забон ба таҳиягарони Java пешниҳод кардаанд. Сервлет API мушаххасотест, ки бояд ба саволҳои асосии мо ҷавоб диҳад. Шумо онро дар ин ҷо пайдо карда метавонед: " JSR-000340 JavaTM Servlet 3.1 Варақаи ниҳоӣ барои арзёбӣ ". Дар боби " 1.1 Сервлет чист? " гуфта мешавад, ки сервлет як ҷузъи вебест, ки ба технологияи Java асос ёфтааст, ки мундариҷаи динамикӣ (яъне мундариҷа) эҷод мекунад. "Дар асоси Java" маънои онро дорад, ки сервлет синфи Java аст, ки ба byte code тартиб дода шудааст . Сервлетҳо аз ҷониби контейнери сервлет идора карда мешаванд, ки баъзан онро муҳаррики Сервлет меноманд. Контейнери сервлет васеъшавии serverи веб мебошад , ки вазифаи сервлетро таъмин мекунад. Дар навбати худ, сервлетҳо ҳамкориро бо муштарӣ дар парадигмаи дархост/ҷавоб, ки аз ҷониби контейнери сервлет амалӣ карда мешавад, таъмин мекунанд. Дар боби " 1.2 Контейнери сервлет чист? " гуфта мешавад, ки контейнери сервлет як қисми serverи веб ё serverи барномаест, ки хидматҳои шабакавиро пешкаш мекунад, ки тавассути он дархостҳо ва посухҳо фиристода мешаванд, дархостҳо ва посухҳо дар асоси MIME тавлид ва коркард мешаванд. . Илова бар ин, контейнерҳои сервлет давраи ҳаёти сервлетҳоро идора мекунанд (яъне тасмим мегиранд, ки кай онҳоро эҷод кардан, нест кардан ва ғ.). Ҳама контейнерҳои сервлет бояд протоколи HTTP-ро барои қабули дархостҳо ва ирсоли посухҳо дастгирӣ кунанд. Дар ин ҷо ман мехоҳам илова кунам, ки MIME стандарт, мушаххасотест, ки мегӯяд, ки чӣ гуна иттилоот бояд рамзгузорӣ карда шавад ва паёмҳо формат карда шаванд, то онҳо тавассути Интернет фиристода шаванд.
Барномаи веб дар Java - 3

Веб-server

Веб-server serverест, ки дархостҳои HTTP-ро аз муштариён қабул мекунад ва ба онҳо посухҳои HTTP медиҳад (одатан дар якҷоягӣ бо саҳифаи HTML, тасвир, файл ё дигар маълумот). Захираҳои дархостшуда тавассути URL-ҳо муайян карда мешаванд. Яке аз маъмултарин serverҳои веб бо дастгирии Servlet API Apache Tomcat мебошад . Аксарияти веб-serverҳо мошинҳои мураккабе мебошанд, ки аз ҷузъҳои гуногун иборатанд, ки ҳар яки онҳо вазифаҳои мушаххасро иҷро мекунанд. Барои намуна:
Барномаи веб дар Java - 4

Пайвасткунакҳо

— Дар вуруд мо Пайвасткунакҳо дорем (яъне пайвасткунакҳо), ки дархостҳои воридотии муштариёнро қабул мекунанд. Пайвасткунаки HTTP дар Tomcat бо истифода аз ҷузъи "Coyote" амалӣ карда мешавад. Пайвасткунакҳо аз муштарӣ маълумот мегиранд ва онро ба Engine Tomcat интиқол медиҳанд. Container Servlet - Tomcat Engine, дар навбати худ, дархости аз муштарӣ гирифташударо бо истифода аз ҷузъи "Catalina", ки контейнери сервлет аст, коркард мекунад. Барои тафсилоти бештар ба ҳуҷҷатҳои Tomcat нигаред: " Шарҳи меъморӣ ". Дигар serverҳои веб мавҷуданд, ки мушаххасоти Servlet API-ро дастгирӣ мекунанд. Масалан, " Jetty " ё " Undertow ". Меъмории онҳо ба ҳам монанд аст, бинобар ин, принсипи кор бо як контейнери сервлетро фаҳмида, шумо метавонед ба кор бо дигараш гузаред.
Барномаи веб дар Java - 5

Барномаи веб

Ҳамин тавр, барои он ки мо як барномаи вебро иҷро кунем, ба мо serverи веб лозим аст, ки API-и Servlet-ро дастгирӣ мекунад (яъне он дорои ҷузъи васеъшавӣ мебошад, ки дастгирии Servlet API-ро барои serverи веб амалӣ мекунад). Хуб. Ба ҳар ҳол як барномаи веб чист? Тибқи боби " 10 Барномаҳои веб "-и мушаххасоти API Servlet, барномаи веб маҷмӯи сервлетҳо, саҳифаҳои HTML, синфҳо ва дигар захираҳо мебошад, ки барномаи ниҳоиро дар serverи веб ташкил медиҳанд. Тибқи боби " 10.6 Архиви Архиви Веб ", барномаи вебро дар Web ARchive бастабандӣ кардан мумкин аст (архив бо тамдиди WAR). Чунон ки дар сахифаи « Глоссарий-219 » омадааст :
Барномаи веб дар Java - 6
Яъне, Ҷанг ба ҷои JAR сохта шудааст, то нишон диҳад, ки ин як барномаи веб аст. Далели муҳими навбатӣ: мо бояд дар бойгонии WAR-и худ сохтори муайяни феҳрист дошта бошем. Дар мушаххасоти API Servlet дар боби " 10.5 Сохтори директория ". Дар ин боб гуфта мешавад, ки феҳристи махсус бо номи "WEB-INF" вуҷуд дорад. Ин директория махсус аст, ки он ба муштарӣ намоён нест ва мустақиман ба он нишон дода намешавад, аммо он ба codeи сервлет дастрас аст. Он инчунин мегӯяд, ки директорияи WEB-INF чиро дар бар гирифта метавонад:
Барномаи веб дар Java - 7
Аз ин тамоми рӯйхат, мо ҳоло ҷузъро дар бораи баъзе файли web.xml бо номи deployment descriptor намедонем ва намефаҳмем . Ин чист? Боби " 14. Тавсифи густариш " ба тавсифи густариш бахшида шудааст. Хулоса, дескриптори ҷойгиркунӣ як файли xml мебошад, ки чӣ гуна ҷойгиркунии (яъне иҷро кардани) замимаи веби моро дар serverи веб тавсиф мекунад. Масалан, тавсифкунандаи густариш нишон медиҳад, ки кадом URL-ҳо барои дастрасӣ ба замимаи мо бояд истифода шаванд, танзимоти амниятие, ки ба замимаи мо марбутанд ва ғайра нишон дода шудаанд. Дар боби " 14.2 Қоидаҳои коркарди ҷобаҷогузорӣ " гуфта мешавад, ки web.xml схемаи пеш аз танзим ва ба кор андохтани замимаи мо тасдиқ карда мешавад (яъне тафтиш карда мешавад, ки мундариҷаи web.xml мувофиқи схема дуруст навишта шудааст) . Ва дар боби " 14.3 Deployment Descriptor " нишон дода шудааст, ки диаграмма дар ин ҷост: http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd Агар мо ба мундариҷаи файл назар кунем, мо мебинем:
Барномаи веб дар Java - 8
Схема барои файлҳои XML чист? Схемаҳо нишон медиҳанд, ки чӣ тавр дуруст пур кардани ҳуҷҷати XML: кадом унсурҳоро истифода бурдан мумкин аст, кадом намуди маълумотро дар элементҳо муайян кардан мумкин аст, унсурҳо бо кадом тартиб бояд раванд, кадом элементҳо лозиманд ва ғайра. Шумо метавонед схемаи ҳуҷҷати XML-ро бо интерфейси Java муқоиса кунед, зеро схема дар Java инчунин муайян мекунад, ки чӣ гуна синфҳоеро, ки интерфейси додаро қонеъ мекунанд (яъне интерфейси додаро амалӣ мекунанд) бояд навишта шаванд. Ҳамин тавр, мо бо донишҳои махфӣ мусаллаҳ ҳастем ва омодаем, ки аввалин веб-барномаи худро эҷод кунем!
Барномаи веб дар Java - 9

Эҷоди барномаи веб

Тасаввур кардан душвор аст, ки кор бо замимаи муосири Java бидуни истифодаи системаҳои сохтани лоиҳаҳои худкор. Баъзе аз системаҳои маъмултарин Maven ва Gradle мебошанд . Мо барои ин баррасии Gradle истифода хоҳем кард. Насб кардани Gradle дар вебсайти расмӣ тавсиф шудааст . Барои сохтани замимаи нав ба мо плагини дар Gradle сохташуда лозим аст: " Build Init Plugin ". Барои сохтани барномаи Java, шумо бояд фармони зеринро иҷро кунед: gradle init --type java-application
Барномаи веб дар Java - 10
Пас аз сохтани лоиҳа, мо бояд файли build.gradle -ро таҳрир кунем . Ин ба истилоҳ Скрипти Сохта аст (барои тафсилоти бештар ба ҳуҷҷатҳои Gradle нигаред: " Навиштани Скриптҳои Сохта "). Ин файл тарзи ҷамъ овардани лоиҳа ва дигар ҷанбаҳои кор бо лоиҳаи Java-ро тавсиф мекунад. Блоки плагинҳо тавсиф мекунад, ки кадом " плагинҳои Gradle " бояд барои лоиҳаи ҷорӣ Gradle истифода шаванд. Плагинҳо имкониятҳои лоиҳаи моро васеъ мекунанд. Масалан, плагини пешфарз " java " аст. Ин плагин ҳамеша истифода мешавад, агар мо ба дастгирии Java ниёз дорем. Аммо ба мо плагини " ариза " лозим нест , зеро... тавсифи он гуфта мешавад, ки он барои сохтани "барномаи иҷрошавандаи JVM" истифода мешавад, яъне. иҷро кардани барномаҳои JVM. Мо бояд як барномаи вебро дар шакли бойгонии WAR эҷод кунем. Ва агар мо дар ҳуҷҷатҳои Gradle калимаи WAR-ро ҷустуҷӯ кунем, мо " Васлкунаки War " -ро хоҳем ёфт. Аз ин рӯ, мо плагинҳои зеринро муайян мекунем:
plugins {
    id 'java'
    id 'war'
}
Инчунин дар " Танзимоти пешфарзии Васлкунаки War " гуфта мешавад, ки директория бо тамоми мундариҷаи замимаи веб бояд "src/main/webapp" бошад, бояд ҳамон директорияи WEB-INF бошад, ки дар он web.xml бояд бошад. ҷойгир шудааст. Биёед чунин файлро эҷод кунем. Мо онро каме дертар пур мекунем, зеро... мо барои ин хануз маълумоти кофй надорем. Дар блоки "вобастагӣ" мо вобастагии лоиҳаи худро нишон медиҳем, яъне он китобхонаҳо/чаҳорчӯбаҳое, ки бе онҳо барномаи мо кор карда наметавонад. Дар ин ҳолат, мо веб-барнома менависем, ки маънои онро дорад, ки мо бе API Servlet кор карда наметавонем:
dependencies {
    providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
    testCompile 'junit:junit:4.12'
}
provideCompile маънои онро дорад, ки вобастагӣ ба бойгонии мо WAR замимаи веб дохил карда намешавад: он танҳо барои тартиб додан лозим аст. Ва ҳангоми иҷро шудан, ин вобастагӣ аз ҷониби каси дигар (яъне веб-server) таъмин карда мешавад. Хуб, мо маълумотро дар скрипти сохта мегузорем, ки дар бораи он, ки кадом анбори вобастагӣ мехоҳем истифода барем - ҳама вобастагии мушаххас аз он зеркашӣ карда мешаванд:
repositories {
    jcenter()
}
Мо ҳама чизи дигарро аз файли скрипти сохтмон хориҷ мекунем. Акнун биёед синфи src\main\java\App.javaро таҳрир кунем. Биёед аз он сервлет созем. Мушаххасоти API Servlet дар боби " БОБИ 2. Интерфейси Сервлет " мегӯяд, ки Интерфейси Сервлет дорои татбиқи асосии HttpServlet мебошад , ки дар аксари ҳолатҳо бояд кофӣ бошад ва таҳиягарон танҳо бояд аз он мерос гиранд. Ва дар боби " 2.1.1 Усулҳои коркарди дархости мушаххаси HTTP " усулҳои асосии коркарди дархостҳои воридотӣ нишон дода шудаанд. Ҳамин тариқ, биёед синфи App.java-ро аз нав нависед:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.io.IOException;

public class App extends HttpServlet {
    public String getGreeting() {
        return "Hello world.";
    }

    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 		// https://www.oracle.com/technetwork/java/servlet-142430.html
 		PrintWriter out = resp.getWriter();
 		out.println(this.getGreeting());
 		out.close();
 	}
}
Ҳамин тавр, мо ба назар мерасад, ки ҳама чиз омода аст. Ҳама чизи боқимонда дуруст навиштани тавсифи густариш аст. Аз диаграмма матни зеринро ба web.xml нусхабардорӣ кунед:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="..."
      version="3.1">
      ...
</web-app>
Ва инчунин роҳ ба схемае, ки дар он нишон дода шудааст: http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd Акнун биёед ба мисоле назар кунем, ки чӣ тавр web.xml бояд дар мушаххасоти API Servlet монанд бошад. Ин мисол дар боби " 14.5.1 Намунаи асосӣ " оварда шудааст. Биёед он чизеро, ки дар диаграмма нишон дода шудааст, бо мисоли дар мушаххасот нишондодашуда якҷоя кунем. Мо инҳоро ба даст меорем:
<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">
      <display-name>A Simple Web Application</display-name>
      <servlet>
		<servlet-name>app</servlet-name>
		<servlet-class>App</servlet-class>
	  </servlet>
	  <servlet-mapping>
		<servlet-name>app</servlet-name>
		<url-pattern>/app</url-pattern>
	  </servlet-mapping>
</web-app>
Тавре ки шумо мебинед, мо схема ва schemaLocation-ро истифода бурдем, ки қаблан муайян карда шуда буданд. Ва тавсифи худи унсурҳо аз мисоли боби 14.5.1 гирифта шудааст. Агар мо ҳама чизро дуруст иҷро карда бошем, мо вазифаи ҷанги градилейро бе хато иҷро хоҳем кард:
Барномаи веб дар Java - 11
Барномаи веб дар Java - 12

Оғози барномаи веб

Барномаи веб чӣ гуна оғоз меёбад? Биёед аввал бо варианти мураккабтар сару кор кунем. Мо қаблан гуфта будем, ки веб-serverи Apache Tomcat мавҷуд аст, ки API-и Servlet-ро дастгирӣ мекунад. Ин маънои онро дорад, ки мо метавонем бойгонии ҷангии ҷамъшудаи худро дар ин server ҷойгир кунем (онҳо "ҷойгир" низ мегӯянд). Дар саҳифаи " Download Tomcat ", аз бахши "Тақсимоти дуӣ" навъи интиқоли "Core" -ро дар формати zip зеркашӣ кунед. Ва бойгонии зеркашидашударо ба ягон директория кушоед, масалан дар C:\apache-tomcat-9.0.14. Пеш аз оғоз кардани server, биёед файлро барои таҳрир кушоем conf\tomcat-users.xmlва ба он сатри зеринро илова мекунем: <user username="tomcat" password="tomcat" roles="tomcat,manager-gui,admin-gui"/> Акнун дар сатри фармон ба директорияи bin гузаред ва -ро иҷро кунед catalina.bat start. Бо нобаёнӣ, консоли server дар http://localhost:8080/manager. Логин ва парол ҳамонҳое мебошанд, ки мо дар tomcat-users.xml зикр кардем. Tomcat дорои феҳристи "webapps", ки дорои барномаҳои веб мебошад. Агар мо хоҳем, ки худамонро ҷойгир кунем, мо бояд архиви ҷангии худро дар он ҷо нусхабардорӣ кунем. Вақте ки мо қаблан фармони ҷанги градро иҷро мекардем, \build\libs\дар феҳрист бойгонии ҷангӣ сохта шуд. Ин аст он чизе ки мо бояд нусхабардорӣ кунем. Пас аз нусхабардорӣ, саҳифаро нав кунед http://localhost:8080/managerва бубинед:
Барномаи веб дар Java - 13
Пас аз анҷом додани http://localhost:8080/javaweb/app, мо ба сервлети худ муроҷиат мекунем, зеро Мо қаблан дархости /appро ба сервлети App "харита" карда будем (яъне харита карда будем). Роҳи зудтари тафтиш кардани кор кардани барнома вуҷуд дорад. Ва системаи монтаж ба мо дар ин кор боз ёрй мерасонад. Дар скрипти сохтани лоиҳаи Gradle, мо метавонем плагини нави " Gretty " -ро ба бахши плагинҳо илова кунем: id "org.gretty" version "2.3.1" Ва ҳоло мо метавонем вазифаи gradle-ро иҷро кунем, то замимаи худро иҷро кунем:gradle appRun
Барномаи веб дар Java - 14
Барои тафсилот нигаред " Иловаи плагини gretty ва иҷро кардани барнома ".
Барномаи веб дар Java - 15

API Spring ва Servlet

Сервлетҳо асоси ҳама чиз мебошанд. Ва ҳатто чаҳорчӯбаи машҳури Springwork ҷуз як илова ба API Servlet чизе нест. Барои оғоз, чаҳорчӯбаи баҳорӣ вобастагии нав барои лоиҳаи мост. Аз ин рӯ, биёед онро ба скрипти сохтани блоки вобастагӣ илова кунем: compile 'org.springframework:spring-webmvc:5.1.3.RELEASE' Дар ҳуҷҷатгузории Spring Framework боби " 1.1. DispatcherServlet " мавҷуд аст. Дар он гуфта мешавад, ки чаҳорчӯбаи Springwork дар шакли "контролҳои пеш" сохта шудааст - ин аст, ки сервлети марказӣ бо номи " DispatcherServlet " мавҷуд аст. Ҳама дархостҳо ба ин сервлет меоянд ва он зангҳоро ба ҷузъҳои зарурӣ вогузор мекунад. Шумо мебинед, ҳатто дар ин ҷо сервлетҳо мавҷуданд. Шумо бояд шунавандаро ба тавсифи густариш илова кунед:
<listener>
	&ltlistener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Ин шунавандаи рӯйдодҳои контексти сервлет аст. Яъне, вақте ки Контексти Сервлет оғоз мешавад, контексти баҳор (WebApplicationContext) низ оғоз мешавад. Context Servlet чист? Он дар мушаххасоти API Servle дар боби " БОБИ 4. Context Servlet " тавсиф шудааст. Контексти сервлет ин "намоиши" сервлети замимаи веб мебошад, ки дар дохor он сервлетҳо кор мекунанд. Ҳар як барномаи веб контексти сервлети худро дорад. Минбаъд, барои фаъол кардани чаҳорчӯбаи Spring, шумо бояд context-param - параметри оғозёбиро барои контексти сервлет муайян кунед.
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/app-context.xml</param-value>
</context-param>
Ва таърифи DispatcherServlet конфигуратсияро анҷом медиҳад :
<servlet>
	<servlet-name>app</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
 		<param-value></param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
	<servlet-name>app</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>
Ва ҳоло ба мо лозим аст, ки файли дар contextConfigLocation нишондодашударо пур кунем. Чӣ тавр ин корро кардан дар ҳуҷҷатҳои чаҳорчӯбаи баҳорӣ дар боби "1.3.1. Эъломия" тавсиф шудааст:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:component-scan base-package="ru.javarush.javaweb"/>
    <mvc:annotation-driven/>
</beans>
Дар ин ҷо муҳим аст, ки на танҳо нишон диҳед, ки кадом бастаро скан кардан лозим аст, балки инчунин мо мехоҳем, ки ба эзоҳ асосёфта, яъне назорат кардани эзоҳҳо дар бораи чӣ гуна кор кардани Баҳор. Танҳо эҷоди бастаи ru.javarush.javaweb ва дар он ҷойгир кардани синфи контроллери Spring аст:
package ru.javarush.javaweb;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class SpringController {

    @GetMapping("/app")
    @ResponseBody
    public String getGreeting() {
        return "Hello world.";
    }
}
Ҳоло gradle appRun -ро иҷро карда, ба суроға меравем, http://127.0.0.1:8080/javaweb/appмо ҳамон Hello World-ро мегирем. Тавре ки шумо мебинед, Framework Spring бо API Servlet зич алоқаманд аст ва онро барои кор дар болои он истифода мебарад.
Барномаи веб дар Java - 16

Аннотацияҳо

Тавре ки мо дидем, шарҳҳо қулайанд. Ва мо танҳо касоне набудем, ки чунин фикр мекардем. Аз ин рӯ, дар мушаххасоти API Servlet, ки аз versionи 3.0 сар карда, боби " БОБИ 8 Эзоҳҳо ва пайвастшавӣ " пайдо шуд, ки муайян мекунад, ки контейнерҳои сервлет бояд қобorяти муайян кардани он чизеро, ки қаблан дар Дескриптори густариш тавассути эзоҳҳо муайян шуда буданд, дастгирӣ кунанд. Ҳамин тариқ, web.xml-ро аз лоиҳа комилан хориҷ кардан мумкин аст ва дар болои синфи сервлет шумо метавонед шарҳи @WebServlet- ро муайян кунед ва нишон диҳед, ки сервлет ба кадом роҳ харита карда шавад. Дар ин ҷо ҳама чиз равшан ба назар мерасад. Аммо чӣ мешавад, агар мо баҳорро ба лоиҳа пайваст кунем, ки танзимоти мураккабтарро талаб мекунад? Дар ин ҷо ҳама чиз каме мураккабтар аст. Аввалан, ҳуҷҷатҳои Spring мегӯяд, ки барои танзим кардани Spring бе web.xml, шумо бояд синфи шахсии худро истифода баред, ки WebApplicationInitializer-ро амалӣ мекунад. Барои тафсилоти бештар ба боби " 1.1. DispatcherServlet " нигаред. Маълум мешавад, ки ин синфи баҳор аст. Пас чӣ гуна API-и Servlet дар ин ҷо истифода мешавад? Дар асл, ServletContainerInitializer ба Servlet API 3.0 илова карда шуд . Бо истифода аз механизми махсус дар Java (бо номи SPI ), Spring оғозкунандаи контейнери сервлети худро бо номи SpringServletContainerInitializer. Дар навбати худ, он аллакай татбиқи WebApplicationInitializer-ро ҷустуҷӯ мекунад ва усулҳои заруриро даъват мекунад ва танзимоти заруриро иҷро мекунад. Барои тафсилоти бештар ба " Чӣ гуна контейнери сервлет татбиқи WebApplicationInitializer -ро пайдо мекунад " нигаред. Танзимоти дар боло зикршударо метавон чунин иҷро кард:
package ru.javarush.javaweb.config;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

public class AppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        // регистрируем конфигурацию созданую высше
        ctx.register(AppConfig.class);
        // добавляем в контекст слушателя с нашей конфигурацией
        servletContext.addListener(new ContextLoaderListener(ctx));

        ctx.setServletContext(servletContext);

        // настраиваем маппинг Dispatcher Servlet-а
        ServletRegistration.Dynamic servlet =
                servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
        servlet.addMapping("/");
        servlet.setLoadOnStartup(1);
    }
}
Ҳоло, бо истифода аз " конфигуратсияи Java дар асоси " мо нишон медиҳем, ки кадом бастаро скан кардан + шарҳҳоро фаъол кардан лозим аст:
package ru.javarush.javaweb.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "ru.javarush.javaweb.controllers")
public class AppConfig {
}
Ва худи SpringController ба кӯчонида шуд ru.javarush.javaweb.controllers, то ҳангоми сканкунӣ конфигуратсия худашро наёбад, балки танҳо контроллерҳоро ҷустуҷӯ кунад.
Барномаи веб дар Java - 17

Ҷамъбаст кардан

Умедворам, ки ин шарҳ дар бораи чӣ гуна кор кардани веб-барномаҳо дар Java равшанӣ андохтааст. Ин танҳо нӯги айсберг аст, аммо бидуни фаҳмидани асосҳо, фаҳмидан душвор аст, ки технологияҳо дар асоси ин таҳкурсӣ чӣ гуна кор мекунанд. Сервлет API қисми марказии ҳама гуна веб-барномаи Java мебошад ва мо дида баромадем, ки чаҳорчӯбаҳои дигар ба он чӣ гуна мувофиқат мекунанд. Барои идома додан, шумо метавонед маводи зеринро тамошо кунед: #Вячеслав
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION