Κύκλος Ζωής JSP: Επεξήγηση Φάσεων & Διαγράμματος

⚡ Έξυπνη Σύνοψη

Ο Κύκλος Ζωής JSP περιγράφει πώς ένα κοντέινερ μεταφράζει μια σελίδα σε ένα servlet, τη μεταγλωττίζει, φορτώνει την κλάση, δημιουργεί μια παρουσία, την αρχικοποιεί, εξυπηρετεί κάθε αίτημα μέσω της μεθόδου υπηρεσίας που δημιουργείται και τέλος την καταστρέφει.

  • 🔄 Επτά φάσεις: Η μετάφραση, η μεταγλώττιση, η φόρτωση κλάσης, η δημιουργία στιγμιότυπων, η αρχικοποίηση, η επεξεργασία αιτημάτων και η καταστροφή εκτελούνται με αυτήν τη σταθερή σειρά.
  • 📄 Μετάφραση: Το κοντέινερ επικυρώνει τη σελίδα και στη συνέχεια γράφει ένα Java αρχείο πηγαίου κώδικα, επομένως το demo.jsp γίνεται demo_jsp.java πριν εκτελεστεί οτιδήποτε.
  • ⚙️ Συλλογή: Αυτή η δημιουργημένη πηγή μεταγλωττίζεται στην demo_jsp.class, την οποία ο Tomcat διατηρεί στον κατάλογο εργασίας του μαζί με το αρχείο .java.
  • 🚀 Τρεις μέθοδοι: Η jspInit() προετοιμάζει τη σελίδα μία φορά, η _jspService() απαντά σε κάθε αίτημα και η jspDestroy() απελευθερώνει πόρους στο τέλος.
  • 🚫 Ένας κανόνας: Η συνάρτηση _jspService() δημιουργείται από το κοντέινερ και δεν πρέπει ποτέ να γραφτεί ή να αντικατασταθεί από τον δημιουργό της σελίδας.
  • 🗃️ Γάντζος καθαρισμού: Η παράκαμψη της συνάρτησης jspDestroy() είναι το σωστό σημείο για το κλείσιμο συνδέσεων βάσης δεδομένων και το άνοιγμα αρχείων.

Φάσεις του κύκλου ζωής του JSP από τη μετάφραση έως την καταστροφή

Τι είναι ο κύκλος ζωής του JSP;

Κύκλος Ζωής JSP ορίζεται ως η μετάφραση μιας σελίδας JSP σε ένα servlet, επειδή μια σελίδα JSP πρέπει να μετατραπεί σε servlet πριν μπορέσει να επεξεργαστεί αιτήματα υπηρεσίας. Ο κύκλος ζωής ξεκινά με τη δημιουργία του JSP και τελειώνει με την καταστροφή της παρουσίας servlet που δημιουργείται από αυτό.

Επειδή η παραγόμενη κλάση είναι ένα συνηθισμένο servlet, όλα όσα ήδη γνωρίζετε για το servlet μπορούν ναtracεξακολουθεί να ισχύει. Το Java Ο κώδικας που γράφει το κοντέινερ είναι αυτός που πραγματικά εκτελείται. Το αρχείο JSP είναι μόνο ο πηγαίος κώδικας που συντηρείτε.

Διαφορετικές φάσεις του κύκλου ζωής JSP

Όταν το πρόγραμμα περιήγησης ζητά ένα JSP, η μηχανή JSP ελέγχει πρώτα αν χρειάζεται να μεταγλωττίσει τη σελίδα. Εάν το JSP δεν έχει μεταγλωττιστεί ποτέ ή εάν έχει τροποποιηθεί από την τελευταία μεταγλώττιση, τότε η μηχανή JSP μεταγλωττίζει τη σελίδα.

Η διαδικασία μεταγλώττισης μιας σελίδας JSP περιλαμβάνει τρία βήματα:

  • Ανάλυση JSP
  • Μετατροπή JSP σε servlet
  • Μεταγλώττιση του servlet

Διάγραμμα Κύκλου Ζωής JSP

Ο κύκλος ζωής του JSP απεικονίζεται στο παρακάτω διάγραμμα, το οποίο tracείναι μια μοναδική σελίδα από το αρχείο πηγαίου κώδικα έως την κλάση που εκτελεί το κοντέινερ.

Διάγραμμα κύκλου ζωής JSP που δείχνει τη μετάφραση, τη μεταγλώττιση, τη φόρτωση, την δημιουργία στιγμιότυπων, την αρχικοποίηση, την επεξεργασία αιτημάτων και την καταστροφή

Τα ακόλουθα βήματα εξηγούν τον κύκλο ζωής του JSP:

  1. Μετάφραση της σελίδας JSP
  2. Μεταγλώττιση σελίδας JSP (μεταγλώττιση της σελίδας JSP σε _jsp.java)
  3. Φόρτωση κλάσης (το _jsp.java μετατρέπεται στο αρχείο κλάσης _jsp.class)
  4. Δημιουργία στιγμιαίου στιγμιότυπου (δημιουργείται ένα αντικείμενο του δημιουργημένου servlet)
  5. Αρχικοποίηση (η μέθοδος jspInit() καλείται από το κοντέινερ)
  6. Επεξεργασία αιτήματος (η μέθοδος _jspService() καλείται από το κοντέινερ)
  7. Destroy (η μέθοδος jspDestroy() καλείται από το κοντέινερ)

Επεξήγηση των φάσεων του κύκλου ζωής του JSP

Ας εξετάσουμε καθένα από τα παραπάνω σημεία με περισσότερες λεπτομέρειες.

1) Μετάφραση της σελίδας JSP:

A Java Το αρχείο servlet δημιουργείται από ένα αρχείο πηγαίου κώδικα JSP. Αυτό είναι το πρώτο βήμα του κύκλου ζωής του JSP. Στη φάση της μετάφρασης, το κοντέινερ επικυρώνει τη συντακτική ορθότητα των αρχείων σελίδας και ετικετών JSP.

  • Το κοντέινερ JSP ερμηνεύει τις τυπικές οδηγίες και ενέργειες, καθώς και τις προσαρμοσμένες ενέργειες που αναφέρονται σε βιβλιοθήκες ετικετών (είναι όλες μέρος της σελίδας JSP και καλύπτονται στο στοιχεία JSP tutorial) που χρησιμοποιείται σε αυτήν τη σελίδα JSP.
  • Στην παραπάνω εικονογραφημένη περιγραφή, το demo.jsp μεταφράζεται σε demo_jsp.java στο πρώτο βήμα.

Ας πάρουμε ένα παράδειγμα του "demo.jsp" όπως φαίνεται παρακάτω:

Demo.jsp

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

Σημείωση για την παραπάνω καταχώριση: αναπαράγεται ακριβώς όπως δημοσιεύτηκε, έτσι ώστε να ταιριάζει με το στιγμιότυπο οθόνης servlet που δημιουργείται και ακολουθεί. Δύο ορθογραφίες σε αυτό δεν θα μεταγλωττιστούν εάν αντιγραφούν αυτόματα — η μεταβλητή δηλώνεται ως demvar αλλά τυπωμένο ως demovar, και το έμμεσο αντικείμενο εξόδου είναι out με πεζά γράμματα, όχι OutΔιορθώστε και τα δύο πριν εκτελέσετε μόνοι σας τη σελίδα.

Code Επεξήγηση για το Demo.jsp

Code Γραμμή 1: ετικέτα έναρξης html

Code Γραμμή 2: Ετικέτα κεφαλής

Code Γραμμή 3 – 4: Ετικέτα τίτλου, δηλαδή Demo JSP, και ετικέτα τέλους κεφαλίδας

Code Γραμμή 5 – 6: Ετικέτα Scriptlet όπου αρχικοποιείται η μεταβλητή demo

Code Γραμμή 7 – 8: Στην ετικέτα body, ένα κείμενο που θα εκτυπωθεί στην έξοδο (Ο αριθμός είναι: )

Code Γραμμή 9: Ετικέτα scriptlet όπου προσπαθούμε να εκτυπώσουμε τη μεταβλητή demovar με την αυξανόμενη τιμή της

Code Γραμμή 10 – 11: Οι ετικέτες body και HTML είναι κλειστές

Η σελίδα Demo JSP μετατρέπεται στο servlet demo_jsp που φαίνεται στον παρακάτω κώδικα.

Δημιουργήθηκε ο πηγαίος κώδικας servlet demo_jsp.java που παρήχθη από το demo.jsp κατά τη διάρκεια της μετάφρασης

Code επεξήγηση για το Demo_jsp.java

Code Γραμμή 1: Η κλάση Servlet demo_jsp επεκτείνει την γονική κλάση HttpServlet

Code Γραμμή 2 – 3: Παράκαμψη της μεθόδου service του JSP, δηλαδή _jspService, η οποία έχει ως παραμέτρους τα αντικείμενα HttpServletRequest και HttpServletResponse

Code Γραμμή 4: Μέθοδος ανοίγματος

Code Γραμμή 5: Κλήση της μεθόδου getWriter() του αντικειμένου απόκρισης για να λάβετε μια ΕκτύπωσηWriter αντικείμενο (εκτυπώνει μια μορφοποιημένη αναπαράσταση αντικειμένων σε μια ροή εξόδου κειμένου)

Code Γραμμή 6: Κλήση της μεθόδου setContentType του αντικειμένου απόκρισης για τον ορισμό του τύπου περιεχομένου

Code Γραμμή 7: Χρήση της μεθόδου write() της συνάρτησης PrintWriter αντικείμενο για ανάλυση html

Code Γραμμή 8: Αρχικοποίηση της μεταβλητής demovar σε 0

Code Γραμμή 9: Κλήση της μεθόδου write() της PrintWriter αντικείμενο για την ανάλυση του κειμένου

Code Γραμμή 10: Κλήση της μεθόδου print() της PrintWriter αντικείμενο να αυξηθεί η μεταβλητή demovar από 0 + 1 = 1. Επομένως, η έξοδος θα είναι 1

Code Γραμμή 11: Χρήση της μεθόδου write() της συνάρτησης PrintWriter αντικείμενο για ανάλυση html

Παραγωγή:

Στη συνέχεια, το πρόγραμμα περιήγησης εμφανίζει τον μετρητή, όπως φαίνεται στο παρακάτω στιγμιότυπο οθόνης.

Έξοδος προγράμματος περιήγησης της εκτύπωσης demo.jsp Ο αριθμός είναι: 1

  • Εδώ μπορείτε να δείτε ότι στο στιγμιότυπο οθόνης η έξοδος είναι 1, επειδή η demvar αρχικοποιείται στο 0 και στη συνέχεια αυξάνεται σε 0 + 1 = 1

Στο παραπάνω παράδειγμα,

  • Το demo.jsp είναι ένα JSP όπου μια μεταβλητή αρχικοποιείται και αυξάνεται. Αυτό το JSP μετατρέπεται στο servlet (demo_jsp.class) όπου η μηχανή JSP φορτώνει τη σελίδα JSP και τη μετατρέπει σε περιεχόμενο servlet.
  • Όταν συμβεί η μετατροπή, όλο το κείμενο του προτύπου μετατρέπεται σε εντολές println() και όλα τα στοιχεία JSP μετατρέπονται σε Java κώδικας.

Έτσι μεταφράζεται μια απλή σελίδα JSP σε κλάση servlet.

2) Σύνταξη της Σελίδας JSP

  • Το παραγόμενο Java Το αρχείο servlet μεταγλωττίζεται σε ένα Java κλάση servlet
  • Η μετάφραση του Java Η μεταφορά της σελίδας πηγαίου κώδικα στην κλάση υλοποίησής της μπορεί να συμβεί οποιαδήποτε στιγμή μεταξύ της ανάπτυξης της σελίδας JSP στο κοντέινερ και της επεξεργασίας της σελίδας JSP.
  • Στην παραπάνω εικονογραφημένη περιγραφή, το demo_jsp.java μεταγλωττίζεται σε ένα αρχείο κλάσης demo_jsp.class.
  • Στο Apache Tomcat και τα δύο artefacts γράφονται στον κατάλογο εργασίας του διακομιστή, στο work/Catalina/localhost/<app>/org/apache/jsp, το οποίο είναι το πρώτο μέρος που πρέπει να αναζητήσετε όταν πρέπει να διαγνωστεί ένα σφάλμα μετάφρασης

3) Φόρτωση τάξης

  • Η κλάση servlet που έχει δημιουργηθεί από τον πηγαίο κώδικα JSP έχει πλέον φορτωθεί στο container.

4) Instantiation

  • Σε αυτό το βήμα δημιουργείται το αντικείμενο, δηλαδή η στιγμιότυπο της κλάσης.
  • Το κοντέινερ διαχειρίζεται μία ή περισσότερες παρουσίες αυτής της κλάσης σε απόκριση σε αιτήματα και άλλα συμβάντα. Συνήθως, ένα κοντέινερ JSP δημιουργείται χρησιμοποιώντας ένα κοντέινερ servlet. Ένα κοντέινερ JSP είναι μια επέκταση ενός κοντέινερ servlet, καθώς και τα δύο κοντέινερ υποστηρίζουν JSP και servlets.
  • Η διεπαφή JspPage, η οποία παρέχεται από το κοντέινερ, δηλώνει τις μεθόδους jspInit() και jspDestroy().
  • Υπάρχει μια διεπαφή HttpJspPage η οποία εξυπηρετεί αιτήματα HTTP και περιέχει επίσης τη μέθοδο service. Η υπογραφή της εξαρτάται από το πρωτόκολλο, γι' αυτό και το container δημιουργεί αυτήν τη μέθοδο αντί να ζητά από τον δημιουργό της σελίδας να την δηλώσει.

5) Αρχικοποίηση

public void jspInit()
{
	//initializing the code
}
  • Η μέθοδος jspInit() αρχικοποιεί την παρουσία servlet που δημιουργήθηκε από το JSP και καλείται από το container σε αυτήν τη φάση.
  • Μόλις δημιουργηθεί η παρουσία, η μέθοδος init καλείται αμέσως μετά από αυτό.
  • Καλείται μόνο μία φορά κατά τη διάρκεια ενός κύκλου ζωής JSP και η μέθοδος για την αρχικοποίηση δηλώνεται όπως φαίνεται παραπάνω.

6) Επεξεργασία αιτήματος

void _jspservice(HttpServletRequest request HttpServletResponse response)
{
	//handling all request and responses
}
  • Η μέθοδος _jspService() καλείται από το container για όλα τα αιτήματα που προκύπτουν από τη σελίδα JSP κατά τη διάρκεια του κύκλου ζωής της.
  • Για αυτήν τη φάση, η σελίδα πρέπει να περάσει από όλες τις παραπάνω φάσεις και μόνο τότε μπορεί να κληθεί η μέθοδος service.
  • Μεταδίδει τα αντικείμενα αιτήματος και απόκρισης
  • Αυτή η μέθοδος δεν μπορεί να παρακαμφθεί, επειδή το κοντέινερ την γράφει κατά τη μετάφραση
  • Η μέθοδος φαίνεται παραπάνω. Είναι υπεύθυνη για τον χειρισμό όλων των μεθόδων HTTP, δηλαδή GET, POST και των υπολοίπων.

7) Καταστρέψτε

public void _jspdestroy()
{
            //all clean up code
}
  • Η μέθοδος jspDestroy() καλείται επίσης από το container
  • Αυτή η μέθοδος καλείται όταν το container αποφασίσει ότι δεν χρειάζεται πλέον την παρουσία του servlet για την εξυπηρέτηση αιτημάτων.
  • Μόλις γίνει η κλήση της μεθόδου destroy, το servlet είναι έτοιμο για συλλογή απορριμμάτων.
  • Αυτό είναι το τέλος του κύκλου ζωής.
  • Μπορούμε να παρακάμψουμε την jspDestroy() όταν εκτελούμε οποιονδήποτε καθαρισμό, όπως κατά την απελευθέρωση συνδέσεων βάσης δεδομένων ή το κλείσιμο ανοιχτών αρχείων.

Μια σημείωση ονομασίας που αξίζει να συνεχιστεί: από την Τζακάρτα EE 9 και μετά, αυτοί οι τύποι ζουν στο jakarta.servlet.jsp πακέτο αντί javax.servlet.jsp, επομένως οι παλαιότερες εισαγωγές πρέπει να ενημερώνονται όταν μια εφαρμογή μετακινείται σε έναν τρέχοντα διακομιστή.

Συχνές Ερωτήσεις

Είναι ο ίδιος κύκλος ζωής μετά τη μετάφραση. Ένα JSP προσθέτει δύο φάσεις μπροστά, τη μετάφραση και τη μεταγλώττιση, οι οποίες μετατρέπουν τη σελίδα σε αρχείο πηγαίου κώδικα και κλάση servlet. Από τη φόρτωση της κλάσης και μετά, το servlet μετατρέπεται σεtract ισχύει αμετάβλητο.

Στον κατάλογο εργασίας του διακομιστή, στο work/Catalina/localhost/ /org/apache/jsp. Τόσο ο δημιουργημένος πηγαίος κώδικας .java όσο και το μεταγλωττισμένο αρχείο .class καταλήγουν εκεί, επομένως το home.jsp γίνεται home_jsp.java και home_jsp.class.

Το κοντέινερ το δημιουργεί από το σώμα της σελίδας κατά τη μετάφραση. Η υπογραφή του εξαρτάται από το πρωτόκολλο αιτήματος, επομένως η προδιαγραφή το αφήνει εκτός της διεπαφής JspPage και απαγορεύει στους συντάκτες σελίδων να το δηλώσουν οι ίδιοι.

Το δημιουργημένο servlet υλοποιεί ήδη την init() για να αποθηκεύσει την ServletConfig και στη συνέχεια καλεί την jspInit(). Οι συντάκτες σελίδων παρακάμπτουν την jspInit(), έτσι ώστε η ρύθμιση του κοντέινερ να μην παραλείπεται ποτέ, κάτι που ακριβώς διατρέχει τον κίνδυνο να παρακάμψει μια χειρόγραφη init().

Η προμεταγλώττιση μεταφράζει και μεταγλωττίζει κάθε σελίδα κατά τη στιγμή της δημιουργίας ή της ανάπτυξης αντί για το πρώτο αίτημα. Αφαιρεί την καθυστέρηση πρώτου χτυπήματος, εμφανίζει σφάλματα μετάφρασης πριν από την κυκλοφορία και επιτρέπει την ανάπτυξη χωρίς μεταγλωττιστή στον διακομιστή.

Εξακολουθεί να υποστηρίζεται ως Σελίδες Διακομιστή Jakarta. Η κύρια αλλαγή είναι ο χώρος ονομάτων πακέτων: από την έκδοση Jakarta EE 9 το API μετακινήθηκε από javax.servlet.jsp σε jakarta.servlet.jsp, επομένως οι παλαιότερες εισαγωγές πρέπει να ξαναγραφτούν πριν εκτελεστούν σε έναν τρέχοντα διακομιστή.

Οι βοηθοί τεχνητής νοημοσύνης διαβάζουν τη δημιουργημένη στοίβα _jsp.java tracκαι αντιστοιχίζουν ένα σφάλμα μεταγλώττισης πίσω στη γραμμή του scriptlet που προκαλεί σφάλμα, το οποίο είναι το πιο δύσκολο μέρος των σφαλμάτων μετάφρασης. Επίσης, επισημαίνουν scriptlets που ανήκουν σε ένα αρχείο ετικέτας ή ένα servlet.

Ναι. Το Copilot scaffolds scriptlets, JSTL blocks, χειρισμό φορμών και αντιστοίχιση κλάσεων servlet από ένα σχόλιο. RevΔείτε την έξοδο για τον χώρο ονομάτων πακέτων Jakarta και για τα scriptlets που θα έπρεπε να είναι γλώσσα έκφρασης, καθώς οι προτάσεις συχνά ακολουθούν παλαιότερα tutorials.

Συνοψίστε αυτήν την ανάρτηση με: