Cycle de vie JSP : Phases et diagramme expliqués

⚡ Résumé intelligent

Le cycle de vie JSP décrit comment un conteneur traduit une page en un servlet, la compile, charge la classe, crée une instance, l'initialise, traite chaque requête via la méthode de service générée et la détruit enfin.

  • (I.e. Sept phases : La traduction, la compilation, le chargement des classes, l'instanciation, l'initialisation, le traitement des requêtes et la destruction s'exécutent dans cet ordre fixe.
  • 📄 Traduction: Le conteneur valide la page, puis écrit un Java Le fichier source, demo.jsp, devient demo_jsp.java avant toute exécution.
  • ⚙️ Compilation: Ce code source généré est compilé en demo_jsp.class, que Tomcat conserve dans son répertoire de travail aux côtés du fichier .java.
  • 🚀 Trois méthodes : jspInit() prépare la page une seule fois, _jspService() répond à chaque requête et jspDestroy() libère les ressources à la fin.
  • 🚫 Une seule règle : La fonction _jspService() est générée par le conteneur et ne doit jamais être modifiée ou redéfinie par l'auteur de la page.
  • 🇧🇷 Crochet de nettoyage : La surcharge de la méthode jspDestroy() est l'endroit approprié pour fermer les connexions à la base de données et ouvrir les fichiers.

Phases du cycle de vie JSP, de la traduction à la destruction

Qu'est-ce que le cycle de vie JSP ?

Cycle de vie des JSP On définit une servlet comme la traduction d'une page JSP en une servlet, car une page JSP doit être convertie en servlet avant de pouvoir traiter les requêtes de service. Son cycle de vie commence par la création de la JSP et se termine par la destruction de l'instance de servlet générée à partir de celle-ci.

Étant donné que la classe générée est une servlet ordinaire, tout ce que vous savez déjà sur les servlets s'applique.tracCela reste valable. Java C’est le code écrit par le conteneur qui s’exécute réellement ; le fichier JSP n’est que le code source que vous gérez.

Différentes phases du cycle de vie JSP

Lorsque le navigateur demande une page JSP, le moteur JSP vérifie d'abord s'il doit la compiler. Si la page JSP n'a jamais été compilée, ou si elle a été modifiée depuis la dernière compilation, le moteur JSP la compile.

Le processus de compilation d'une page JSP comprend trois étapes :

  • Analyse de JSP
  • Transformer JSP en servlet
  • Compilation de la servlet

Diagramme du cycle de vie JSP

Le cycle de vie JSP est illustré dans le diagramme ci-dessous, qui tracIl s'agit d'une seule page, du fichier source jusqu'à la classe exécutée par le conteneur.

Diagramme du cycle de vie JSP illustrant la traduction, la compilation, le chargement, l'instanciation, l'initialisation, le traitement des requêtes et la destruction

Les étapes suivantes expliquent le cycle de vie de JSP :

  1. Traduction de la page JSP
  2. Compilation de la page JSP (compilation de la page JSP en _jsp.java)
  3. Chargement des classes (_jsp.java est converti en fichier de classe _jsp.class)
  4. Instanciation (un objet du servlet généré est créé)
  5. Initialisation (la méthode jspInit() est invoquée par le conteneur)
  6. Traitement de la requête (la méthode _jspService() est invoquée par le conteneur)
  7. Détruire (la méthode jspDestroy() est invoquée par le conteneur)

Explication des phases du cycle de vie JSP

Examinons plus en détail chacun des points ci-dessus.

1) Traduction de la page JSP :

A Java Le fichier servlet est généré à partir d'un fichier source JSP. Il s'agit de la première étape du cycle de vie JSP. Lors de la phase de traduction, le conteneur vérifie la syntaxe correcte de la page JSP et des fichiers de balises.

  • Le conteneur JSP interprète les directives et actions standard, ainsi que les actions personnalisées faisant référence aux bibliothèques de balises (elles font toutes partie de la page JSP et sont traitées dans la documentation). Éléments JSP tutoriel) utilisé dans cette page JSP.
  • Dans la description illustrée ci-dessus, demo.jsp est traduit en demo_jsp.java lors de la première étape.

Prenons l’exemple du fichier « demo.jsp », comme indiqué ci-dessous :

Démo.jsp

<html>
<head>
<title>Demo JSP</title>
</head>
<%
int demvar=0;%>
<body>
Count is:
<% Out.println(demovar++); %>
<body>
</html>

