ΚΕΝΤΡΟ ΠΛΗ.ΝΕ.Τ. Ν. ΦΛΩΡΙΝΑΣ
Εισαγωγή στα Java Servlets
Εισαγωγή στα Servlets
Οι ιστοσελίδες που περιέχουν κώδικα JSP (JavaServer Pages), δηλ. ανάμιξη κώδικα HTML με κώδικα Java, μετατρέπονται (μεταφράζονται ή μεταγλωττίζονται) σε Servlets πριν εκτελεσθούν στον server. Η κατανόηση αυτής της μετάφρασης (απόδοσης) σε κώδικα Servlet θα μας βοηθήσει να καταλάβουμε καλύτερα τις δραστηριότητες των JSPs στο παρασκήνιο. Ένα Servlet, στη γενική του μορφή, είναι μια τάξη (class) της Java που υλοποιεί (implements) το interface Servlet και δέχεται αιτήσεις (requests) και παράγει (δημιουργεί) αποκρίσεις (responses). Οι αιτήσεις μπορεί να προέρχονται από τάξεις της Java, από Web clients ή και από άλλα Servlets.
Όταν υλοποιούμε ένα interface λέμε ότι η τάξη μάς παρέχει υλοποιήσεις για τις μεθόδους που είναι δηλωμένες στο interface. Συνεπώς, όταν υλοποιούμε το interface Servlet δηλώνουμε ότι ο κώδικάς μας θα παρέχει υλοποιήσεις για τις μεθόδους που βρίσκονται στο interface Servlet. Θα ασχοληθούμε μ’ ένα μόνο συγκεκριμένο είδος Servlet, το HttpServlet, το οποίο δέχεται HTTP requests και παράγει HTTP responses. Όταν γράφουμε το δικό μας HttpServlet, δεν υλοποιούμε το interface Servlet απευθείας, αλλά επεκτείνουμε (extend) την τάξη HttpServlet.
Μετατροπή των JSPs σε Servlets
Αφού τα JSPs (ιστοσελίδες με JSP κώδικα) μετατρέπονται σε Servlets, τότε θα μπορεί να ρωτήσει κάποιος γιατί να πρέπει να μάθουμε και να χρησιμοποιούμε και τα δύο; Ο βασικότερος λόγος για το γιατί πρέπει να χρησιμοποιούμε τα JSPs είναι ότι μπορούμε να γράψουμε ευκολότερα τον κώδικα, ενώ αν ασχοληθούμε με το γράψιμο του κώδικα σε Servlet, θα πρέπει να μάθουμε να δημιουργούμε τάξεις (classes) και κληρονομικότητα (inheritance) σε γλώσσα Java, κάτι όχι ιδιαίτερα επιθυμητό από τους περισσότερους.
Θα πρέπει επίσης να μάθουμε πώς είναι ένας κώδικας γραμμένος σε Servlet, για να γνωρίζουμε τι βρίσκεται πίσω από έναν κώδικα που είναι γραμμένος σε JSP.
Οι μέθοδοι που χρησιμοποιούνται στον κύκλο ζωής ενός JSP ή ενός Servlet είναι οι εξής :
new(), για τη δημιουργία ενός JSP ή Servlet.
init(), για την απόδοση αρχικών τιμών (αρχικοποίηση).
service() ή doGet() ή doPost() για τον χειρισμό των αιτήσεων των clients.
destroy(), για τη διαγραφή ενός JSP ή Servlet.
finalize(), για τον καθαρισμό της μνήμης από τα διαγραμμένα JSPs ή Servlets.
Όσον αφορά τώρα τη διαδικασία μετατροπής (μετάφρασης), το JSP μεταφράζεται (translated) στον αντίστοιχο κώδικα Servlet, το οποίο είναι ένα αρχείο με επέκταση .java. Αυτό μετά μεταγλωττίζεται (compiled) στο αντίστοιχο bytecode αρχείο με επέκταση .class. Το αρχείο .class εκτελείται, δημιουργείται η έξοδος σε μορφή HTML εγγράφου και στέλνεται πίσω στον client. Μετά από την πρώτη κλήση ενός JSP, τα επόμενα requests δεν θα ακολουθήσουν όλη τη φάση της μετάφρασης αλλά θα πάνε κατευθείαν στο ήδη μεταγλωττισμένο αρχείο .class.
Η Βασική Δομή ενός HttpServlet
Υπάρχουν πολλές μέθοδοι που υπερκαλύπτουμε (override) όταν γράφουμε ένα HttpServlet, όπως :
void init(ServletConfig sc) throws ServletException;
void Service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
Η μέθοδος init() καλείται για να αποδώσει αρχικές τιμές σε ορισμένες παραμέτρους. Η μέθοδος Service() χρησιμοποιείται για να ελέγξουμε τις καταχωρήσεις του χρήστη όταν δεν μας ενδιαφέρει αν η αίτησή (request) του προήλθε από μια μέθοδο GET ή μια μέθοδο POST. Αν, όμως, έχει σημασία το αν η HTML φόρμα στάλθηκε με μια μέθοδο GET ή μια μέθοδο POST, τότε θα πρέπει να υπερκαλύψουμε μια από τις μεθόδους doGet() ή doPost().
Μια HTML φόρμα διαθέτει την ιδιότητα (attribute) METHOD η οποία ορίζει τον τρόπο με τον οποίο θα σταλούν τα δεδομένα στον server. Η μέθοδος GET προσαρτά τα δεδομένα στο URL και τα στέλνει στον server μ’ αυτόν τον τρόπο, ενώ η μέθοδος POST συσκευάζει τα δεδομένα σ’ ένα πακέτο και στέλνει το πακέτο στον server.
Ένα Παράδειγμα Μετατροπής JSP σε Servlet
Θα δούμε τώρα ένα παράδειγμα κώδικα σε JSP και το ισοδύναμό του σε κώδικα Servlet. Ο κώδικας Servlet παράγει την ίδια ακριβώς έξοδο με το JSP, αλλά με πολύ περισσότερη δουλειά. Ο κώδικας JSP που θα δούμε δημιουργεί έναν πίνακα δύο στηλών που περιέχει στην πρώτη στήλη τους αριθμούς 1 έως 10 και στη δεύτερη στήλη το κείμενο Άρτιος ή Περιττός, ανάλογα.
<html>
<head>
<title> Οι Άρτιοι και οι Περιττοί Αριθμοί </title>
</head>
<body>
<center>
<h2> Οι Άρτιοι και οι Περιττοί Αριθμοί </h2>
</center>
<table border="2" align="center">
<th>Αριθμός</th><th>Άρτιος/Περιττός</th>
<% for (int i=0; i<10; i++) { %>
<tr><td><%=i%></td>
<% if(Math.IEEEremainder(i, 2)==0) { %>
<td>Ο Αριθμός είναι Άρτιος</td>
</tr>
<% } else { %>
<td>Ο Αριθμός είναι Περιττός</td>
</tr>
<% } // end if
} // end for %>
</table>
</body>
</html>
Η έξοδος της παραπάνω σελίδας θα είναι ένας πίνακας με δύο στήλες, όπου στη μια στήλη θα είναι ένας από τους ακέραιους αριθμούς 1-10 και στη δεύτερη στήλη το κείμενο Άρτιος ή Περιττός, ανάλογα. Ο πίνακας θα έχει περίγραμμα (border) ίσο με 2 pixels και θα είναι κεντραρισμένος στη σελίδα. Με τα tags <th> δημιουργούμε τις επικεφαλίδες του πίνακα.
Το σύμβολο <%, που κλείνει με το σύμβολο %>, αποκαλείται scriptlet tag και χρησιμοποιείται για να προσθέσουμε κώδικα Java μέσα σε HTML κώδικα. Το tag <%= αποκαλείται expression tag και μας επιτρέπει να εισάγουμε μια έκφραση της Java η οποία θα εκτιμηθεί (υπολογισθεί) και το αποτέλεσμά της θα εισαχθεί στον JSP κώδικα σαν κανονικό κείμενο.
Θα δούμε τώρα τον ισοδύναμο κώδικα Servlet, ο οποίος θα παράγει το ίδιο ακριβώς αποτέλεσμα. Αυτό σημαίνει ότι ο παραπάνω κώδικας JSP θα μεταφρασθεί στον επόμενο κώδικα Servlet.
import java.io.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;
public class EvenOddNumbers extends HttpServlet
{
public void Service(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
ServletOutputStream out=response.getOutputStream();
out.print("<html>");
out.print("<head><title>Οι Άρτιοι και οι Περιττοί Αριθμοί
</title></head>");
out.print("<body>");
out.print("<center>");
out.print("<h2>Οι Άρτιοι και οι Περιττοί Αριθμοί</h2>");
out.print("</center>");
out.print("<table border=’2’ align=’center’>");
out.print("<th>Αριθμός</th><th>Άρτιος/Περιττός</th>);
for (int i=0; i<10; i++) {
out.print("<tr><td>" + i + "</td>");
if(Math.IEEEremainder(i, 2)==0) {
out.print("<td>Ο Αριθμός είναι Άρτιος</td></tr>");
}
else {
out.print("<td>Ο Αριθμός είναι Περιττός</td></tr>");
} // τέλος εντολής if-else
} // τέλος βρόχου for
out.print("</table></body></html>");
out.close();
}
}
Βλέπουμε ότι αν και το αποτέλεσμα είναι το ίδιο, απαιτείται πολύ περισσότερη δουλειά για να γράψουμε κώδικα για Servlets και επίσης πολύ καλή γνώση της Java, κάτι που δεν είναι απαραίτητο αν θέλουμε να γράψουμε σε JSP κώδικα.