Jakarta Ενότητα 1 - Getting Started With Servlets
Jakarta Ενότητα 1 - Getting Started With Servlets
Στο σημερινό δωρεάν μάθημα Java EE θα εγκαταστήσουμε όλα τα απαραίτητα εργαλεία που χρειαζόμαστε για να δημιουργήσουμε μια Java Enterprise εφαρμογή, και θα γράψουμε, και ταυτόχρονα θα αναλύσουμε, τον κώδικα που χρειάζεται για να τρέξει ένα Servlet.
Αν και μπορεί να ακούγεται παράξενο, τα 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. Για το IDE η δική μου επιλογή είναι το Apache NetBeans. Απλά κατεβάστε από εδώ (https://netbeans.apache.org/download/index.html) την πιο τελευταία έκδοση του Apache Netbeans.
Τώρα όσο αφορά τον Application Server θα επιλέξω τον Wildfly. Είναι ένας από τους καλύτερους και ποιο σταθερούς Application Server για Java Enterprise εφαρμογές. Αντί όμως να τον εγκαταστήσουμε και να φορτώνουμε (deploy) τις εφαρμογές μας σε αυτόν, η καινούργια προσέγγιση που ακολουθούμε στον Java Enterprise προγραμματισμό είναι ο Application Server να είναι ενσωματωμένος με την εφαρμογή. Αυτό το πετυχαίνουμε με την τροποποίηση του pom.xml αρχείου του maven project μας. Ας δούμε τα βήματα ένα προς ένα πως να δημιουργήσουμε το πρώτο μας project που θα μπορείτε να το χρησιμοποιήσετε και σαν template για τα υπόλοιπα project που θα δημιουργήσουμε μέσα από τα δωρεάν μαθήματα Java EE.
Πηγαίνουμε στο https://start.microprofile.io/ και για groupid βάζουμε com.mycompany, στο artifactid γράφουμε JavaEE8BasicServlet, στο MicroProfile Runtime επιλέγουμε Wildfly και για Java SE Version επιλέγουμε Java 11. Στο Microprofile Version θα εμφανιστεί αυτόματα η επιλογή MP3.3. Πατήστε το κουμπί DOWNLOAD για να κατεβάσετε το maven project.
Πριν προχωρήσουμε στα επόμενα βήματα, απλά θα ήθελα να σας υπενθυμίσω ότι για μπορούμε να τρέξουμε την Java EE εφαρμογή μας, χρειάζεται να έχουμε εγκαταστήσει την Java 11 και το apache maven.
Αφού κατεβάσετε το zip αρχείο, μπορείτε να το αποσυμπιέσετε σε όποιο φάκελο του σκληρού σας δίσκου θέλετε. Όταν ολοκληρώσετε αυτή την διαδικασία μπορείτε να το ανοίξετε με το Apache Netbeans.
Το project που θα έχει δημιουργηθεί έχει κάποια έξτρα αρχεία που δεν χρειαζόμαστε. Επίσης πρέπει να κάνουμε κάποιες αλλαγές στο pom.xml. Πάμε λοιπόν να δούμε τι αλλαγές χρειάζεται να κάνουμε.
Όπως είπαμε στην αρχή της ενότητας, χρειαζόμαστε έναν embedded application server. Πάμε λοιπόν στο web site του Wildfly application server (wildfly.org) και κάνετε κλικ επάνω στην ενότητα Wildfly Bootable JAR.
Το συγκεκριμένο άρθρο μας δίνει πληροφορίες για το πως να αλλάξουμε το pom.xml αρχείο για να μπορεί να τρέξει το project μας με τον wildfly ενσωματωμένο. To αποτέλεσμα, αφού κάνουμε build το project μας με το maven, είναι να δημιουργηθεί ένα jar αρχείο που αν το εκτελέσετε θα ξεκινήσει έναν wildfly και μετά θα φορτώσει το project σας.
Αν δεν θέλετε να διαβάσετε όλο το άρθρο, ή βρίσκεται κάπως δύσκολο να καταλάβετε όλες τις αλλαγές, σας δίνω εδώ πως θα μοιάζει η τελική μορφή του pom.xml μετά τις τροποποιήσεις. Μπορείτε απλά να το αντιγράψετε στο pom.xml του project που μόλις δημιουργήσαμε.
Διαγράφουμε λοιπόν το Index.html από το Web Pages. Από το πακέτο com.mycompany.JavaEE8BasicServlet στο Source Packages διαγράφετε τα δύο java αρχεία. Τέλος, μέσα στο META-INF, του φακέλου Other Resources, διαγράφουμε το microprofile-config.properties.
Μην σας φαίνονται πολλές οι αλλαγές. Στην πραγματικότητα διαγράψαμε ότι υπήρχε εκεί σαν κώδικας γιατί θα δημιουργήσουμε τον δικό μας κώδικα από το μηδέν.
Μετά από όλες αυτές τις αλλαγές η τελική δομή του project θα είναι παρόμοια με αυτή της παρακάτω εικόνας:
Πριν γράψουμε τον πρώτο μας κώδικα, ας κάνουμε compile το project μας. Κάνουμε λοιπόν δεξί κλικ επάνω στο project και επιλέγουμε Clean and Build. Όλες οι απαραίτητες βιβλιοθήκες του Jakarta EE8 θα κατέβουν στον υπολογιστή σας και το project θα έχει δημιουργηθεί σωστά.
Τώρα που έχουμε την βασική δομή της εφαρμογής μας δεν έχουμε παρά να δημιουργήσουμε το πρώτο μας Servlet. Κάνουμε δεξί κλικ επάνω στο πακέτο, επιλέγουμε New και μετά Servlet.
Στο παράθυρο που εμφανίζεται γράφουμε SimpleServlet για Class Name. Αφήνουμε τις άλλες επιλογές όπως έχουν και πατάμε Next.
Στο τελευταίο παράθυρο απλά πατάτε Finish. Στην καινούργια έκδοση των Servlets δεν χρειάζεται να δημιουργήσουμε ένα web.xml. Τώρα μπορούμε να καθορίσουμε πολλά από τα properties των Servlets με την χρήση των annotations.
To Servlet μας είναι έτοιμο. Τώρα μπορούμε να γράψουμε ένα απλό μήνυμα που θα εμφανίζεται στον Browser. Υπάρχουν όμως κάποια μικρά θεωρητικά στοιχεία που πρέπει να αναλύσουμε για να κατανοήσουμε καλύτερα την λειτουργία του Servlet πριν προχωρήσουμε στην εγγραφή και εκτέλεση ενός Servlet κώδικα.
Αν κοιτάξουμε λίγο τον κώδικα του Servlet που δημιουργήσαμε, θα δούμε πως έχουν δημιουργηθεί δύο μέθοδοι : doGet και doPost που βασικά ανταποκρίνονται σε GET και POST calls που δέχονται δια μέσου του HTTP πρωτοκόλλου. Το Servlet μας απόκτησε αυτή την ικανότητα λόγω της κληρονομικότητας από την κλάση HttpServlet (η πρώτη γραμμή της κλάσης μας είναι public class SimpleServlet extends HttpServlet) που και αυτό με την σειρά του κληρονομεί από μια πιο γενική κλάση που ονομάζεται GenericServlet. Το αποτέλεσμα αυτής της κληρονομικότητας είναι ότι το Servlet μας μπορεί να διαχειριστεί HTTP καλέσματα και μπορεί ταυτόχρονα να περιέχει Java κώδικα.
Τέλος αν προσέξουμε τις μεθόδους, θα παρατηρήσουμε ότι οι παράμετροι που περνάμε είναι είδος HttpServletRequest και HttpServletResponse. Το HttpServletResponse αντικείμενο προετοιμάζει την απάντηση έτσι ώστε να την επιστρέψει στον browser.
Οι HttpServlet μέθοδοι που έχουμε στην διάθεση μας γενικότερα είναι οι εξής:
Ας αλλάξουμε τον κώδικα μέσα στην processRequest μέθοδο για να μας δείξει ένα απλό μήνυμα στον browser.
Όταν τελειώσετε με τα παραπάνω βήματα, θα δείτε ότι πάνω από το όνομα της κλάσης υπάρχει ένα annotation με το όνομα @WebServlet. Θα βασιστούμε στην λειτουργία του για να εκτελεστεί σωστά η εφαρμογή μας. Αυτό που στην πραγματικότητα κάνει το συγκεκριμένο annotation είναι να προσφέρει μια αντιστοιχία του Servlet και του URL στο οποίο ακούει χωρίς να χρειάζεται το web.xml. Υπάρχουν αρκετά στοιχεία (elements) που μπορούμε να προσθέσουμε αμέσως μετά το @WebServlet όπως δείχνει ο πιο κάτω πίνακας:
Το @WebServlet annotation αντιστοιχεί την κλάση SimpleServlet στο URL pattern /SimpleServlet. Επίσης ονομάζουμε το Servlet σαν SimpleServlet.
Είναι χρήσιμο να γράφουμε Servlets με αυτό τον τρόπο; Εξαρτάται, γιατί το configuration τώρα είναι μέσα στον κώδικα που σημαίνει ότι αν θέλουμε να αλλάξουμε κάποιο element ή κάποιο annotation θα πρέπει να γίνει recompile το project μας. Για παράδειγμα, σκεφτείτε ότι ενώ έχει γίνει deploy το project θέλουμε να αλλάξουμε το URL patterns. Επίσης θα πρέπει να πηγαίνουμε σε μεμονωμένα αρχεία και να κάνουμε όλες τις αλλαγές που χρειάζονται σε κάθε κλάση ξεχωριστά.
Τώρα για να ξεκινήσουμε το project μας, πρέπει πρώτα να εκτελέσουμε την εντολή Clean and Build. Μετά πηγαίνουμε στο Navigator και αφού κάνουμε δεξί κλικ επάνω στο wildfly-jar run επιλέγουμε Execute Goal.
Μετά από λίγα δευτερόλεπτα, θα έχει ξεκινήσει ο ενσωματωμένος wildfly. Τώρα μπορούμε να δούμε το αποτέλεσμα του Servlet στον browser στην εξής διεύθυνση: http://127.0.0.1:8080/SimpleServlet
Το SimpleServlet είναι το urlPatterns που ορίσαμε στο Servlet. Μπορείτε να κρατήσετε το name το ίδιο και απλά να αλλάξετε το όνομα του urlPatterns.
ΕΙΣΗΓΗΤΗΣ
Μιχάλης Κασάπογλου
Ο Μιχάλης Κασάπογλου, είναι ένας από τους πιο έμπειρους τεχνικούς εκπαιδευτές στον χώρο του προγραμματισμού με πάνω από 20 χρόνια εμπειρία. Έχει εργαστεί σαν IT Operations Manager, Senior Programmer, και Training Team Leader ενώ κατέχει και αρκετές πιστοποιήσεις που καλύπτουν ένα μεγάλο φάσμα τεχνολογιών στο προγραμματισμό, σε βάσεις δεδομένων και cloud. Στον ελεύθερο του χρόνο διατηρεί ένα τεχνολογικό blog στο οποίο θα βρείτε αρκετά δωρεάν μαθήματα προγραμματισμού για αρχάριους.