JavaRush /Java-Blog /Random-DE /Ohne Pathos. Lassen Sie uns über Java EE, Servlets und ih...
eGarmin
Level 41

Ohne Pathos. Lassen Sie uns über Java EE, Servlets und ihre Container sprechen

Veröffentlicht in der Gruppe Random-DE
In diesem Thema möchte ich offen über mein Verständnis von Servlets sprechen, was Servlet-Container sind, was die meisten, wenn nicht alle Web-Front-End-Frameworks sind, und auch das Thema ansprechen, wie Servlet-Container und Anwendungsserver zusammenhängen untereinander sowie Servlet- und Webserver-Container. Ohne Pathos.  Lassen Sie uns über Java EE, Servlets und ihre Container sprechen – 1Bevor ich mit dem Gespräch beginne, möchte ich anmerken, dass ich wirklich davon ausgehe, dass es zu einer Diskussion kommen wird, denn... Hier möchte ich keinen einzelnen Codeabschnitt nennen, sondern nur das Wesentliche ansprechen, das immer in Worten ausgedrückt werden kann. Ich werde versuchen, alle Punkte zu skizzieren, die mir zu Beginn nicht klar waren. Als ich in verschiedenen Foren Fragen zum Thema stellte, wie sich der Tomcat-Servlet-Container von jedem Anwendungsserver, sagen wir WebSphere oder Geronimo, unterscheidet, waren die einzigen Leute, die es wagten zu antworten, Arschlöcher, die nichts anderes sagen konnten als „Schau dir Wikipedia an“ oder „ Es ist schwer zu sagen, Serveranwendungen – das ist eine komplexe Infrastruktur für Unternehmensanwendungen, die…“ bla bla bla. Ich kann solche Leute nicht ausstehen, und ich vermute, die meisten von euch auch nicht. Wir werden historisches Unrecht korrigieren. Gehen…

Servlets

Egal, was jemand sagt, ein Servlet ist eine in Java geschriebene Webseite. Einige werden sagen, dass ich falsch liege und dass ein Servlet eine Webanwendung ist und dass es einen Unterschied in diesen Konzepten gibt, aber das ist nicht so. Jetzt gibt es keinen Unterschied mehr und in PHP geschriebene Websites können auch sicher als Webanwendungen bezeichnet werden. Das ist völlig natürlich, denn... PHP unterstützt OOP vollständig und CMS wie Joomla nutzen dies aktiv. Was ist ein Servlet auf Codeebene? Dies ist eine Klasse mit einer Reihe von Methoden, die in den Ruhezustand versetzt werden und prüfen, ob jemand über GET- oder POST-HTTP-Anfragen auf sie zugreift. Diese. Wir haben eine GET-Anfrage in den Browser eingegeben, die entsprechende Methode der Servlet-Klasse akzeptiert diese und generiert dann eine Antwort darauf in Form einer HTML-Seite. Im klassischen Sinne eines Servlets, wie es von Sun konzipiert wurde, wurde diese Seite Zeile für Zeile an den Client gesendet, beginnend mit der Zeile <!DOCTYPE htm>> und endend mit der Zeile </html>. In Java gibt es also eine grundlegende Servlet-Klasse namens Servlet. Darüber hinaus gibt es eine Reihe weiterer Klassen, die von dieser Basisklasse erben und dadurch deren Funktionalität erweitern. Das ist ein Servlet – mehr nicht. Es handelt sich lediglich um ein Java-Analogon von PHP-Code, der ebenfalls auf dem Server ausgeführt wird und nur die Antwort auf die Anfrage des Webbrowsers in Form einer Webseite an den Client gesendet wird. Alle.

Web-Frontend-Frameworks

Der Untertitel ist kompliziert und normalerweise schreiben sie nur „ Front-End-Framework“ oder sogar „Web Muzzle“ , aber ich möchte hier betonen, dass wir, wenn wir über Front-End-Frameworks sprechen, über eine GUI für die Arbeit mit Java über einen Webbrowser sprechen. Diese. Auch hier handelt es sich wieder um Websites in Java, d.h. über Servlets. Was ist fast jedes Front-End-Framework, zum Beispiel Apache Struts? Es handelt sich lediglich um eine Reihe von Klassen, die die Basisklasse erweitern Servlet. Nichts mehr. Diese. Es ist lediglich eine andere Möglichkeit, dasselbe reguläre Servlet zu erstellen. Es ist nur so, dass die Entwickler dieses Frameworks (oder mit anderen Worten die Entwickler dieser Technologie) der Meinung waren, dass die Hinzufügung der Basisklasse Servletmit einigen Methoden für den Programmierer praktischer wäre als die dürftige Funktionalität des klassischen Servlets von Sun/Oracle hat.

JSP-Seiten

Fast sofort kam den Entwicklern des Java-Servlet-Konzepts eine andere Idee in den Sinn. Da wir ein Servlet schreiben, dessen Aufgabe darin besteht, eine HTML-Seite an den Client zu senden, ist es möglicherweise richtiger, diese HTML-Seite sofort zu schreiben. Wenn Sie eine Art Logik in Java benötigen, fügen Sie sie einfach direkt ein in den HTML-Code. Wenn es nicht klarer wird, kann der Satz helfen: Eine JSP-Seite ist ein Analogon einer PHP-Seite. Schwierig? Dann erkläre ich es noch einmal. Was machen wir, wenn wir eine Seite in PHP schreiben? Wir haben statisches HTML, und wenn wir Logik wie Schleifen und Bedingungen in PHP einfügen müssen, fügen wir sie in den Textkörper des Tags ein <?php … ?>. Bei JSP ist alles beim Alten, lediglich die Logik ist in reinem Java geschrieben, deren Code in den Body des Tags eingefügt wird <% … %>. Kehren wir noch einmal zum Konzept eines Servlets zurück. Im Wesentlichen ist eine JSP-Seite ein Servlet, jedoch etwas anders geschrieben. In einem regulären Servlet schreiben wir eine Methode, die eine gewisse Logik ausführt und basierend auf ihren Ergebnissen eine HTML-Seite für den Client generiert. Es ist nur so, dass die Servlet-Entwickler nach einiger Zeit darüber nachdachten: Was wäre, wenn es praktisch keine Logik in der Methode gäbe und fast nur die Bildung einer HTML-Seite erfolgt, wäre es dann nicht einfacher, sofort eine HTML-Seite hineinzuschreiben? Welchen Code soll ich mit minimalen Java-Einfügungen erstellen? Nun, noch eine letzte Sache zu JSP-Seiten. Beim ersten Zugriff auf eine solche Seite wird diese in ein Servlet kompiliert und dann ausgeführt. Nachfolgende Anfragen an diese JSP-Seite werden schneller sein, weil Es ist bereits kompiliert und muss nur noch ausgeführt werden.

Servlet-Container

Also haben wir eine Servlet-Klasse oder eine JSP-Seite geschrieben. Was weiter? Wie kann man sie auf einen Webserver, beispielsweise Apache, übertragen, damit dieser sie an den Webbrowser des Benutzers senden kann? Der Webserver kann nur HTML senden, und wenn unsere Seite beispielsweise PHP-Code enthält, leitet der Webserver die Seite zunächst durch einen Interpreter, der PHP in HTML übersetzt, und erst dann wird das Ergebnis an den Client gesendet. Etwa das Gleiche passiert mit Servlets – vor dem Senden müssen sie ausgeführt werden, damit die HTML-Seite generiert werden kann, und der Servlet-Container ist genau das, was für die Ausführung von Servlets und JSP-Seitencode verantwortlich ist. Diese. Ein Servlet-Container für Java ist ein Analogon des PHP-Interpreter-Moduls in einem Webserver. Wenn der Benutzer also eine Adresse im Webbrowser eingibt, wird die Anfrage an den Webserver gesendet. Der Webserver erkennt, dass ein Servlet angefordert wird, und leitet die Anfrage an den Servlet-Container weiter. Danach führt der Servlet-Container das Servlet aus und sendet die resultierende HTML-Seite an den Webserver, der sie wiederum an den Client zurückgibt. Kann ein Servlet-Container eigenständig laufen, d. h. ohne Webserver? So etwas wie Tomcat kann es definitiv. Und wenn wir eine Site erstellen möchten, die außer denen, die auf Servlets basieren, keine anderen HTML-Seiten enthält, dann reicht uns ein Servlet-Container völlig aus. Wenn wir jedoch eine Site aus Servlets und beispielsweise PHP-Seiten kombinieren möchten, müssen wir einen Webserver installieren. Darüber hinaus verfügen nicht alle Webserver standardmäßig über einen Servlet-Container, aber fast alle ermöglichen die Installation als Plugin. Wenn wir also unsere Website auf einem Hosting im Internet starten möchten, auf dem höchstwahrscheinlich Apache läuft, müssen wir den Anbieter fragen, ob der Servlet-Container angeschlossen ist.

Java EE

Es gibt das sogenannte JavaSE (Java Standard Edition). Dieses Konzept umfasst alle Klassen java, für deren Nutzung wir sie nur importieren müssen (z. B. java.util.Date) oder dies auch nicht tun müssen (z. B. Stringweil sie sich im Paket befinden java.lang). Und es gibt Java EE (Java Enterprise Edition). Diese Klassen gehören ebenfalls zu Sun/Oracle, der einzige Unterschied besteht jedoch darin, dass es schwieriger ist, sie in einem Projekt zu verwenden. Eine einfache Zeile import…wird nicht ausreichen, denn... Das Projekt lässt sich nicht kompilieren. Um die Situation zu beheben, müssen Sie die Bibliotheksdatei javaee.jar finden und in das Projekt einbinden. Dies kann über die Projekteigenschaften in der Entwicklungsumgebung erfolgen. Es wird oft gesagt, dass dieser Verbindungsprozess so genannt wird: Registrieren Sie einen JAR-Spitznamen im Build-Pfad oder Klassenpfad des Projekts.

Anwendungsserver

Stellen Sie sich nun vor, wir hätten unser Servlet-Projekt kompiliert, das Java EE verwendet. Alles ist großartig, aber wir müssen jetzt unsere kompilierten Klassen in einem Servlet-Container platzieren. Nehmen wir an, sie haben es getan. Funktioniert unsere Bewerbung? Die Antwort ist nein. Beim Zugriff auf das Servlet werden Ausnahmen ausgelöst, die darauf hinweisen, dass einige Klassen nicht gefunden wurden. Warum? Weil wir den Compiler durch Ausrutschen „getäuscht“ haben javaee.jar в classpath, d.h. Der Compiler hat gesehen, dass die Klassen von Java EE vorhanden waren, und hat sich beruhigt, aber der Servlet-Container sieht diese Klassen nicht, aber er sieht Links zu ihnen von unserem Servlet. Ist diese Situation innerhalb eines Servlet-Containers lösbar? Natürlich ja, Sie müssen nur die Bibliotheksdatei javaee.jar zum Ordner mit unserem Servlet im Servlet-Container hinzufügen . Stellen Sie sich nun vor, dass es viele solcher Projekte geben wird und sie alle in einem Tomcat-Servlet-Container laufen. Das bedeutet, dass Sie diese JAR-Datei in den Ordner jedes Servlets kopieren müssen. Das ist unbequem und falsch. Die Situation wurde durch die Einführung des Konzepts eines Anwendungsservers gelöst, bei dem sich diese Datei seit langem in einer einzigen Kopie befindet und alle Servlets darauf zugreifen können und keine eigene Kopie haben. Meiner Meinung nach ist es sehr praktisch und logisch. Natürlich ist die ganze Aufregung nicht auf eine einzige JAR-Datei zurückzuführen (ich habe sie als Beispiel angegeben) – es gibt viele solcher Dateien. Aber das ist noch nicht alles, was uns Anwendungsserver bieten. Anwendungsserver selbst können Verbindungen zu vielen Ressourcen aufrechterhalten, beispielsweise einer Datenbank. In diesem Fall öffnet unser Servlet eine solche Verbindung möglicherweise nicht selbst, sondern übernimmt sie einfach vom Anwendungsserver. In einem Servlet-Container ist dies unmöglich, weil... Ein Container ist gewissermaßen ein abgespeckter Anwendungsserver. In einem Container muss ein Servlet immer Verbindungen zur Datenbank selbst herstellen. So etwas in der Art... Kriegsarchiv Was ist ein Kriegsarchiv? WAR ist ein Webarchiv. Tatsächlich ist es nur eine ZIP-Datei, wie jedes JAR. Im Grunde ist dies nur eine Möglichkeit, unsere Website, die aus vielen Webseiten, JSP-Seiten und Servlet-Klassen besteht, in eine ZIP-Datei zu packen. web.xml web.xml ist der sogenannte Deployment-Deskriptor. Dies ist eine Datei, die dummerweise beschreibt, welche Webbrowser-Zeilenanforderung zur Verarbeitung an welche Servlet-Klasse gesendet werden soll, damit der Servlet-Container nicht verwirrt wird, welches Servlet wofür verantwortlich ist. Im Allgemeinen ist es in Java sehr in Mode, Einstellungen in allen Arten von XML-Dateien zu beschreiben, aber in letzter Zeit gibt es eine Tendenz, von dieser Tradition abzuweichen. Wie, fragen Sie? Und durch Anmerkungen. Annotationsklassen selbst bewirken nichts; sie wurden nur erstellt, um alle möglichen Einstellungen (Metadaten) zu beschreiben, nicht in einer separaten XML-Datei, sondern direkt im Code. Sehr bequem. Allerdings gibt es jetzt eine gewisse Zwischenstufe, in der einige Einstellungen durch Annotationen und andere durch XML angegeben werden, und das kann verwirrend sein, weil Sie sehen sich die XML-Datei an und sehen eine Einstellung, den Anmerkungen zufolge gibt es jedoch eine andere. Welches hat die höchste Priorität? Wer weiß…

Abschluss

Nachdem ich dies geschrieben hatte, dachte ich, dass eine so kurze Rezension niemandem helfen würde, weil... enthält keine Einzelheiten und keine Beispiele, aber andererseits lösche nicht das Geschriebene, also lass es sein.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION