JAVA EE 8 - ΕΝΟΤΗΤΑ 3 – Dynamic Content in a Servlet? Be careful!

Όπως ήδη έχουμε δει, ένα servlet είναι μια java κλάση, πού επειδή κληρονομεί από το httpservlet, έχει έξτρα ιδιότητες που του επιτρέπουν να διαχειρίζεται http αιτήματα. 
 Το γεγονός ότι έχουμε να κάνουμε με java κλάση μας δίνει το δικαίωμα να δημιουργήσουμε μεταβλητές και μεθόδους. Κάποιες από τις μεταβλητές θα χρησιμοποιηθούν τοπικά μέσα στις μεθόδους, και άλλες θα είναι σε επίπεδο κλάσης και το περιεχόμενο τους θα αλλάζει σε σχέση με το input από τον χρήστη ή πληροφορία που θα λάβει από τον application server.

Στο παράδειγμα μας, θα δημιουργήσουμε μια μεταβλητή με το όνομα 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 ή δεδομένα που μπορεί να έχουν προέλθει από ένα αίτημα σε μια βάση δεδομένων.

Μιχάλης Κασάπογλου

Archive

Contact Form

Send