JSP livscyklus: Faser og diagram forklaret

โšก Smart opsummering

JSP's livscyklus beskriver, hvordan en container oversรฆtter en side til en servlet, kompilerer den, indlรฆser klassen, opretter en instans, initialiserer den, behandler alle anmodninger via den genererede servicemetode og til sidst รธdelรฆgger den.

  • ๐Ÿ”„ Syv faser: Oversรฆttelse, kompilering, klasseindlรฆsning, instantiering, initialisering, anmodningsbehandling og destruktion kรธrer i den faste rรฆkkefรธlge.
  • ๐Ÿ“„ Oversรฆttelse: Containeren validerer siden og skriver derefter en Java kildefilen, sรฅ demo.jsp bliver til demo_jsp.java, fรธr noget udfรธres.
  • ๐Ÿ‡ง๐Ÿ‡ท Samling: Den genererede kildekode kompileres til demo_jsp.class, som Tomcat opbevarer i sin arbejdsmappe sammen med .java-filen.
  • ๐Ÿš€ Tre metoder: jspInit() forbereder siden รฉn gang, _jspService() besvarer hver anmodning, og jspDestroy() frigiver ressourcer til sidst.
  • ๐Ÿšซ ร‰n regel: _jspService() genereres af containeren og mรฅ aldrig skrives eller overskrives af sideforfatteren.
  • ๐Ÿ—ƒ๏ธ Oprydningskrog: Overstyring af jspDestroy() er det korrekte sted at lukke databaseforbindelser og รฅbne filer.

JSP livscyklusfaser fra oversรฆttelse til destruktion

Hvad er JSP's livscyklus?

JSP livscyklus defineres som oversรฆttelsen af โ€‹โ€‹en JSP-side til en servlet, fordi en JSP-side skal konverteres til en servlet, fรธr den kan behandle serviceanmodninger. Livscyklussen starter med oprettelsen af โ€‹โ€‹JSP'en og slutter med destruktionen af โ€‹โ€‹den servlet-instans, der genereres ud fra den.

Fordi den genererede klasse er en almindelig servlet, kan alt, hvad du allerede ved om servlet'en,tracDet gรฆlder stadig. Java Den kode, som containeren skriver, er det, der rent faktisk kรธrer; JSP-filen er kun den kildekode, du vedligeholder.

Forskellige faser af JSP livscyklus

Nรฅr browseren beder om en JSP, kontrollerer JSP-motoren fรธrst, om den skal kompilere siden. Hvis JSP'en aldrig er blevet kompileret, eller hvis den er blevet รฆndret siden den sidste kompilering, kompilerer JSP-motoren siden.

Kompileringsprocessen for en JSP-side involverer tre trin:

  • Parsing af JSP
  • Forvandler JSP til servlet
  • Kompilere servlet

JSP livscyklusdiagram

JSP'ens livscyklus er vist i diagrammet nedenfor, som tracer en enkelt side fra kildefilen til den klasse, som containeren udfรธrer.

JSP-livscyklusdiagram, der viser oversรฆttelse, kompilering, indlรฆsning, instantiering, initialisering, anmodningsbehandling og destruktion

Fรธlgende trin forklarer JSP's livscyklus:

  1. Oversรฆttelse af JSP-side
  2. Kompilering af JSP-side (kompilering af JSP-siden til _jsp.java)
  3. Klasseindlรฆsning (_jsp.java konverteres til klassefilen _jsp.class)
  4. Instantiering (et objekt af den genererede servlet oprettes)
  5. Initialisering (jspInit()-metoden kaldes af containeren)
  6. Anmodningsbehandling (metoden _jspService() kaldes af containeren)
  7. Destroy (jspDestroy()-metoden kaldes af containeren)

Faser i JSP-livscyklussen forklaret

Lad os se nรฆrmere pรฅ hvert af ovenstรฅende punkter.

1) Oversรฆttelse af JSP-siden:

A Java Servlet-filen genereres fra en JSP-kildefil. Dette er det fรธrste trin i JSP'ens livscyklus. I oversรฆttelsesfasen validerer containeren den syntaktiske korrekthed af JSP-siden og tag-filerne.

  • JSP-containeren fortolker standarddirektiverne og -handlingerne samt de brugerdefinerede handlinger, der refererer til tagbiblioteker (de er alle en del af JSP-siden og er dรฆkket i JSP elementer tutorial) brugt pรฅ denne JSP-side.
  • I den billedlige beskrivelse ovenfor er demo.jsp oversat til demo_jsp.java i fรธrste trin.

Lad os tage 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>

Bemรฆrkning til ovenstรฅende liste: Den gengives prรฆcis som udgivet, sรฅ den matcher det genererede servlet-skรฆrmbillede, der fรธlger. To stavemรฅder i den vil ikke kompileres, hvis den kopieres ordret โ€” variablen erklรฆres som demvar men udskrives som demovar, og det implicitte outputobjekt er out med smรฅ bogstaver, ikke OutRet begge dele, fรธr du selv kรธrer siden.

Code Forklaring til Demo.jsp

Code Linje 1: html starttag

Code Linje 2: Hovedtag

Code Linje 3-4: Titeltag, f.eks. Demo JSP, og afsluttende headtag

Code Linje 5-6: Scriptlet-tag, hvor variablen demo initialiseres

Code Linje 7 โ€“ 8: I body-tagget, en tekst der skal udskrives i outputtet (Count is: )

Code Linje 9: Scriptlet-tag, hvor vi forsรธger at udskrive variablen demovar med dens inkrementerede vรฆrdi

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

Demo JSP-siden konverteres til servlet'en demo_jsp, som vist i koden nedenfor.

Genereret demo_jsp.java servlet-kildekode produceret fra demo.jsp under oversรฆttelse

Code forklaring til Demo_jsp.java

Code Linje 1: Servlet-klassen demo_jsp udvider den overordnede klasse HttpServlet

Code Linje 2 โ€“ 3: Tilsidesรฆttelse af servicemetoden for JSP'en, dvs. _jspService, som har HttpServletRequest- og HttpServletResponse-objekter som parametre.

Code Linje 4: ร…bningsmetode

Code Linje 5: Kald af metoden getWriter() af responsobjektet for at fรฅ en udskriftWriter objekt (udskriver en formateret reprรฆsentation af objekter til en tekstoutputstrรธm)

Code Linje 6: Kald af setContentType-metoden for responsobjektet for at indstille indholdstypen

Code Linje 7: Brug af write()-metoden i PrintWriter objekt til at parse html

Code Linje 8: Initialisering af demovar-variablen til 0

Code Linje 9: Kald af write()-metoden i PrintWriter objekt til at analysere teksten

Code Linje 10: Kald af print()-metoden i PrintWriter objekt for at รธge variablen demovar fra 0 + 1 = 1. Derfor vil outputtet vรฆre 1

Code Linje 11: Brug af write()-metoden i PrintWriter objekt til at parse html

Output:

Browseren gengiver derefter tรฆlleren, som skรฆrmbilledet nedenfor viser.

Browseroutput af demo.jsp-udskrivning Antal er: 1

  • Her kan du se, at outputtet pรฅ skรฆrmbilledet er 1, fordi demvar initialiseres til 0 og derefter รธges til 0 + 1 = 1.

I ovenstรฅende eksempel

  • demo.jsp er en JSP, hvor รฉn variabel initialiseres og รธges. Denne JSP konverteres til servlet'en (demo_jsp.class), hvor JSP-motoren indlรฆser JSP-siden og konverterer den til servlet-indhold.
  • Nรฅr konverteringen sker, konverteres al skabelontekst til println()-sรฆtninger, og alle JSP-elementer konverteres til Java kode.

Sรฅdan oversรฆttes en simpel JSP-side til en servlet-klasse.

2) Kompilering af JSP-siden

  • Den genererede Java servlet-filen kompileres til en Java servlet-klasse
  • Oversรฆttelsen af Java kildesiden til dens implementeringsklasse kan ske nรฅr som helst mellem implementeringen af โ€‹โ€‹JSP-siden i containeren og behandlingen af โ€‹โ€‹JSP-siden.
  • I den billedlige beskrivelse ovenfor er demo_jsp.java kompileret til en klassefil demo_jsp.class
  • Pรฅ Apache Tomcat er begge artefakter skrevet under serverens arbejdsmappe, i work/Catalina/localhost/<app>/org/apache/jsp, hvilket er det fรธrste sted at se, nรฅr en oversรฆttelsesfejl skal diagnosticeres

3) Klasseindlรฆsning

  • Servlet-klassen, der er genereret fra JSP-kildekoden, er nu indlรฆst i containeren.

4) Instantiering

  • I dette trin genereres objektet, dvs. klassens instans.
  • Containeren administrerer en eller flere instanser af denne klasse som svar pรฅ anmodninger og andre hรฆndelser. Typisk bygges en JSP-container ved hjรฆlp af en servlet-container. En JSP-container er en udvidelse af en servlet-container, da begge containere understรธtter JSP og servlets.
  • JspPage-grรฆnsefladen, som leveres af containeren, deklarerer metoderne jspInit() og jspDestroy().
  • Der er en grรฆnseflade, HttpJspPage, som hรฅndterer HTTP-anmodninger, og den indeholder ogsรฅ servicemetoden. Dens signatur afhรฆnger af protokollen, hvilket er grunden til, at containeren genererer den metode i stedet for at bede sideforfatteren om at deklarere den.

5) Initialisering

public void jspInit()
{
	//initializing the code
}
  • Metoden jspInit() initialiserer den servlet-instans, der blev genereret fra JSP'en, og kaldes af containeren i denne fase.
  • Nรฅr instansen er oprettet, kaldes init-metoden umiddelbart efter det.
  • Den kaldes kun รฉn gang i lรธbet af en JSP-livscyklus, og metoden til initialisering deklareres som vist ovenfor.

6) Behandling af anmodning

void _jspservice(HttpServletRequest request HttpServletResponse response)
{
	//handling all request and responses
}
  • Metoden _jspService() kaldes af containeren for alle anmodninger, der rejses af JSP-siden i lรธbet af dens livscyklus.
  • I denne fase skal siden gennemgรฅ alle ovenstรฅende faser, og fรธrst derefter kan servicemetoden kaldes.
  • Den sender anmodnings- og svarobjekterne
  • Denne metode kan ikke tilsidesรฆttes, fordi containeren skriver den under oversรฆttelsen
  • Metoden er vist ovenfor. Den er ansvarlig for at hรฅndtere alle HTTP-metoder, dvs. GET, POST og resten.

7) ร˜delรฆg

public void _jspdestroy()
{
            //all clean up code
}
  • Metoden jspDestroy() kaldes ogsรฅ af containeren.
  • Denne metode kaldes, nรฅr containeren beslutter, at den ikke lรฆngere har brug for servlet-instansen til at servicere anmodninger.
  • Nรฅr kaldet til destroy-metoden er foretaget, er servlet'en klar til garbage collection.
  • Dette er afslutningen pรฅ livscyklussen.
  • Vi kan tilsidesรฆtte jspDestroy(), nรฅr vi udfรธrer en oprydning, f.eks. nรฅr vi frigiver databaseforbindelser eller lukker รฅbne filer.

En navngivningsbemรฆrkning, der er vรฆrd at viderefรธre: fra Jakarta EE 9 og fremefter lever disse typer i jakarta.servlet.jsp pakke snarere end javax.servlet.jsp, sรฅ รฆldre importer skal opdateres, nรฅr en applikation flyttes til en nuvรฆrende server.

Ofte Stillede Spรธrgsmรฅl

De har den samme livscyklus efter oversรฆttelse. En JSP tilfรธjer to faser foran, oversรฆttelse og kompilering, som omdanner siden til en servlet-kildefil og -klasse. Fra klasseindlรฆsning og fremefter bestรฅr servlet'en aftract gรฆlder uรฆndret.

Under serverens arbejdsmappe, i work/Catalina/localhost/ /org/apache/jsp. Bรฅde den genererede .java-kildekode og den kompilerede .class-fil lander der, sรฅ home.jsp bliver til home_jsp.java og home_jsp.class.

Containeren genererer den fra sideteksten under oversรฆttelsen. Dens signatur afhรฆnger af anmodningsprotokollen, sรฅ specifikationen udelader den fra JspPage-grรฆnsefladen og forbyder sideforfattere at deklarere den selv.

Den genererede servlet implementerer allerede init() til at gemme sin ServletConfig og kalder derefter jspInit(). Sideforfattere tilsidesรฆtter jspInit(), sรฅ containeropsรฆtning aldrig springes over, hvilket er prรฆcis, hvad en hรฅndskrevet init()-tilsidesรฆttelse risikerer.

Prรฆkompilering oversรฆtter og kompilerer hver side ved bygge- eller implementeringstidspunktet i stedet for ved den fรธrste anmodning. Det fjerner forsinkelsen ved fรธrste forsรธg, afslรธrer oversรฆttelsesfejl fรธr udgivelsen og tillader implementering uden en compiler pรฅ serveren.

Den understรธttes fortsat som Jakarta Server Pages. Den primรฆre รฆndring er pakkenavneomrรฅdet: fra Jakarta EE 9 er API'en flyttet fra javax.servlet.jsp til jakarta.servlet.jsp, sรฅ รฆldre importer skal omskrives, fรธr de kรธres pรฅ en nuvรฆrende server.

AI-assistenter lรฆser den genererede _jsp.java-stak trace og knytter en kompileringsfejl tilbage til den problematiske scriptlet-linje, hvilket er den svรฆreste del af oversรฆttelsesfejl. De markerer ogsรฅ scriptlets, der hรธrer hjemme i en tag-fil eller en servlet.

Ja. Copilot scaffolder scriptlets, JSTL-blokke, formularhรฅndtering og matchende servlet-klasser fra en kommentar. RevSe outputtet for jakarta-pakkenavnerummet og for scriptlets, der burde vรฆre udtrykssprog, da forslag ofte fรธlger รฆldre vejledninger.

Opsummer dette indlรฆg med: