JSP-livssyklus: Faser og diagram forklart

โšก Smart oppsummering

JSPs livssyklus beskriver hvordan en container oversetter en side til en servlet, kompilerer den, laster inn klassen, oppretter en instans, initialiserer den, betjener hver forespรธrsel gjennom den genererte tjenestemetoden og til slutt รธdelegger den.

  • ๐Ÿ”„ Syv faser: Oversettelse, kompilering, klasseinnlasting, instantiering, initialisering, forespรธrselsbehandling og destruksjon kjรธres i den faste rekkefรธlgen.
  • ๐Ÿ“„ Oversettelse: Containeren validerer siden, og skriver deretter en Java kildefilen, slik at demo.jsp blir til demo_jsp.java fรธr noe kjรธres.
  • โš™๏ธ Samling: Den genererte kildekoden kompileres til demo_jsp.class, som Tomcat oppbevarer under arbeidskatalogen sin sammen med .java-filen.
  • ๐Ÿš€ Tre metoder: jspInit() forbereder siden รฉn gang, _jspService() svarer pรฅ hver forespรธrsel, og jspDestroy() frigjรธr ressurser pรฅ slutten.
  • ๐Ÿšซ ร‰n regel: _jspService() genereres av containeren og mรฅ aldri skrives eller overskrives av sideforfatteren.
  • ๐Ÿ—ƒ๏ธ Oppryddingskrok: Overstyring av jspDestroy() er det riktige stedet รฅ lukke databasetilkoblinger og รฅpne filer.

JSPs livssyklusfaser fra oversettelse til destruksjon

Hva er JSPs livssyklus?

JSP livssyklus er definert som oversettelsen av en JSP-side til en servlet, fordi en JSP-side mรฅ konverteres til en servlet fรธr den kan behandle tjenesteforespรธrsler. Livssyklusen starter med opprettelsen av JSP-en og slutter med destruksjonen av servlet-instansen som genereres fra den.

Fordi den genererte klassen er en vanlig servlet, kan alt du allerede vet om servletentracDet gjelder fortsatt. Java Koden som containeren skriver er det som faktisk kjรธrer; JSP-filen er bare kildekoden du vedlikeholder.

Ulike faser av JSP livssyklus

Nรฅr nettleseren ber om en JSP, sjekker JSP-motoren fรธrst om den trenger รฅ kompilere siden. Hvis JSP-en aldri har blitt kompilert, eller hvis den har blitt endret siden forrige kompilering, kompilerer JSP-motoren siden.

Kompileringsprosessen for en JSP-side involverer tre trinn:

  • Parsing av JSP
  • Gjรธr om JSP til servlet
  • Kompilere servleten

JSP livssyklusdiagram

JSP-livssyklusen er vist i diagrammet nedenfor, som traclagrer en enkelt side fra kildefilen til klassen som containeren kjรธrer.

JSP-livssyklusdiagram som viser oversettelse, kompilering, lasting, instansiering, initialisering, forespรธrselsbehandling og destruksjon

Fรธlgende trinn forklarer livssyklusen til JSP:

  1. Oversettelse av JSP-side
  2. Kompilering av JSP-side (kompilering av JSP-siden til _jsp.java)
  3. Klasseinnlasting (_jsp.java konverteres til klassefilen _jsp.class)
  4. Instantiering (et objekt av den genererte servleten opprettes)
  5. Initialisering (jspInit()-metoden kalles av containeren)
  6. Forespรธrselsbehandling (_jspService()-metoden kalles av containeren)
  7. Destroy (jspDestroy()-metoden kalles av containeren)

Faser i JSP-livssyklusen forklart

La oss se nรฆrmere pรฅ hvert av punktene ovenfor.

1) Oversettelse av JSP-siden:

A Java Servlet-filen genereres fra en JSP-kildefil. Dette er det fรธrste trinnet i JSP-livssyklusen. I oversettelsesfasen validerer containeren den syntaktiske korrektheten til JSP-siden og taggfilene.

  • JSP-containeren tolker standarddirektivene og -handlingene, og de tilpassede handlingene som refererer til tagbiblioteker (de er alle en del av JSP-siden og er dekket i JSP-elementer veiledning) som brukes pรฅ denne JSP-siden.
  • I den billedlige beskrivelsen ovenfor er demo.jsp oversatt til demo_jsp.java i det fรธrste trinnet.

La oss ta et eksempel pรฅ ยซdemo.jspยป som vist nedenfor:

Demo.jsp

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

Merknad om listen ovenfor: den er gjengitt nรธyaktig slik den er publisert, slik at den samsvarer med det genererte servlet-skjermbildet som fรธlger. To stavemรฅter i den vil ikke kompileres hvis den kopieres ordrett โ€“ variabelen er deklarert som demvar men trykket som demovar, og det implisitte utdataobjektet er out med smรฅ bokstaver, ikke OutRett begge fรธr du kjรธrer siden selv.

Code Forklaring for Demo.jsp

Code Linje 1: html starttag

Code Linje 2: Hovedtagg

Code Linje 3โ€“4: Titteltag, f.eks. Demo JSP, og avsluttende head-tag

Code Linje 5โ€“6: Scriptlet-tag der variabelen demo initialiseres

Code Linje 7โ€“8: I body-taggen, en tekst som skal skrives ut i utdataene (Antall er: )

Code Linje 9: Scriptlet-taggen der vi prรธver รฅ skrive ut variabelen demovar med dens inkrementerte verdi

Code Linje 10โ€“11: Brรธdtekst og HTML-tagger lukket

Demo JSP-siden konverteres til demo_jsp-servleten som vises i koden nedenfor.

Genererte demo_jsp.java servlet-kildekode produsert fra demo.jsp under oversettelse

Code forklaring for Demo_jsp.java

Code Linje 1: Servlet-klassen demo_jsp utvider den overordnede klassen HttpServlet

Code Linje 2โ€“3: Overstyring av servicemetoden til JSP-en, dvs. _jspService, som har HttpServletRequest- og HttpServletResponse-objekter som parametere.

Code Linje 4: ร…pningsmetode

Code Linje 5: Kalling av metoden getWriter() av โ€‹โ€‹responsobjektet for รฅ fรฅ en utskriftWriter objekt (skriver ut en formatert representasjon av objekter til en tekstutdatastrรธm)

Code Linje 6: Kalling av setContentType-metoden til responsobjektet for รฅ angi innholdstypen

Code Linje 7: Bruk av write()-metoden til PrintWriter objekt for รฅ analysere html

Code Linje 8: Initialiserer demovar-variabelen til 0

Code Linje 9: Kalling av write()-metoden til PrintWriter objekt for รฅ analysere teksten

Code Linje 10: Kalling av print()-metoden til PrintWriter objekt for รฅ รธke variabelen demovar fra 0 + 1 = 1. Derfor vil utdataene vรฆre 1

Code Linje 11: Bruk av write()-metoden til PrintWriter objekt for รฅ analysere html

Utgang:

Nettleseren gjengir deretter telleren, som skjermbildet nedenfor viser.

Nettleserutdata for demo.jsp-utskrift Antall er: 1

  • Her kan du se at utdataene pรฅ skjermbildet er 1, fordi demvar initialiseres til 0 og deretter รธkes til 0 + 1 = 1.

I eksemplet ovenfor,

  • demo.jsp er en JSP der รฉn variabel initialiseres og รธkes. Denne JSP-en konverteres til servleten (demo_jsp.class) der JSP-motoren laster inn JSP-siden og konverterer den til servlet-innhold.
  • Nรฅr konverteringen skjer, konverteres all maltekst til println()-setninger, og alle JSP-elementer konverteres til Java kode.

Dette er hvordan en enkel JSP-side blir oversatt til en servlet-klasse.

2) Kompilering av JSP-siden

  • Den genererte Java servlet-filen kompileres til en Java servlet-klasse
  • Oversettelsen av Java kildesiden til implementeringsklassen kan skje nรฅr som helst mellom distribusjonen av JSP-siden i containeren og behandlingen av JSP-siden.
  • I den billedlige beskrivelsen ovenfor er demo_jsp.java kompilert til en klassefil demo_jsp.class
  • Pรฅ Apache Tomcat skrives begge artefaktene under serverens arbeidskatalog, i work/Catalina/localhost/<app>/org/apache/jsp, som er det fรธrste stedet man skal se etter nรฅr en oversettelsesfeil mรฅ diagnostiseres

3) Klasselasting

  • Servlet-klassen som er generert fra JSP-kilden er nรฅ lastet inn i containeren.

4) Instantiering

  • I dette trinnet genereres objektet, dvs. instansen av klassen.
  • Containeren administrerer รฉn eller flere forekomster av denne klassen som svar pรฅ forespรธrsler og andre hendelser. Vanligvis bygges en JSP-container ved hjelp av en servlet-container. En JSP-container er en utvidelse av en servlet-container, ettersom begge containerne stรธtter JSP og servlets.
  • JspPage-grensesnittet, som leveres av containeren, deklarerer metodene jspInit() og jspDestroy().
  • Det finnes et grensesnitt, HttpJspPage, som betjener HTTP-forespรธrsler, og det inneholder ogsรฅ tjenestemetoden. Signaturen avhenger av protokollen, og det er derfor containeren genererer den metoden i stedet for รฅ be sideforfatteren om รฅ deklarere den.

5) Initialisering

public void jspInit()
{
	//initializing the code
}
  • jspInit()-metoden initialiserer servlet-instansen som ble generert fra JSP-en, og kalles av containeren i denne fasen.
  • Nรฅr instansen er opprettet, kalles init-metoden umiddelbart etter det.
  • Den kalles bare รฉn gang i lรธpet av en JSP-livssyklus, og metoden for initialisering deklareres som vist ovenfor.

6) Behandling av forespรธrsel

void _jspservice(HttpServletRequest request HttpServletResponse response)
{
	//handling all request and responses
}
  • _jspService()-metoden kalles av containeren for alle forespรธrsler som genereres av JSP-siden i lรธpet av dens livssyklus.
  • For denne fasen mรฅ siden gรฅ gjennom alle fasene ovenfor, og fรธrst da kan tjenestemetoden kalles.
  • Den sender forespรธrsels- og svarobjektene
  • Denne metoden kan ikke overstyres, fordi containeren skriver den under oversettelsen
  • Metoden er vist ovenfor. Den er ansvarlig for รฅ hรฅndtere alle HTTP-metoder, dvs. GET, POST og resten.

7) ร˜delegg

public void _jspdestroy()
{
            //all clean up code
}
  • jspDestroy()-metoden kalles ogsรฅ av containeren.
  • Denne metoden kalles nรฅr containeren bestemmer at den ikke lenger trenger servlet-instansen for รฅ betjene forespรธrsler.
  • Nรฅr kallet til destroy-metoden er gjort, er servleten klar for sรธppelinnsamling.
  • Dette er slutten pรฅ livssyklusen.
  • Vi kan overstyre jspDestroy() nรฅr vi utfรธrer opprydding, for eksempel รฅ frigjรธre databasetilkoblinger eller lukke รฅpne filer.

En navnebemerkning verdt รฅ ta med seg videre: fra Jakarta EE 9 og utover lever disse typene i jakarta.servlet.jsp pakke heller enn javax.servlet.jsp, sรฅ eldre importer mรฅ oppdateres nรฅr et program flyttes til en gjeldende server.

Spรธrsmรฅl og svar

De har samme livssyklus etter oversettelse. En JSP legger til to faser foran, oversettelse og kompilering, som gjรธr siden om til en servlet-kildefil og -klasse. Fra klassen lastes og utover inneholder servletentract gjelder uendret.

Under serverens arbeidskatalog, i work/Catalina/localhost/ /org/apache/jsp. Bรฅde den genererte .java-kildekoden og den kompilerte .class-filen havner der, sรฅ home.jsp blir home_jsp.java og home_jsp.class.

Beholderen genererer den fra sideteksten under oversettelsen. Signaturen avhenger av forespรธrselsprotokollen, sรฅ spesifikasjonen utelater den fra JspPage-grensesnittet og forbyr sideforfattere รฅ deklarere den selv.

Den genererte servleten implementerer allerede init() for รฅ lagre ServletConfig, og kaller deretter jspInit(). Sideforfattere overstyrer jspInit() slik at containeroppsettet aldri hoppes over, noe som er akkurat det en hรฅndskrevet init()-overstyring risikerer.

Forkompilering oversetter og kompilerer hver side ved bygge- eller distribusjonstidspunkt i stedet for ved fรธrste forespรธrsel. Den fjerner forsinkelsen ved fรธrste treff, avdekker oversettelsesfeil fรธr utgivelse og tillater distribusjon uten en kompilator pรฅ serveren.

Den stรธttes fortsatt som Jakarta Server Pages. Hovedendringen er pakkenavnerommet: fra Jakarta EE 9 ble API-et flyttet fra javax.servlet.jsp til jakarta.servlet.jsp, sรฅ eldre importer mรฅ skrives om fรธr de kjรธres pรฅ en nรฅvรฆrende server.

AI-assistenter leser den genererte _jsp.java-stakken trace og tilordner en kompileringsfeil tilbake til den problematiske scriptlet-linjen, som er den vanskeligste delen av oversettelsesfeil. De flagger ogsรฅ scriptlets som hรธrer hjemme i en tag-fil eller en servlet.

Ja. Copilot bruker stillas for skriptletter, JSTL-blokker, skjemahรฅndtering og matchende servletklasser fra en kommentar. RevSe utdataene for navnerommet i Jakarta-pakken og for skriptletter som skal vรฆre uttrykkssprรฅk, siden forslag ofte fรธlger eldre veiledninger.

Oppsummer dette innlegget med: