Web 2.0 Software-Architekturen JavaServerPages als dynamische View einer MVC Anwendung Prof. Dr. Nikolaus Wulff Von Servlets zu JSP's • Die Erstellung der HTML Ausgabe in einem Servlet endete in uneffektiven „out.println Orgien“. • JSPs sollen die Servlets als Controller von dieser Aufgabe entlasten. • Ziel ist die Trennung der Datenverarbeitung von der Darstellung der Daten. • Beim ersten Laden eine JSP wird aus dieser ein Web-Container internes Servlet generiert, das die HTML Ausgabe ermöglicht, ohne dies explizit selber zu codieren... Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 2 Java Server Pages • Ermöglichen Aufgabenverteilung (Design und Codierung) bei der Entwicklung • Trennung nach dem Model-View-Controller-Pattern • Plattformunabhängig • Alle Bibliotheken des JDK stehen zur Verfügung • Sehr gute Unterstützung von Multithreading • Strukturiertes Exception-Handling • Gute bis sehr gute Performance: – Kompilierung der Seite erfolgt nur beim ersten Aufruf – Java auf Server-Seite ist schnell! Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 3 Andere Technologien • Viele Techniken unterstützen keine Trennung der Datenverarbeitung und Darstellung (z.B. Perl, PHP). • CGI-Skripte starten bei jedem Aufruf einen Prozess auf dem Server, dies führt zur schlechten Performance. • Häufig aufwendiges Session-Management (z.B. Perl) • Servlets erlauben kein normales Design einer Webseite. • Active Server Pages sind konzeptionell sehr ähnlich: – Ist meist auf Microsoft-Plattformen beschränkt – Basiert auf .Net (meist Visual Basic oder C#). Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 4 Architektur-Überblick Application-Server Browser Browser Web-Container Web-Container JavaScript Servlet RMI IIOP EJB DB JNDI JDBC JAF JMS JTA JSP JNDI JDBC JAF JMS JTA AJAX HTTP EJB-Container EJB-Container Präsentation Präsentation Geschäftslogik • Darstellung von HTML, XML • Session Verwaltung • Use Cases • HTML Generierung • Business Objects • ggf. Scripting Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 5 Hello World! Eine einfache Java Server Page: <HTML> <BODY> <% out.println(„Hello JSP World!“); %> </BODY> </HTML> <% ... %> beschreibt ein Java Scriplet: Java Code direkt eingebettet in eine HTML Seite. Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 6 Prinzip der Java Server Pages • HTML-Design mit Tool nach Wahl (z.B. Dreamweaver) • Einfügen des Java-Codes mit geeignetem Editor, Dateiendung *.jsp • Bereitstellen der Datei im entsprechenden Verzeichnis auf dem Webserver • Beim ersten Aufruf durch einen Client kompiliert der Webserver die JSP in ein Servlet • Bei einem erneuten Abruf der Seite prüft der Webserver, ob sich die Seite geändert hat. Falls nein, wird das zuvor kompilierte Servlet ausgeführt. Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 7 Beispiel • Es soll eine einfache HTML-Seite erstellt werden, welche analog zum HelloWorld-Servlet die aktuelle Uhrzeit anzeigt. • Schreiben einer „normale HTML-Seite“, die lediglich die Endung „*.jsp“ hat. • Das einzige Dynamische ist ein Skriplet <%=new Date() %> • welches bei jedem Aufruf die aktuelle Zeit in den Ausgabestrom der Seite schreibt. Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 8 Dynamische HelloWorld JSP <%@ page language="java" import="java.util.*" %> <HTML><HEAD> <TITLE>HelloWorld JSP</TITLE> </HEAD><BODY> <H1>HelloWorld</H1> Dieser erste Teil ist statischer Text. <br/> Hier kommt eine dynamisch erzeugte Ausgabe<br/> Hier und jetzt ist es: <%=new Date() %> </BODY></HTML> HTML und Java gemischt auf einer Seite. Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 9 Laufzeitumgebung • Java SDK muss installiert sein (Compiler!) • Servlet-Engine des Webservers muss JSPs verarbeiten können • Beispiele: – WebLogic Application Server – IBM WebSphere – Apache Webserver mit Tomcat – Eclipse Jetty Plugin Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 10 Gliederung einer JSP • JSP-Direktiven – Voreinstellungen für Seite, Includes usw. • JSP-Deklarationen – Block für Definition statischer Variablen • JSP-Scriptlets – Blöcke, die Java-Code mit der Seitenlogik enthalten • JSP-Expression – Ausdruck, der ausgewertet in den Text eingefügt wird • JavaScript-Bereich für clientseitigen Code • HTML-Code Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 11 Beispiel JSP <%@ page language="java" import="java.util.*" %> <%! String strText = "<b>Text einer deklarierten Variablen,</b>"; %> <% strText += " <b><i> dynamisch erweitert!</i></b>"; %> <html> <head> Beachte: <%! Member Variable oder Funktion, <% lokales Scriplet. <title>HelloWorld JSP</title> </head><body> <h1>HelloWorld</h1> Dieser erste Teil ist statischer Text. <br/> Hier kommt eine dynamisch erzeugte Ausgabe<br/> Hier und jetzt ist es: <%=new Date() %><br/> Und hier die Variable strText: <%=strText%> </body></html> Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 12 Syntax Direktiven 1 • Page-Direktive <%@ page attribut="value" %> Definiert Einstellungen, die für die gesamte Seite gültig sind. Mögliche Attribute sind (Auswahl): import, extends, errorPage, session Beispiel: <%@ page language="java" import="java.util.*, bookstore.*" %> Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 13 Syntax Direktiven 2 • Include-Direktive <%@ include file="url" %> Angegebene Datei wird statisch während der Kompilierung eingebunden. Es kann sich um eine HTML-Seite oder JSP handeln. Beispiel: <%@ include file="mypage.html" %> Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 14 Syntax Actions • Jsp:include-Action <jsp:include page="url" /> Angebene Datei wird bei bei jedem neuen Request der Seite eingebunden. Inhalt kann statisch oder dynamisch sein. • Jsp:usebean-Action <jsp:usebean attribut="value" /> Mögliche Attribute sind (Auswahl): id, scope, class • Jsp:forward-Action <jsp:forward page="url" /> Weiterleitung auf statische Seite, Servlet oder andere JSP. Prozessierung der aktuellen Seite wird abgebrochen. Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 15 Syntax Deklarationen • Kennzeichnung mit <%! .... %> • Im Deklarations-Block werden Variablen definiert. • Die Initialisierung erfolgt bei der Initialisierung der Seite. • Vorsicht: Da es sich um Instanz-Variablen handelt, können die Werte Session-übergreifend sichtbar sein! • Beispiel: <%! String dummy = "hallo"; int version = 1; %> Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 16 Implizite Objekte • Implizite Objekte werden automatisch erzeugt und können ohne Deklaration verwendet werden. – request => HttpServletRequest – response => HttpServletResponse – session => HttpSession – out => PrintWriter – Außerdem: page, pageContext, config, exception, application • Die ersten vier Objekte entsprechen denen aus der Servlet API. Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 17 Beispiele Implizite Objekte • <% session.putValue("MeinParameter", "Wert"); %> • <% String param = (String)session.getValue("MeinParameter"); %> • <% String param2 = request.getParameter("editDatum"); %> • <% out.println("Dieser Text wird ausgegeben!"); %> Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 18 Jsp:usebean • Jsp:usebean <jsp:usebean <attribut>=<value> /> Mögliche Attribute: Scope: entweder page, request, session oder application Id: Name, unter dem auf die Bean zugegriffen wird Class: Vollständiger Name der JavaBean-Klasse Beispiel: <jsp:useBean id="StoreBean" scope="session" class=„onlinestore.StoreBean" /> Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 19 Error-Handling • Es gibt zwei Arten von JSP-Fehlern: – Translation Time Errors: Fehler beim Kompilieren – Request Time Errors: Fehler zur Laufzeit • Compile-Errors sind im Logfile des Servers. • Laufzeit-Fehler werfen eine Exception und können im JSP-Code abgefangen werden. • Nicht abgefangene Exceptions werden an eine optional angegebene Fehler-Seite weitergegeben: <%@ page language="java" errorPage="/error.jsp" %> Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 20 JSP Vererbungshierarchie <<Interface>> Servlet (from ser vl et) <<Int erface>> JspPage js pInit() js pDestroy() <<Int erface>> HttpJspPage <<Interface>> ServletConfig <<Abstract>> GenericServlet (from serv let) (from serv let) <<Interface>> ServletContext <<Abstract>> HttpServlet (from serv let) (from http) <<Container>> HttpJspBase (from org.apache.j asper.runtime) abhängig von der JSPEngine. Hier Apache Tomcat _jspService() MyJavaServerPage <<generated>> MyJspServlet pageContext PageContext 1 Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 21 PageContext <<Interface>> ServletRequest <<Interface>> ServletResponse (from serv let) (from serv let) 1 <<Interface>> HttpSession +session (from http) Writer (from io) 1 PageContext (from lang) 0..1 0.. 1 +out 1 JspWri ter 1 <<Interface>> ServletConfig (from serv let) Prof. Dr. Nikolaus Wulff -attribut Object name : String Web 2.0 Software-Architekturen 1 <<Interface>> ServletContext (from serv let) 22 PageContext <<Interface>> ServletRequest <<Interface>> ServletResponse (from serv let) (from serv let) 1 <<Interface>> HttpSession +session (from http) Writer (from io) 1 PageContext (from lang) 0..1 0.. 1 +out 1 JspWri ter 1 <<Interface>> ServletConfig (from serv let) Prof. Dr. Nikolaus Wulff -attribut Object name : String Web 2.0 Software-Architekturen 1 <<Interface>> ServletContext (from serv let) 23 JSP Template Muster • JSPs lassen sich dynamisch für ein einheitliches Layout verschachteln: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding=" <html> <jsp:include page="<%=request.getAttribute("HEADER").toString() %>" /> <body> <div id="content"> <jsp:include page="<%=request.getAttribute("CONTENT").toString() %>" /> </div> <div id="footer"> <jsp:include page="<%=request.getAttribute("FOOTER").toString() %>" /> </div> </body> </html> • Header, Content und Footer sind kontextsensitiv vom Servlet Controller entsprechend der Anfrage im „request Scope“ hinterlegt worden. Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 24 Controller → View • Um ein MVC Muster zu realisieren delegiert das Controller Servlet die Anfragen an entsprechende Modell Klassen. Die Ergebnistypen werden dann meistens im Request oder Session Scope hinterlegt. • Das Erstellen der HTML Seite wird dann vom Controller Servlet an die JSP Seite delegiert. • Hierzu wird wird ein RequestDispatcher parameterisiert und die Kontrolle an die JSP Seite per include oder forward übergeben. Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 25 JSP Page include /** * Does an include for a jsp page. * @param page String the page url to include * @param req HttpServletRequest the request instance * @param res HttpServletResponse the response object * @throws ServletException * @throws IOException */ protected void doInclude(String page, HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { RequestDispatcher dispatcher = req.getRequestDispatcher(page); dispatcher.include(req, res); } Ressourcen (Servlets, JSPs...) lassen sich einfach per include oder forward vom Servlet aus rufen und in die Seite einbauen. Prof. Dr. Nikolaus Wulff eCommerce 26