Java 2 Enterprise Edition, Teil 1: Java Server Pages Entwicklung
Transcription
Java 2 Enterprise Edition, Teil 1: Java Server Pages Entwicklung
Java 2 Enterprise Edition, Teil 1: Java Server Pages Entwicklung von Web-Anwendungen Projektseminar Einführung • Früher: – Statische Web-Angebote, d.h. • einfache HTML-Seiten • Zunehmend: – Dynamische Web-Angebote, z.B. • • • • Multimediale Gestaltungselemente Interaktion mit Endbenutzern Kommunikation Geschäftlich relevante Vorgänge 1 (eine mögliche) Klassifikation • Informationsorientierte Angebote – z.B. www.spiegel.de, www.yahoo.de • Applikationsorientierte Angebote – z.B. www.bahn.de, www.dealtime.de • Transaktionsorientierte Angebote – z.B. www.amazon.de, www.ebay.de, www.consors.de • Kommunikationsorientierte Angebote – z.B. www.redseven.de • Integrierte Angebote – Angebote, die ein oder mehrere dieser Angebotsformen unter einer einheitlichen Oberfläche bündeln Beispiel 1: Spiegel Online 2 Beispiel 2: Deutsche Bahn Beispiel 3: Amazon.de 3 Beispiel 4: Redseven Technologie - ein Überblick • Dokumentformate – HTML – XML • Clientseitige Applikationen – Clientseitiges Skripting – Ausführbarer Code • Serverseitige Applikationen – CGI-Schnittstelle – Server-API – Serverseitiges Skripting – Applikationsserver 4 Dokumentformate • HTML – Auszeichnungssprache mit festgelegtem Satz an Elementen <HTML> – z.B. • • • • • • Paragraph Liste Tabelle Links Bildreferenzen etc. <HEAD> <TITLE>Meine erste HTML-Seite</TITLE> </HEAD> <BODY> <P>Hallo Welt!</P> <P><A href=„index.html“>Back</A></P> </BODY> </HTML> • XML – Metasprache zu Erzeugung von Auszeichnungssprachen Clientseitiges Skripting • Sind in die HTML-Seite eingebettet • Definierte Funktionen werden durch objektbezogene Ereignisse aktiviert und manipulieren wiederum Objekte • Sind Teil des Dynamic HTMLKonzeptes • <HTML> <HEAD> ... </HEAD> <BODY> <SCRIPT> function hello() ... </SCRIPT> ... HTML-Code ... Beispiele: JavaScript, VBScript </BODY> </HTML> 5 Ausführbarer Code • • Wird von einem HTMLDokument referenziert und vom Browser nachgeladen Browser Drei Ansätze: HTML – Java Applets – ActiveX Controls – Plugins Java Virtual Machine Applet WWW-Server CGI-Schnittstelle • Browser referenziert CGI-Skript über die URL und übergibt dabei Parameter • Server startet CGI-Skript als eigenen Prozess • CGI-Skript erzeugt Dokument und übergibt es an den WWW-Server • Server sendet Dokument an Browser Browser WWW-Server CGI-Skript 6 Server API • Funktionalität wird in Form einer DLL in den Server integriert • Benutzt also den gleichen Adressraum wie der WWWServer • Parallele Aufrufe werden durch Threads bearbeitet Browser WWW-Server DLL oder Shared Library Serverseitiges Skripting • Skriptsprache wird direkt in den HTML-Dokumenten codiert • Wenn der Client ein Dokument abruft, werden die Skripte auf dem Server ausgeführt • Der Output des Skriptes wird vom Server in das Dokument integriert (z.B. Ergebnis einer DB-Abfrage) <HTML> <HEAD> ... </HEAD> <BODY> ... HTML-Code ... <% Skriptsprache %> ... HTML-Code ... </BODY> </HTML> 7 Applikationsserver • Ein Applikationsserver bietet eine Laufzeitumgebung für serverseitige Anwendungen • Typische Funktionalitäten – Datenbankzugriff – Sicherheitsmechanismen – Sessionmanagement – Transaktionsmanagement – Verfügbarkeit (LoadBalancing, Failover) – Entwicklungswerkzeuge • Wichtige Klassen und Produkte – Skripting-orientiert (Microsoft ASP, PHP, Macromedia Cold Fusion etc.) – Komponenten-orientiert (IBM WebSphere, BEA, Macromedia JRun etc.) Probleme in der Praxis mit der Entwicklung von Webanwendungen • • • • • • • Hohe Anforderungen an technisches Handwerkszeug Sicherheitsanforderungen werden unterschätzt Skalierbarkeit reicht nicht aus Integrationsaufgabe hinter den Kulissen des Browsers ist gewaltig Kein konzertiertes Vorgehen von Technik-Leuten und Business Leuten Kein methodisches Vorgehen Unterschätzung der Architekturaufgabe 8 XML Nachteile • Diskussion der Hausaufgabe JSP-Programmierung • HelloWorld.jsp – HTML-Seite mit eingebetteten Kommandos <html> <head> [...] </head> <body> <% out.println(„Hello World“); %> </body> </html> 9 Elemente auf JSP-Seiten • JSP Skripting – Mechanismus, der es erlaubt, Code-Fragmente direkt in eine JSPSeite einzubetten • Direktiven – enthalten globale Angaben über die gesamte Seite • Aktionen – Tags, die bestimmte Aufgabenkomplexe kapseln JSP Skripting: Anweisungen • Anweisungsfragmente • Syntax: <% Anweisungsfragment(e) %> • wird sehr häufig verwendet <jsp:useBean id="myKalender" scope="page" class="java.util.GregorianCalendar"/> <html> <head> <title>Home</title> </head> <body> <% if (myKalender.getInstance().get(myKalender.AM_PM) == myKalender.AM) { %> Guten Morgen! <% } else { %> Guten Tag! <% } %> </body> </html> 10 JSP Skripting: Ausdrücke • • Ausdrücke <html> <head> [...] </head> Syntax: – <%= Ausdruck %> • dienen dazu, Ausdrücke auf der Ergebnisseite auszugeben • werden ebenfalls sehr häufig verwendet <body> <% String s = "bla"; %> [...] <%=s %> </body> </html> JSP Skripting: Kommentare • Kommentare • Syntax: – <%-- beliebiger Text --%> • • <html> <head> [...] </head> <body> dienen dazu, Kommentare in den Code einzubringen, die auf der Ergebnisseite unterdrückt werden <!-- sollten ebenfalls sehr häufig verwendet werden <%-- JSP-Kommentar --%> HTML-Kommentar, wird in der Seite erscheinen //--> <% // Java-Kommentar %> </body> </html> 11 JSP Skripting: Vereinbarungen • • Vereinbarungen <html> <head>[...]</head> <body> Syntax: – <%! Vereinbarung(en) --%> • dienen dazu, Variablen, Methoden etc. zu vereinbaren, können von mehreren Threads verwendet werden • werden eher selten verwendet <%-- 1. Vereinbarung der Methode --%> <%! String f(int i) { if (i%2 == 0) return "gerade"; else return "ungerade"; } %> <%-- 2. Aufruf der Methode --%> Die 1 ist eine <%=f(1) %> Zahl.<br> Die 2 ist eine <%=f(2) %> Zahl. </body> </html> JSP-Skripting: Implizite Objekte • Implizite Objekte – ... stehen dem Programmierer auf allen JSP-Seiten zur Verfügung – ... ermöglichen den Zugang zu wichtigen Ressourcen des Servers • Wichtige Beispiele: – request – response – session – application – out 12 JSP-Skripting: Implizite Objekte • Das implizite Objekt request <html> <head> – ... kapselt alle Informationen </head> über die Anfrage an die aktuelle <body> JSP-Seite <title>index2.jsp</title> <!-- Begrüßung --> <% if (request.getParameter("name") != null) { %> – ... ermöglicht den Zugang zu den HTTP-Headern der Anfrage, zu Cookies und zu Anfrageparametern (GET und POST) – ... ist insbesondere im Zusammenhang mit der Auswertung von Formularen wichtig Hallo <%=request.getParameter("name") %>!!! <% } %> <!-- Eingabefeld --> <form action="index2.jsp" method="post"> Dein Name: <input type="text" name="name"> <input type="submit" value="ok"> </form> </body> </html> JSP-Skripting: Beispiel 13 JSP-Skripting: Implizite Objekte • Das implizite Objekt response – ... repräsentiert die Antwort auf eine Anfrage – ... ermöglicht unter anderem das Schreiben in den HTTPHeader oder das Anhängen von Cookies [...] <% Cookie[] cookies = request.getCookies(); int anzahl_cookies = cookies.length; int anzahl_aufrufe; String wert = "null"; for (int i=0; i < anzahl_cookies; i++) { if (cookies[i].getName().equals("anz_aufrufe")) { wert = cookies[i].getValue(); } } if (wert != "null") { out.println("Das " + wert + ". Mal hier."); anzahl_aufrufe = Integer.parseInt(wert); anzahl_aufrufe = anzahl_aufrufe + 1; Cookie co = new Cookie ("anz_aufrufe", Integer.toString(anzahl_aufrufe)); response.addCookie(co); } else { out.println("Das erste Mal hier, wie?"); Cookie co = new Cookie ("anz_aufrufe", "2"); response.addCookie(co); } %> [...] JSP-Skripting: Beispiel Reload Reload 14 JSP-Skripting: Implizite Objekte • Das implizite Objekt session – ... enthält sitzungsorientierte Objekte, also Objekte, die auf mehreren, nacheinander aufgerufenen JSP-Seiten innerhalb einer Sitzung zu Verfügung stehen sollen <html> <head> <title>Seitenzähler mit Session-Objekt</title> </head> <body> <% Integer anzahl = (Integer) session.getAttribute("ANZAHL"); – ... bietet Methoden, die das Einfügen, Löschen oder Ändern von Objekten in das Sitzungsobjekt ermöglichen if (anzahl != null) { out.println("Das " + anzahl + ". Mal hier."); anzahl = new Integer(anzahl.intValue()+1); session.setAttribute("ANZAHL", anzahl); } else { out.println("Das erste Mal hier, wie?"); anzahl = new Integer(2); session.setAttribute("ANZAHL", anzahl); } %> </body> </html> JSP-Skripting: Implizite Objekte • Das implizite Objekt out – ... enthält Methoden, mit den Ausgaben auf der ErgebnisSeite erzeugt werden können <html> <head> [...] </head> <body> – ... wird relativ häufig verwendet <% out.println(„Hello World“); %> </body> </html> 15 JSP Direktiven • • • ... beinhalten globale Angaben, die im Gegensatz zu Skripten nicht nur Auswirkung zum Ausführungszeitpunkt, sondern auch zum Übersetzungszeitpunkt haben ... können überall auf der Seite stehen ... sind unabhhängig von der verwendeten Skriptsprache • Syntax: • <%@ direktivname {attributname=„wert“} %> • Beispiele • include • page • taglib (in dieser Veranstaltung nicht behandelt) JSP Direktiven: include • Die Direktive include • ... bindet wiederkehrende Elemente in Dateien ein <html> <head> [...] </head> • Syntax: <body> – <%@ include file=„[pfad]“ %> <%@ include file=„header.htm“ %> [...] </body> </html> 16 JSP Direktiven: include Element “banner_top.htm” Element “header.htm” Element “teaser_right.jsp” Element “nav_left.jsp” Element “banner_content.htm” Element “content_art.jsp” Element “footer.htm” JSP Direktiven: include <html><title>[...]</title></head> <style type="text/css"> <%@ include file="styles.css" %> </style> <body> <table cellpadding="5" border="0" width="750"> <tr> <td colspan="3" valign="top"><%@ include file="banner/banner_top.htm" %></td> </tr> <tr> <td colspan="3" valign="top"><%@ include file="inc/header.htm" %></td> </tr> <tr> <td width="150" valign="top"><%@ include file="inc/nav_left.jsp" %></td> <td width="450" valign="top"><%@ include file="inc/content_art.jsp" %></td> <td width="150" valign="top"><%@ include file="inc/teaser_right.jsp" %> <%@ include file="banner/banner_content_small.htm" %> </td> </tr> <tr> <td colspan="3" valign="top"><%@ include file="inc/footer.htm" %></td> </tr> </table> </body></html> 17 JSP Direktiven: page • Die Direktive page • ... trifft Vereinbarungen, die für die gesamte Seite wichtig sind • Beispiele – import – language – contentType – errorPage – (isErrorPage) – session <%@ page import="java.util.*, java.text.*" language="Java" contentType="text/html" errorPage="error.jsp“ session="true" %> <html> <head> [...] </head> <body> [...] </body> </html> JSP Aktionen • Wichtige Aktionen: – <jsp:include> – <jsp:forward> – <jsp:useBean> – <jsp:setProperty> – <jsp:getProperty> • Aktionen können Objekte erzeugen oder existierende Objekte verändern • Es gibt Standardaktionen und benutzerdefinierte Aktionen (vgl. taglibs) 18 JSP Aktionen: include • Aktion include • Ausgabe einer JSP-Seite kann zur Laufzeit in eine andere Seite eingebettet werden • Syntax: – <jsp:include page=„pfadangabe“ flush=„true“/> • page: – Pfadangabe zur JSP, kann absolut (z.B. http://www.uni-goe.de/1.jsp) oder relativ sein (z.B. ../../header.jsp) – Der Wert kann auch dynamisch zur Laufzeit eingefügt werden • flush: – muss zur Zeit immer auf „true“ gesetzt werden • Abgrenzung zur Direktive include: Diese wird zur Übersetzungszeit eingefügt JSP Aktionen: forward • Aktion forward • Weiterleitung einer Anfrage an eine andere Seite oder ein Servlet • beendet die Ausführung der aktuellen Seite • Syntax: <jsp:forward page=„pfadangabe“ /> <% String next_page; String browser = request.getHeader("HTTP_USER_AGENT"); if (browser.indexOf("MSIE") > 0) next_page = "index_ie.htm"; else next_page = "index_ns.htm"; %> <jsp:forward page="<%=next_page %>" /> 19 JSP Aktionen: forward http://xyz.de/index.jsp http://xyz.de/index_ns.htm http://xyz.de/index_ie.htm Komponenten Was sind Komponenten? 20 Was sind Komponenten? • Eine Komponente ... – ... ist ein Stück Software mit einer in sich geschlossenen, fachlichen Funktionalität – ... ist wiederverwendbar, kann also in mehreren, vorab nicht antizipierten Anwendungskontexten eingesetzt werden – ... verfügt über standardisierte Schnittstellen zur Kommunikation mit anderen Komponenten – ... kann die eigene Schnittstelle über sogenannte „Introspektion“ gegenüber anderen Komponenten beschreiben – ... kann von beliebigen Programmiersprachen und unterschiedlichen Plattformen aus angesprochen werden – ... kann auch von entfernten Rechnern aus angesprochen werden (verteilt) – Beispiele: Microsoft DCOM, Corba Components, Enterprise JavaBeans Wie programmiert man mit Komponenten? Komponente A Komponente B Komponente C Steuerungssprache (häufig in Form eine Skriptsprache) 21 JSP und JavaBeans • Eine einfache Architektur für Web-Applikationen ... 1 2 Browser JSP JavaBean 5 Präsentation Client 3 DB 4 Anwendungslogik Applikationsserver Arbeitsplatzrechner Datenhaltung DB-Server JSP Aktionen: Beans • Vereinbarung von Beans <jsp:useBean id="bean_id" class="Klassenbezeichnung" scope="{page|request|session|application}" /> • Eigenschaften auslesen <jsp:getProperty name="bean_id" property="eigenschaft" /> • Eigenschaften verändern <jsp:setProperty name="bean_id" property="eigenschaft" value="wert" /> 22 Weitere Varianten des Zugriffs auf JavaBeans • JavaBeans lassen sich auch direkt in Skripten ansprechen: Allgemein: bean_id.methode() // bean_id wurde vorher vereinbart! Beispiel: <jsp:useBean id="produktdatenbank" class="ProduktDatenbankBean" scope="page" /> [...] <% String p_name; p_name = produktdatenbank.getProduktName(p_id); [...] %> 23