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

Τι είναι ο κύκλος ζωής του 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
- Μεταγλώττιση σελίδας JSP (μεταγλώττιση της σελίδας JSP σε _jsp.java)
- Φόρτωση κλάσης (το _jsp.java μετατρέπεται στο αρχείο κλάσης _jsp.class)
- Δημιουργία στιγμιαίου στιγμιότυπου (δημιουργείται ένα αντικείμενο του δημιουργημένου servlet)
- Αρχικοποίηση (η μέθοδος jspInit() καλείται από το κοντέινερ)
- Επεξεργασία αιτήματος (η μέθοδος _jspService() καλείται από το κοντέινερ)
- 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 που φαίνεται στον παρακάτω κώδικα.
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
Παραγωγή:
Στη συνέχεια, το πρόγραμμα περιήγησης εμφανίζει τον μετρητή, όπως φαίνεται στο παρακάτω στιγμιότυπο οθόνης.
- Εδώ μπορείτε να δείτε ότι στο στιγμιότυπο οθόνης η έξοδος είναι 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, επομένως οι παλαιότερες εισαγωγές πρέπει να ενημερώνονται όταν μια εφαρμογή μετακινείται σε έναν τρέχοντα διακομιστή.



