Kirish
Ma'lumki, Java-ning muvaffaqiyati aynan tarmoqqa ulanishga intilayotgan dasturiy ta'minotning evolyutsiyasi tufayli keldi. Shuning uchun biz odatiy konsol ilovasi " Salom dunyo " ni asos qilib olamiz va konsol ilovasidan tarmoq ilovasi bo'lish uchun nima kerakligini tushunamiz. Shunday qilib, avval siz Java loyihasini yaratishingiz kerak. Dasturchilar dangasa odamlardir. Tarixdan oldingi davrlarda, ba'zilari mamontlarni ovlayotganda, boshqalari Java kutubxonalari va katalog tuzilmalarining xilma-xilligida o'tirib, adashmaslikka harakat qilishdi. Ishlab chiquvchi dastur yaratish jarayonini boshqarishi va shunchaki "Men 2-versiyadagi kutubxonani xohlayman" deb yozishi uchun ular maxsus vositalarni - tizimlarni qurishni taklif qilishdi. Ikkita eng mashhurlari - Maven va Gradle . Ushbu maqola uchun biz Gradle-dan foydalanamiz. Agar ilgari biz katalog tuzilmasini o'zimiz yaratishimiz kerak bo'lgan bo'lsa, endi Gradle Gradle Init plaginidan foydalanib, bitta buyruqda katalog tuzilmasi va asosiy asosiy sinfga ega Java loyihasini yaratishga imkon beradi:gradle init --type java-application
Bu buyruq ishga tushirishni (init) amalga oshiradi. bizga Hello World konsoli bilan Java ilovasi (java-ilovasi). Tugatgandan so'ng, katalogda fayl paydo bo'ladi - build.gradle . Bu bizning qurish skriptimiz - ya'ni buning uchun qanday harakatlar bajarilishi kerakligi tavsiflangan dastur yaratish uchun ma'lum bir skript. Keling, uni ochamiz va unga qator qo'shamiz: jar.baseName = 'webproject'
Gradle sizga loyihada turli xil amallarni bajarishga imkon beradi va bu harakatlar deyiladi vazifalar . Buyruqni (topshiriqni) bajarish orqali JAR fayli /build/libsgradle build
katalogida yaratiladi . Va siz taxmin qilganingizdek, endi uning nomi webproject.jar bo'ladi . Ammo biz ni bajarsak , xatoga duch kelamiz: . Buning sababi, java ilovasi uchun ma'lum bir manifestni biriktirishingiz kerak - bu dastur bilan qanday ishlash, uni qanday qabul qilishning tavsifi. Shunda java ilovasini bajaradigan JVM qaysi sinf dasturga kirish nuqtasi ekanligini va boshqa ma'lumotlarni bilib oladi (masalan, classpath). Qurilish skriptining mazmunini batafsil ko'rib chiqsak, plaginlarning ulanganligini ko'ramiz. Masalan: Agar biz Gradle Java Plugin sahifasiga o'tsak , biz manifestni sozlashimiz mumkinligini ko'ramiz: java -jar ./build/libs/webproject.jar
no main manifest attribute
apply plugin: 'java'
jar {
manifest {
attributes 'Main-Class': 'App'
}
}
Asosiy sinf, dasturga kirish nuqtasi biz uchun Gradle Init Plugin tomonidan yaratilgan. Va u hatto mainClassName parametrida ham ko'rsatilgan. Ammo bu bizga mos kelmadi, chunki ... bu sozlama boshqa plaginga, Gradle Application Pluginga tegishli . Shunday qilib, bizda ekranda Hello World-ni ko'rsatadigan Java ilovasi mavjud. Ushbu Java ilovasi JAR (Java ARchive) da paketlangan. Bu oddiy, konsolga asoslangan, zamonaviy emas. Qanday qilib uni veb-ilovaga aylantirish mumkin?
Servlet API
Java-ning tarmoq bilan ishlashi uchun, qadimgi davrlarda Servlet API deb nomlangan spetsifikatsiya paydo bo'lgan . Aynan mana shu spetsifikatsiya mijoz-server o'zaro ta'sirini, mijozdan xabar olish (masalan, brauzer) va javob yuborishni (masalan, sahifa matni bilan) tavsiflaydi. Tabiiyki, o'shandan beri ko'p narsa o'zgardi, ammo gap shundaki, Java ilovasi veb-ilovaga aylanishi uchun Servlet API-dan foydalaniladi. Asossiz taxmin qilmaslik uchun, keling, ushbu spetsifikatsiyani ko'rib chiqaylik: JSR-000340 JavaTM Servlet 3.1 . Avvalo, bizni " 1-bob: Umumiy ko'rinish " qiziqtiradi. Bu biz tushunishimiz kerak bo'lgan asosiy tushunchalarni tavsiflaydi. Birinchidan, servlet nima? " 1.1 Servlet nima? " bo'limida aytilishicha, Servlet - bu konteyner tomonidan boshqariladigan va dinamik tarkibni yaratuvchi Java komponenti. Boshqa Java komponentlari singari, servlet ham bayt-kodga kompilyatsiya qilingan va Java texnologiyasidan foydalangan holda veb-serverga yuklanishi mumkin bo'lgan Java sinfidir. Servlet konteyneri tomonidan amalga oshiriladigan so'rov/javob paradigmasi doirasida servletlar veb-mijoz (masalan, brauzer) bilan o'zaro aloqada bo'lishi muhimdir. Ma'lum bo'lishicha, Servletlar qandaydir Servlet konteynerida yashaydi. Nima bu? " 1.2 Servlet konteyneri nima? " bo'limida aytilishicha, Servlet konteyneri so'rovlar yuboriladigan va javoblar yuboriladigan tarmoq xizmatlarini taqdim etadigan veb-server yoki dastur serverining bir qismidir. Ushbu Servlet konteyneri servletlarning hayot aylanishini boshqaradi. Barcha Servlet konteynerlari HTTP protokolini kamida qo'llab-quvvatlashi kerak, ammo boshqalarni qo'llab-quvvatlashi mumkin. Masalan, HTTPS. Servlet konteyneri servletlar bajariladigan muhitga xavfsizlik bilan bog'liq har qanday cheklovlarni o'rnatishi ham muhimdir. Shuningdek, “ 10.6 Veb-ilovalar arxivi fayli ” ga muvofiq veb-ilova WAR (Web ARchive) faylida to'plangan bo'lishi ham muhimdir . Ya'ni, endi biz boshqa narsa uchun jar va dastur plaginlarini olib tashlashimiz kerak. Va bu Gradle WAR plaginidir . Va o'rniga jar.baseName war.baseName belgilang Chunki Biz endi jar plaginidan foydalanmayotganimiz uchun manifest sozlamalarini ham olib tashladik. JAR-ni ishga tushirganimizda, Java Virtual Machine (JVM) bizning ilovamiz bilan qanday ishlashni manifest orqali aytib berishimiz kerak edi. Chunki JVM uni boshqarayotgan edi. Veb-ilova, aftidan, qandaydir veb-server tomonidan bajariladi. Ma'lum bo'lishicha, u qandaydir tarzda unga bizning veb-ilovamiz bilan qanday ishlashni aytishi kerak? Va shunday bo'lib chiqdi. Veb-ilovalar o'zlarining maxsus manifestiga ega. U Deployment Descriptor deb ataladi . Unga butun bo'lim bag'ishlangan: “ 14. Deployment Descriptor ”. Muhim bo'lim bor: " 10-bob:". U Servlet API nuqtai nazaridan veb-ilova nima ekanligi haqida gapiradi. Masalan, " 10.5 Katalog tuzilmasi " bobida joylashtirish deskriptori qayerda bo'lishi kerakligi ko'rsatilgan:/WEB-INF/web.xml
. WEB-INFni qayerga joylashtirish kerak? Gradle WAR plaginida aytilganidek, u yangi maketni qo'shadi : src/main/webapp
.Shuning uchun shunday katalog yaratamiz, ichida biz WEB-INF katalogini yaratamiz va ichida biz web.xml faylini yaratamiz.Katalog bo'lishi muhim. META-INF emas, WEB-INF deb ataladi! Keling, uni " 14.5.1 Asosiy misol " XML misolidan ko'chirib olaylik:
specification is available at http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd
biz sxemaga havolani hamma joyda belgilangan xsd bilan almashtirishimiz kerak, uni version="2.5"
3.1 ga o'zgartirishni unutmang, shuningdek, hamma joyda nom maydonini o'zgartirishimiz kerak ( xmlns va xsi:schemaLocation da). Ular qaysi nomlar maydonida ishlashimizni ko'rsatadi (juda sodda qilib aytganda, qanday element nomlaridan foydalanishimiz mumkin). Agar siz sxema faylini ochsangiz, targetNamespace biz belgilashimiz kerak bo'lgan bir xil nom maydonini o'z ichiga oladi:
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);
}
}
}
Lekin loyihamiz hali tayyor emas. Chunki biz hozir Servlet API 3.1 versiyasiga bog'liqmiz. Bu bizning qurish skriptimizda biz Servlet API-ga bog'liqlikni ko'rsatishimiz kerakligini anglatadi. JVM kodda yozgan narsangiz to'g'ri ekanligini va undan qanday foydalanishni bilishi kerak. Esda tutganimizdek, spetsifikatsiya aslida barchasi qanday ishlashini tavsiflovchi interfeyslardir. Va ilovalar veb-server tomonida joylashgan. Shuning uchun, Servlet APIsiz Maven Central da kerakli kutubxonani toping: javax.servlet-api . Va bog'liqliklar blokiga kirish qo'shing . Maven omborida, siz ko'rganingizdek, u taqdim etilgan deb aytilgan. Tobelikni ishlatishdan oldin siz qamrovni belgilashingiz kerak. Gradle-da "ta'minlangan" deb nomlangan qamrov yo'q, lekin u " faqat kompilyatsiya qilish " doirasiga ega. Shuning uchun biz aytamiz: providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
Uh, hammasi joyida? Gradle Build bizning loyihamizni WAR fayliga aylantiradi. Va bundan keyin nima qilishimiz kerak? Birinchidan, bizga veb-server kerak. Google'da biz " veb server java ro'yxati " deb yozamiz va veb-serverlar ro'yxatini ko'ramiz. Keling, ushbu ro'yxatdan tanlaylik, masalan, TomCat . Apache Tomcat veb-saytiga o'ting , so'nggi versiyani (hozirgi versiya 9) zip arxivi sifatida yuklab oling (agar Windows uchun). Uni biron bir katalogga oching. Huray, bizda veb-server bor. Bin pastki katalogidagi veb-server katalogidan biz buyruq satridan catalina-ni ishga tushiramiz va mavjud variantlarni ko'ramiz. Keling, qilaylik: catalina start
. Har bir veb-serverda veb-server nazorat qiladigan katalog mavjud. Agar u yerda veb-ilova fayli paydo bo'lsa, veb-server uni o'rnatishni boshlaydi. Ushbu o'rnatish tarqatish yoki tarqatish deb ataladi . Ha, ha, shuning uchun " joylashtirish deskriptori ". Ya'ni, dasturni qanday qilib to'g'ri joylashtirish kerak. Tomcat-da bu katalog webapps hisoblanadi . Keling, u erda gradle build yordamida qilgan urushimizni ko'chirib olaylik. Shundan so'ng, jurnalda biz shunga o'xshash narsani ko'ramiz: Yaxshiroq tushunish uchun tomcat katalogida quyidagi qatorlarni qo'shib Deployment of web application archive [tomcat\webapps\webproject.war] has finished in [время] ms
faylni tahrirlaymiz :\conf\tomcat-users.xml
http://127.0.0.1:8080/manager
erda biz barcha ilovalarning yo'llarini ko'ramiz. Bizning veb-loyihamizga katta ehtimollik bilan yo'l/webloyiha berilgan. Bu qanday yo'l? " 10.1 Veb-serverlar ichidagi veb-ilovalar " bo'limidagi spetsifikatsiyada veb-ilova ilova ichidagi ba'zi yo'llar bilan bog'langanligini bildiradi (bu holda, /webproject). Ushbu yo'l orqali barcha so'rovlar bir xil ServletContext bilan bog'lanadi. Ushbu yo'l contextRoot deb ham ataladi . Va " 10.2 ServletContext bilan aloqasi " ga ko'ra, servlet konteyneri veb-ilova va ServletContext-ni birma-bir bog'laydi. Ya'ni, har bir veb-ilova o'z ServletContext-ga ega. ServletContext nima ? Spetsifikatsiyada aytilganidek, ServletContext bu servletlarga ular ishlayotgan " ilova ko'rinishi" bilan ta'minlovchi ob'ektdir . Servlet konteksti Servlet API spetsifikatsiyasining 4-bobida batafsil tavsiflangan. Ajablanarlisi shundaki, 3.1 versiyadagi Servlet API endi web.xml bo'lishini talab qilmaydi. Masalan, siz izohlar yordamida servletni belgilashingiz mumkin:
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");
}
}
Shuningdek, mavzu bo'yicha tavsiya etiladi: " Java EE intervyu - JEE Servlet API (Savollar va javoblar) ". Shunday qilib, bizda Servlet bor - u veb-mijozga qanday javob berish uchun javobgardir. Bizda foydalanuvchidan so‘rovlarni qabul qiluvchi, servlet yo‘li bilan kirilgan yo‘lga mos keladigan va moslik topilsa, Servletni bajaradigan ServletContainer mavjud. Yaxshi. Bu dunyo rasmida bahor qaysi o'rinni egallaydi ?
Spring Web MVC
Ajoyib, bizda veb-ilova mavjud. Endi biz bahorni ulashimiz kerak. Buni qanday qilishimiz mumkin? Birinchidan, siz bahorni loyihangizga qanday qilib to'g'ri ulashni aniqlab olishingiz kerak. Ma'lum bo'lishicha, ilgari buni Bahor platformasi loyihasi hujjatlariga muvofiq amalga oshirish mumkin edi , ammo endi " Platforma qo'llab-quvvatlanadigan muddati 2019 yil 9 aprelda tugaydi ", ya'ni buni qilish tavsiya etilmaydi. foydalaning, chunki u tez orada qo'llab-quvvatlanmaydi. Yagona yo'l - " Platforma foydalanuvchilariga Spring Boot-ning qaramlik boshqaruvidan foydalanishni boshlash tavsiya etiladi ". Shuning uchun, keling, Spring Boot hujjatlariga o'tamiz . Aniqlik kiritamanki, biz Spring Boot-dan foydalanmaymiz, faqat Spring Boot-dan Dependency Management-dan foydalanamiz. Ya'ni, Spring Boot loyihasi kutubxonalarning qaysi versiyalaridan foydalanish (shu jumladan Spring MVC) haqida ma'lumot berishi mumkin. U erda biz 3.2 ni topamiz . Spring Boot-ning qaramlik boshqaruvidan alohida foydalanish . Hujjatlarga ko'ra, qurilish skriptiga quyidagilarni qo'shing:plugins {
id 'org.springframework.boot' version '2.0.4.RELEASE' apply false
}
apply plugin: 'io.spring.dependency-management'
Va
dependencyManagement {
imports {
mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
}
}
Ko'rib turganingizdek, biz ko'rsatdik apply false
, ya'ni. Biz Spring Boot-ning o'zidan foydalanmaymiz, lekin u erdan qaramlikni boshqarishdan foydalanamiz. Ushbu qaramlik boshqaruvi BOM - " Materiallar ro'yxati " deb ham ataladi . Endi biz Spring Web MVC loyihasini ulashga tayyormiz. Spring Web MVC Spring Framework loyihasining bir qismidir va biz " Web Servlet " bo'limiga qiziqamiz . Qurilish skriptiga qaramlikni qo'shamiz: compile 'org.springframework:spring-webmvc'
. Ko'rib turganimizdek, biz kompilyatsiya hajmini o'rnatdik, chunki veb-server bizga bahorni taqdim etmaydi. Bizning loyihamiz Bahor kutubxonasini o'z ichiga kiritishga majbur. Keyinchalik, " 1.2. DispatcherServlet " bo'limini o'qish biz uchun juda muhim , bu erda Spring MVC " Front kontroller " sxemasi atrofida qurilgan , bu erda konfiguratsiya va boshqa komponentlarga vakolat berishni ta'minlaydigan markaziy servlet mavjud. . Dispetcherni dispetcher deb tarjima qilish mumkin. Shunday qilib, birinchi navbatda, web.xml da biz e'lon qilamiz:
applicationContext.xml
Va biz ilgari ko'rsatgan faylni yaratishni unutmang . Bahor hujjatlaridan misol keltiraylik: " 1.10.3. Sinflarni avtomatik aniqlash va loviya ta'riflarini ro'yxatdan o'tkazish ".
-
Veb-konfiguratsiya, masalan, Java uslubi konfiguratsiyasi:
@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(); } }
Ushbu misol Spring Framework hujjatlarida tasvirlangan: " 1.11. MVC Config ".
Bu erda biz jsp sahifalari qaerda joylashganligini aniqlashga yordam beradigan ViewResolver-ni ro'yxatdan o'tkazamiz. Ikkinchi usul " Standart servlet " yoqilganligini ta'minlaydi.
Bu haqda ko'proq ma'lumotni bu erda o'qishingiz mumkin: " Default-servlet-handler nima kerak va undan foydalanish kerak ".
-
Muayyan JSP ga so'rovlar xaritasini tavsiflash uchun HelloController kontrolleri
@Controller public class HelloController { @GetMapping("/hello") public String handle(Model model) { return "hello"; } }
Bu erda biz " 1.4. Izohlangan kontrollerlar " bo'limidagi hujjatlarda tasvirlangan @Controller izohidan foydalandik .
/webproject/hello
(bu erda /webproject kontekst ildizi), DispatcherServlet birinchi bo'lib qayta ishlanadi. U asosiy dispetcher sifatida biz /* joriy so'rovga mos kelishini aniqlaydi, ya'ni DispatcherServlet biror narsa qilishi kerak. Keyin u topgan barcha xaritalardan o'tadi. U /hello ga moslashtirilgan tutqich usuliga ega HelloController mavjudligini ko'radi va uni bajaradi. Bu usul "salom" matnini qaytaradi. Ushbu matn ViewResolver tomonidan qabul qilinadi, u serverga mijozga ko'rsatilishi kerak bo'lgan jsp fayllarini qaerdan izlash kerakligini aytadi. Shunday qilib, mijoz oxir-oqibat o'sha juda qadrli sahifani oladi.
GO TO FULL VERSION