JavaRush /Java blogi /Random-UZ /Pafossiz. Keling, Java EE, servletlar va ularning konteyn...
eGarmin
Daraja

Pafossiz. Keling, Java EE, servletlar va ularning konteynerlari haqida gapiraylik

Guruhda nashr etilgan
Ushbu mavzuda men servletlar haqidagi tushunchalarim, servlet konteynerlari nima, ko'pchilik, agar hammasi bo'lmasa ham, veb-brauzerlar nima ekanligi, shuningdek, servlet konteynerlari va dastur serverlari bilan qanday bog'liqligi haqidagi mavzuga to'xtalib o'tmoqchiman. bir-biri va servlet va veb-server konteynerlari. Pafossiz.  Keling, Java EE, servletlar va ularning konteynerlari haqida gapiraylik - 1Suhbatni boshlashdan oldin shuni ta'kidlamoqchimanki, men haqiqatan ham munozara bo'lishini kutmoqdaman, chunki... Bu erda men bitta kod bo'lagini berishni xohlamayman, lekin har doim so'z bilan ifodalanishi mumkin bo'lgan mohiyatga tegmoqchiman. Men birinchi boshlaganimda menga tushunarsiz bo'lgan barcha fikrlarni aytib berishga harakat qilaman. Men turli forumlarda Tomcat servlet konteyneri har qanday dastur serveridan qanday farq qilishi haqida savollar berganimda, aytaylik WebSphere yoki Geronimo, javob berishga jur'at etgan yagona odamlar "Vikipediyaga qarang" yoki "boshqa hech narsa aytolmagan eshaklar edi. aytish qiyin, server ilovalari - bu korporativ ilovalar uchun murakkab infratuzilma bo'lib, u ..." blah blah blah. Men bunday odamlarga chiday olmayman va ko‘pchiligingiz ham bunga chiday olmaysiz. Biz tarixiy adolatsizlikni tuzatamiz. Boring…

Servletlar

Kim nima demasin, servlet Java-da yozilgan veb-sahifadir. Ba'zilar men noto'g'riman va servlet bu veb-ilova ekanligini va bu tushunchalarda farq borligini aytishadi, lekin bu unday emas. Endi hech qanday farq yo'q va PHP-da yozilgan saytlarni veb-ilovalar deb ham atash mumkin. Endi bu mutlaqo tabiiy, chunki... php OOP-ni to'liq qo'llab-quvvatlaydi va Joomla kabi CMS-lar bundan faol foydalanadi. Kod darajasidagi servlet nima? Bu uxlash va kimdir GET yoki POST HTTP so'rovlari orqali ularga kirish-qilmasligini ko'radigan bir qancha usullarga ega bo'lgan sinf. Bular. Biz brauzerda ba'zi GET so'rovini yozdik, servlet sinfining mos keladigan usuli uni qabul qiladi va keyin HTML sahifasi ko'rinishida unga javob hosil qiladi. Servletning klassik ma'nosida, Sun tomonidan o'ylab topilganidek, ushbu sahifa mijozga satr bo'yicha <!DOCTYPE htm>> qatoridan boshlanib, </html> qatori bilan yakunlangan. Shunday qilib, Java'da asosiy servlet klassi mavjud Servlet. Bundan tashqari, ushbu asosiy sinfdan meros bo'lib qolgan va shu bilan uning funksionalligini kengaytiradigan bir qator boshqa sinflar mavjud. Bu servlet - boshqa hech narsa emas. Bu shunchaki PHP kodining Java analogi bo'lib, u serverda ham bajariladi va mijozga faqat veb-brauzer so'roviga veb-sahifa ko'rinishidagi javob yuboriladi. Hammasi.

Web front-end ramkalar

Subtitr murakkab va odatda ular faqat front-end ramka yoki hatto veb-muszle yozadilar , lekin men bu erda ta'kidlashga qaror qildimki, biz front-end ramkalar haqida gapirganda, biz veb-brauzer orqali Java bilan ishlash uchun GUI haqida gapiramiz. Bular. bu erda yana Java-dagi veb-saytlar haqida gapiramiz, ya'ni. servletlar haqida. Deyarli har qanday front-end ramka nima, masalan, Apache Struts. Bu oddiygina asosiy sinfni kengaytiruvchi sinflar to'plamidir Servlet. Boshqa hech narsa. Bular. bu oddiy servletni yaratishning boshqa usuli. Shunchaki, ushbu ramka ishlab chiquvchilari (yoki boshqacha aytganda, ushbu texnologiyani ishlab chiquvchilari) Servletba'zi usullar bilan asosiy sinfni qo'shish dasturchi uchun Sun/Oracle klassik servletidan ko'ra qulayroq bo'ladi, deb hisoblashdi. ega.

JSP sahifalari