Remarque concernant l'annonce ci-dessus : Il est reproduit exactement tel que publié afin de correspondre à la capture d'écran du servlet généré ci-dessous. Deux fautes d'orthographe qu'il contient ne compileront pas s'ils sont copiés mot pour mot : la variable est déclarée comme demvar mais imprimé comme demovar, et l'objet de sortie implicite est out en minuscules, pas OutVeuillez corriger les deux avant d'exécuter la page vous-même.

Code Explication du fichier Demo.jsp

Code Ligne 1 : balise d'ouverture HTML

Code Ligne 2 : Étiquette d'en-tête

Code Lignes 3 et 4 : Balise titre (par exemple, Demo JSP) et balise de fermeture <head>

Code Lignes 5 et 6 : Balise scriptlet dans laquelle la variable demo est initialisée

Code Lignes 7 à 8 : Dans la balise body, un texte à imprimer dans la sortie (Nombre : )

Code Ligne 9 : Balise scriptlet où l’on tente d’afficher la variable demovar avec sa valeur incrémentée

Code Lignes 10 et 11 : Balises body et HTML fermées

La page JSP de démonstration est convertie en servlet demo_jsp, comme indiqué dans le code ci-dessous.

Le code source du servlet demo_jsp.java a été généré à partir de demo.jsp lors de la traduction.

Code Explication du fichier Demo_jsp.java

Code Ligne 1 : La classe Servlet demo_jsp étend la classe parente HttpServlet

Code Lignes 2 et 3 : Surcharge de la méthode de service JSP, c’est-à-dire _jspService, qui prend comme paramètres les objets HttpServletRequest et HttpServletResponse

Code Ligne 4 : Méthode d'ouverture

Code Ligne 5 : Appel de la méthode getWriter() de l'objet de réponse pour obtenir un PrintWriter objet (imprime une représentation formatée des objets dans un flux de sortie texte)

Code Ligne 6 : Appel de la méthode setContentType de l’objet de réponse pour définir le type de contenu

Code Ligne 7 : Utilisation de la méthode write() de l’impressionWriter objet pour analyser le HTML

Code Ligne 8 : Initialisation de la variable demovar à 0

Code Ligne 9 : Appel de la méthode write() de l’impressionWriter objet pour analyser le texte

Code Ligne 10 : Appel de la méthode print() de l’imprimanteWriter L'objet est d'incrémenter la variable demovar de 0 + 1 = 1. Par conséquent, la sortie sera 1.

Code Ligne 11 : Utilisation de la méthode write() de l’impressionWriter objet pour analyser le HTML

Sortie :

Le navigateur affiche ensuite le compteur, comme le montre la capture d'écran ci-dessous.

Affichage du navigateur pour demo.jsp : Nombre : 1

  • Ici, vous pouvez voir que sur la capture d'écran, la sortie est 1, car la variable demvar est initialisée à 0 puis incrémentée à 0 + 1 = 1

Dans l'exemple ci-dessus,

  • Le fichier demo.jsp est une page JSP dans laquelle une variable est initialisée et incrémentée. Cette page JSP est ensuite convertie en servlet (demo_jsp.class), où le moteur JSP charge la page JSP et la convertit en contenu servlet.
  • Lors de la conversion, tout le texte du modèle est converti en instructions println() et tous les éléments JSP sont convertis en Java code.

C'est ainsi qu'une simple page JSP est traduite en une classe de servlet.

2) Compilation de la page JSP

  • Le généré Java Le fichier servlet est compilé en un Java classe de servlet
  • La traduction de Java La conversion de la page source en sa classe d'implémentation peut se produire à tout moment entre le déploiement de la page JSP dans le conteneur et le traitement de la page JSP.
  • Dans la description illustrée ci-dessus, demo_jsp.java est compilé en un fichier de classe demo_jsp.class
  • Sur Apache Tomcat, les deux artefacts sont écrits dans le répertoire de travail du serveur, dans work/Catalina/localhost/<app>/org/apache/jsp, qui est le premier endroit à consulter lorsqu'il faut diagnostiquer une erreur de traduction

3) Chargement de classe

  • La classe de servlet générée à partir du code source JSP est maintenant chargée dans le conteneur.

4) Instanciation

  • Dans cette étape, l'objet, c'est-à-dire l'instance de la classe, est généré.
  • Le conteneur gère une ou plusieurs instances de cette classe en réponse aux requêtes et autres événements. Généralement, un conteneur JSP est construit à l'aide d'un conteneur de servlets. Un conteneur JSP est une extension d'un conteneur de servlets, car les deux prennent en charge JSP et les servlets.
  • L'interface JspPage, fournie par le conteneur, déclare les méthodes jspInit() et jspDestroy().
  • L'interface HttpJspPage gère les requêtes HTTP et contient la méthode de service correspondante. Sa signature dépend du protocole ; c'est pourquoi le conteneur la génère automatiquement au lieu de demander à l'auteur de la page de la déclarer.

5) Initialisation

public void jspInit()
{
	//initializing the code
}
  • La méthode jspInit() initialise l'instance de servlet générée à partir du JSP et est invoquée par le conteneur dans cette phase.
  • Une fois l'instance créée, la méthode d'initialisation est immédiatement appelée.
  • Elle n'est appelée qu'une seule fois au cours du cycle de vie d'une JSP, et la méthode d'initialisation est déclarée comme indiqué ci-dessus.

6) Traitement des demandes

void _jspservice(HttpServletRequest request HttpServletResponse response)
{
	//handling all request and responses
}
  • La méthode _jspService() est invoquée par le conteneur pour toutes les requêtes émises par la page JSP au cours de son cycle de vie.
  • Pour cette phase, la page doit passer par toutes les phases précédentes, et ce n'est qu'ensuite que la méthode de service peut être invoquée.
  • Il transmet les objets de requête et de réponse
  • Cette méthode ne peut pas être surchargée, car le conteneur l'écrit lors de la traduction.
  • La méthode est présentée ci-dessus. Elle gère toutes les méthodes HTTP, c'est-à-dire GET, POST, etc.

7) Détruire

public void _jspdestroy()
{
            //all clean up code
}
  • La méthode jspDestroy() est également appelée par le conteneur
  • Cette méthode est appelée lorsque le conteneur décide qu'il n'a plus besoin de l'instance de servlet pour traiter les requêtes.
  • Une fois l'appel à la méthode destroy effectué, la servlet est prête pour le ramasse-miettes.
  • C'est la fin du cycle de vie.
  • Nous pouvons redéfinir la fonction jspDestroy() lors de toute opération de nettoyage, comme la libération des connexions à la base de données ou la fermeture des fichiers ouverts.

Une précision importante à retenir concernant la dénomination : à partir de Jakarta EE 9, ces types vivent dans le jakarta.servlet.jsp paquet plutôt que javax.servlet.jspLes importations plus anciennes doivent donc être mises à jour lorsqu'une application est déplacée vers un serveur actuel.

FAQ

Le cycle de vie est identique après la traduction. Une JSP ajoute deux phases en amont : la traduction et la compilation, qui transforment la page en un fichier source et une classe de servlet. À partir du chargement des classes, la servlet…tract s'applique sans modification.

Dans le répertoire de travail du serveur, dans work/Catalina/localhost/ /org/apache/jsp. Le fichier source .java généré et le fichier .class compilé se trouvent tous deux dans ce répertoire ; ainsi, home.jsp devient home_jsp.java et home_jsp.class.

Le conteneur la génère à partir du corps de la page lors de la traduction. Sa signature dépendant du protocole de requête, la spécification l'exclut de l'interface JspPage et interdit aux auteurs de pages de la déclarer eux-mêmes.

La servlet générée implémente déjà la méthode `init()` pour stocker sa configuration `ServletConfig`, puis appelle `jspInit()`. Les auteurs de pages redéfinissent `jspInit()` afin que la configuration du conteneur ne soit jamais ignorée, ce qui est précisément le risque qu'entraîne une redéfinition manuelle de `init()`.

La précompilation traduit et compile chaque page lors de la compilation ou du déploiement, et non à la première requête. Elle supprime le délai de première utilisation, détecte les erreurs de traduction avant la mise en production et permet un déploiement sans compilateur sur le serveur.

Il reste pris en charge en tant que Jakarta Server Pages. Le principal changement concerne l'espace de noms des packages : depuis Jakarta EE 9, l'API est passée de javax.servlet.jsp à jakarta.servlet.jsp ; par conséquent, les importations héritées doivent être réécrites avant d'être exécutées sur un serveur actuel.

Les assistants IA lisent la pile _jsp.java générée tracIls permettent d'associer une erreur de compilation à la ligne de script incriminée, ce qui représente la partie la plus complexe du traitement des erreurs de traduction. Ils signalent également les scripts qui devraient figurer dans un fichier de balises ou une servlet.

Oui. Copilot génère des scriptlets, des blocs JSTL, gère les formulaires et fait correspondre les classes de servlet à partir d'un commentaire. RevConsultez la sortie pour l'espace de noms du package jakarta et pour les scriptlets qui devraient être en langage d'expression, car les suggestions suivent souvent d'anciens tutoriels.

Résumez cet article avec :