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 Browser Browser Application-Server Web-Container EJB-Container JavaScript AJAX HTTP JSP Servlet RMI IIOP EJB DB JNDI JDBC JAF JMS JTA JNDI JDBC JAF JMS JTA Präsentation Darstellung von HTML, XML ggf. Scripting Präsentation Session Verwaltung HTML Generierung Geschäftslogik Use Cases Business Objects 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> <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> Beachte: <%! Member Variable oder Funktion, <% lokales Scriplet. 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 Servlet (from servlet) <<Abstract>> GenericServlet (from serv let) ServletConfig (from serv let) <<Int erface>> JspPage jspinit() js pdestroy() <<Abstract>> HttpServlet (from http) ServletContext (from serv let) <<Int erface>> HttpJspPage _jspservice() <<Container>> HttpJspBase (from org.apache.j asper.runtime) abhängig von der JSPEngine. Hier Apache Tomcat MyJavaServerPage <<generated>> MyJspServlet pagecontext 1 PageContext Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 21
PageContext ServletRequest (from serv let) 1 ServletResponse (from serv let) 1 HttpSession (from http) +session 0..1 PageContext name : String -attribut Object 0..1 (from lang) Writer (from io) +out JspWri ter 1 1 1 ServletConfig (from serv let) ServletContext (from serv let) Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 22
PageContext ServletRequest (from serv let) 1 ServletResponse (from serv let) 1 HttpSession (from http) +session 0..1 PageContext name : String -attribut Object 0..1 (from lang) Writer (from io) +out JspWri ter 1 1 1 ServletConfig (from serv let) ServletContext (from serv let) Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 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