Ιωάννης Πρίγγουρης (iprigg@di.uoa.gr) Java Server Pages Ιωάννης Πρίγγουρης (iprigg@di.uoa.gr)
Servlets Η πρώτη απόπειρα υποστήριξης CGI programming από τη Java Χρησιμοποιούνται για τη δημιουργία web σελίδων και εφαρμογών γενικότερα Εμφανίστηκαν για πρώτη φορά το 1997 Τελευταία τρέχουσα έκδοση του προτύπου είναι η 2.5 Είναι ένα JAVA API το οποίο περιλαμβάνει ένα σύνολο κλάσεων για τη δημιουργία web εφαρμογών Τμήμα της προδιαγραφής J2EE
Servlets – Πλεονεκτήματα σε σχέση με το παραδοσιακό CGI scripting Απόδοση Πολύ καλύτερη διαχείριση της μνήμης μέσω του JVM Κάθε request γεννάει 1 καινούργιο Νήμα (Thread) και όχι process Ευκολία Δεν χρειάζεται η γνώση άλλης γλώσσας εκτός από JAVA To API που παρέχεται προσφέρει έτοιμες κλάσεις για ένα πλήθος λειτουργιών (π.χ., ανάγνωση δεδομένων από φόρμες κοκ.) Δυναμική Όλη η δυναμική της JAVA ενσωματώνεται στην web εφαρμογή Φορητότητα Όπως και η JAVA ένα servlet τρέχει σε οποιαδήποτε λειτουργικό σύστημα και υπολογιστή Χαμηλό κόστος Πληθώρα web servers παρέχονται δωρεάν, όπως άλλωστε και η JAVA
Servlets – A Hello World Example (1/2) package test; import java.io.PrintWriter; import java.io.IOException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.ServletException; public class HelloServlet extends HttpServlet { public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { PrintWriter pw = res.getWriter(); pw.println("<html><head><title>HelloWorld</title></head>"); pw.println("<body>"); pw.println("<center><h2> "); pw.println("Hello World!!"); pw.println("</h2></center> "); pw.println("</body></html>"); pw.close(); }
Servlets – A Hello World Example (2/2) Configuration is needed as shown below: <web-app> <servlet> <servlet-name>hello</servlet-name> <servlet-class>test.HelloServlet</servlet-class> </servlet> <servlet-mapping> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
Servlets – Μειονεκτήματα Πρέπει να τα μεταγλωττίσει (compile) και να τα εγκαταστήσει στον server o προγραμματιστής Δεν απεικονίζονται απευθείας σε http URLs Π.χ., ένα servlet με όνομα HelloWorld.java δεν καλείται κατ’ ανάγκη ως http://localhost:8080/HelloWorld.java O κώδικας της HTML (για τη εμφάνιση δεδομένων στην οθόνη) ενσωματώνεται στον κώδικα της JAVA Εάν το servlet πρέπει να τυπώσει αρκετά στοιχεία στην οθόνη η χρήση HTML μέσα σε διαδοχικά out.println(…) καταντάει κουραστική. Δεν είναι δυναμικά. Κάθε αλλαγή στον κώδικα του Servlet, απαιτεί εκ νέου μεταγλώττιση και εγκατάσταση στον Server.
JSP - Γενικά Στοιχεία Η τεχνολογία JSP παρέχει ένα εύκολο και γρήγορο τρόπο για τη δημιουργία εφαρμογών web Ανεξαρτησία από λειτουργικό σύστημα και web server Τελευταία τρέχουσα έκδοση του προτύπου είναι η 2.1 Τμήμα της προδιαγραφής J2EE Η λειτουργικότητα που παρέχεται είναι ακριβώς η ίδια με ένα servlet
JSP - Hello World! <html> <head> <title>JSP Hello World!</title> </head> <body> <%=”Hello from JSP!”%> </body> </html>
JSP – Πλεονεκτήματα Ενσωμάτωση κώδικα JAVA σε κώδικα HTML Απεικονίζονται απευθείας σε http URLs Τα μεταγλωττίζει και τα εγκαθιστά απευθείας ο server Είναι δυναμικά Αλλαγές στον κώδικα του JSP αρχείου γίνονται άμεσα ορατές στον server
Απαιτήσεις Συστήματος Περιβάλλον εκτέλεσης: Πρόσφατη έκδοση του J2SE (JDK/JRE) Servlet Engine (web server) που να υλοποιεί τουλάχιστον την προδιαγραφή JSP έκδοσης 1.2 Περιβάλλον ανάπτυξης: Απλός κειμενογράφος Προαιρετικά ολοκληρωμένο περιβάλλον ανάπτυξης
Εργαλεία Συστήματος Εγκατάσταση του JDK/JRE Web server: Apache Tomcat Εκδοση 1.3.1+ Web server: Apache Tomcat Εκδοση 5.0+ Κειμενογράφος Textpad v4.6
Κύκλος Λειτουργίας Αίτηση Απάντηση Εχει γίνει πρόσφατη μετατροπή; Οχι Μετατροπή jsp σε κώδικα Java (servlet) Αίτηση Ναι Απάντηση Εκτέλεση κώδικα
Φιλοσοφία Ανάπτυξης JSP Ανάπτυξη σελίδας ως απλό HTML Διαδοχική προσθήκη δυναμικών κομματιών (γραμμένων σε JAVA) Κατασκευή βιβλιοθηκών
Βασικά Στοιχεία Υπάρχουν δύο διαφορετικές φάσεις επεξεργασίας μιας σελίδας Φάση 1: Μετατροπή της σελίδας JSP σε κώδικα Κατά τη φάση αυτή γίνεται επεξεργασία συγκεκριμένων ορισμάτων, που αρχίζουν από <%@ Φάση 2: Εκτέλεση του κώδικα Κατά τη φάση αυτή γίνεται επεξεργασία των υπολοίπων ορισμάτων, που αρχίζουν από <%
Βασικά Στοιχεία (2) Σύμβολα εισαγωγής εντολών: <% και %> Σχόλια: <%-- Σχόλιο JSP--%> <!-- Σχόλιο HTML --> Εισαγωγή αρχείου (Server-side include): <%@include file=”sample.jsp”%> Υπολογισμός παραστάσεων: <%=1+1%> <%=”Πρόσθεση “+”αλφαριθμητικού”%>
Ασκηση Κατασκευή σελίδας JSP που να εμφανίζει το εξής κείμενο: 3*5 = 15 Ο αριθμός 15 θα πρέπει να υπολογίζεται δυναμικά
Βασικά Αντικείμενα Η κατάσταση του συστήματος μπορεί να βρεθεί από τα αντικείμενα: request session application
Αντικείμενο request Περιέχει όλες τις πληροφορίες που έρχονται από την αίτηση του πελάτη Χρήσιμες μέθοδοι: getHeader(String header) getQueryString() getParameter(String name) getParameterValues(String name) getServerName() getRemoteHost() isSecure()
Παράδειγμα Εμφάνιση παραμέτρων που δώθηκαν από το χρήστη: page1.jsp: <html> <body> <form name=”frm” method=”POST” action=”page2.jsp”> Ονομα χρήστη: <input type=”text” name=”username”><br> <input type=”submit”> </form> </body> </html> page2.jsp: <html> <body> Ονομα χρήστη: <%=request.getParameter(“username”)%> </body> </html>
Ασκηση Βασικό calculator, με το χρήστη να δίνει δύο αριθμούς και να εμφανίζεται το άθροισμά τους
Παράδειγμα Εμφάνιση του browser που χρησιμοποιεί ο χρήστης: whichbrowser.jsp: <html> <body> Αναγνωριστικό browser: <%=request.getHeader(“User-Agent”)%> </body> </html>
Αντικείμενο session Περιέχει όλες τις πληροφορίες που αφορούν τη συγκεκριμένη συνεδρία Μια συνεδρία καθορίζεται είτε με τη χρήση cookies είτε με διαμόρφωση URL Χρήσιμες μέθοδοι: getAttribute(String name) setAttribute(String name, Object value) removeAttribute(String name)
Παράδειγμα Εμφάνιση του ονόματος του χρήστη για τη συνεδρία: page2.jsp: <% session.setAttribute(“uname”,request.getParameter(“username”));%> <html> <head> <script> window.location.replace('page3.jsp'); </script> </head> </html> page1.jsp: <html> <body> <form name=”frm” method=”POST” action=”page2.jsp”> Ονομα χρήστη: <input type=”text” name=”username”><br> <input type=”submit”> </form> </body> </html> page3.jsp: <html> <body> Ονομα χρήστη: <%=session.getAttribute(“uname”)%> </body> </html>
Πολυγλωσσική Υποστήριξη Για σωστή υποστήριξη εμφάνισης Ελληνικών, είναι πιθανό να απαιτείται η εξής οδηγία στην αρχή του αρχείου: <%@page pageEncoding="..."%> Μερικές πιθανές τιμές: <%@page pageEncoding="UTF-8"%> <%@page pageEncoding="ISO-8859-7"%> <%@page pageEncoding="windows-1253"%> Κλασσικές τιμές για αγγλικά (default): <%@page pageEncoding="ISO-8859-1"%> %@page pageEncoding="windows-1252"% Για υποστήριξη ανάγνωσης Ελληνικών που εισάγονται από φόρμες απαιτείται η κλήση της μεθόδου: request.setCharacterEncoding(“…”);
Αντικείμενο application Περιέχει πληροφορίες που μοιράζονται όλοι οι χρήστες του συστήματος Παρόμοια λειτουργία με το αντικείμενο session Χρήσιμες μέθοδοι: getAttribute(String name) setAttribute(String name, Object value) removeAttribute(String name)
Βασικά Στοιχεία Java Εκφράσεις – παραστάσεις Αυτόματες μετατροπές 2 ((8/(2*4))+3)-(8/4) 7/2 7.0/2.0 “Ενα αλφαριθμητικό” “Ενα”+” “+”αλφαριθμητικό” Αυτόματες μετατροπές 7.0/2 “1+1=”+2
Βασικά Στοιχεία Java (2) Μεταβλητές int x = 5; int y = 8; x = x+5-y; String st = “hello!”; Μερικοί τύποι δεδομένων: short int long double boolean String
Βασικά Στοιχεία Java (3) Τελεστές σύγκρισης: x>5 x==5 (x>=5)&&(x<=8) String st = “hello!”; x!=5 st.equals(“hello!”); Βασικές μετατροπές τύπων Integer.toString(int x) Integer.parseInt(String xs) Double.toString(double y) Double.parseDouble(String ys)
Βασικά Στοιχεία Java (4) Εντολή if: if (x!=5) { x = x+2; } else { x = x-2; }
Βασικά Στοιχεία Java (5) Εντολή while: int x = 1; int a = 0; while (x<=5) { a = a+x; x = x+1; } Εντολή for: for (int x=1; x<=5; x++) {
Βασικά Στοιχεία Java (6) Ιδιαίτερες σταθερές: null true false Αντιστοιχία βασικών τύπων & κλάσεων: int <-> Integer long <-> Long boolean <-> Boolean double <-> Double Οπου ζητείται μια παράμετρος τύπου Object, δεν μπορούμε να χρησιμοποιήσουμε τους βασικούς τύπους αλλά μόνο τις αντίστοιχες τους κλάσεις
Παράδειγμα Κατασκευή μίας σελίδας που θα εμφανίζει ένα μετρητή για το πόσες φορές έχει εμφανιστεί η συγκεκριμένη σελίδα <%@page pageEncoding=“ISO-8859-7”%> <% String count = (String)application.getAttribute("counter"); if (count==null) { count = "0"; } int c = Integer.parseInt(count); c++; application.setAttribute("counter",Integer.toString(c)); %> <html> <body> Μετρητής: <%=c%> </body> </html>
Ασκηση Κατασκευή μίας σελίδας που θα εμφανίζει ένα μετρητή για το πόσες φορές έχει εμφανιστεί η συγκεκριμένη σελίδα από ΔΙΑΦΟΡΕΤΙΚΟΥΣ χρήστες Χρησιμοποιείστε το αντικείμενο request για να διακρίνετε τους χρήστες