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

Εισαγωγή στα JavaBeans

 

Εισαγωγή στα JavaBeans

Τα JavaBeans είναι τάξεις της Java που ικανοποιούν την προδιαγραφή JavaBean. Αυτή η προδιαγραφή καθιερώνει κατευθυντήριες οδηγίες για την ανάπτυξη κώδικα σε Java που να είναι εύκολο να ξαναχρησιμοποιηθεί σαν λειτουργικά μπλοκς σε πολλά σενάρια. Εφόσον τα JSPs επιτρέπουν στους προγραμματιστές (developers) να αναμείξουν την HTML και τον κώδικα της Java σ’ έναν ενοποιημένο πηγαίο κώδικα, μπορεί να αναρωτηθεί κάποιος ποια μπορεί να είναι η χρησιμότητα των JavaBeans. Δεν υπάρχει κάποιος ιδιαίτερος λόγος για να πρέπει να χρησιμοποιήσουμε τα JavaBeans.

Από τεχνική άποψη, μπορούμε να κάνουμε σ’ ένα JSP όλη τη δουλειά ενός JavaBean. Αλλά στην πραγματικότητα τα JSPs σχεδιάσθηκαν για να χρησιμοποιηθούν ως το επίπεδο παρουσίασης (presentation layer), το οποίο αποτελεί εκείνο το κομμάτι μιας εφαρμογής που έχει να κάνει με την άμεση αλληλεπίδραση με τον χρήστη. Αλλά, αυτή η εργασία είναι αρκετά πολύπλοκη.

Υπάρχουν και άλλες πολύπλοκες εργασίες στην ανάπτυξη εφαρμογών, όπως είναι οι υπολογισμοί και η επεξεργασία των βάσεων δεδομένων που πρέπει να λάβουν χώρα για να ικανοποιηθούν οι αιτήσεις (requests) από την αλληλεπίδραση με τον χρήστη. Και αυτό που λέει η εμπειρία των προγραμματιστών είναι ότι είναι καλύτερο να διαχωρισθεί το επίπεδο παρουσίασης από τους υπολογισμούς και την επεξεργασία των βάσεων δεδομένων.

Ο πολύ μεγάλος φόρτος υπολογισμών που συμβαίνει στο παρασκήνιο θα πρέπει να χειρισθεί από κάποιον μηχανισμό που να είναι αφοσιωμένος σ’ αυτή τη δουλειά, όπως είναι τα JavaBeans. Η τάξη της Java που υλοποιεί τα JavaBeans θα έχει συνήθως έναν αριθμό από μεταβλητές, οι οποίες αναφέρονται σαν οι ιδιότητες (properties) των JavaBeans. Για καθεμία από τις μεταβλητές που χρειάζεται η προδιαγραφή της JavaBean, οι developers θα πρέπει να παρέχουν αντίστοιχες μεθόδους set και get για να μπορέσουν να ορίσουν και να διαβάσουν, αντίστοιχα, την τιμή της μεταβλητής.

Τα ονόματα αυτών των μεθόδων προέρχονται από το όνομα της μεταβλητής. Για παράδειγμα, αν το όνομα της μεταβλητής είναι abc, τότε τα ονόματα των μεθόδων θα είναι setAbc() και getAbc(). Το πρώτο γράμμα του ονόματος της μεταβλητής μέσα στο όνομα της μεθόδου θα πρέπει να είναι κεφαλαίο.

Για να δημιουργήσουμε ένα στιγμιότυπο ενός JavaBean χρησιμοποιούμε το tag ενέργειας <jsp:useBean>. Το επόμενο παράδειγμα δημιουργεί ένα στιγμιότυπο (instance) ενός JavaBean της τάξης Circle και το συσχετίζει με το όνομα circle1 στην JSP. Αποτελεί δουλειά της JSP το να ορίσει και να διαβάσει τις ιδιότητες του circle1.

            <jsp:useBean name="circle1" class="florina.Circle">

Ακολουθεί ένα παράδειγμα υλοποίησης ενός JavaBean :

            package florina;

            public class Circle {

                        double radius;

                        double area;

                        public void setRadius(double r) {radius = r;}

                        public double getRadius() {return radius;}

                        public void setArea(double a) {area = a;}

public double getArea() {return area;}

            }

Το JavaBean Circle δηλώνει δύο μεταβλητές, τις radius και area, και μετά δηλώνει τις μεθόδους set και get για καθεμία από τις μεταβλητές. Όταν δημιουργείται το στιγμιότυπο του JavaBean και συσχετίζεται μ’ ένα όνομα, μπορεί να χρησιμοποιηθεί για να γίνουν κλήσεις στο στιγμιότυπο. Αν η τάξη ικανοποιεί την προδιαγραφή του JavaBean τότε οι τιμές των μεταβλητών μπορούν να ορισθούν και να διαβασθούν με τα tags setProperty και getProperty της JSP.

Ακολουθώντας τις προδιαγραφές ονομασίας των JavaBeans στις ιδιότητες set και get, τα JSPs μπορούν να δώσουν ειδικά tags για τροποποίηση και πρόσβαση στις ιδιότητες των JavaBeans. Το tag <jsp:setProperty> χρησιμοποιείται για να ορίσει την τιμή μιας ιδιότητας και το tag <jsp:getProperty> χρησιμοποιείται για να διαβάσει την τιμή μιας ιδιότητας. Το επόμενο απλό παράδειγμα παρουσιάζει τη χρήση ενός JavaBean από ένα JSP χρησιμοποιώντας το παράδειγμα του κύκλου που είδαμε νωρίτερα.

<html>

<head>

<title> Ένα Απλό Παράδειγμα JavaBean </title>

</head>

<body>

            <jsp:useBean name="circle1" class="florina.Circle">

            <jsp:setProperty name="circle1" property="radius" value="2">

            Εμβαδόν = <jsp:getProperty name="circle1" property="area">

</body>

</html>

Όταν το παραπάνω JSP εκτελεσθεί σ’ έναν φυλλομετρητή, το αποτέλεσμα θα είναι το string :

Εμβαδόν = 12.5664

 

Κατανοώντας τα JavaBeans                            

Οι εφαρμογές του Web διαιρούνται συχνά σε δύο επίπεδα (layers) : το presentation layer και το business logic layer. Το presentation layer είναι αυτό που βλέπει ο χρήστης και αλληλεπιδρά μαζί του σ’ έναν φυλλομετρητή. Το business logic layer αποτελείται από πολλές τάξεις (classes) της Java που συνεργάζονται μεταξύ τους για να μοντελοποιήσουν και να εκτελέσουν τη ροή εργασίας μιας επιχείρησης, όπως είναι οι πολιτικές της επιχείρησης, οι κανονισμοί και οι διαδικασίες για τον χειρισμό των συναλλαγών (transactions) της επιχείρησης κ.ά.

Τα JSPs εμπίπτουν στην κατηγορία του presentation layer και τα JavaBeans στην κατηγορία του business logic layer. Τα JSPs προορίζονται να χρησιμοποιηθούν για τη δημιουργία δυναμικών ιστοσελίδων (dynamic Web pages). Ο ενσωματωμένος κώδικας της Java στα scriptlets της JSP θα πρέπει να χρησιμοποιείται για να αποφασίσει προγραμματιστικά για τη διάταξη (layout) και το περιεχόμενο (content) της σελίδας.

Για σοβαρές υπολογιστικές εργασίες, μπορούμε να εξετάσουμε την περίπτωση δημιουργίας εξειδικευμένου κώδικα σε Java, όπως είναι τα JavaBeans. Τα scriptlets μπορούν να δημιουργήσουν στιγμιότυπα (instances) των τάξεων (classes) της Java και να τα χρησιμοποιήσουν ως αντικείμενα (objects). Για να κατανοήσουμε το πώς τα διάφορα τμήματα μιας Web εφαρμογής μπορούν να τοποθετηθούν είτε στο presentation layer είτε στο business logic layer, ας θεωρήσουμε ένα Web site που πουλάει εκατοντάδες προϊόντα στο Web.

Αυτό το Web site θα μπορεί να περιέχει τις εξής ιστοσελίδες : μια ιστοσελίδα καλωσορίσματος, μια ιστοσελίδα καταλόγου, μια ιστοσελίδα με καλάθι αγορών και μια ιστοσελίδα με πληροφορίες για την πληρωμή και την αποστολή των ειδών. Αυτές οι ιστοσελίδες διαμορφώνουν το presentation layer της Web εφαρμογής και μπορούν να δημιουργηθούν από αντίστοιχες ιστοσελίδες που να είναι γραμμένες σε JSP κώδικα με ονόματα όπως home.jsp, catalog.jsp, shoppingcart.jsp, billing.jsp και shipping.jsp.

Οι χρήστες αλληλεπιδρούν με τις ιστοσελίδες κάνοντας κλικ στους συνδέσμους και τα πλήκτρα που αυτές περιέχουν για να μπορούν να μεταφέρονται (πλοηγούνται) ανάμεσα στις ιστοσελίδες. Για να κατανοήσουμε το business logic layer, ας θεωρήσουμε το σενάριο (περίπτωση) ενός χρήστη που περιηγείται στον κατάλογο, βρίσκει ένα προϊόν που τον ενδιαφέρει και το προσθέτει στο καλάθι αγορών. Μια λογική αλληλεπίδραση στο presentation layer θα ήταν ότι όταν ο χρήστης κάνει κλικ σ’ έναν σύνδεσμο με όνομα "Προσθήκη στο Καλάθι Αγορών", που βρίσκεται στην ιστοσελίδα catalog.jsp, τότε θα εμφανισθούν τα περιεχόμενα του καλαθιού αγορών, αφού πρώτα γίνει μεταφορά του χρήστη στην ιστοσελίδα shoppingcart.jsp.

Ένας άλλος τρόπος δημιουργίας ενός καλαθιού αγορών είναι να έχουμε ένα JavaBean που να υλοποιεί το καλάθι αγορών σε κώδικα Java και να μπορούμε να το χρησιμοποιούμε από το presentation layer. Το JavaBean θα είναι γραμμένο σε Java, ο πηγαίος κώδικας της τάξης θα μπορεί να έχει ένα όνομα σαν το ShoppingCart.java και θα περιέχει μεθόδους (συναρτήσεις) που θα υπολογίζουν ο,τιδήποτε θα θέλαμε να γνωρίζουμε από ένα καλάθι αγορών, όπως ποια προϊόντα βρίσκονται στο καλάθι αγορών, το συνολικό κόστος τους, τις πληροφορίες αποστολής για ένα συγκεκριμένο προϊόν κοκ.

Το καλάθι αγορών σε JavaBean θα μπορεί να αλληλεπιδρά μ’ άλλα JavaBeans για να ενημερώνει την αποθήκη, να υπολογίζει τους φόρους για τα προϊοντα, να ορίζει την πιστοποίηση της πιστωτικής κάρτας κοκ. Μ’ άλλα λόγια, τα JavaBeans μπορούν να κάνουν ένα μεγάλο μέρος από την παρασκηνιακή δουλειά. Αυτοί οι μηχανισμοί αποτελούν το business logic.

 

Ένα Απλό Παράδειγμα με JavaBean

Θα δούμε τώρα τον τρόπο δημιουργίας ενός JavaBean για τη μοντελοποίηση υπαλλήλων και των σχετικών στοιχείων τους όπως όνομα, αριθμός μητρώου και μισθός. Το JavaBean ακολουθεί τις προδιαγραφές καθώς δηλώνεται ένα constuctor χωρίς ορίσματα καθώς και οι μέθοδοι set και get για καθεμία από τις μεταβλητές που υπάρχουν στην τάξη (class). Ακολουθεί ο κώδικας δημιουργίας του JavaBean Ypallilos, το οποίο είναι ένα αρχείο κώδικα Java με όνομα Ypallilos.java.

package jsp.florina;

public class Ypallilos {

                        String Name;

            int am, misthos;

            public Ypallilos() {}

                        public void setName(String n) {name=n;}

            public String getName() {return name;}

                        public void setAm(int a) {am=a;}

            public int getAm() {return am;}

public void setMisthos(int s) {misthos=s;}

            public int getMisthos() {return misthos;}

}

Για να υπάρχει συμμόρφωση με τις προδιαγραφές του JavaBean δηλώνουμε ένα constructor χωρίς ορίσματα, το Ypallilos(), και αντίστοιχες μεθόδος set και get για καθεμία από τις μεταβλητές της τάξης (class). Τα τυχαία δεδομένα δημιουργούνται χρησιμοποιώντας ένα δεύτερο JavaBean το οποίο μπορεί να δημιουργήσει τυχαία ονόματα, μισθούς και αριθμούς μητρώου. Τα JavaBeans μεταγλωττίζονται με την εντολή (compiler) javac.

Οι ιδιότητες (attributes) του bean θα πάρουν τυχαίες τιμές που θα τις δημιουργήσει το utility JavaBean που φαίνεται παρακάτω και έχει το όνομα RandomPeopleGenerator.java.

package jsp.florina;

public class RandomPeopleGenerator {

                        String[] names={"Antonis", "Maria", "Kostas", "Petros", "Ioanna"};

            public String getRandomName() {

            int nameIndex = (int)(names.length*Math.random());

            return names[nameIndex];

            }

            public int getRandomAM() {

                        String randomAM = "0";

                        for(int j=0; j<5; j++)

                           randomAM = randomAM+((int)(9 * Math.random()));

                        return Integer.parseInt(randomAM);

                        public int getRandomInt(int maxInt) {

                        return (int)(maxInt * Math.random());

                        }

}

Το παρακάτω παράδειγμα κώδικα JSP έχει το όνομα randomMisthos.jsp και δείχνει πώς δημιουργείται ένα στιγμιότυπο (instance) του JavaBean και πώς αυτό χρησιμοποιείται για να δημιουργήσει μια λίστα από τυχαίους υπαλλήλους. Όταν ο application server ζητήσει την JSP σελίδα, τότε αυτή θα δημιουργήσει ένα στιγμιότυπο (instance) του Ypallilos στη μνήμη.

<html>

<head><title> Μια Τυχαία Μισθοδοσία </title></head>

<body>

<jsp:useBean id="ypallilos" class="jsp.florina.Ypallilos"/>

<jsp:useBean id="randomNames" class="jsp.florina.RandomPeopleGenerator" />

<%@ page import="jsp.florina.*" %>

<table width=100%>

            <tr><td>Όνομα</td>

            <tr><td>Αριθμός Μητρώου</td>

            <tr><td>Μισθός</td>

            </tr>

<% for(int j=0; j<5; j++) {

            ypallilos.setName(randomNames.getRandomName());

            ypallilos.setAm(randomNames.getRandomAM());

            ypallilos.setMisthos(randomNames.getRandomInt(2)*1000); %>

<tr><td><%=ypallilos.getName() %></td>

            <tr><td><%=ypallilos.getAm() %></td>

            <tr><td><%=ypallilos.getMisthos() %></td>

            </tr>

<% } %>

</table>

</body>

</html>

 

Η Εμβέλεια των JavaBeans

Η εμβέλεια (scope) ενός JavaBean αναφέρεται στον χρόνο ζωής του αφού αυτό έχει δημιουργηθεί (instantiated). Η εμβέλεια αυτή μπορεί να κυμαίνεται από τη διάρκεια ζωής της σελίδας έως τη διάρκεια ζωής του εκτελούμενου application server. Η εμβέλεια ορίζεται με την παράμετρο scope του tag <jsp:useBean> και έχει την εξής σύνταξη :

<jsp:useBean id="beanName" class="beanClass" scope="beanScope">

Το beanScope μπορεί να λάβει μια από τις εξής τέσσερις τιμές : page, request, session ή application. Η τιμή page είναι η προκαθορισμένη (default) και αν την επιλέξουμε τότε το στιγμιότυπο (instance) θα απορριφθεί όταν φύγουμε από τη σελίδα.

 

Οι Ιδιότητες των JavaBeans

Τα JSPs χρησιμοποιούν δύο tags για την αποθήκευση (setting) και το διάβασμα (getting) των τιμών των μεταβλητών ενός JavaBean. Οι μεταβλητές αυτές αναφέρονται σαν ιδιότητες (properties) του JavaBean. Τα ονόματα των tags είναι setProperty και getProperty και η σύνταξή τους είναι ως εξής :

<jsp:setProperty name="Name" property="Property" value="Value"/>

<jsp:getProperty name="Name" property="Property"/>

Θα πρέπει το JavaBean στο οποίο αναφερόμαστε να διαθέτει αντίστοιχες μεθόδους set και get για τις ιδιότητές του. Μπορούμε μετά να χρησιμοποιήσουμε το tag setProperty μέσα στα tags useBean για να δώσουμε αρχικές τιμές στο JavaBean, ως εξής :

<jsp:useBean id="Bean" class="jsp.florina.class">

            <jsp:setProperty name="Bean" property="Property1" value="Value1">

            <jsp:setProperty name="Bean" property="Property2" value="Value2">

</jsp:useBean>

Αφού το JavaBean έχει δηλωθεί και έχει πάρει προαιρετικά αρχικές τιμές, θα μπορούμε να χρησιμοποιούμε τα tags setProperty και getProperty για να δίνουμε και να διαβάζουμε τιμές για τις ιδιότητές του (properties). Για παράδειγμα, θα δούμε πώς μπορούμε να πάρουμε το ίδιο ακριβώς αποτέλεσμα που είχαμε με το randomMisthos.jsp, αλλά αντί να χρησιμοποιήσουμε τις μεθόδους set και get του JavaBean, θα δουλέψουμε με τα tags setProperty και getProperty. Το αρχείο θα έχει το όνομα SetAndGetProperties.jsp.

<html>

<head><title> Μια Τυχαία Μισθοδοσία </title></head>

<body>

<%@ page import="jsp.florina.*" %>

<jsp:useBean id="ypallilos" scope="page" class="jsp.florina.Ypallilos"/>

<jsp:useBean id="randomNames" class="jsp.florina.RandomPeopleGenerator" />

<table width=100%>

            <tr><td>Όνομα</td>

            <tr><td>Αριθμός Μητρώου</td>

            <tr><td>Μισθός</td>

            </tr>

<% for(int j=0; j<5; j++) {

            String Name = randomNames.getRandomName();

            int am = randomNames.getRandomAM();

            int misthos = randomNames.getRandomInt(2)*1000); %>

            <jsp:setProperty name="ypallilos" property="Name" value="<%=Name%>"/>

            <jsp:setProperty name="ypallilos" property="am" value="<%=am%>"/>

            <jsp:setProperty name="ypallilos" property="misthos" value="<%=misthos%>"/>

<tr>

<td><jsp:getProperty name="ypallilos" property="Name"/></td>

<td><jsp:getProperty name="ypallilos" property="am"/></td>

<td><jsp:getProperty name="ypallilos" property="misthos"/></td>

            </tr>

<% } %>

</table>

</body>

</html>

 

Χρήση Φορμών με JavaBeans

Οι φόρμες της HTML χρησιμοποιούνται για να συγκεντρώσουν πληροφορίες από τους χρήστες και αυτές οι πληροφορίες μπορούν να δοθούν (σταλούν) σε JSPs με τη μορφή ζευγαριών ονόματος/τιμής στο αντικείμενο request. Για παράδειγμα, μια φόρμα μπορεί να συγκεντρώνει στοιχεία για έναν χρήστη, όπως το όνομά του, η διεύθυνσή του και ο μισθός του. Η φόρμα στέλνει αυτά τα στοιχεία σ’ ένα JSP σαν ζευγάρια ονόματος/τιμής με το αντικείμενο request.

Τα JavaBeans μπορούν να χρησιμοποιηθούν για να μαζέψουν τις τιμές των παραμέτρων request σε μια συνεκτική και λογική μονάδα. Αυτό μπορεί να γίνει εξάγοντας τις τιμές των παραμέτρων στο αντικείμενο request που στέλνονται από τη φόρμα και δίνοντας τιμές στις ιδιότητες (properties) ενός κατάλληλα ορισμένου JavaBean. Για να ορίσουμε τις ιδιότητες ενός JavaBean με τις τιμές των παραμέτρων του αντικειμένου request, θα πρέπει κανονικά να εξάγουμε την τιμή της καθεμίας παραμέτρου και να χρησιμοποιήσουμε το παρακάτω tag για καθεμία από τις ιδιότητες του JavaBean που θέλουμε να ορίσουμε (δώσουμε τιμές) :

            <jsp:setProperty name="beanName"

                        property="parameter1"

                        value="<%=request.getParameter("parameterA")%>"/>

Τα strings parameter1 και parameterA δεν είναι ανάγκη να έχουν το ίδιο όνομα. Αν έχουμε πολλές ιδιότητες να ορίσουμε, ο παραπάνω τρόπος θα είναι σίγουρα δύσχρηστος. Το tag <jsp:setProperty> διαθέτει και μια ειδική σύνταξη που μπορεί να χρησιμοποιηθεί για να ορίσουμε τις ιδιότητες ενός JavaBean με τις τιμές των πεδίων της HTML φόρμας με μιας. Η σύνταξη αυτή είναι η εξής :

            <jsp:setProperty name="beanName" property="*"/>

Η παραπάνω σύνταξη με το * σημαίνει ότι όλες οι ιδιότητες του JavaBean με το όνομα beanName των οποίων τα ονόματα ταιριάζουν με τα ονόματα των παραμέτρων στο αντικείμενο request θα πάρουν τιμές των παραμέτρων του αντικειμένου request. Αυτό πρακτικά σημαίνει ότι αντί να πηγαίνουμε σε καθεμία από τις ιδιότητες του JavaBean, ένα μόνο tag μπορεί να δώσει τιμές σ’ όλες τις ιδιότητες. Αυτό δουλεύει μόνο όταν το όνομα της παραμέτρου είναι ίδιο με το όνομα μιας αντίστοιχης ιδιότητας.

Για παράδειγμα, το παρακάτω JSP αρχείο με όνομα forms.jsp χρησιμοποιεί το JavaBean Ypallilos που ορίσαμε νωρίτερα και χρησιμοποιεί μια HTML φόρμα για να ορίσει (δώσει τιμές) στις ιδιότητές του.

<html>

<head><title> Τα JavaBeans και οι Φόρμες </title></head>

<body>

<jsp:useBean id="formBean" class="jsp.florina.Ypallilos"/>

<jsp:setProperty name="formBean" property="*" />

<form action=forms.jsp method=POST>

            Όνομα : <input type=text name=Name value="Δημήτρης">

            ΑΜ : <input type=text name=am value="123456">

            Μισθός : <input type=text name=misthos value="1000">

</form>

<h3> Έξοδος </h3>

<table width=100%>

            <tr><td>Όνομα</td>

<td><jsp:getProperty name="formBean" property="Name"</td></tr>

            <tr><td>Αριθμός Μητρώου</td>

<td><jsp:getProperty name="formBean" property="am"</td></tr>

            <tr><td>Μισθός</td>

<td><jsp:getProperty name="formBean" property="misthos"</td></tr>

</table>

</body>

</html>     

 

back.gif (9867 bytes)

Επιστροφή