JAVA EE 8 - ΕΝΟΤΗΤΑ 3 – Dynamic Content in a Servlet? Be careful!
Όπως
ήδη έχουμε δει, ένα servlet είναι
μια java κλάση, πού επειδή
κληρονομεί από το httpservlet, έχει
έξτρα ιδιότητες που του επιτρέπουν να
διαχειρίζεται http αιτήματα.
Στο
παράδειγμα μας, θα δημιουργήσουμε μια
μεταβλητή με το όνομα curreDataAndTime.
Αφού έχουμε να κάνουμε με java
κλάση, τότε λογικό είναι να θέλουμε
να καλέσουμε την συγκεκριμένη μεταβλητή
και να δούμε την τιμή που περιέχει. Μέχρι
εδώ ακούγονται όλα λογικά, αλλά υπάρχει
μια μικρή αλλά σημαντική λεπτομέρεια
– η java κλάση (δηλαδή το
servlet) τρέχει επάνω στον
Application Server και αυτό κατά
συνέπεια αυτόματα σημαίνει ότι υπάρχει
πιθανότητα πολλαπλοί χρήστες να ζητήσουν
ταυτόχρονα την ίδια πληροφορία δηλαδή
να ζητήσουν την τιμή της μεταβλητής.
Αυτό ίσως προκαλέσει πρόβλημα στην
εφαρμογή σας. Ας το αναλύσουμε λίγο
περισσότερο.
Τα
Servlets είναι mutlithreaded
από κατασκευή τους οπότε ταυτόχρονη
χρήση του Servlet από
πολλαπλούς χρήστες δεν είναι πρόβλημα.
Όταν όμως κάποια μεταβλητή ορίζεται σε
επίπεδο Servlet κλάσης (και
όχι μέσα σε κάποια μέθοδο σαν τοπική
μεταβλητή) τότε είναι ευθύνη του
προγραμματιστή να προστατέψει την
λειτουργία της και να βεβαιώσει το
γεγονός ότι μόνο ένας χρήστης κάθε φορά
μπορεί να αλλάξει την τιμή της μεταβλητής.
Πως μπορούμε να λύσουμε αυτό το πρόβλημα?
Εφαρμόζοντας απλή java λογική
και χρησιμοποιώντας την λέξη κλειδί
synchronize σε όσο το δυνατόν
λιγότερες γραμμές κώδικα για να μην
επιβαρύνουμε την απόδοση του συστήματος.
Στην
πιο κάτω εικόνα μπορείτε να δείτε τον
καινούργιο κώδικα του Servlet.
Μόνο η αρχή της κλάσης και η doGet
μέθοδο παρουσιάζεται, ο υπόλοιπος
κώδικας παραμένει ο ίδιος.
Ένας από τους λόγους
που τα Servlet είναι διάσημα
και ακόμα χρησιμοποιούνται σε εφαρμογές
είναι γιατί μπορούν να εμφανίσουν το
περιεχόμενο μεταβλητών που οι τιμές
τους μεταβάλλονται. Το περιεχόμενο των
μεταβλητών ίσως προέρχεται από τον
server, την βάση ή από τον
ίδιο τον χρήστη.
Στο παράδειγμα μας, το
servlet παρουσιάζει στον
browser την ώρα και την
ημερομηνία την στιγμή που το κάλεσε ο
χρήστης. Όταν ο χρήστης καλεί να δει το
servlet, καλείται η doGet
μέθοδο στην οποία έχουν περάσει τα
request και response
αντικείμενα. Η ημερομηνία και η ώρα,
αφού το Servlet τα λάβει από
τον server δημιουργώντας
ένα LocalDateTime αντικείμενο,
τα αναθέτει στην μεταβλητή currDateAndTime.
Κάθε φορά που κάποιος χρήστης καλεί
το servlet, αυτό θα δείχνει
την ημερομηνία και ώρα την στιγμή που
έγινε το αίτημα. Φυσικά, δεν είναι ανάγκη
να περιορίσουμε το παράδειγμα μας σε
αντικείμενο είδος ημερομηνίας. Μπορείτε
κάλλιστα να προσθέσετε μια int
μεταβλητή που η τιμή της θα προέλθει
από μια αριθμητική πράξη μέσα από τον
Servlet ή δεδομένα που μπορεί
να έχουν προέλθει από ένα αίτημα σε μια
βάση δεδομένων.
Μιχάλης
Κασάπογλου