Gliederung 1. Software-Komponenten: Grundlegende Begriffe 2. Systematischer Entwicklungsprozess für Komponenten-Software mit UML 3. Java-Komponenten-Technologien 3.1 JavaBeans-Technologie 3.2 Web-Komponenten mit Java 3.3 Enterprise JavaBeans-Technologie 4. Komponentenspezifikation 5. Komponententechnologien im Vergleich 5.1 Microsoft COM/DCOM/COM+ 5.2 CORBA Component Model 5.3 Vergleich der Komponentenstandards 6. Zusammenfassung und Ausblick Technische Universität Dresden Prof. Hußmann Softwarekomponenten Kapitel 3 Java-Komponenten-Technologien 3.2 Web-Komponenten mit Java – Dynamische Webseiten – Servlets – Java Server Pages – Einsatz von JavaBeans in Web-Anwendungen – Definition von Tags mit Java Literatur: – Volker Turau/Ronald Pfeiffer: Java Server Pages, dpunkt 2000 – Karl Avedal et al.: Professional JSP, Wrox Press 2000 Technische Universität Dresden Prof. Hußmann Seite 1 Softwarekomponenten Zähler mit Java Server Pages: Anzeige Beispiel unter Verwendung der Entwicklungsumgebung "Forte for Java" Technische Universität Dresden Prof. Hußmann Softwarekomponenten Zähler mit Java Server Pages: HTML-Quelle <html> <head><title>Counter Demo Page</title></head> <body> <jsp:useBean id="counter" scope="session" class="Counter"/> <% if (request.getParameter("CountButton")!=null) { counter.count(); }; if (request.getParameter("ResetButton")!=null) { counter.reset(); } %> <h2 align="center">Counter Demo</h2> Current counter value = <jsp:getProperty name="counter" property="current" /> <br> <form method="POST" action="CounterJSP.jsp"> <input name="CountButton" type="submit" value="Count"> <input name="ResetButton" type="submit" value="Reset"> </form> </body> </html> Technische Universität Dresden Prof. Hußmann Seite 2 Softwarekomponenten Einschub: <form>-Anweisung in HTML • Zweck: Interaktive Abfrage von Daten vom Benutzer (Formular) • Prinzipieller Aufbau: <form> method=M action=P FT </form> Attributwerte: – für M: "GET" (Kodierung in URL), "POST" (HTTP-Header; empfohlen) – für P: Programm, das die Daten verarbeitet – für FT: Formulartext, enthält spezielle Eingabe-Tags: <select> Auswahl (Drop-Down-Menüs) <textarea> Mehrzeilige Textfelder <input> Andere Eingabeelemente • Attributwerte für Eingabe-Tags am Beispiel <input>: – name=N – type=T – value=V Technische Universität Dresden Name des Eingabeelements Art des Eingabeelements "text": Einzeilige Texteingabe "submit": Klickbarer Knopf Standardwert bzw. Name Prof. Hußmann Softwarekomponenten Beispiel zur <form>-Anweisung <form method="POST" action="CounterJSP.jsp"> Startwert: <input name="StartValue" type="text" size=10 value="0"><br> <input name="CountButton" type="submit" value="Count"> <input name="ResetButton" type="submit" value="Reset"> </form> Technische Universität Dresden Prof. Hußmann Seite 3 Softwarekomponenten Web-basierte Anwendungen: Überblick • Statik vs. Dynamik: – HTML ist als statische Sprache ausgelegt – Komplexe Anwendungen: Interaktion, dynamische Inhaltsänderung • Client-seitige Lösungen: – Festinstallation zusätzlicher Programme » Spezialanwendungen, Hilfsprogramme, Plug-Ins – Dynamisches Laden von Programm-Code » Java Applets Probleme: Portabilität, Interoperabilität, Sicherheit, Skalierbarkeit • Server-seitige Lösungen: – Aufruf externer Server-Programme » CGI (Common Gateway Interface), Server-APIs, Java Servlets – Erweiterungen der Web-Server-Funktionalität » "Server Side Includes", Server-Skripte, JSP Technische Universität Dresden Prof. Hußmann Softwarekomponenten Server-seitige Lösungen: Überblick (1) • Common Gateway Interface (CGI) – einfach zu verwenden » Parameter über Umgebungsvariablen » Ergebnis Text auf Standardausgabe – CGI-Anwendungen in jeder Programmiersprache realisierbar – Nachteile: » Performance, Skalierbarkeit, Unterstützung von "Sitzungen" • Web-Server APIs – Beispiele: NSAPI (Netscape), ISAPI (Microsoft), Java Servlets (Sun) – Dynamisches Laden von Programmteilen in den Server – Vorteile: » Bessere Performance, Realisierbarkeit von Transaktionen, ... – Nachteile: » teilweise proprietär; schlecht portabel » schlechte Trennung von Anwendungslogik und Präsentation Technische Universität Dresden Prof. Hußmann Seite 4 Softwarekomponenten Beispiel: Einfaches Java Servlet • Aufgabe: HTML-Seite mit aktuellem Datum public class DateServlet extends HttpServlet { public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String title = "Date Servlet Page"; response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML><HEAD><TITLE>"); out.println(title); out.println("</TITLE></HEAD><BODY>"); out.println("<H1>" + title + "</H1>"); out.print("<P>Current time is: "); out.println(new java.util.GregorianCalendar().getTime()); out.println("</BODY></HTML>"); out.close(); } } Java HTML Technische Universität Dresden Prof. Hußmann Softwarekomponenten Kombination von Programmiersprache und HTML • Servlets (und ebenso CGI, NSAPI, ISAPI): – Programme zum Erzeugen von HTML-Code – HTML-Elemente als Argumente von "print"-Anweisungen – Vorteil: » Flexibilität – Nachteil: » Unübersichtlich; HTML-Editoren ("Autorensysteme") nicht verwendbar • Rollenkonflikt: – Softwareentwickler: » bevorzugen Programmiersprache als "Basis" mit eingebettetem HTML – Web-Designer: » bevorzugen HTML mit Erweiterungen für dynamische Anzeige » wollen interaktive Werkzeuge mit "WYSIWYG"-Effekt • Vgl.: Einbettung von SQL in Programmcode Technische Universität Dresden Prof. Hußmann Seite 5 Softwarekomponenten Beispiel: Java Server Page (JSP) • Gleiche Aufgabe: HTML-Seite mit aktuellem Datum <HTML> <%! String title = "Date JSP"; %> <HEAD><TITLE> <%=title%> </TITLE></HEAD> <BODY> <H1> <%=title%> </H1> <P>Current time is: <% java.util.Date now = new GregorianCalendar().getTime(); %> <%=now%> </BODY></HTML> • (Naheliegende) Grundidee für Java Server Pages: – Definition durch in HTML eingebettete Skripte ("Scriptlets") – Automatische Übersetzung in Java Servlet Java HTML Technische Universität Dresden Prof. Hußmann Softwarekomponenten Server-seitige Lösungen: Überblick (2) • Server-Side Includes – Erstmals im NCSA Web-Server realisiert: "umgekehrte Einbettung" – Eingeschränkte Anweisungen; keine volle Programmiersprache • Server-seitige Skripte (Aktive Server-Seiten) – Benutzung vollwertiger Programmier- oder Skriptsprache – Beliebte Sprache für Server-Skripte: PHP (Personal Home Page) – Microsoft Active Server Pages (ASP) » Verwendung verschiedener Skriptsprachen (JScript, VBScript) » Einsatz von Komponenten (Active/X und DCOM) – Java als Skript-Sprache: Java Server Pages » Einsatz von Komponenten (JavaBeans und EJBs), sh. später Technische Universität Dresden Prof. Hußmann Seite 6 Softwarekomponenten Vergleich JSP / ASP • Prinzipiell sind JSP und ASP sehr ähnlich. • Vorteile von JSP: – Plattformunabhängigkeit (alle bekannten Web-Server) – Leistungsfähige Programmiersprache mit Anschluß an umfangreiche Standard-APIs – Bessere Separierung Logik/Präsentation durch benutzerdefinierte Tags (sh. später) – Code wird bei erneuter Ausführung nur auf Byte-Code-Ebene interpretiert (Übersetzung in Byte-Code nur einmalig) • Im folgenden: – Grundprinzipien von JSP/Servlets – Beispiel zur Übertragung auf andere Plattformen/Technologien Technische Universität Dresden Prof. Hußmann Softwarekomponenten Kapitel 3 Java-Komponenten-Technologien 3.2 Web-Komponenten mit Java – Dynamische Webseiten – Servlets – Java Server Pages – Einsatz von JavaBeans in Web-Anwendungen – Definition von Tags mit Java Technische Universität Dresden Prof. Hußmann Seite 7 Softwarekomponenten Java Servlets • Erste Version der Servlet API: 1996 (Java: 1995) • Java Server Pages: 1997-1999 • Wichtige Referenz-Implementierung: – "Jakarta"-Projekt der "Apache"-Gruppe » Apache: weitverbreiteter OpenSource-Web-Server – "Tomcat": » Unterstützung für Servlet und JSP » Separat oder als Modul für Apache-Server » Entwicklungsumgebung "Forte" z.B. enthält eigenen Tomcat-Server • Grundprinzip der Ausführung: – Web-Server ruft Servlet bei Client-Requests auf (Muster Template Method) – Servlet bestimmt über Datenstrukturen die Antwort für den Client Technische Universität Dresden Prof. Hußmann Softwarekomponenten Servlet-API: Grundzüge • abstract class javax.servlet.GenericServlet – Deklariert Methode service() • abstract class javax.servlet.http.HttpServlet – Definiert Standardimplementierung für Methode service() – Gemäß Muster "Template Method" werden aufgerufen: » doPost(), doGet(), doPut() etc. je nach Benutzer-Anfrage – protected void doGet(HttpServletRequest req, HttpServletResponse resp) – protected void doPost(HttpServletRequest req, HttpServletResponse resp) • interface javax.servlet.http.HttpServletRequest – Deklariert Methoden wie getAttribute(), getParameter(), getReader() • interface javax.servlet.http.HttpServletResponse – Deklariert Methoden wie setContentType(), getWriter() Technische Universität Dresden Prof. Hußmann Seite 8 Softwarekomponenten Kapitel 3 Java-Komponenten-Technologien 3.2 Web-Komponenten mit Java – Dynamische Webseiten – Servlets – Java Server Pages – Einsatz von JavaBeans in Web-Anwendungen – Definition von Tags mit Java Technische Universität Dresden Prof. Hußmann Softwarekomponenten Java Server Pages und Servlets Übersetzung in Servlet bei erster Anfrage oder bei Installation • Lebenslauf einer JSP: Client JSP-Server xyz.jsp xyz.jsp installieren übersetzen xyz-Servlet starten res1 res1: HTML xyz.jsp starten res2 Technische Universität Dresden res2: HTML Prof. Hußmann Seite 9 Softwarekomponenten JSP-Sprachelemente • Skript-Elemente – Einbettung von Java-Code • Implizite Objekte – Einfacher Zugriff auf wichtige Servlet-Bestandteile • Direktiven – Globale Anweisungen an Übersetzungsvorgang • Aktionen – Standardelemente für Laufzeitverhalten • Prinzipiell kann JSP zur Generierung beliebiger Texte verwendet werden. – Neben HTML zunehmend wichtige Zielsprache: XML Technische Universität Dresden Prof. Hußmann Softwarekomponenten Einbettung von Java-Code in HTML • Möglichkeiten zur Einbettung: – Spezielle Tags (z.B. <script> für JavaScript) » Gefahr der Inkompatibilität mit HTML-Weiterentwicklung – Tags aus Sonderzeichen » Unelegant, aber bequem manuell zu handhaben » JSP: <%, <%!, <%=, <%@, %>, <%--, --%> – XML-Namespaces » "Namespace" (xmlns) durch URL definiert, z.B. "jsp" » Tags der Form <jsp: xyz> • JSP benutzt zwei Varianten der Einbettung – Derzeit: Namespace-Syntax nur für Aktionen üblich – Mittelfristig: Übergang zu Namespace-Syntax wahrscheinlich (bei besserer Werkzeugunterstützung) Technische Universität Dresden Prof. Hußmann Seite 10 Softwarekomponenten JSP-Skript-Elemente • Vereinbarungen – Syntax: – Beispiel: <%! Vereinbarungen %> <%! String title = "Date JSP"; %> – Wird in Instanzvariable der generierten Klasse übersetzt. • Anweisungen (Scriptlets) – Syntax: – Beispiel: <% Anweisungen %> <% java.util.Date now = new GregorianCalendar().getTime(); %> – Lokale Variablen: in anderen Anweisungen sichtbar, nicht in Methoden • Ausdrücke – Syntax: – Beispiel: – Äquivalent zu <%= Ausdruck %> <%= now %> <% out.print(now); %> Hinweis: Fehlermeldungen des Java-Compilers beziehen sich auf das generierte Servlet! Technische Universität Dresden Prof. Hußmann Softwarekomponenten Kommentare in JSP • JSP-Kommentare – Syntax: – Beispiel: <%-- Vereinbarungen --%> <%-- JSP Kommentar --%> – Dokumentation der JSP; nicht in Servlet übernommen • HTML/XML-Kommentare – – – – – Syntax: <!-- Vereinbarungen --> Beispiel: <!-- HTML Kommentar --> Dokumentation des generierten Texts Ausgabeanweisungen für Kommentar im Servlet generiert Beispiel für dynamisch generierten Kommentar: <!-- Version vom <%=heute%> --> Technische Universität Dresden Prof. Hußmann Seite 11 Softwarekomponenten Implizite Objekte in JSP-Skripten • Auswahl der wichtigsten impliziten Objekte: • request (javax.servlet.http.HttpServletRequest) – Lesen von HTTP-Headern, Parametern, Cookies etc. der Anfrage • response (javax.servlet.http.HttpServletResponse) – Ausgeben von HTTP-Headern, Cookies etc. in der Antwort • session (javax.servlet.http.HttpSession) – Verfolgung von "Sitzungen" (zusammengehörigen Interaktionen) • out (javax.servlet.jsp.JspWriter) – Ausgabestrom (Ergebnisseite) – Übliche print- und println-Operationen stehen zur Verfügung • Beispiel: <% if (request.getParameter("CountButton")!=null) { counter.count(); }; %> Technische Universität Dresden Prof. Hußmann Softwarekomponenten Erzeugter Servlet-Code (Auszug) <HTML> <%! String title = "Date JSP"; %> <HEAD><TITLE> <%=title%> </TITLE></HEAD> <BODY> <H1> <%=title%> </H1> <P>Current time is: <% java.util.Date now = new GregorianCalendar().getTime(); %> <%=now%> </BODY></HTML> ... out.write("\r\n"); out.write("<html>\r\n"); out.write(""); out.write("\r\n"); out.write("<head><title>"); out.print(title); out.write("</title></head>\r\n"); out.write("<body>\r\n"); out.write("<H1>"); Vollständiger Code für das Beispiel: out.print(title); Datei sk4-CalendarServlet.java out.write("</H1>\r\n"); ... Technische Universität Dresden Prof. Hußmann Seite 12 Softwarekomponenten JSP-Direktiven • Syntax für Direktiven: <%@DirektivenName AttributName = Wert %> • Direktive "include": – Einkopieren anderer Dateien zur Übersetzungszeit – Bsp: <%@include file="fusszeile.html" %> • Direktive "page": – Steuerung des Übersetzungsvorgangs – Wichtigste Attribute: import: Analog zum Java-Import-Statement Bsp: <%@page import="java.util.*" %> session: Bereitstellung von Sitzungsverfolgung Bsp: <%@page session="false" %> (Standardwert ist "true") Technische Universität Dresden Prof. Hußmann Softwarekomponenten JSP-Aktionen • Syntax für Aktionen: <jsp:AktionsName AttributName = Wert/> • Standardaktionen: – <jsp:include page = "pfad" flush="true"/> » "Sprung" zur Ausführungszeit zu anderer JSP-Seite; mit Rücksprung » Attributwert kann auch dynamisch bestimmt werden – <jsp:forward page = "pfad"/> » analog ohne Rücksprung – Aktionen zum Arbeiten mit JavaBeans (sh. nächste Folie) • Benutzerdefinierte Aktionen (sh. später: Tag-Bibliotheken) Technische Universität Dresden Prof. Hußmann Seite 13 Softwarekomponenten Kapitel 3 Java-Komponenten-Technologien 3.2 Web-Komponenten mit Java – Dynamische Webseiten – Servlets – Java Server Pages – Einsatz von JavaBeans in Web-Anwendungen – Definition von Tags mit Java Technische Universität Dresden Prof. Hußmann Softwarekomponenten Beispiel: Java Server Page mit JavaBeans <P>Current time is: <% java.util.Date now = new GregorianCalendar().getTime(); %> <%=now%> </BODY></HTML> Gleicher Effekt mit Nutzung von JavaBeans: <jsp:useBean id="clock" scope="page" class="java.util.GregorianCalendar"/> <P>Current time is: <jsp:getProperty name="clock" property="time"/> </BODY></HTML> • Wo liegt der Unterschied? – Programmkomponenten für Web-Designer nutzbar machen – Keine Programmierkenntnisse nötig: nur HTML-Tags – Visuelle Werkzeuge möglich Technische Universität Dresden Prof. Hußmann Seite 14 Softwarekomponenten JavaBeans in JSP: Aktion useBean • Syntax für useBean-Aktion: <jsp:useBean id=LokalerName class=KlassenName scope=Gültigkeitsbereich /> • Attribute: id: class: scope: Name einer lokalen Java-Variablen Verwendbar auch in Skript-Elementen Name einer Bean-Klasse (Mit Attribut "type"zusätzlicher Cast möglich.) "page": "request": Nur in aktueller Seite verfügbar Nur in aktueller Anfrage verfügbar (evtl. mehrere Seiten wegen include/forward) "session": Nur in aktueller Sitzung verfügbar (evtl. mehrere Seiten wegen include/forward) "application": In gesamter Anwendung verfügbar • Ausführung: Zuerst Suche, ob Bean-Instanz existiert, dann ggf. Instanziierung Technische Universität Dresden Prof. Hußmann Softwarekomponenten Zugriff auf Eigenschaften von JavaBeans in JSP • Lesen von Eigenschaften: <jsp:getProperty name=LokalerName property=EigenschaftsName/> – <jsp:getProperty name=counter property=current/> ist gleichwertig zu: <%=counter.getCurrent;%> • Setzen von Eigenschaften: <jsp:setProperty name=LokalerName property=EigenschaftsName/> value=WertAlsString/> – <jsp:setProperty name=counter property=startValue value="1"/> ist gleichwertig zu (Typkonversionen automatisch erzeugt!): <% counter.setStartValue(Integer.parseInt(new String("1")));%> • Spezielle Unterstützung für Setzen von Eigenschaften aus RequestParametern (d.h. z.B. Eingabefeldern einer <form>) Technische Universität Dresden Prof. Hußmann Seite 15 Softwarekomponenten Zähler mit Java Server Pages: HTML-Quelle <html> <head><title>Counter Demo Page</title></head> <body> <jsp:useBean id="counter" scope="session" class="Counter"/> <% if (request.getParameter("CountButton")!=null) { counter.count(); }; if (request.getParameter("ResetButton")!=null) { counter.reset(); } %> <h2 align="center">Counter Demo</h2> Current counter value = <jsp:getProperty name="counter" property="current" /> <br> <form method="POST" action="CounterJSP.jsp"> <input name="CountButton" type="submit" value="Count"> <input name="ResetButton" type="submit" value="Reset"> </form> </body> </html> Technische Universität Dresden Prof. Hußmann Softwarekomponenten MVC-Architektur mit JavaBeans und JSP Web Service (JSP Server) request Web Client Browser Controller JSP/Servlet forward response Technische Universität Dresden Model JavaBeans Datenbanken, EJBs... View JSP Prof. Hußmann Seite 16 Softwarekomponenten Beispiel: Counter mit Konfigurationsseite Technische Universität Dresden Prof. Hußmann Softwarekomponenten View-Seite für Counter <html> <head><title>MVC Counter View</title></head> <body> <jsp:useBean id="counter" scope="session" class="Counter"/> <h2 align="center">Counter Demo</h2> Current counter value = <jsp:getProperty name="counter" property="current" /> <br> <form method="POST" action="MVCCounterContr.jsp"> <input name="CountButton" type="submit" value="Count"> <input name="ResetButton" type="submit" value="Reset"> <input name="ConfigButton" type="submit" value="Configure Counter"> </form> </body> </html> Technische Universität Dresden Prof. Hußmann Seite 17 Softwarekomponenten Controller-Seite für Counter <jsp:useBean id="counter" scope="session" class="Counter"/> <% if (request.getParameter("CountButton")!=null) { counter.count(); %> <jsp:forward page="MVCCounterView.jsp"/> <% }; if (request.getParameter("ResetButton")!=null) { counter.reset(); %> <jsp:forward page="MVCCounterView.jsp"/> <% } if (request.getParameter("ConfigButton")!=null) { %> <jsp:forward page="MVCCounterConfView.jsp"/> <% } if (request.getParameter("ConfigChangeButton")!=null) { %> <jsp:setProperty name="counter" property="*"/> <% counter.reset(); %> <jsp:forward page="MVCCounterView.jsp"/> <% } %> Eigenschaftswerte aus Parametern der Anfrage bestimmt Kein HTML-Text! Deshalb evtl. als Servlet Technische Universität Dresden Prof. Hußmann Softwarekomponenten View-Seite für Counter Configuration <html><head><title>MVC Counter Configuration View</title></head> <body> <jsp:useBean id="counter" scope="session" class="Counter"/> <h2 align="center">Counter Demo</h2> Please enter new counter configuration: <br> <form method="POST" action="MVCCounterContr.jsp"> Start value: <input name="startValue" type="text" value=<jsp:getProperty name="counter" property="startValue"/> size=5><br> Increment value: <input name="incrValue" type="text" value=<jsp:getProperty name="counter" property="incrValue"/> size=5><br> <input name="ConfigChangeButton" type="submit" value="Change Configuration"> </form> </body> </html> Technische Universität Dresden Prof. Hußmann Seite 18 Softwarekomponenten Kapitel 3 Java-Komponenten-Technologien 3.2 Web-Komponenten mit Java – Dynamische Webseiten – Servlets – Java Server Pages – Einsatz von JavaBeans in Web-Anwendungen – Definition von Tags mit Java Technische Universität Dresden Prof. Hußmann Softwarekomponenten Benutzerdefinierte Tags • Komplexe "View"-Seiten: – benötigen Programmlogik z.B. zum Durchlaufen und Formatieren von Ergebnismengen einer Anfrage – können mit Aktionen useBean/setProperty/getProperty nicht realisiert werden • Benutzerdefinierte Tags: – Syntax: <NamespaceName:TagName AttributName = Wert/> oder <NamespaceName:TagName AttributName = Wert> Rumpf </NamespaceName:TagName> – Semantik wird durch Java-Klasse (JavaBean) angegeben: "Tag Handler" – Alle Tags eines Namensraums: "Tag Library" • Beispiel: Anwendung eines benutzerdefinierten Tags (aus Turau 2000) <fhw:anfrage id="orders" connection="con"> select Country, City Date from orders where ORDERID>11051 order by Country </fhw:anfrage> Technische Universität Dresden Prof. Hußmann Seite 19 Softwarekomponenten Prinzip einer Tag-Handler-Klasse (Bean) • Tag-Handler implementieren eine der beiden Schnittstellen – "Tag" (Tag ohne Rumpf) oder – "BodyTag" (Tag mit Rumpf; Möglichkeit zur Wiederholung) • Tag-Attribute werden als Eigenschaften der Handler-Bean betrachtet • Deklaration von Tags: "Taglib-Deskriptor" (XML-Datei) <<interface>> javax.servlet.jsp.tagext.Tag <<interface>> javax.servlet.jsp.tagext.BodyTag ... doStartTag(): int doEndTag(): int ... doInitBody(): int doAfterBody(): int Spezielle Ergebniswerte signalisieren: doStartTag(): Auswerten des Rumpfs doEndTag(): Bearbeitung der Rest-Seite Spezielle Ergebniswerte signalisieren: doAfterBody(): Rumpf wiederholen Tutorial zu Tag-Erweiterungen in JSP: www.orionserver.com Technische Universität Dresden Prof. Hußmann Seite 20 Softwarekomponenten