ΚΕΝΤΡΟ ΠΛΗ.ΝΕ.Τ. Ν. ΦΛΩΡΙΝΑΣ

Εισαγωγή στα 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 είναι οι εξής :

 Όσον αφορά τώρα τη διαδικασία μετατροπής (μετάφρασης), το JSP μεταφράζεται (translated) στον αντίστοιχο κώδικα Servlet, το οποίο είναι ένα αρχείο με επέκταση .java. Αυτό μετά μεταγλωττίζεται (compiled) στο αντίστοιχο bytecode αρχείο με επέκταση .class. Το αρχείο .class εκτελείται, δημιουργείται η έξοδος σε μορφή HTML εγγράφου και στέλνεται πίσω στον client. Μετά από την πρώτη κλήση ενός JSP, τα επόμενα requests δεν θα ακολουθήσουν όλη τη φάση της μετάφρασης αλλά θα πάνε κατευθείαν στο ήδη μεταγλωττισμένο αρχείο .class.

 

Η Βασική Δομή ενός HttpServlet

Υπάρχουν πολλές μέθοδοι που υπερκαλύπτουμε (override) όταν γράφουμε ένα HttpServlet, όπως :

Η μέθοδος 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 και στη δεύτερη στήλη το κείμενο Άρτιος ή Περιττός, ανάλογα.

EvenOddNumbers.jsp

<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 κώδικα.

 

back.gif (9867 bytes)

Επιστροφή