JavaRush /Blog Java /Random-FR /Sans pathos. Parlons de Java EE, des servlets et de leurs...
eGarmin
Niveau 41

Sans pathos. Parlons de Java EE, des servlets et de leurs conteneurs

Publié dans le groupe Random-FR
Dans ce sujet, je voudrais parler franchement de ma compréhension des servlets, de ce que sont les conteneurs de servlets, de la plupart, sinon de la totalité, des frameworks frontaux Web, et également aborder le sujet de la relation entre les conteneurs de servlets et les serveurs d'applications. entre eux, ainsi que les conteneurs de servlets et de serveurs Web. Sans pathos.  Parlons de Java EE, des servlets et de leurs conteneurs - 1Avant d'entamer la conversation, je tiens à souligner que je m'attends vraiment à ce qu'il y ait une discussion, parce que... Ici, je ne veux pas donner un seul morceau de code, mais je veux juste aborder l'essence, qui peut toujours être énoncée avec des mots. Je vais essayer de souligner tous ces points qui ne m'étaient pas clairs au début. Lorsque j'ai posé des questions sur divers forums sur la différence entre le conteneur de servlet Tomcat et n'importe quel serveur d'applications, par exemple WebSphere ou Geronimo, les seules personnes qui ont osé répondre étaient des connards qui ne pouvaient rien dire d'autre que « regardez Wikipédia » ou « c'est difficile à dire, les applications serveur - il s'agit d'une infrastructure complexe pour les applications d'entreprise, qui..." bla bla bla. Je ne supporte pas les gens comme ça et je suppose que la plupart d’entre vous non plus. Nous corrigerons l’injustice historique. Aller…

Servlets

Quoi qu’on en dise, une servlet est une page Web écrite en Java. Certains diront que je me trompe et qu’une servlet est une application web et qu’il y a une différence dans ces concepts, mais ce n’est pas le cas. Désormais, il n'y a plus de différence et les sites écrits en PHP peuvent également être appelés applications Web en toute sécurité. Maintenant, c'est tout à fait naturel, parce que... php prend entièrement en charge la POO et les CMS tels que Joomla l'utilisent activement. Qu'est-ce qu'une servlet au niveau du code ? Il s'agit d'une classe qui possède un certain nombre de méthodes qui dorment et voient si quelqu'un y accède via des requêtes HTTP GET ou POST. Ceux. Nous avons tapé une requête GET dans le navigateur, la méthode correspondante de la classe servlet l'accepte puis génère une réponse sous la forme d'une page HTML. Au sens classique d'une servlet, telle qu'elle a été conçue par Sun, cette page était envoyée au client ligne par ligne, en commençant par la ligne <!DOCTYPE htm>> et en terminant par la ligne </html>. Ainsi, en Java, il existe une classe de servlet de base appelée Servlet. De plus, de nombreuses autres classes héritent de cette classe de base et étendent ainsi ses fonctionnalités. C'est ce qu'est une servlet - rien de plus. Il s'agit simplement d'un analogue Java du code PHP, qui est également exécuté sur le serveur, et seule la réponse à la demande du navigateur Web sous la forme d'une page Web est envoyée au client. Tous.

Frameworks front-end Web

Le sous-titre est compliqué et ils écrivent généralement simplement un framework front-end ou même un museau Web , mais j'ai décidé de souligner ici que lorsque nous parlons de frameworks front-end, nous parlons d'une interface graphique pour travailler avec Java via un navigateur Web. Ceux. là encore, nous parlons de sites Web en Java, c'est-à-dire à propos des servlets. Qu'est-ce que presque n'importe quel framework front-end, par exemple Apache Struts. Il s'agit simplement d'un ensemble de classes qui étendent la classe de base Servlet. Rien de plus. Ceux. c'est juste une façon différente de créer le même servlet régulier. C'est juste que les développeurs de ce framework (ou en d'autres termes, les développeurs de cette technologie) considéraient que leur ajout de la Servletclasse de base avec certaines méthodes serait plus pratique pour le programmeur que les maigres fonctionnalités que propose la servlet classique de Sun/Oracle. a.

Pages JSP

Presque immédiatement, une autre idée est venue à l'esprit des développeurs du concept de servlet Java. Puisque nous écrivons un servlet dont la tâche est d'envoyer une page html au client, il serait peut-être plus correct d'écrire immédiatement cette page html, et si vous avez besoin d'une sorte de logique en Java, insérez-la simplement directement dans le HTML. Si cela ne devient pas plus clair, alors la phrase peut aider : une page jsp est un analogue d’une page php. Difficile? Ensuite, je vais vous expliquer à nouveau. Que fait-on lorsqu’on écrit une page en PHP ? Nous avons du HTML statique, et lorsque nous devons insérer une logique en PHP telle que des boucles et des conditions, nous l'insérons dans le corps de la balise <?php … ?>. Avec jsp tout est pareil, seule la logique est écrite en Java pur, dont le code est inséré dans le corps de la balise <% … %>. Revenons encore une fois au concept de servlet. Essentiellement, une page JSP est un servlet, mais écrit légèrement différemment. Dans une servlet classique, nous écrivons une méthode qui exécute une certaine logique et, sur la base de ses résultats, génère une page HTML pour le client. C'est juste qu'après un certain temps, les développeurs de servlets ont commencé à penser : et s'il n'y avait pratiquement aucune logique dans la méthode et que presque seule la formation d'une page html se produisait, alors ne serait-il pas plus facile d'écrire immédiatement une page html dans lequel faire un minimum d'insertions Java ? Eh bien, une dernière chose à propos des pages jsp. Lors du premier accès à une telle page, elle est compilée dans un servlet puis exécutée. Les requêtes ultérieures sur cette page jsp seront plus rapides car il sera déjà compilé et devra seulement être exécuté.

Conteneur de servlets

Nous avons donc écrit une classe de servlet ou une page JSP. Et après? Comment les transmettre à un serveur Web, par exemple Apache, afin qu'il puisse les envoyer au navigateur Web de l'utilisateur ? Le serveur Web ne peut envoyer que du HTML, et si notre page a, par exemple, du code php, alors le serveur Web transmet d'abord la page via un interpréteur qui traduit php en html, et ensuite seulement le résultat est envoyé au client. La même chose se produit avec les servlets - avant l'envoi, ils doivent être exécutés pour que la page HTML soit générée, et le conteneur de servlets est exactement la chose qui est responsable de l'exécution des servlets et du code de la page jsp. Ceux. Un conteneur de servlet pour Java est un analogue du module interpréteur PHP dans un serveur Web. Ainsi, lorsque l'utilisateur saisit une adresse dans le navigateur Web, la requête est envoyée au serveur Web, le serveur Web comprend qu'un servlet est demandé et transmet la requête au conteneur de servlet. Après cela, le conteneur de servlet exécute le servlet, envoie la page HTML résultante au serveur Web, qui, à son tour, la renvoie au client. Un conteneur de servlet peut-il fonctionner seul, c'est-à-dire sans serveur web ? Quelque chose comme Tomcat le peut certainement. Et si nous voulons créer un site qui n'aura pas d'autres pages html que celles basées sur des servlets, alors un conteneur de servlets nous suffit amplement. Mais si nous voulons combiner un site à partir de servlets et, disons, de pages PHP, nous devrons alors installer un serveur Web. De plus, tous les serveurs Web n'ont pas de conteneur de servlets inclus par défaut, mais presque tous vous permettent de l'installer en tant que plugin. Par conséquent, si nous souhaitons lancer notre site Web sur un hébergement sur Internet, où Apache s'exécute probablement, nous devrons alors demander au fournisseur si le conteneur de servlet est connecté.

JavaEE

Il existe ce qu'on appelle JavaSE (Java Standard Edition). Ce concept inclut toutes les classes java, pour l'utilisation desquelles il suffit de les importer (par exemple, java.util.Date) ou même de ne pas le faire (par exemple, Stringpuisqu'elles se trouvent dans le package java.lang). Et il existe Java EE (Java Enterprise Edition). Ces classes appartiennent également à Sun/Oracle, mais la seule différence est qu'elles sont plus difficiles à utiliser dans un projet. Une simple ligne import…ne suffira pas, car... le projet ne sera pas compilé. Afin de corriger la situation, vous devrez trouver le fichier de bibliothèque javaee.jar et l'inclure dans le projet. Cela peut être fait via les propriétés du projet dans l'environnement de développement. On dit souvent que ce processus de connexion s'appelle : enregistrer un pseudo jar dans le chemin de construction ou le chemin de classe du projet.

Serveur d'applications

Imaginez maintenant que nous ayons compilé notre projet de servlet qui utilise Java EE. Tout va bien, mais nous devons maintenant placer nos classes compilées dans un conteneur de servlet. Disons qu'ils l'ont fait. Notre application fonctionnera-t-elle ? La réponse est non. Lors de l'accès au servlet, des exceptions seront levées indiquant que certaines classes n'ont pas été trouvées. Pourquoi? Parce que nous avons « trompé » le compilateur en glissant javaee.jar в classpath, c'est-à-dire le compilateur a vu que les classes de Java EE étaient en place et s'est calmé, mais le conteneur de servlet ne voit pas ces classes, mais il voit les liens vers elles depuis notre servlet. Cette situation peut-elle être résolue dans un conteneur de servlet ? Bien sûr, oui, il vous suffit d'ajouter le fichier de bibliothèque javaee.jar au dossier contenant notre servlet dans le conteneur de servlet . Imaginez maintenant qu'il y aura de nombreux projets de ce type et qu'ils s'exécuteront tous dans un seul conteneur de servlet Tomcat. Cela signifie que vous devrez copier ce fichier jar dans le dossier de chaque servlet. C’est gênant et erroné. La situation a été résolue en introduisant le concept de serveur d'applications, dans lequel ce fichier a longtemps été en une seule copie, et toutes les servlets peuvent y accéder et ne pas avoir leur propre copie. À mon avis, c'est très pratique et logique. Naturellement, tout ce bruit n'est pas dû à un seul fichier jar (je l'ai donné comme exemple) - il existe de nombreux fichiers de ce type. Mais ce n’est pas tout ce que les serveurs d’applications nous offrent. Les serveurs d'applications eux-mêmes peuvent maintenir des connexions à de nombreuses ressources, par exemple une base de données. Dans ce cas, notre servlet ne peut pas ouvrir elle-même une telle connexion, mais simplement la récupérer auprès du serveur d'applications. Dans un conteneur de servlet, c'est impossible, car... un conteneur est, dans une certaine mesure, un serveur d'applications allégé. Dans un conteneur, une servlet doit toujours créer des connexions à la base de données elle-même. Quelque chose comme ça... war-archive Qu'est-ce qu'une war-archive ? WAR est une archive Web. En fait, c'est juste un fichier zip, comme n'importe quel fichier jar. Fondamentalement, il s'agit simplement d'un moyen de regrouper notre site Web, composé de nombreuses pages Web, pages jsp et classes de servlet, dans un seul fichier zip. web.xml web.xml est ce qu'on appelle le descripteur de déploiement. Il s'agit d'un fichier qui décrit bêtement quelle demande de ligne de navigateur Web envoyer à quelle classe de servlet pour traitement, afin que le conteneur de servlet ne soit pas confus, quelle servlet est responsable de quoi. En général, en Java, il est très à la mode de décrire les paramètres de toutes sortes de fichiers XML, mais récemment, on a eu tendance à s'éloigner de cette tradition. Comment, demandez-vous ? Et grâce aux annotations. Les classes d'annotation elles-mêmes ne font rien ; elles ont été créées uniquement pour décrire toutes sortes de paramètres (métadonnées) non pas dans un fichier XML séparé, mais directement dans le code. Très confortablement. Cependant, il existe désormais une certaine étape intermédiaire, lorsque certains paramètres sont spécifiés par des annotations et d'autres par XML, ce qui peut prêter à confusion, car Vous regardez le XML et voyez un paramètre, mais selon les annotations, il y en a un autre. Lequel a la plus haute priorité ? Qui sait…

Conclusion

Après avoir écrit ceci, j'ai pensé qu'un examen aussi rapide n'aiderait personne, car... ne contient aucun détail ni aucun exemple, mais d'un autre côté, n'effacez pas ce qui est écrit, qu'il en soit ainsi.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION