Ciclul de viață JSP: Faze și diagramă explicate

⚡ Rezumat inteligent

Ciclul de viață JSP descrie modul în care un container traduce o pagină într-un servlet, o compilează, încarcă clasa, creează o instanță, o inițializează, deservește fiecare cerere prin metoda de serviciu generată și, în final, o distruge.

  • 🔄 Șapte faze: Traducerea, compilarea, încărcarea claselor, instanțierea, inițializarea, procesarea cererilor și distrugerea se desfășoară în acea ordine fixă.
  • 📄 Traducere: Containerul validează pagina, apoi scrie un Java fișierul sursă, astfel încât demo.jsp devine demo_jsp.java înainte de a se executa orice.
  • ⚙️ Compilare: Codul sursă generat se compilează în fișierul demo_jsp.class, pe care Tomcat îl păstrează în directorul său de lucru, alături de fișierul .java.
  • 🚀 Trei metode: jspInit() pregătește pagina o singură dată, _jspService() răspunde la fiecare cerere, iar jspDestroy() eliberează resursele la final.
  • 🚫 O regulă: _jspService() este generată de container și nu trebuie niciodată scrisă sau suprascrisă de autorul paginii.
  • 🗃️ Cârlig de curățare: Suprascrierea funcției jspDestroy() este locul corect pentru a închide conexiunile la baza de date și a deschide fișiere.

Fazele ciclului de viață JSP de la traducere la distrugere

Ce este ciclul de viață al unui JSP?

Ciclul de viață JSP este definit ca traducerea unei pagini JSP într-un servlet, deoarece o pagină JSP trebuie convertită într-un servlet înainte de a putea procesa cererile de serviciu. Ciclul de viață începe cu crearea JSP-ului și se termină cu distrugerea instanței servlet generate de acesta.

Deoarece clasa generată este un servlet obișnuit, tot ce știi deja despre servlet conțintracse aplică în continuare. Java Codul scris de container este cel care rulează efectiv; fișierul JSP este doar sursa pe care o întrețineți.

Diferite faze ale ciclului de viață JSP

Când browserul solicită un JSP, motorul JSP verifică mai întâi dacă trebuie să compileze pagina. Dacă JSP-ul nu a fost niciodată compilat sau dacă a fost modificat de la ultima compilare, atunci motorul JSP compilează pagina.

Procesul de compilare a unei pagini JSP implică trei pași:

  • Analiza JSP
  • Transformarea JSP în servlet
  • Compilarea servlet-ului

Diagrama ciclului de viață JSP

Ciclul de viață al unui JSP este reprezentat în diagrama de mai jos, care traco singură pagină de la fișierul sursă până la clasa pe care o execută containerul.

Diagrama ciclului de viață JSP care prezintă traducerea, compilarea, încărcarea, instanțierea, inițializarea, procesarea cererilor și distrugerea

Următorii pași explică ciclul de viață al JSP:

  1. Traducerea paginii JSP
  2. Compilarea paginii JSP (compilarea paginii JSP în _jsp.java)
  3. Încărcarea claselor (_jsp.java este convertit în fișierul de clasă _jsp.class)
  4. Instanțiere (se creează un obiect al servletului generat)
  5. Inițializare (metoda jspInit() este invocată de container)
  6. Procesarea cererilor (metoda _jspService() este invocată de container)
  7. Distruge (metoda jspDestroy() este invocată de container)

Fazele ciclului de viață JSP explicate

Să analizăm fiecare dintre punctele de mai sus mai detaliat.

1) Traducerea paginii JSP:

A Java Un fișier servlet este generat dintr-un fișier sursă JSP. Acesta este primul pas al ciclului de viață JSP. În faza de traducere, containerul validează corectitudinea sintactică a paginii JSP și a fișierelor de etichete.

  • Containerul JSP interpretează directivele și acțiunile standard, precum și acțiunile personalizate care fac referire la bibliotecile de etichete (toate fac parte din pagina JSP și sunt acoperite în elemente JSP tutorial) utilizat în această pagină JSP.
  • În descrierea ilustrată de mai sus, fișierul demo.jsp este tradus în demo_jsp.java în primul pas.

Să luăm un exemplu de „demo.jsp”, așa cum se arată mai jos:

Demo.jsp

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

Notă privind lista de mai sus: este reprodusă exact așa cum a fost publicată, astfel încât să corespundă cu captura de ecran a servletului generat care urmează. Două variante ortografice din aceasta nu se vor compila dacă sunt copiate ad litteram — variabila este declarată ca demvar dar tipărit ca demovar, iar obiectul de ieșire implicit este out cu literă mică, nu OutCorectați ambele înainte de a rula pagina singur.

Code Explicație pentru Demo.jsp

Code Linia 1: etichetă de început html

Code Linia 2: Etichetă antet

Code Linia 3 – 4: Eticheta de titlu, de exemplu Demo JSP, și eticheta de închidere head

Code Linia 5 – 6: Eticheta scriptlet în care este inițializată variabila demo

Code Linia 7 – 8: În eticheta body, un text care va fi afișat în rezultat (Numărul este: )

Code Linia 9: Eticheta scriptlet unde încercăm să afișăm variabila demovar cu valoarea sa incrementată

Code Linia 10 – 11: Etichetele Body și HTML închise

Pagina JSP Demo este convertită în servletul demo_jsp așa cum se arată în codul de mai jos.

Sursa servlet demo_jsp.java generată din demo.jsp în timpul traducerii

Code explicație pentru Demo_jsp.java

Code Linia 1: Clasa servlet demo_jsp extinde clasa părinte HttpServlet

Code Linia 2 – 3: Suprascrierea metodei de service a JSP-ului, adică _jspService, care are ca parametri obiectele HttpServletRequest și HttpServletResponse

Code Linia 4: Metoda de deschidere

Code Linia 5: Apelarea metodei getWriter() a obiectului de răspuns pentru a obține o imprimareWriter obiect (tipărește o reprezentare formatată a obiectelor într-un flux de ieșire text)

Code Linia 6: Apelarea metodei setContentType a obiectului de răspuns pentru a seta tipul de conținut

Code Linia 7: Utilizarea metodei write() din PrintWriter obiect pentru analizarea codului html

Code Linia 8: Inițializarea variabilei demovar la 0

Code Linia 9: Apelarea metodei write() a funcției PrintWriter obiect pentru a analiza textul

Code Linia 10: Apelarea metodei print() a funcției PrintWriter obiect pentru a incrementa variabila demovar de la 0 + 1 = 1. Prin urmare, ieșirea va fi 1

Code Linia 11: Utilizarea metodei write() din PrintWriter obiect pentru analizarea codului html

ieșire:

Apoi, browserul afișează contorul, așa cum se arată în captura de ecran de mai jos.

Rezultatul browserului pentru imprimarea demo.jsp Numărul este: 1

  • Aici puteți vedea că în captură de ecran ieșirea este 1, deoarece demvar este inițializat la 0 și apoi incrementat la 0 + 1 = 1

În exemplul de mai sus,

  • demo.jsp este un JSP în care o variabilă este inițializată și incrementată. Acest JSP este convertit într-un servlet (demo_jsp.class) în care motorul JSP încarcă pagina JSP și o convertește în conținut de servlet.
  • Când are loc conversia, tot textul șablonului este convertit în instrucțiuni println() și toate elementele JSP sunt convertite în Java cod.

Acesta este modul în care o pagină JSP simplă este tradusă într-o clasă servlet.

2) Compilarea paginii JSP

  • Generat Java Fișierul servlet este compilat într-un Java clasa servlet
  • Traducerea Java Transformarea paginii sursă în clasa sa de implementare poate avea loc oricând între implementarea paginii JSP în container și procesarea paginii JSP.
  • În descrierea ilustrată de mai sus, demo_jsp.java este compilat într-un fișier de clasă demo_jsp.class
  • Pe Apache Tomcat, ambele artefacte sunt scrise în directorul de lucru al serverului, în work/Catalina/localhost/<app>/org/apache/jsp, care este primul loc de căutat atunci când trebuie diagnosticată o eroare de traducere

3) Încărcare de clasă

  • Clasa servlet generată din sursa JSP este acum încărcată în container.

4) Instanciare

  • În acest pas se generează obiectul, adică instanța clasei.
  • Containerul gestionează una sau mai multe instanțe ale acestei clase ca răspuns la cereri și alte evenimente. De obicei, un container JSP este construit folosind un container servlet. Un container JSP este o extensie a unui container servlet, deoarece ambele containere acceptă JSP și servlet-uri.
  • Interfața JspPage, furnizată de container, declară metodele jspInit() și jspDestroy().
  • Există o interfață HttpJspPage care deservește cereri HTTP și conține și metoda de service. Semnătura sa depinde de protocol, motiv pentru care containerul generează acea metodă în loc să ceară autorului paginii să o declare.

5) Inițializare

public void jspInit()
{
	//initializing the code
}
  • Metoda jspInit() inițializează instanța servlet generată din JSP și este invocată de container în această fază.
  • Odată ce instanța este creată, metoda init este invocată imediat după aceea
  • Este apelată o singură dată în timpul unui ciclu de viață JSP, iar metoda de inițializare este declarată așa cum se arată mai sus.

6) Procesarea cererii

void _jspservice(HttpServletRequest request HttpServletResponse response)
{
	//handling all request and responses
}
  • Metoda _jspService() este invocată de container pentru toate cererile generate de pagina JSP pe parcursul ciclului său de viață.
  • Pentru această fază, pagina trebuie să treacă prin toate fazele de mai sus și numai atunci poate fi invocată metoda de service.
  • Transmite obiectele de cerere și răspuns
  • Această metodă nu poate fi suprascrisă, deoarece containerul o scrie în timpul traducerii.
  • Metoda este prezentată mai sus. Este responsabilă pentru gestionarea tuturor metodelor HTTP, adică GET, POST și restul.

7) Distrugeți

public void _jspdestroy()
{
            //all clean up code
}
  • Metoda jspDestroy() este, de asemenea, invocată de container
  • Această metodă este apelată atunci când containerul decide că nu mai are nevoie de instanța servlet pentru a răspunde cererilor.
  • Odată ce apelul metodei destroy este efectuat, servletul este gata pentru colectarea gunoiului.
  • Acesta este sfârșitul ciclului de viață.
  • Putem suprascrie jspDestroy() atunci când efectuăm orice curățare, cum ar fi eliberarea conexiunilor la baza de date sau închiderea fișierelor deschise.

O notă privind denumirea care merită menționată: de la Jakarta EE 9 încoace, aceste tipuri trăiesc în jakarta.servlet.jsp pachet în loc de javax.servlet.jsp, deci importurile mai vechi trebuie actualizate atunci când o aplicație este mutată pe un server curent.

Întrebări frecvente

Acestea au același ciclu de viață după traducere. Un JSP adaugă două faze în față, traducerea și compilarea, care transformă pagina într-un fișier sursă și o clasă servlet. De la încărcarea clasei încolo, servlet-ul contract se aplică neschimbat.

Sub directorul de lucru al serverului, în work/Catalina/localhost/ /org/apache/jsp. Atât sursa .java generată, cât și fișierul .class compilat ajung acolo, așa că home.jsp devine home_jsp.java și home_jsp.class.

Containerul îl generează din corpul paginii în timpul traducerii. Semnătura sa depinde de protocolul de solicitare, așa că specificația o exclude din interfața JspPage și interzice autorilor paginii să o declare ei înșiși.

Servletul generat implementează deja init() pentru a stoca configurația sa ServletConfig, apoi apelează jspInit(). Autorii paginilor suprascriu jspInit() astfel încât configurarea containerului să nu fie niciodată omisă, exact ceea ce riscă o suprascriere init() scrisă de mână.

Precompilarea traduce și compilează fiecare pagină în momentul construirii sau implementării, în loc de prima solicitare. Elimină întârzierea la prima accesare, evidențiază erorile de traducere înainte de lansare și permite implementarea fără un compilator pe server.

Rămâne suportat ca Jakarta Server Pages. Principala modificare este spațiul de nume al pachetului: din Jakarta EE 9, API-ul s-a mutat de la javax.servlet.jsp la jakarta.servlet.jsp, așadar importurile vechi trebuie rescrise înainte de a rula pe un server curent.

Asistenții inteligenți artificiali citesc stiva _jsp.java generată trace și mapează o eroare de compilare înapoi la linia scriptlet-ului eronat, ceea ce reprezintă cea mai dificilă parte a erorilor de traducere. De asemenea, acestea semnalează scriptlet-urile care aparțin unui fișier tag sau unui servlet.

Da. Copilot creează structuri pentru scriptlet-uri, blocuri JSTL, gestionarea formularelor și potrivirea claselor servlet dintr-un comentariu. RevVizualizați ieșirea pentru spațiul de nume al pachetului Jakarta și pentru scriptlet-urile care ar trebui să fie limbaj de expresie, deoarece sugestiile vin adesea după tutoriale mai vechi.

Rezumați această postare cu: