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 Εφαρμογές που θα δημιουργήσουμε.

Τι είναι λοιπόν τα Servlets? Τα Servlets είναι Java κλάσεις που ακολουθούν τους κανόνες του Java Servlet API και έχουν την ικανότητα να απαντούν σε web αιτήματα. Αν και θεωρητικά μπορούν να ανταποκριθούν σε οποιοδήποτε είδος αιτήματος, κυρίως χρησιμοποιούνται για να απαντούν σε http αιτήματα.

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

Πριν ξεκινήσουμε να γράφουμε τον πρώτο μας κώδικα, πρέπει να κατεβάσουμε ένα περιβάλλον IDE και έναν application server που υποστηρίζουν Java EE 8. Η δική μου επιλογή είναι το Eclipse (τελευταία έκδοση) και ο Wildfly Application Server (τελευταία έκδοση). Είναι πολύ εύκολο να ενσωματώσεις τον Wildfly μέσα στο Eclipse οπότε δεν θα αναλύσω αυτά τα βήματα. Με ένα απλό search στο Web νομίζω ότι θα βρείτε ένα step by step tutorial για αυτό.


Όταν πετύχετε αυτό το βήμα, κάντε δεξί κλικ επάνω στον Wildfly και επιλέξτε Start για να ξεκινήσει.


Τώρα πάμε να δημιουργήσουμε το πρώτο μας Servlet Application. Επιλέγουμε File > New > Other από το κεντρικό μενού. Βρίσκουμε την κατηγορία Web και επιλέγουμε Dynamic Web Project.


Πατάμε Next.

Δίνουμε ένα όνομα στο project και βεβαιωνόμαστε ότι το Target runtime δείχνει στον Application Server και ότι στο Dynamic web module version είναι επιλεγμένο το 4.0.


Πατάμε Next και πατάμε Next για ακόμα μια φορά στο Source folders on build path.


Στο τελευταίο παράθυρο που εμφανίζεται επιλέγουμε Generate web.xml deployment descriptor και πατάμε Finish.



Τώρα έχουμε την βασική δομή μιας εφαρμογής. Δεν έχουμε παρά να δημιουργήσουμε το πρώτο μας Servlet.



Κάνουμε δεξί κλικ επάνω στο src και δημιουργούμε ένα δικό μας πακέτο επιλέγοντας New > package και δίνοντας το όνομα com.mycompany.




Πατάμε Finish.


Κάνουμε λοιπόν δεξί κλικ επάνω στο πακέτο και επιλέγουμε New > Servlet


Ονομάζουμε το Servlet μας SimpleServlet και πατάμε Next.



Στο επόμενο παράθυρο απλά πατάμε Next.



Στο τελευταίο παράθυρο αφήνουμε τις προεπιλεγμένες επιλογές όπως είναι και πατάμε Finish.




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


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

Archive

Contact Form

Send