JavaRush /Java блогы /Random-KK /Пафоссыз. Java EE, сервлеттер және олардың контейнерлері ...
eGarmin
Деңгей

Пафоссыз. Java EE, сервлеттер және олардың контейнерлері туралы сөйлесейік

Топта жарияланған
Бұл тақырыпта мен сервлеттер туралы түсінігім туралы, сервлет контейнерлері дегеніміз не, веб-фронт-реймворктердің көпшілігі, егер бәрі болмаса да, не болатыны туралы ашық айтқым келеді, сонымен қатар сервлет контейнерлері мен қолданба serverлерінің байланысы туралы тақырыпты қозғағым келеді. бір-бірімен және сервлет пен веб-server контейнерлері. Пафоссыз.  Java EE, сервлеттер және олардың контейнерлері туралы сөйлесейік - 1Әңгімені бастамас бұрын, мен шынымен де пікірталас болады деп күтетінімді атап өткім келеді, өйткені... Бұл жерде мен codeтың бір бөлігін бергім келмейді, бірақ әрқашан сөзбен айтуға болатын мәнге тоқталғым келеді. Мен алғаш бастаған кезде маған түсініксіз болған барлық тұстарды сипаттауға тырысамын. Мен әртүрлі форумдарда Tomcat сервлет контейнерінің кез келген қолданба serverінен қалай ерекшеленетіні туралы сұрақтар қойған кезде, айталық, WebSphere немесе Geronimo, жауап беруге батылы барған адамдар ғана «Уикипедияға қараңыз» немесе « айту қиын, serverлік қосымшалар – бұл корпоративтік қолданбаларға арналған күрделі инфрақұрылым, ол...» бла бла бла. Мен ондай адамдарға шыдай алмаймын және көпшілігіңіз де шыдай алмайсыз деп ойлаймын. Біз тарихи әділетсіздікті түзетеміз. Бару…

Сервлеттер

Кім не айтса да, сервлет Java тілінде жазылған веб-бет. Кейбіреулер менің қателескенімді және сервлет веб-бағдарлама екенін және бұл ұғымдарда айырмашылық бар екенін айтады, бірақ олай емес. Енді ешқандай айырмашылық жоқ және PHP тілінде жазылған сайттарды веб-қосымшалар деп те атауға болады. Енді бұл табиғи нәрсе, өйткені... php толық OOP қолдайды және Joomla сияқты CMS оны белсенді пайдаланады. Код деңгейіндегі сервлет дегеніміз не? Бұл ұйықтайтын және біреудің GET немесе POST HTTP сұраулары арқылы оларға қол жеткізетінін тексеретін бірнеше әдістері бар сынып. Анау. Біз браузерде кейбір GET сұрауын тердік, сервлет класының сәйкес әдісі оны қабылдайды, содан кейін оған HTML беті түрінде жауапты жасайды. Сервлеттің классикалық мағынасында, оны Sun ойлап тапқандай, бұл бет клиентке <!DOCTYPE htm>> жолынан басталып, </html> жолымен аяқталатын жол бойынша жіберілді. Сонымен Java-да деп аталатын негізгі сервлет класы бар Servlet. Бұған қоса, осы базалық сыныптан мұра болып табылатын және сол арқылы оның функционалдығын кеңейтетін басқа да сыныптар бар. Сервлет дегеніміз - басқа ештеңе емес. Бұл жай ғана PHP codeының Java аналогы, ол serverде де орындалады және клиентке веб-парақ түріндегі веб-шолғыштың сұрауына жауап ғана жіберіледі. Барлық.

Веб-фронттік фреймворктар

Субтитр күрделі және әдетте олар тек қана фронтальды фреймворкты немесе тіпті веб-мұзды жазады , бірақ мен бұл жерде фронттық фреймворктер туралы айтқанда, веб-шолғыш арқылы Java-мен жұмыс істеуге арналған GUI туралы айтатынымды атап өтуді жөн көрдім. Анау. мұнда тағы да Java тіліндегі веб-сайттар туралы айтып отырмыз, яғни. сервлеттер туралы. Кез келген дерлік фронтальды жақтау дегеніміз не, мысалы, Apache Struts. Бұл жай ғана базалық сыныпты кеңейтетін сыныптар жиынтығы Servlet. Артық ештеңе. Анау. бұл бірдей кәдімгі сервлетті жасаудың басқа жолы. Бұл негізді әзірлеушілер (немесе басқаша айтқанда, осы технологияны әзірлеушілер) Servletкейбір әдістермен базалық классты қосу бағдарламашыға Sun/Oracle классикалық сервлетінің шамалы функционалдылығынан ыңғайлырақ болады деп есептеді. бар.

JSP беттері

Бірден дерлік Java сервлет концепциясын жасаушылардың санасына тағы бір идея келді. Біз клиентке html бетін жіберу міндеті болып табылатын сервлет жазып жатқандықтан, бұл html бетін дереу жазу дұрысырақ болуы мүмкін, ал егер сізге Java-да қандай да бір логика қажет болса, оны жай ғана енгізіңіз. html ішіне. Егер ол анық болмаса, онда фраза көмектесуі мүмкін: jsp беті PHP бетінің аналогы. Қиын ба? Сосын тағы түсіндіремін. PHP тілінде бет жазғанда не істейміз? Бізде статикалық html бар және PHP-ге циклдар мен шарттар сияқты кез келген логиканы енгізу қажет болғанда, біз оны тегтің негізгі бөлігіне кірістіреміз <?php … ?>. jsp-де бәрі бірдей, тек логика таза Java тілінде жазылған, оның codeы тегтің негізгі бөлігіне енгізілген <% … %>. Сервлет ұғымына тағы да оралайық. Негізінде, JSP беті сервлет болып табылады, бірақ сәл басқаша жазылған. Кәдімгі сервлетте біз кейбір логиканы орындайтын әдіс жазамыз және оның нәтижелері негізінде клиент үшін HTML бетін жасайды. Біраз уақыттан кейін сервлет әзірлеушілері ойлана бастады: егер әдісте іс жүзінде логика болмаса және html бетін құру ғана орын алса, html бетін бірден жазу оңай емес пе еді? ең аз Java кірістірулерін жасау үшін қандай code? Jsp беттері туралы соңғы бір нәрсе. Мұндай бетке бірінші рет кіргенде, ол сервлетке жинақталады, содан кейін орындалады. Бұл jsp бетіне кейінгі сұраулар жылдамырақ болады, себебі ол қазірдің өзінде құрастырылған және тек орындалуы керек.

Сервлет контейнері

Сонымен, біз сервлет класын немесе JSP бетін жаздық. Ары қарай не? Оларды қолданушының веб-шолғышына жіберуі үшін оларды веб-serverге, мысалы apache-ге қалай итеруге болады? Веб-server тек html-ді ғана жібере алады, ал егер бетімізде айталық, php codeы болса, онда веб-server алдымен бетті php-ті html-ге аударатын интерпретатор арқылы өткізеді, содан кейін ғана нәтиже клиентке жіберіледі. Сервлеттермен бірдей нәрсе болады - жіберу алдында HTML беті жасалуы үшін оларды орындау керек, ал сервлет контейнері сервлеттер мен jsp бет codeын орындауға жауап беретін нәрсе. Анау. Java үшін сервлет контейнері веб-serverдегі php интерпретатор модулінің аналогы болып табылады. Осылайша, пайдаланушы веб-шолғышта мекенжайды енгізген кезде, сұрау веб-serverге жіберіледі, веб-server сервлеттің сұралып жатқанын түсінеді және сұрауды сервлет контейнеріне жібереді. Осыдан кейін сервлет контейнері сервлетті орындайды, нәтижесінде алынған HTML бетін веб-serverге жібереді, ол өз кезегінде оны клиентке қайтарады. Сервлет контейнері өздігінен жұмыс істей ала ма, яғни. веб-serverсіз бе? Tomcat сияқты нәрсе сөзсіз мүмкін. Егер біз сервлеттерге негізделгеннен басқа html беттері болмайтын сайт жасағымыз келсе, онда сервлет контейнері бізге жеткілікті. Бірақ егер біз сайтты сервлеттерден және айталық, PHP беттерінен біріктіргіміз келсе, онда веб-serverді орнатуға тура келеді. Сонымен қатар, барлық веб-serverлерде әдепкі бойынша қосылған сервлет контейнері жоқ, бірақ барлығы дерлік оны плагин ретінде орнатуға мүмкіндік береді. Сондықтан, егер біз веб-сайтымызды Apache жұмыс істейтін Интернеттегі кейбір хостингте іске қосқымыз келсе, онда провайдерден сервлет контейнерінің қосылғанын сұрауға тура келеді.

Java EE

JavaSE (Java Standard Edition) деп аталатын нұсқасы бар. Бұл тұжырымдама барлық сыныптарды қамтиды java, оларды пайдалану үшін біз оларды импорттауымыз керек (мысалы, java.util.Date) немесе тіпті мұны істеудің қажеті жоқ (мысалы, Stringол пакетте орналасқандықтан java.lang). Және Java EE (Java Enterprise Edition) бар. Бұл сыныптар да Sun/Oracle тобына жатады, бірақ жалғыз айырмашылығы - оларды жобада пайдалануды бастау қиынырақ. Қарапайым сызық import…жеткіліксіз болады, өйткені... жоба құрастырылмайды. Жағдайды түзету үшін javaee.jar кітапхана файлын тауып , оны жобаға қосу керек . Мұны әзірлеу ортасындағы жоба сипаттары арқылы жасауға болады. Бұл қосылу процесі деп аталады: жобаның құрастыру жолында немесе сынып жолында jar лақап атын тіркеңіз.

Қолданбалар serverі

Енді біз Java EE қолданатын сервлет жобамызды құрастырдық деп елестетіңіз. Барлығы тамаша, бірақ біз енді құрастырылған сыныптарды сервлет контейнеріне орналастыруымыз керек. Олар мұны істеді делік. Біздің өтініміміз жұмыс істей ме? Жауап жоқ. Сервлетке қатынасу кезінде кейбір сыныптардың табылмағанын көрсететін ерекшеліктер шығарылады. Неліктен? Өйткені біз компиляторды сырғыту арқылы «алдадық» javaee.jar в classpath, яғни. компилятор Java EE сыныптарының орнында екенін және тынышталғанын көрді, бірақ сервлет контейнері бұл сыныптарды көрмейді, бірақ біздің сервлеттен оларға сілтемелерді көреді. Бұл жағдайды сервлет контейнерінде шешуге болады ма? Әрине иә, сізге javaee.jar кітапхана файлын сервлет контейнеріндегі біздің сервлет бар қалтаға қосу керек . Енді мұндай жобалар көп болады деп елестетіп көріңіз және олардың барлығы бір Tomcat сервлет контейнерінде жұмыс істейді. Бұл осы jar файлын әрбір сервлет қалтасына көшіру керек дегенді білдіреді. Бұл ыңғайсыз және дұрыс емес. Жағдай қолданбалы server тұжырымдамасын енгізу арқылы шешілді, онда бұл файл бұрыннан бір көшірмеде болды және барлық сервлеттер оған қол жеткізе алады және жеке көшірмесі болмайды. Менің ойымша, бұл өте ыңғайлы және логикалық. Әрине, барлық әбігер бір jar файлына байланысты емес (мен оны мысал ретінде келтірдім) - мұндай файлдар көп. Бірақ бұл қолданба serverлері бізге беретін барлық нәрсе емес. Қолданба serverлерінің өзі көптеген ресурстарға, мысалы, дерекқорға қосылымдарды сақтай алады. Бұл жағдайда біздің сервлет мұндай қосылымды өзі ашпауы мүмкін, тек оны қолданба serverінен алуы мүмкін. Сервлет контейнерінде бұл мүмкін емес, себебі... контейнер белгілі бір дәрежеде жойылған қолданба serverі болып табылады. Контейнерде сервлет әрқашан дерекқордың өзіне қосылымдар жасауы керек. Мынадай бірдеңе... соғыс мұрағаты Соғыс мұрағаты дегеніміз не? WAR - бұл веб-мұрағат. Шын мәнінде, бұл кез келген банка сияқты жай ғана zip файлы. Негізінде, бұл көптеген веб-беттерден, jsp беттерінен және сервлет сыныптарынан тұратын веб-сайтты бір zip файлына жинақтаудың жолы ғана. web.xml web.xml — орналастыру дескрипторы деп аталатын. Бұл сервлет контейнері шатастырмас үшін өңдеу үшін қай сервлет сыныбына жіберуге болатын веб-шолғыш жолының сұрауын ақымақ сипаттайтын файл, қай сервлет не үшін жауап береді. Жалпы, Java тілінде xml файлдарының барлық түрлерінде параметрлерді сипаттау өте сәнді, бірақ соңғы уақытта бұл дәстүрден алыстау үрдісі байқалды. Қалай, сұрайсың ба? Және annotationлар арқылы. Аннотация кластарының өзі ештеңе жасамайды, олар барлық параметрлерді (мета-деректер) бөлек xml файлында емес, тікелей codeта сипаттау үшін ғана жасалған. Өте ыңғайлы. Дегенмен, қазір кейбір параметрлер annotationлармен, ал кейбіреулері xml арқылы көрсетілген белгілі бір аралық кезең бар және бұл шатасуы мүмкін, өйткені Сіз xml-ге қарап, бір параметрді көресіз, бірақ annotationларға сәйкес басқасы бар. Қайсысының басымдығы жоғары? Кім біледі…

Қорытынды

Осыны жазған соң, мұндай жылдам шолу ешкімге көмектеспейді деп ойладым, өйткені... ешқандай ерекшелік пен мысалдарды қамтымайды, бірақ екінші жағынан, жазылғанды ​​өшірмеңіз, сондықтан солай болсын.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION