JAVA EE 8 - ΕΝΟΤΗΤΑ 1 – GETTING STARTED WITH SERVLETS
Αν και μπορεί να ακούγεται παράξενο, τα Java Servlets ήταν η πρώτη προσπάθεια για να παράγουμε δυναμικές Java Web εφαρμογές. Η έκδοση 3.0 που ήταν μέρος του Java EE 6 έδωσε μια καινούργια νοοτροπία στο πως χτίζουμε μια Java Web εφαρμογή.
Αν και είναι κάπως δύσκολο να χτιστεί μια ολόκληρη ιστοσελίδα μόνο με Servlets, η χρήση τους στο MVC μοντέλο ήταν πολύ συχνή αφού είχαν και έχουν τον ρόλο του Controller.
Βασικά ακόμα και σήμερα τα Servlets είναι η βάση για όλες τις Java EE εφαρμογές. Web frameworks όπως JSP (Java Server Pages) και JSF (Java Server Faces) στην πραγματικότητα γίνονται compile σε Java Servlets για να μπορούν να εκτελεστούν σωστά στο Web Container του Application Server. Δεν θα εμβαθύνουμε πολύ στα Servlets αν και είναι πολύ χρήσιμα, στα σίγουρα όμως θα μάθουμε αρκετά πράγματα έτσι ώστε να μπορούμε αργότερα να τα χρησιμοποιήσουμε σαν Clients στις Enterprise Εφαρμογές που θα δημιουργήσουμε.
Για να μπορεί να εκτελεστεί σωστά ένα Servlet πρέπει να γίνει deploy σε ένα Web container δηλαδή σε κάποιον application server όπως Tomcat, Payara, Wildfly κτλ. Επειδή κάθε Servlet κληρονομεί από το Servlet API, έχει την δυνατότητα παρέχει συγκεκριμένα αντικείμενα που προσθέτουν δυνατότητες στην λειτουργία του. Μερικά από τα αντικείμενα είναι το request, το response, το pageContext και άλλα. Εμείς απλά θα μείνουμε στα request και response αντικείμενα αφού με αυτά μπορούμε να εκτελέσουμε αρκετές από τις λειτουργίες που θέλουμε.
Όπως είπαμε και στην αρχή της ενότητας, τα Servlets είναι στην πραγματικότητα java classes και αυτό σημαίνει ότι μπορούμε να αναπτύξουμε ότι κώδικα Java θέλουμε μέσα σε αυτά. Άλλωστε για αυτό και συνηθίζουμε να τα χρησιμοποιούμε σαν clients σε απλά Web παραδείγματα για να δείξουμε την λειτουργία μιας απλής εφαρμογής.
Ιστορικά, το Servlet 3.1 specification ήταν μέρος του Java EE 7 που ακόμα χρησιμοποιούμε και θα γράφουμε κώδικα σε αυτό για πολύ καιρό ακόμα. Μέσα σε αυτήν την έκδοση είδαμε καινούργια χαρακτηριστικά στα Servlets όπως υποστήριξη του HTTP 1.1, non-blocking ασύγχρονο I/O και πολλά άλλα. Το καινούργιο Servlet 4.0 specification, το οποίο είναι μέρος του Java EE 8 φέρνει μαζί του ακόμα καλύτερες βελτιώσεις όπως request/response mutliplexing, server push, stream prioritization και άλλα. Κάποιες από αυτές τις βελτιώσεις συμβαίνουν χωρίς εμείς να μπορούμε να επέμβουμε ενώ κάποιες άλλες όπως το server push δίνουν στον προγραμματιστή επιπλέον δυνατότητες να πειραματιστεί.
Όταν
πετύχετε αυτό το βήμα, κάντε δεξί κλικ
επάνω στον Wildfly
και
επιλέξτε Start
για
να ξεκινήσει.
Τώρα
πάμε να δημιουργήσουμε το πρώτο μας
Servlet
Application. Επιλέγουμε
File
> New > Other από
το κεντρικό μενού. Βρίσκουμε την κατηγορία
Web
και
επιλέγουμε Dynamic
Web Project.
Πατάμε
Next.
Δίνουμε
ένα όνομα στο project και
βεβαιωνόμαστε ότι το Target
runtime δείχνει στον Application
Server και ότι στο Dynamic web
module version είναι επιλεγμένο το 4.0.
Στο
τελευταίο παράθυρο που εμφανίζεται
επιλέγουμε Generate web.xml deployment
descriptor και πατάμε Finish.
Κάνουμε
δεξί κλικ επάνω στο src και
δημιουργούμε ένα δικό μας πακέτο
επιλέγοντας New > package και
δίνοντας το όνομα com.mycompany.
To
Servlet μας είναι έτοιμο. Τώρα μπορούμε
να γράψουμε ένα απλό μήνυμα που θα
εμφανίζεται στον Browser. Υπάρχουν
όμως κάποια μικρά θεωρητικά στοιχεία
που πρέπει να αναλύσουμε για να
κατανοήσουμε καλύτερα την λειτουργία
του Servlet πριν προχωρήσουμε
στην εγγραφή και εκτέλεση ενός Servlet
κώδικα.
Κατά
την δημιουργία του project μας,
επιλέξαμε να δημιουργήσουμε ένα web.xml
αρχείο ή όπως αλλιώς ονομάζεται web
deployment descriptor. Αυτό το αρχείο είναι
απαραίτητο όταν κάνουμε deploy
ένα Servlet σε ένα Servlet
Container γιατί έχει όλο το configuration
που χρειάζεται για να γνωρίζει ο
Application Server πως να εκτελέσει
το Servlet και κάτω από ποιο
URL να το εμφανίσει.
Αυτή
την στιγμή αν τρέξουμε το δικό μας
project δεν θα εμφανίσει το
Servlet μας γιατί πολύ απλά
δεν γνωρίζει πως να το χειριστεί.
Χρειάζεται λοιπόν να προσθέσουμε κάποιες
έξτρα πληροφορίες στο web.xml
για την σωστή εκτέλεση του Servlet.
Πηγαίνουμε
στον φάκελο WEB-INF και
ανοίγουμε το αρχείο web.xml.
Αλλάζουμε τον κώδικα όπως δείχνει
η παρακάτω εικόνα:
Με
αυτό τον τρόπο ενημερώνουμε τον
Application Server (Wildfly) ότι θέλουμε
η εφαρμογή μας να ξεκινήσει από ένα
Servlet που ονομάζεται
SimpleServlet. Θα είναι το το
homepage της εφαρμογής και
θα εμφανιστεί κάτω από το URL
/SimpleServlet που αντιστοιχεί στο
SimpleServlet που υπάρχει μέσα
στο πακέτο com.mycompany.
Αν
κοιτάξουμε λίγο τον κώδικα του Servlet
που δημιουργήσαμε, θα δούμε πως
έχουν δημιουργηθεί δύο μέθοδοι : doGet
και doPost που βασικά
ανταποκρίνονται σε GET και
POST calls που δέχονται δια
μέσου του HTTP πρωτοκόλλου.
Το Servlet μας απόκτησε αυτή
την ικανότητα λόγω της κληρονομικότητας
από την κλάση HttpServlet (η
πρώτη γραμμή της κλάσης μας είναι public
class SimpleServlet extends HttpServlet) που και αυτό
με την σειρά του κληρονομεί από μια πιο
γενική κλάση που ονομάζεται GenericServlet.
Το αποτέλεσμα αυτής της κληρονομικότητας
είναι ότι το Servlet μας
μπορεί να διαχειριστεί HTTP
καλέσματα και μπορεί ταυτόχρονα να
περιέχει Java κώδικα.
Τέλος
αν προσέξουμε τις μεθόδους, θα παρατηρήσουμε
ότι οι παράμετροι που περνάμε είναι
είδος HttpServletRequest και
HttpServletResponse. Το
HttpServletResponse αντικείμενο
προετοιμάζει την απάντηση έτσι ώστε να
την επιστρέψει στον browser.
Οι
HttpServlet μέθοδοι που έχουμε
στην διάθεση μας γενικότερα είναι οι
εξής:
Method
Name |
Description |
doGet |
Used
to process HTTP GET requests. |
doPost |
Used
to process HTTP POST requests. |
doPut |
Used
to process HTTP PUT requests |
doDelete |
Used
to process HTTP DELETE requests |
doHead |
Used
to process HTTP HEAD requests |
doOptions |
Called
by the container to allow OPTIONS request handling |
doTrace |
Called
by the container to handle TRACE requests |
getLastModified |
Returns
the time that the HttpServletRequest object was last modfied |
init |
Initializes
the servlet |
destroy |
Finalized
the servlet |
getServletInfo |
Provides
information regarding the servlet |
Ας
αλλάξουμε των κώδικα του Servlet
όπως δείχνει η πιο κάτω εικόνα και
βεβαιωθείτε ότι έχετε διαγράψει επίσης
και το @WebServlet (“/SimpleServlet”). Η
χρήση του @WebServlet είναι ο
δεύτερος τρόπος να ορίσουμε ένα Servlet
χωρίς όμως να χρησιμοποιήσουμε
web.xml. Αυτό όμως θα το
αναλύσουμε στην επόμενη ενότητα.
Κάνουμε
δεξί κλικ επάνω στο project μας
> Run As > Run on Server
Μιχάλης
Κασάπογλου