Deyarli darhol Java servlet kontseptsiyasini ishlab chiquvchilarning miyasiga yana bir g'oya keldi. Biz mijozga html-sahifani yuborish vazifasi bo'lgan servlet yozayotganimiz sababli, darhol ushbu html sahifani yozish to'g'riroq bo'lishi mumkin va agar sizga Java-da qandaydir mantiq kerak bo'lsa, uni to'g'ridan-to'g'ri kiriting. html ichiga. Agar u aniqroq bo'lmasa, unda ibora yordam berishi mumkin: jsp sahifasi PHP sahifasining analogidir. Qiyinmi? Keyin yana tushuntiraman. PHP da sahifa yozishda nima qilamiz? Bizda statik html bor va biz PHP-ga looplar va shartlar kabi istalgan mantiqni kiritishimiz kerak bo'lganda, biz uni tegning tanasiga joylashtiramiz <?php … ?>. Jsp bilan hamma narsa bir xil, faqat mantiq sof Java-da yozilgan, uning kodi tegning tanasiga kiritilgan <% … %>. Servlet tushunchasiga yana bir bor qaytaylik. Aslini olganda, JSP sahifasi servletdir, lekin biroz boshqacha yozilgan. Oddiy servletda biz ba'zi bir mantiqni bajaradigan va uning natijalari asosida mijoz uchun HTML sahifasini yaratadigan usul yozamiz. Shunchaki, bir muncha vaqt o'tgach, servlet ishlab chiquvchilari o'ylay boshladilar: agar usulda mantiq deyarli yo'q bo'lsa va deyarli faqat html-sahifa hosil bo'lsa, unda darhol HTML sahifani yozish osonroq bo'lmaydimi? minimal Java qo'shimchalarini qanday qilish kerak? Xo'sh, jsp sahifalari haqida oxirgi narsa. Bunday sahifaga birinchi marta kirishda u servletga kompilyatsiya qilinadi va keyin bajariladi. Ushbu jsp sahifasiga keyingi so'rovlar tezroq bo'ladi, chunki u allaqachon tuzilgan va faqat bajarilishi kerak bo'ladi.

Servlet konteyneri

Shunday qilib, biz servlet sinfini yoki JSP sahifasini yozdik. Keyin nima? Qanday qilib ularni veb-serverga, masalan, apachega, u ularni foydalanuvchining veb-brauzeriga yuborishi mumkin? Veb-server faqat html yuborishi mumkin va agar bizning sahifamiz, deylik, php kodi bo'lsa, u holda veb-server avval sahifani php ni html ga o'tkazuvchi tarjimon orqali o'tkazadi va shundan keyingina natija mijozga yuboriladi. Taxminan xuddi shu narsa servletlar bilan sodir bo'ladi - yuborishdan oldin ular HTML sahifasi yaratilishi uchun bajarilishi kerak va servlet konteyneri aynan servletlar va jsp sahifa kodlarini bajarish uchun javobgar bo'lgan narsadir. Bular. Java uchun servlet konteyneri veb-serverdagi PHP tarjimon modulining analogidir. Shunday qilib, foydalanuvchi veb-brauzerda manzilni kiritganda, so'rov veb-serverga yuboriladi, veb-server servlet so'ralayotganini tushunadi va so'rovni servlet konteyneriga uzatadi. Shundan so'ng, servlet konteyneri servletni bajaradi, natijada olingan HTML sahifani veb-serverga yuboradi, bu esa o'z navbatida uni mijozga qaytaradi. Servlet konteyneri o'z-o'zidan ishlay oladimi, ya'ni. veb-serversizmi? Tomcat kabi biror narsa, albatta, mumkin. Va agar biz servletlarga asoslangan sahifalardan tashqari boshqa HTML sahifalari bo'lmagan sayt yaratmoqchi bo'lsak, u holda biz uchun servlet konteyneri etarli. Ammo agar biz saytni servletlardan va aytaylik, PHP sahifalaridan birlashtirmoqchi bo'lsak, u holda veb-serverni o'rnatishimiz kerak bo'ladi. Bundan tashqari, barcha veb-serverlarda sukut bo'yicha servlet konteyneri mavjud emas, lekin deyarli barchasi uni plagin sifatida o'rnatishga imkon beradi. Shuning uchun, agar biz veb-saytimizni Apache ishlaydigan Internetdagi ba'zi hostingda ishga tushirmoqchi bo'lsak, u holda provayderdan servlet konteyneri ulanganligini so'rashimiz kerak bo'ladi.

Java EE

JavaSE (Java Standard Edition) deb ataladigan narsa mavjud. Ushbu kontseptsiya barcha sinflarni o'z ichiga oladi java, ulardan foydalanish uchun biz ularni faqat import qilishimiz kerak (masalan, java.util.Date) yoki hatto buni qilish kerak emas (masalan, Stringpaketda joylashganligi sababli java.lang). Va Java EE (Java Enterprise Edition) mavjud. Bu sinflar ham Sun/Oracle-ga tegishli, biroq yagona farq shundaki, ulardan loyihada foydalanishni boshlash qiyinroq. Oddiy chiziq import…etarli bo'lmaydi, chunki ... loyiha kompilyatsiya qilinmaydi. Vaziyatni tuzatish uchun javaee.jar kutubxona faylini topishingiz va uni loyihaga kiritishingiz kerak bo'ladi. Buni ishlab chiqish muhitidagi loyiha xususiyatlari orqali amalga oshirish mumkin. Ko'pincha bu ulanish jarayoni deyiladi: loyihaning qurish yo'lida yoki sinf yo'lida jar taxallusni ro'yxatdan o'tkazing.

Ilovalar serveri

Endi tasavvur qiling-a, biz Java EE dan foydalanadigan servlet loyihamizni tuzdik. Hammasi zo'r, lekin endi biz kompilyatsiya qilingan sinflarimizni servlet konteyneriga joylashtirishimiz kerak. Aytaylik, ular buni qilishdi. Bizning arizamiz ishlaydimi? Javob yo‘q. Servletga kirishda ba'zi sinflar topilmaganligini ko'rsatadigan istisnolar tashlanadi. Nega? Chunki biz kompilyatorni sirg'alib, "aldaganmiz" javaee.jar в classpath, ya'ni. kompilyator Java EE sinflari joyida ekanligini va tinchlanayotganini ko'rdi, lekin servlet konteyneri bu sinflarni ko'rmaydi, lekin bizning servletimizdan ularga havolalarni ko'radi. Bu vaziyatni servlet konteynerida hal qilish mumkinmi? Albatta, ha, javaee.jar kutubxona faylini servlet konteyneridagi servletimiz joylashgan papkaga qo'shishingiz kifoya . Endi tasavvur qiling-a, bunday loyihalar ko'p bo'ladi va ularning barchasi bitta Tomcat servlet konteynerida ishlaydi. Bu shuni anglatadiki, siz ushbu jar faylini har bir servlet papkasiga nusxalashingiz kerak bo'ladi. Bu noqulay va noto'g'ri. Vaziyat dastur serveri kontseptsiyasini joriy etish orqali hal qilindi, unda bu fayl uzoq vaqtdan beri bitta nusxada bo'lib kelgan va barcha servletlar unga kirishlari mumkin va o'zlarining nusxalariga ega bo'lmaydilar. Menimcha, bu juda qulay va mantiqiy. Tabiiyki, barcha shov-shuvlar bitta jar fayliga bog'liq emas (men buni misol tariqasida keltirdim) - bunday fayllar juda ko'p. Ammo bu dastur serverlari bizga beradigan hamma narsa emas. Ilova serverlarining o'zlari ko'plab resurslarga, masalan, ma'lumotlar bazasiga ulanishni saqlab turishi mumkin. Bunday holda, bizning servletimiz bunday ulanishni o'zi ochmasligi mumkin, lekin uni oddiygina dastur serveridan oling. Servlet konteynerida bu mumkin emas, chunki... konteyner ma'lum darajada o'chirilgan dastur serveridir. Konteynerda servlet har doim ma'lumotlar bazasiga ulanishlarni yaratishi kerak. Shunga o'xshash narsa... urush arxivi Urush arxivi nima? WAR veb-arxivdir. Aslida, bu har qanday jar kabi oddiygina zip fayl. Asosan, bu ko'plab veb-sahifalar, jsp sahifalar va servlet sinflaridan iborat veb-saytimizni bitta zip faylga to'plashning bir usuli. web.xml web.xml tarqatish deskriptori deb ataladi. Bu servlet konteyneri chalkashmasligi uchun qaysi veb-brauzer qatoriga ishlov berish uchun qaysi servlet sinfiga yuborish so'rovini ahmoqona tasvirlab beradi, qaysi servlet nima uchun javobgardir. Umuman olganda, Java-da barcha turdagi xml fayllaridagi sozlamalarni tasvirlash juda moda, ammo yaqinda bu an'anadan uzoqlashish tendentsiyasi kuzatildi. Qanday qilib, deb so'rayapsizmi? Va izohlar orqali. Annotatsiya sinflarining o'zi hech narsa qilmaydi, ular faqat alohida xml faylida emas, balki to'g'ridan-to'g'ri kodda barcha turdagi sozlamalarni (meta-ma'lumotlar) tasvirlash uchun yaratilgan. Juda qulay. Biroq, hozir ma'lum bir oraliq bosqich mavjud, ba'zi sozlamalar izohlar bilan, ba'zilari esa xml bilan belgilanadi va bu chalkash bo'lishi mumkin, chunki Siz xml ga qaraysiz va bitta sozlamani ko'rasiz, ammo izohlarga ko'ra boshqasi bor. Qaysi biri ustuvor? Kim biladi…

Xulosa

Buni yozgandan so'ng, men bunday tez ko'rib chiqish hech kimga yordam bermaydi deb o'yladim, chunki ... hech qanday aniqlik va misollarni o'z ichiga olmaydi, lekin boshqa tomondan, yozilgan narsalarni o'chirmang, shuning uchun bo'lsin.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION