JavaRush /Blog Java /Random-PL /Bez patosu. Porozmawiajmy o Java EE, serwletach i ich kon...
eGarmin
Poziom 41

Bez patosu. Porozmawiajmy o Java EE, serwletach i ich kontenerach

Opublikowano w grupie Random-PL
W tym temacie chciałbym szczerze porozmawiać o moim rozumieniu serwletów, czym są kontenery serwletów, czym jest większość, jeśli nie wszystkie, frameworki front-endu WWW, a także poruszyć temat powiązań kontenerów serwletów i serwerów aplikacji siebie nawzajem oraz kontenery serwletów i serwerów WWW. Bez patosu.  Porozmawiajmy o Java EE, serwletach i ich kontenerach - 1Zanim zacznę rozmowę, chcę zaznaczyć, że naprawdę oczekuję, że będzie dyskusja, bo... Nie chcę tutaj podawać ani jednego fragmentu kodu, ale chcę tylko dotknąć istoty, którą zawsze można wyrazić słowami. Spróbuję zarysować wszystkie punkty, które nie były dla mnie jasne, kiedy zaczynałem. Kiedy zadawałem pytania na różnych forach na temat tego, czym kontener serwletów Tomcat różni się od dowolnego serwera aplikacji, powiedzmy WebSphere czy Geronimo, jedynymi osobami, które odważyły ​​się odpowiedzieć, byli dupki, które nie mogły powiedzieć nic innego jak tylko „spójrz na Wikipedię” lub „ trudno powiedzieć, aplikacje serwerowe – to złożona infrastruktura dla aplikacji korporacyjnych, które…” bla bla bla. Nie znoszę takich ludzi i myślę, że większość z Was też nie. Naprawimy niesprawiedliwość historyczną. Iść…

Serwlety

Bez względu na to, co ktoś mówi, serwlet to strona internetowa napisana w Javie. Niektórzy powiedzą, że się mylę i że serwlet jest aplikacją internetową i że istnieje różnica w tych koncepcjach, ale to nieprawda. Teraz nie ma żadnej różnicy i strony napisane w PHP można śmiało nazwać aplikacjami internetowymi. Teraz jest to całkowicie naturalne, ponieważ... php w pełni obsługuje OOP, a systemy CMS, takie jak Joomla, aktywnie z tego korzystają. Czym jest serwlet na poziomie kodu? Jest to klasa posiadająca wiele metod, które są uśpione i sprawdzają, czy ktoś uzyskuje do nich dostęp za pośrednictwem żądań HTTP GET lub POST. Te. Wpisaliśmy w przeglądarce jakieś żądanie GET, odpowiednia metoda klasy serwletu akceptuje je, a następnie generuje na nie odpowiedź w postaci strony HTML. W klasycznym sensie serwletu, według koncepcji firmy Sun, strona ta była wysyłana do klienta linia po linii, zaczynając od linii <!DOCTYPE htm>> i kończąc na linii </html>. Zatem w Javie istnieje podstawowa klasa serwletów o nazwie Servlet. Ponadto istnieje wiele innych klas, które dziedziczą z tej klasy bazowej i w ten sposób rozszerzają jej funkcjonalność. Tym właśnie jest serwlet – niczym więcej. Jest to po prostu odpowiednik kodu PHP w języku Java, który jest również wykonywany na serwerze i do klienta wysyłana jest jedynie odpowiedź na żądanie przeglądarki internetowej w postaci strony internetowej. Wszystko.

Frameworki frontendowe dla sieci Web

Podtytuł jest skomplikowany i zazwyczaj piszą po prostu framework front-endowy lub nawet web muzzle , ale postanowiłem tutaj podkreślić, że mówiąc o frameworkach front-endowych mamy na myśli GUI do pracy z Javą poprzez przeglądarkę internetową. Te. tu znowu mowa o stronach internetowych w Javie, czyli tzw. o serwletach. Czym jest prawie każdy framework front-endowy, na przykład Apache Struts. Jest to po prostu zestaw klas rozszerzających klasę bazową Servlet. Nic więcej. Te. to po prostu inny sposób na utworzenie tego samego zwykłego serwletu. Tyle, że twórcy tego frameworka (czyli twórcy tej technologii) uznali, że dodanie przez nich klasy bazowej Servletz niektórymi metodami będzie dla programisty wygodniejsze niż mizerna funkcjonalność, jaką oferuje klasyczny serwlet firmy Sun/Oracle ma.

strony JSP

Niemal natychmiast twórcom koncepcji serwletu Java przyszedł do głowy kolejny pomysł. Ponieważ piszemy serwlet, którego zadaniem jest wysłanie strony HTML do klienta, to bardziej poprawne może być natychmiastowe napisanie tej strony HTML, a jeśli potrzebujesz jakiejś logiki w Javie, to po prostu wstaw ją bezpośrednio do html'a. Jeśli nie stanie się to jaśniejsze, pomocne może być sformułowanie: strona jsp jest odpowiednikiem strony php. Trudny? Potem wyjaśnię jeszcze raz. Co robimy pisząc stronę w PHP? Mamy statyczny HTML i kiedy potrzebujemy wstawić jakąkolwiek logikę w PHP, taką jak pętle i warunki, wstawiamy ją do treści tagu <?php … ?>. W jsp wszystko jest takie samo, tylko logika jest napisana w czystej Javie, której kod jest wstawiany w treść tagu <% … %>. Wróćmy jeszcze raz do koncepcji serwletu. Zasadniczo strona JSP jest serwletem, ale napisanym nieco inaczej. W zwykłym serwlecie piszemy metodę, która wykonuje pewną logikę i na podstawie jej wyników generuje stronę HTML dla klienta. Tyle, że po pewnym czasie twórcy serwletów zaczęli się zastanawiać: co jeśli w metodzie praktycznie nie ma logiki, a następuje prawie tylko utworzenie strony html, to czy nie byłoby łatwiej od razu zapisać stronę html w który zrobić minimalne wstawki kodu Java? Cóż, ostatnia rzecz dotycząca stron JSP. Przy pierwszym dostępie do takiej strony jest ona kompilowana do serwletu, a następnie wykonywana. Kolejne żądania do tej strony JSP będą szybsze, ponieważ zostanie już skompilowany i będzie wymagał jedynie wykonania.

Kontener serwletów

Napisaliśmy więc klasę serwletu lub stronę JSP. Co dalej? Jak wypchnąć je na serwer WWW, powiedzmy Apache, aby mógł wysłać je do przeglądarki internetowej użytkownika? Serwer WWW może wysyłać tylko kod HTML i jeśli nasza strona zawiera, powiedzmy, kod php, to serwer WWW najpierw przepuszcza stronę przez interpreter, który tłumaczy php na HTML, a dopiero potem wynik jest wysyłany do klienta. Mniej więcej to samo dzieje się z serwletami - przed wysłaniem muszą zostać wykonane, aby wygenerować stronę HTML, a kontener serwletów jest dokładnie tym, co odpowiada za wykonanie serwletów i kodu strony jsp. Te. Kontener serwletów dla Java jest odpowiednikiem modułu interpretera php na serwerze WWW. Zatem, gdy użytkownik wprowadza adres w przeglądarce internetowej, żądanie jest wysyłane do serwera WWW, serwer WWW rozpoznaje, że żądano serwletu i przekazuje żądanie do kontenera serwletu. Następnie kontener serwletu wykonuje serwlet, wysyła wynikową stronę HTML do serwera WWW, który z kolei zwraca ją do klienta. Czy kontener serwletu może działać samodzielnie, tj. bez serwera WWW? Coś takiego jak Tomcat zdecydowanie może. A jeśli chcemy stworzyć witrynę, która nie będzie miała żadnych innych stron HTML poza tymi opartymi na serwletach, to kontener servletów nam w zupełności wystarczy. Ale jeśli chcemy połączyć witrynę z serwletów i, powiedzmy, stron PHP, będziemy musieli zainstalować serwer WWW. Co więcej, nie wszystkie serwery internetowe mają domyślnie dołączony kontener serwletów, ale prawie wszystkie pozwalają na zainstalowanie go jako wtyczki. Dlatego jeśli będziemy chcieli uruchomić naszą stronę na jakimś hostingu w Internecie, na którym najprawdopodobniej działa Apache, wówczas będziemy musieli zapytać dostawcę, czy kontener serwletu jest podłączony.

JavaEE

Istnieje tak zwany JavaSE (Java Standard Edition). Koncepcja ta obejmuje wszystkie klasy java, do wykorzystania których wystarczy je zaimportować (na przykład java.util.Date) lub nawet nie trzeba tego robić (na przykład, Stringponieważ znajduje się w pakiecie java.lang). Jest też Java EE (Java Enterprise Edition). Klasy te również należą do Sun/Oracle, ale jedyną różnicą jest to, że trudniej jest zacząć ich używać w projekcie. Prosta linia import…nie wystarczy, bo... projekt nie zostanie skompilowany. Aby naprawić tę sytuację, musisz znaleźć plik biblioteki javaee.jar i dołączyć go do projektu. Można to zrobić poprzez właściwości projektu w środowisku programistycznym. Często mówi się, że ten proces połączenia nazywa się: zarejestruj pseudonim jar w ścieżce kompilacji lub ścieżce klas projektu.

Serwer aplikacji

Teraz wyobraź sobie, że skompilowaliśmy nasz projekt serwletu korzystający z Java EE. Wszystko jest świetnie, ale teraz musimy umieścić nasze skompilowane klasy w kontenerze serwletów. Powiedzmy, że to zrobili. Czy nasza aplikacja będzie działać? Odpowiedź brzmi nie. Podczas uzyskiwania dostępu do serwletu zostaną zgłoszone wyjątki wskazujące, że nie znaleziono niektórych klas. Dlaczego? Ponieważ „oszukaliśmy” kompilator wślizgując się javaee.jar в classpath, tj. kompilator zobaczył, że klasy z Java EE są na miejscu i uspokoił się, ale kontener serwletu nie widzi tych klas, ale widzi linki do nich z naszego serwletu. Czy tę sytuację można rozwiązać w kontenerze serwletów? Oczywiście tak, wystarczy dodać plik biblioteki javaee.jar do folderu z naszym serwletem w kontenerze serwletów . Teraz wyobraź sobie, że będzie wiele takich projektów i wszystkie będą działać w jednym kontenerze serwletów Tomcat. Oznacza to, że będziesz musiał skopiować ten plik jar do folderu każdego serwletu. Jest to niewygodne i niewłaściwe. Sytuację rozwiązano wprowadzając koncepcję serwera aplikacji, w którym plik ten od dawna znajduje się w jednej kopii, a wszystkie serwlety mają do niego dostęp, a nie mają własnej kopii. Moim zdaniem jest to bardzo wygodne i logiczne. Oczywiście całe zamieszanie nie jest spowodowane jednym plikiem jar (podałem go jako przykład) - takich plików jest wiele. Ale to nie wszystko, co dają nam serwery aplikacji. Same serwery aplikacji mogą utrzymywać połączenia z wieloma zasobami, na przykład bazą danych. W takim wypadku nasz serwlet może sam nie otworzyć takiego połączenia, lecz po prostu pobrać je z serwera aplikacji. W kontenerze serwletów jest to niemożliwe, ponieważ... kontener jest w pewnym stopniu uproszczonym serwerem aplikacji. W kontenerze serwlet musi zawsze tworzyć połączenia z samą bazą danych. Coś w tym stylu... archiwum wojenne Co to jest archiwum wojenne? WAR to archiwum internetowe. W rzeczywistości jest to po prostu plik zip, jak każdy słoik. Zasadniczo jest to po prostu sposób na umieszczenie naszej witryny internetowej, składającej się z wielu stron internetowych, stron JSP i klas serwletów, w jednym pliku ZIP. web.xml web.xml to tak zwany deskryptor wdrożenia. Jest to plik, który w głupi sposób opisuje, która linia żądania przeglądarki internetowej ma zostać wysłana do której klasy serwletu w celu przetworzenia, aby kontener serwletu nie został pomieszany i który serwlet jest za co odpowiedzialny. Generalnie w Javie bardzo modne jest opisywanie ustawień w różnego rodzaju plikach XML, jednak ostatnio pojawiła się tendencja do odchodzenia od tej tradycji. Jak, pytasz? I poprzez adnotacje. Same klasy adnotacyjne nic nie robią, zostały stworzone właśnie po to, aby opisywać wszelkiego rodzaju ustawienia (metadane) nie w osobnym pliku xml, ale bezpośrednio w kodzie. Bardzo wygodnie. Jednak teraz jest pewien etap pośredni, kiedy niektóre ustawienia są określone przez adnotacje, a inne przez XML, co może być mylące, ponieważ Patrzysz na plik XML i widzisz jedno ustawienie, ale zgodnie z adnotacjami jest inne. Który z nich ma najwyższy priorytet? Kto wie…

Wniosek

Po napisaniu tego pomyślałem, że taka szybka recenzja nikomu nie pomoże, bo... nie zawiera żadnych konkretów i przykładów, ale z drugiej strony nie wymazuje tego, co jest napisane, niech tak będzie.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION