JavaRush /Java Blog /Random-TK /“Salam World” -dan “Bahar Web MVC” -e çenli we hyzmatçyla...
Viacheslav
Dereje

“Salam World” -dan “Bahar Web MVC” -e çenli we hyzmatçylaryň munuň bilen näme baglanyşygy bar

Toparda çap edildi
“Salam World” -dan “Bahar Web MVC” -e we hyzmatçylaryň munuň bilen näme baglanyşygy bar - 1

Giriş

Bilşimiz ýaly, Java-yň üstünligi, tora birikmäge çalyşýan programma üpjünçiliginiň ewolýusiýasy netijesinde ýüze çykdy. Şol sebäpden, “ Salam Dünýä ” adaty konsol programmasyny alarys we konsol programmasyndan tor programmasy bolmak nämä gerekdigine düşüneris. Şonuň üçin ilki bilen Java taslamasyny döretmeli. Programmistler ýalta adamlar. Taryhdan öňki döwürde, käbiri mamontlary awlaýarka, beýlekiler Java kitaphanalarynyň we katalog gurluşlarynyň dürli görnüşlerinde bulaşmazlyga synanyşdylar. Programma dörediji programma döretmek prosesine gözegçilik edip biler ýaly, “Şeýle we 2-nji wersiýanyň kitaphanasyny isleýärin” diýip ýazyp biler ýaly, ýörite gurallar - ulgamlar gurupdyrlar. Iň meşhurlary Maven we Gradle . Bu makala üçin Gradle ulanarys. Ozal katalog gurluşyny özümiz döretmeli bolardyk, indi Gradle, Gradle Init Plugini ulanyp, bir buýrukda katalog gurluşy we esasy synpy bolan Java taslamasyny döretmäge mümkinçilik berýär: gradle init --type java-application Bu buýruk başlangyç (init) ýerine ýetirýär bize “Salam World” konsoly bilen Java programmasy (java-programma). Gutarandan soň, build.gradle katalogynda bir faýl peýda bolar . Bu biziň gurmak skriptimiz , ýagny munuň üçin haýsy hereketleriň edilmelidigini düşündirýän programma döretmek üçin belli bir skript. Geliň, ony açalyň we oňa setir goşalyň: jar.baseName = 'webproject' Gradle size taslama boýunça dürli hereketleri etmäge mümkinçilik berýär we bu hereketlere meseleler diýilýär . Buýrugy (ýumuşy) ýerine ýetirip, / build / libsgradle build katalogynda JAR faýly dörediler . Siziň çak edişiňiz ýaly, onuň ady indi webproject.jar bolar . Emma ýerine ýetirsek , ýalňyşlyk alarys : . Sebäbi java programmasy üçin belli bir manifesti birikdirmeli - bu programma bilen nädip işlemelidigini, ony nädip kabul etmelidigini düşündirýär. Soňra java programmasyny ýerine ýetirjek JVM haýsy synpyň programma we beýleki maglumatlara giriş nokadydygyny biler (mysal üçin, synp ýoly). Gurluş skriptiniň mazmunyna has içgin göz aýlasak, pluginleriň birikdirilendigini göreris. Mysal üçin: “Gradle Java Plugin” sahypasyna girsek , manifesti düzüp biljekdigimizi görüp bileris: java -jar ./build/libs/webproject.jarno main manifest attributeapply plugin: 'java'
jar {
    manifest {
        attributes 'Main-Class': 'App'
    }
}
Esasy synp, programmanyň giriş nokady, Gradle Init Plugin tarapyndan döredildi. Hatda esasyClassName parametrinde hem görkezilýär. Emma bu bize laýyk däldi, sebäbi ... bu sazlama başga bir plugin, Gradle Program Plugin-i aňladýar . Şeýlelikde, ekranda “Salam World” -ny görkezýän Java programmasy bar. Bu Java programmasy JAR-da (Java ARchive) gaplanýar. Bu ýönekeý, konsol esasly, döwrebap däl. Ony web programmasyna nädip öwürmeli?
От Hello World до Spring Web MVC и при чём тут сервлеты - 2

Servlet API

Java-yň tor bilen işlemegi üçin Servlet API atly spesifikasiýa gadymy döwürlerde ýüze çykypdyr . Hut şu spesifikasiýa müşderi-serweriň özara täsirini, müşderiden habar almagy (mysal üçin, brauzer) we jogap ibermegi (mysal üçin sahypanyň teksti bilen) beýan edýär. Elbetde, şondan bäri köp zat üýtgedi, ýöne esasy zat, Java programmasynyň web programmasy bolmagy üçin Servlet API ulanylýar. Esassyz çaklamazlyk üçin, geliň, şol spesifikasiýany alalyň: JSR-000340 JavaTM Servlet 3.1 . Ilki bilen, " 1-nji bap: syn " bilen gyzyklanýarys . Onda düşünmeli esasy düşünjelerimiz beýan edilýär. Birinjiden, servlet näme? " 1.1 Servlet näme? " Bölüminde Servlet konteýner tarapyndan dolandyrylýan we dinamiki mazmun döredýän Java komponentidir diýilýär . Beýleki Java komponentleri ýaly, servlet bytekodda düzülen we Java tehnologiýasy arkaly web serwerine ýüklenip bilýän Java synpydyr. Servletleriň, “Servlet Container” tarapyndan amala aşyrylýan haýyş / jogap paradigmasynyň çäginde web müşderisi (mysal üçin, brauzer) bilen aragatnaşyk saklamagy möhümdir. Görnüşi ýaly, Servlets haýsydyr bir Servlet konteýnerinde ýaşaýar. Bu näme? " 1.2 Servlet konteýner näme? " Bölüminde " Servlet Container " web serweriniň ýa-da haýyşlar iberilýän we jogaplar iberilýän ulgam hyzmatlaryny berýän web serweriniň bir bölegi diýilýär . Bu “Servlet Container” servletleriň ýaşaýyş siklini dolandyrýar. Servhli Servlet konteýnerleri azyndan HTTP protokolyny goldamaly, ýöne beýlekileri goldap biler. Mysal üçin, HTTPS. Şeýle hem, “Servlet Container” -iň hyzmat ediş ýerine ýetirilýän daşky gurşawa howpsuzlyk bilen baglanyşykly islendik çäklendirmeleri girizmegi möhümdir. Şeýle hem, “ 10.6 Web Programma Arhiw Faýly ” laýyklykda web programmasynyň WAR (Web ARchive) faýlynda gaplanmagy möhümdir . .Agny, indi başga bir zat üçin bankamyzy we programma plaginlerimizi aýyrmaly. Bu Gradle WAR pluginidir . Jar.baseName ýerine war.baseName görkeziň Sebäbi Indi banka pluginini ulanmaýandygymyz sebäpli, açyk sazlamalary hem aýyrdyk. JAR işe girizenimizde, Java Wirtual Machine (JVM) programmamyz bilen nädip işlemelidigimizi aç-açan aýtmalydy. Sebäbi JVM işleýärdi. Web programmasy, görnüşi ýaly, haýsydyr bir web serweri tarapyndan ýerine ýetirilýär. Görnüşi ýaly, oňa nädip web programmamyz bilen işlemelidigini aýtmalymy? Hawa, şeýle bolýar. Web programmalarynyň öz aýratyn manifesti bar. Oňa ýerleşdiriş beýany diýilýär . Tutuş bölüm oňa bagyşlanýar: “ 14. Gurnama beýany ”. Möhüm bölüm bar: " 10-njy bap:"Servlet API" nukdaýnazaryndan web programmasynyň nämedigi barada gürrüň edilýär. Mysal üçin, " 10.5 Katalog gurluşy " bölüminde ýerleşdiriş beýanynyň nirede bolmalydygy görkezilýär: /WEB-INF/web.xmlWEB-INF nirede goýmaly? Gradle WAR plugininde aýdylyşy ýaly, ol täze düzüliş goşýar : src/main/webappŞonuň üçin geliň, şeýle bukjany döredeliň, içerde WEB-INF bukjasyny dörederis we içerde web.xml faýly dörederis. Katalogyň bolmagy möhümdir. WEB-INF diýilýär, META-INF däl! Geliň, " 14.5.1 Esasy mysal " XML mysalyndan göçüreliň :
От Hello World до Spring Web MVC и при чём тут сервлеты - 3
Görşümiz ýaly, konfigurasiýa üçin XML resminamasy ulanylýar. Dogry (Dogry) hasaplamak üçin XML resminamasy käbir “shema” laýyk gelmelidir. Muny XML resminamasy üçin interfeýs görnüşi diýip pikir edip bilersiňiz. Shema XML resminamasynda haýsy elementleriň bolup biljekdigini, haýsy maglumat elementini, tertibi, zerurlygy we beýleki taraplary kesgitläp biljekdigini kesgitleýär. Resminamalardan göçürilen mysal 2.5 wersiýasyny görkezýär, ýöne 3.1 wersiýasyny ulanmak isleýäris. Elbetde, wersiýalar üýtgänsoň spesifikasiýa üýtgedi we täze aýratynlyklar goşuldy. Şonuň üçin 2.5 wersiýa (web-app_2_5.xsd) üçin ulanylýanlardan başga shema ulanmaly. 3.1 wersiýasy üçin haýsy shemany ulanmaly? Resminamalar bu meselede bize kömek eder, “ 14.3 Deployment Descripttor ”, ýagny specification is available at http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd shemanyň baglanyşygyny hemme ýerde görkezilen xsd bilen çalyşmalydyrys, ony version="2.5"3.1-e üýtgetmegi ýatdan çykarmaly däldiris, şeýle hem hemme ýerde at giňişligini üýtgetmelidiris ( xmlns we xsi-de: shemaLocation). Haýsy at giňişliginde işlejekdigimizi görkezýärler (has ýönekeý söz bilen aýdylanda, haýsy element atlaryny ulanyp bileris). Shema faýly açsaňyz, maksatNamespace-de görkezmeli şol bir at giňişligi bolar:
От Hello World до Spring Web MVC и при чём тут сервлеты - 4
.Adymyzda bolsa, “Jar” faýlynyň Manifestinde haýsy synpy ulanjakdygymyzy ýazdyk. Bu ýerde näme etmeli? Bu ýerde web müşderisinden haýyş alanymyzda haýsy servlet synpyny ulanjakdygymyzy kesgitlemeli. Düşündiriş " 14.4 Gurnama beýan edijiniň diagrammasy " bölüminde okalýar . Bu şeýle bolar:
От Hello World до Spring Web MVC и при чём тут сервлеты - 5
Bu ýerde hemme zat ýönekeý. Serwerlet yglan edilýär, soň bolsa belli bir şablona düzülýär. Bu ýagdaýda / programmada. Şablon ýerine ýetirilende, servlet usuly ýerine ýetiriler. Gözellik üçin, “App” synpy xml konfigurasiýasyny düzetmegi ýatdan çykarman, bukja geçirilmeli. Emma bu hemmesi däl. Programma servlet bolmaly. Serwlet bolmak nämäni aňladýar? Bu, HttpServlet- den miras almalydygymyzy aňladýar . Mysal üçin " 8.1.1 @WebServlet " bölüminde görmek bolýar . Oňa görä, “App” synpymyz şeýle bolar:
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

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

	public void doGet(HttpServletRequest request, HttpServletResponse response) {
		response.setContentType("text/html");
		try {
			response.getWriter().println(getGreeting());
		} catch (IOException e) {
			throw new IllegalStateException(e);
		}
	}
}
Emma taslamamyz entek taýýar däl. Sebäbi indi Servlet API 3.1 wersiýasyna bagly. Bu, gurluşyk skriptimizde Servlet API-e baglylygy görkezmelidigimizi aňladýar. JVM kodda ýazan zatlaryňyzyň dogrudygyny we ony nähili ulanmalydygyny bilmelidir. .Adymyzda bolsa, spesifikasiýa aslynda diňe nähili işlemelidigini görkezýän interfeýslerdir. Amallar web serwer tarapynda. Şonuň üçin “Servlet API” bolmasa Maven Central-de zerur kitaphanany tapyň: javax.servlet-api . Baglylyklar blokyna ýazgy goşuň . Maven ammarynda, görşüňiz ýaly, üpjün edilendigi aýdylýar. Baglylyk ulanmazdan ozal, gerimini görkezmeli. Gradle "üpjün edilen" atly çäk ýok, ýöne " diňe jemlemek " çäkleri bar. Şonuň üçin görkezeris: providedCompile 'javax.servlet:javax.servlet-api:3.1.0' Ug, hemme zat gowy ýaly? Gradle Build taslamamyzy WAR faýlyna öwürer. Ondan soň näme etmeli? Ilki bilen bize Web Serwer gerek. Google-da “ web serwer java sanawy ” ýazýarys we web serwerleriniň sanawyny görýäris. Geliň, bu sanawdan, mysal üçin TomCat saýlalyň . Apache Tomcat web sahypasyna giriň , iň soňky wersiýasyny (häzirki wersiýa 9) poçta arhiwi hökmünde göçürip alyň (Windows üçin bolsa). Käbir bukja salyň. Hurray, web serwerimiz bar. Bin bukjasyndaky web serwer katalogyndan , katalinany buýruk setirinden ýerine ýetirýäris we elýeterli opsiýalary görýäris. Geliň : catalina start. Her web serwerinde web serweriniň gözegçilik edýän katalogy bar. Şol ýerde web programma faýly peýda bolsa, web serweri ony gurup başlaýar. Bu gurnama ýerleşdiriş ýa-da ýerleşdiriş diýilýär . Hawa hawa, şonuň üçin " ýerleşdiriş beýany ". .Agny, programmany nädip dogry ýerleşdirmeli. Tomkatda bu katalog webbapplardyr . Geliň, şol ýerde gradle gurmak arkaly eden söweşimizi göçüreliň. Ondan soň, gündeligimizde şuňa meňzeş bir zady göreris: Has gowy düşünmek üçin tomcat katalogynda aşakdaky setirleri goşup Deployment of web application archive [tomcat\webapps\webproject.war] has finished in [время] ms faýly redaktirläris :\conf\tomcat-users.xml
От Hello World до Spring Web MVC и при чём тут сервлеты - 6
Indi serweri täzeden başlaýarys (katalina duralgasy, katalina başlangyjy) we adrese geçýäris. http://127.0.0.1:8080/manager Bu ýerde ähli programmalaryň ýollaryny göreris. Web taslamamyz, ähtimal, ýol / web taslamasy berildi. Bu ýol näme? " Web serwerleriniň içindäki 10.1 web programmalary " bölümindäki spesifikasiýa web programmasynyň programmanyň içindäki käbir ýollar bilen baglanyşyklydygyny (bu ýagdaýda / web taslamasy) görkezýär. Bu ýol arkaly ähli islegler şol bir ServletContext bilen baglanyşykly bolar. Bu ýol kontekstRoot hem diýilýär . " ServletContext bilen 10.2 gatnaşyk " laýyklykda , servlet konteýner web programmasyny we ServletContext-i bir-birine baglanyşdyrýar. .Agny, her web programmasynyň öz ServletContext bar. “ServletContext” näme ? Spesifikasiýada aýdylyşy ýaly, “ ServletContext” servletlere işleýän “ amaly görnüşi” bilen üpjün edýän obýektdir . Servlet konteksti Servlet API spesifikasiýasynyň 4-nji bölüminde has jikme-jik beýan edilýär. Geň zat, 3.1 wersiýasyndaky Servlet API indi web.xml-iň bolmagyny talap etmeýär. Mysal üçin, düşündirişleri ulanyp, bir servlet kesgitläp bilersiňiz:
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/app2")
public class App2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html");
        response.getWriter().println("app2");
    }
}
Şeýle hem mowzukda maslahat berilýär: " Java EE Söhbetdeşlik - JEE Servlet API (Soraglar we jogaplar) ". Şeýlelikde, bizde “Servlet” bar - web müşderisine nähili jogap bermelidigi jogapkärdir. Ulanyjydan haýyşlary kabul edýän, servlet ýoly bilen giren ýol bilen gabat gelýän we bir gabat gelse, Servlet-i ýerine ýetirýän “ServletContainer” bar. Gowy. Dünýäniň bu suratynda Bahar haýsy ýeri eýeleýär ?

Bahar web MVC

Gowy, bizde web programmasy bar. Indi Bahary birleşdirmeli. Muny nädip edip bileris? Ilki bilen, bahary öz taslamaňyza nädip dogry birikdirmelidigini anyklamaly. Görnüşi ýaly, muny öň “ Bahar” platformasynyň taslamasynyň resminamalaryna laýyklykda edip bolýardy , ýöne indi “ Platforma 2019-njy ýylyň 9-njy aprelinde goldanýan ömrüniň ahyryna ýeter ”, ýagny maslahat berilmeýär ulanyň, sebäbi ýakyn wagtda goldanylmaz. Outeke-täk çykalga: " Platformany ulanyjylara Spring Boot-a baglylyk dolandyryşyny ulanyp başlamak maslahat berilýär ". Şonuň üçin, “Bahar boot” resminamalaryna geçeliň . “Bahar Boot” -yň özi ulanmaýandygymyzy, diňe “Bahar Boot” -dan garaşlylygy dolandyrýandygymyzy düşündiriň. Springagny, “Bahar boot” taslamasy kitaphanalaryň haýsy wersiýalaryny ulanmalydygy barada maglumat berip biler (Bahar MVC-i goşmak bilen). Şol ýerde 3.2 taparys . “Spring Boot” -yň garaşlylyk dolandyryşyny izolýasiýa ulanmak . Resminamalara laýyklykda, gurluşyk skriptine aşakdakylary goşuň:
plugins {
    id 'org.springframework.boot' version '2.0.4.RELEASE' apply false
}
apply plugin: 'io.spring.dependency-management'
We
dependencyManagement {
    imports {
        mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
    }
}
Görşüňiz ýaly, görkezdik apply false. “Spring Boot” -yň özi ulanmaýarys, ýöne ol ýerden garaşlylygy dolandyrýarys. Bu garaşlylygy dolandyrmak BOM - " Materiallar billi " hem diýilýär . Indi “Bahar Web MVC” taslamasynyň özüni birikdirmäge taýyn. “Spring Web MVC” “Bahar çarçuwasy” taslamasynyň bir bölegidir we biz “ Web Servlet ” bölümi bilen gyzyklanýarys . Gurluş skriptine garaşlylygy goşalyň : compile 'org.springframework:spring-webmvc'. Görşümiz ýaly, çäkleri düzýäris, sebäbi web serweri bize Bahar bilen üpjün etmeýär. Taslamamyz, Bahar kitaphanasyny öz içine almaga mejbur bolýar. Ondan soň, " 1.2. DispatcherServlet " bölümini okamak möhümdir , bu ýerde Bahar MVC-iň " Öň kontrolleýjiniň " nagşynyň töwereginde gurlandygy aýdylýar , bu ýerde beýleki komponentlere konfigurasiýa we wekilçilik berýän merkezi hyzmat ediş görnüşi bar. . Dispetçer dispetçer hökmünde terjime edilip bilner. Şeýlelikde, ilki bilen web.xml-de yglan edýäris:
От Hello World до Spring Web MVC и при чём тут сервлеты - 7
Görşümiz ýaly, bu aslynda Servlet API spesifikasiýasynda kesgitlenen yzygiderli diňleýji. Has takygy, bu “ServletContextListener”, ýagny web programmamyz üçin “Servlet” kontekstini başlamaga itergi berýär. Ondan soň, sazlamalar bilen ýörite xml konfigurasiýasynyň nirededigini Bahara aýdyp berjek sazlamany görkezmeli:
От Hello World до Spring Web MVC и при чём тут сервлеты - 8
Görşüňiz ýaly, bu diňe “Servlet” kontekst derejesinde saklanýan, ýöne “Programma” kontekstini başlanda Bahar tarapyndan ulanyljak adaty sazlama. Indi ähli hyzmat ediş hyzmatlarynyň ýerine beýleki islegleri paýlaýan ýekeje dispetçeri yglan etmeli.
От Hello World до Spring Web MVC и при чём тут сервлеты - 9
Bu ýerde jady ýok. Seretsek, bu HttpServlet, edil Baharyň çarçuwasyna öwürýän köp zady edýär. Galan zat, belli bir URL şablonyny servlet bilen baglanyşdyrmak (karta):
От Hello World до Spring Web MVC и при чём тут сервлеты - 10
Hemme zat öňküsi ýaly. Indi web serwerimiziň görkezmeli bir zadyny döredeliň. Mysal üçin, WEB-INF-de sahypalaryň bukjasyny döredeliň we salam.jsp faýly bolar. Mazmuny iň ýönekeý bolup biler. Mysal üçin, html bellikleriniň içinde " Salam Dünýä " ýazgyly h1 belligi bar . applicationContext.xmlÖň bellän faýlymyzy döretmegi ýatdan çykarmaň . Bahar resminamalaryndan mysal alalyň: " 1.10.3. Sapaklary awtomatiki kesgitlemek we noýba kesgitlemelerini hasaba almak ".
От Hello World до Spring Web MVC и при чём тут сервлеты - 11
Sebäbi bu usul bilen awtomatiki kesgitlemäge mümkinçilik berýäris, indi 2 synp döredip bileris (ýörite bahar bellikleriniň ulanylmagy sebäpli bahar noýbasy hasaplanar), bahar indi özüni döreder we kömegi bilen programmamyzy sazlar:
  1. Web konfigurasiýasy, mysal üçin Java stiliniň konfigurasiýasy:

    @Configuration
    @EnableWebMvc
    public class WebConfig implements WebMvcConfigurer {
        @Override
        public void configureViewResolvers(ViewResolverRegistry registry) {
            registry.jsp("/WEB-INF/pages/", ".jsp");
        }
        @Override
        public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
            configurer.enable();
        }
    }

    Bu mysal, "Bahar çarçuwasy" resminamalarynda düşündirilýär: " 1.11. MVC konfigurasiýasy ".

    Bu ýerde jsp sahypalarynyň nirededigini kesgitlemäge kömek etjek ViewResolver-i hasaba alýarys. Ikinji usul, " Bellenen servlet " -iň açyk bolmagyny üpjün edýär.

    Bu hakda has giňişleýin maglumaty şu ýerden okap bilersiňiz: " default-servlet-handler-iň zerurlygy we ulanylyşy näme ".

  2. Haýyşlaryň belli bir JSP-e kartalaşdyrylmagyny beýan etmek üçin HelloController dolandyryjysy

    @Controller
    public class HelloController {
        @GetMapping("/hello")
        public String handle(Model model) {
            return "hello";
        }
    }

    Bu ýerde, " 1.4. Annotated Controllers " bölüminde resminamalarda beýan edilen @Controller düşündirişini ulandyk .

Indi, programmamyz ýerleşdirilende, haýyş iberenimizde /webproject/hello(nirede / web taslamasy kontekst köküdir), ilki bilen DispatcherServlet işlener. Esasy dispetçer hökmünde, häzirki haýyşa laýyk gelýändigimizi kesgitlär, bu bolsa DispatcherServlet-iň bir zat etmelidigini aňladýar. Soň bolsa tapan kartalarynyň hemmesinden geçer. Salam / karta düzülen we ýerine ýetirjek tutawaç usuly bolan HelloController-iň bardygyny görer. Bu usul "salam" tekstini yzyna getirer. Bu tekst, müşderä görkezilmeli jsp faýllaryny nireden gözlemelidigini serwere görkezjek ViewResolver tarapyndan kabul ediler. Şeýlelik bilen, müşderi ahyrsoňy şol söýgüli sahypany alar.

Netije

Makaladan “kontekst” sözüniň gorkunç däldigi aýdyň bolar diýip umyt edýärin. Bu aýratynlyklar gaty peýdaly bolup çykýar. Resminamalar bolsa duşmanymyz däl, dostumyz. Baharyň nämä esaslanýandygy, nädip baglanyşýandygy we Servlet API-iň näme bilen baglanyşygy aýdyň bolar diýip umyt edýärin.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION