Einführung Ralf Gitzel [email protected] 1 Übersicht Ralf Gitzel [email protected] 2 Übersicht • • • • • • JSP Konzept JSP Beispiel Szenario Java Code in JSPs Unsere erste JSP Skriptfreie Seiten JSTL 3 JSP Konzept Ralf Gitzel [email protected] 4 Was ist eine Java Server Page? • HTML Seite mit besonderen Befehlen, die Zugriff erlauben auf Java Objekte • Wird serverseitig verarbeitet, beim Client kommt reines HTML an • JSP kann alles, was ein Servlet auch kann 5 Was ist eine JSP wirklich? HTML Entwurf Entwicklung JSP-Datei Autom. Generierung Servlet Autom. Deployment HTML Seite nach Entwurf Container (Application Server) Servlet 6 JSP Beispiel Szenario Ralf Gitzel [email protected] 7 Entwurf für die HTML-Seite (1) 8 Entwurf für die HTML-Seite (2) 9 HTML-Code Zu ersetzen durch ermittelte Werte Zu ersetzen durch ermittelte Werte Zu ersetzen durch ermittelte Werte 10 JSP als Teil einer Web-App Request Response Kontrolle (über die Anfrage) Modell (erledigt die Arbeit) Container (Application Server) Controller Servlet Java Business Logic JSP Servlet Ansicht (zeigt das Ergebnis) 11 Entwicklung der Geschäftslogik 12 Übergabewert an die JSP 13 Controller Servlet ??? Modell befüllen und ausführen Parameter auslesen 14 Klasse: jsp.MaintenancerMasterController-Stage1 Java Code in JSPs Ralf Gitzel [email protected] 15 Verschiedene Möglichkeiten, Java-Code in JSPs zu verwenden • • • • Scriptlets Declarations Expressions Directives 16 Scriptlets • Kleine Java Code Blöcke im HTML Code • Werden bei der Servlet-Erstellung aus dem JSP-Code nach einem festen Muster eingefügt <% … Java Code … %> 17 „Hello World“ JSP Semikolon! 18 FirstScriptlet.jsp Declarations • Erlaubt die Definition von nicht-lokalen Variablen, Methoden usw. <%! Deklaration %> 19 Beispiel FirstDeclaration.jsp 20 Expressions • Beliebige Java-Ausdrücke (=Expressions), deren Ergebnis dann im HTML Ausgegeben wird • Vereinfacht gesagt: Ausdrücke sind eine ganz besondere Kategorie, z.B.: – Mathematische Operationen – Methoden mit Rückgabewert != void – Strings – Variablen 21 Expressions Kein Semikolon! 22 Directives • Verschiedene Hilfsaufgaben • Für uns wichtig: Import von Java-Paketen <%@ page import=„…“ %> 23 Directive-Beispiel 24 Umsetzung im Servlet • Import-Directives: Als imports am Kopf der Klassendatei • Declarations: Im Klassenrumpf • In der „do[Post/Get]-Ersatzmethode“: – HTML-Zeilen: out.println(„….“); – Scriplets: 1-zu-1 an der entsprechenden Stelle [Damit sind Variablen lokal] – Expressions: out.println(Expression); 25 Gruppendiskussion • Warum einmal ein Semikolon (Scriptlets), warum einmal nicht (Expressions)? • Hinweis: Antwort steht auf der vorherigen Folie! 26 Interessante Fragen • Zugriff auf andere Java Elemente • Kommunikation mit Servlets 27 Einige implizite Objekte out request JspWriter, im Grunde zu verwenden wie der Writer der Response! HttpServletRequest response HttpServletResponse session HttpSession application ServletContext config ServletConfig Throwable Für Error Seiten 28 ServletConfig Bis auf eine Zeile wie bei normalen Servlets 29 Unsere erste JSP Ralf Gitzel [email protected] 30 Erinnerung 31 Änderung am Controller Servlet Klasse: jsp.MaintenanceControllerServlet 32 JSP zum Auswerten der Ergebnisse 33 Gruppendiskussion • Was fällt am JSP-Code der vorherigen Seite (unangenehm) auf? • Wie gut kann man wohl mit JSPs arbeiten, die andere entwickelt haben? • Wirken meine Fragen suggestiv? 34 Skriptfreie Seiten Ralf Gitzel [email protected] 35 Motivation • Webdesigner haben wahrscheinlich Schwierigkeiten, den Java-HTML Mix einer JSP zu verstehen • Alternative JSP Konzepte erlauben die Vermeidung von Java Code • Anmerkung: Es folgt ein (nur kurzer) Einblick 36 Ersatz für Scriptlets • JSP Expression Language • Java Standard Template Library (JSTL) Tags 37 JSP Expression Language • Wurde bei JSP 2.0 hinzugefügt • Hier nur ein Abriss der für uns wichtigen Befehle! • Wir verwenden EL in Kombination mit JSTL 38 Expression Language ${Expression} Hier kommt keine Java Syntax zum Einsatz! (Erinnert eher an XSLT.) Rückgabewert wird an dieser Stelle in der HTML Seite eingefügt 39 Ausgewählte Expressions ${x[“y”]} Zugriff auf eine Map X=Map-Name Y=Schlüssel Zugriff auf eine Bean Zugriff auf eine List bzw. ein Array X=Objekt-Name Y=Property Name X=List-Name Y=Array/List Index (Mit oder ohne Anführungszeichen) 40 Anmerkung zur Notation ${x[“y”]} ${x[‘y’]} ${x.y} Sinnvoll, wenn ganze Expression in einem String steht! Nicht mit ArrayIndex! 41 Beispiel InstallInfo = HashMap emails = ArrayList Advise = Bean 42 Code: jsp.MaintenanceController_EL, index3.html Beispiel InstallInfo = HashMap emails = ArrayList Advise = Bean Code: EL-Results.jsp 43 Hinweis: Property Names Definiert das Property mit dem Namen „newCost“ (Man beachte die Groß- und Kleinschreibung!!) 44 Implizite Objekte in EL requestScope Map mit Request-Attributen sessionScope Map mit Session-Attributen applicationScope Map mit Application-Attributen param, paramValues Maps mit den Request-Parametern (paramValues bei mehreren Werten zu einem Namen) initParam Map mit Context Init Parametern (nicht Servlet Init Parametern) 45 Beispiel Implizite Objekte Code: EL-Results.jsp 46 JSTL Ralf Gitzel [email protected] 47 JSTL Tags • Erlauben Kontrollstrukturen ohne Java Code • Müssen explizit importiert werden • Es können auch eigene Tags geschrieben werden. (Behandeln wir nicht!) 48 Import Herunterladen: jstl-impl-1.2.jar jstl-api-1.2.jar Als Library in das Projekt einfügen 1. Wie servlet.jar 2. Als Kopie in WEB-INF/lib 3. In Eclipse: Refresh! (Sonst ignoriert Eclipse diese manuell kopierten Dateien!) Anmerkung: Dies ist nur eine Möglichkeit! Den Rest lassen wir Aus Zeitgründen weg. In die JSP importieren s. Beispiel nächste Folie 49 Beispiel Import der JSTL („uri“) und lokale Verwendung unter dem Namen „c“ („prefix“) Einsatz eines Tags aus der JSTL 50 Source: JSTLTest.jsp JSTL Tags c:out Ausgabe von Werten. Gut, um Usereingaben auszugeben (verhindert „cross-site scripting“ etc.) <c:forEach> Iteriert über Arrays und Collections. Beispiel folgt <c:if> Bedingtes Ausführen von Anweisungen. Beispiel folgt (oder: chose/when/otherwise) <c:url> Einfaches URL Rewriting in einer JSP (URL wird als value-Attribut angegeben) 51 c:forEach Datenquelle Zugriff auf das aktuelle Element Variable für das aktuelle Element Quelle: FancyDisplay.jsp (wird vom DataProducer Servlet aufgerufen) 52 c:if if Quelle: FancyDisplay.jsp (wird vom DataProducer Servlet aufgerufen) 53 Lernziele Ralf Gitzel [email protected] 54 Lernziele • Beziehung JSP und Servlet • JSP Wiederholung • JSPs als Ausgabemedium für Servlet/EJB Daten verwenden können • Existierende JSPs verstehen und verändern können 55 Gruppenaufgabe Ralf Gitzel [email protected] 56 Zielsetzung • Ein Servlet produziert Daten in Form von ArrayLists und fügt diese als Attribute in das Request Objekt (als Zahlen) • Weiterleitung an eine JSP: – Ausgabe der Daten in einer Liste – Zahlen, die größer sind als 10 sollen farblich hervorgehoben werden – Primzahlen sollen fett gedruckt werden 57 Primzahlen ??? • Es ist eine Klasse zu schreiben, die Primzahlen erkennt • Diese soll in der JSP verwendet werden (z.B. über ein Scriptlet) • Bonusaufgaben: – Es wird ein Objekt ZahlData in der Liste übergeben statt eine echte Zahl. Das Objekt enthält eine Methode IstPrimzahl. – Einsatz der als Bonusmaterial eingestuften Folien 58 Bonus Material Freiwillig* * = man braucht es nicht in der Klausur, es kann aber in der Klausur nützlich sein! Ralf Gitzel [email protected] 59 Variablen-Counter in c:forEach Quelle: FancyDisplay.jsp (wird vom DataProducer Servlet aufgerufen) 60 Mehr zu c:forEach Quelle: FancyDisplay.jsp (wird vom DataProducer Servlet aufgerufen) 61 Anmerkung: Templates einfügen • Man kann HTML-Fragmente wiederverwenden • <jsp:include> Tag • s. auch: HeaderDemo.jsp 62