Page 1
WS 2006/07 Prof. Dr. Andreas Schmietendorf 1
Programmierung von Client/Server-Anwendungen
J2EE – Web-Applikationen, Java Server Pages, JavaBeans und Servlets
erstellt in Anlehnung an Stark, T.: J2EE – Einstieg für Anspruchsvolle,Addison-Wesley, Pearson Studium, München 2005
Page 2
WS 2006/07 Prof. Dr. Andreas Schmietendorf 2
Übersicht zur Vorlesung
HTML im Rückblick
Java-Server-Pages (JSP)
JSP und Datenbankanbindung via JDBC
JavaBean-Komponentenmodell
Servlets vs. JSP
Idee der Tag-Bibliotheken
Page 3
WS 2006/07 Prof. Dr. Andreas Schmietendorf 3
HTML im Rückblick
Page 4
WS 2006/07 Prof. Dr. Andreas Schmietendorf 4
HTML-Versionen im Vergleich (W3 Konsortiums):HTML (ohne Versionsnummer) - 1992
- Überschriften, Textabsätze, Grafikreferenzen, Hypertext-Links
HTML V2.0 - 1995 (noch akademisch geprägt)
- kleinster gemeinsamer Nenner für Web-Seiten
HTML V3.2 - 1997 (Zusammenarbeit mit der Industrie)
- Tabellen, physische Textformatierungen
HTML V4.0 - 1998
- Verwendung von Frames (geteilte Seiten)
- Cascading Style Sheets - festlegen von z.B. Schriftgröße, -farbe, ...
- Verwendung von Scriptsprachen (z.B. JavaSkript)
XHTML 1.0 Neuformulierung HTML 4.01 mit Hilfe von XML - 2000
HTML im Rückblick
Page 5
WS 2006/07 Prof. Dr. Andreas Schmietendorf 5
Hypermediale Informationssysteme
Aufbau des Unified Ressource Locator:Ziel: einheitliche Schnittstelle zum Internet
PROTOKOLL://SERVER/VERZEICHNISPFAD/DOKUMENT Protokoll: http, file, ftp, mailto, ftp, https, ... Server:
- IP-Adresse z.B. 164.19.200.20- alternativ Domain Name Service (DNS-Name)
Verzeichnispfad: Verzeichnis innerhalb des lokalen Filesystems Dokument: eigentliche auszugebende Datei, über Dateiextension erfolgt die
Wahl möglicher Plug-Ins (z.B. *.htm, *.pdf, ...)
Beispiel eines URL:
http://userpage.fu-berlin.de/~schmiete/index.htm
Page 6
WS 2006/07 Prof. Dr. Andreas Schmietendorf 6
Hypermediale Informationssysteme
Erstellung von HTML-Dokumenten: Einfache ASCII-Datei, neu erstellt oder übernommen z.B. von Word und mit
HTML-Befehlen versehene Datei Verwendung einfacher Editoren (Vorschlag: UltraEdit-32) Nutzung von Generatoren (Bsp.: WebWizard, HotMeTaL, ...) Verwendung von Entwicklungsumgebungen wie z.B. MS Visual Interdev
und Frontpage (für Formulare sinnvoll) Nutzung der Genratorfunktionen von Textverarbeitungsprogrammen wie
z.B. MS Office (generiert auch XML)
Einstiegsdatei typischerweise index.htm oder default.htm
(*.htm unter DOS und *.html unter UNIX oder WindowsNT)
Page 7
WS 2006/07 Prof. Dr. Andreas Schmietendorf 7
Hypermediale Informationssysteme
Möglichkeiten der Einstellung
Angebot der Internet-Service-Provider, z.B. T-Online
Im Rahmen von direkten Internet-Zugängen und eigenem HTTP-Server
Verwendung akademischer Server-Systeme
Häufig Probleme bei dynamischen Komponenten, z.B. zu startende Services
TCP/IP-Netz
Laptop
IBM RS/6000
IBM RS/6000
DSL
DFÜ
HTTP-ServerBeispiel: WindowsNT Serverinetpub/wwwroot/default.htm
Einstellung per FTP (RAS), NW-Laufwerke, NFS,
Page 8
WS 2006/07 Prof. Dr. Andreas Schmietendorf 8
Hypermediale Informationssysteme
Grundaufbau einer einfachen HTML-Datei:
<HTML>
<!-----Kommentarzeile------->
<HEAD>
<TITLE>Dokumente und Informationen</TITLE>
</HEAD>
<BODY>
<H1>Client/Server-Anwendungen</H1>
<HR>
</BODY>
</HTML>
Page 9
WS 2006/07 Prof. Dr. Andreas Schmietendorf 9
Hypermediale Informationssysteme
Merkmale der HTML-Syntax: Befehle meist aus einleitenden und abschließenden Tag, keine Beachtung
von Groß- und Kleinschreibung
Leerzeichen im Text zusammengefaßt, explizit mit  
Verschachtelte Tags führen zu Fehlern
Zusätzliche Attribute bei einleitenden Tag möglich, z.B. die Ausrichtung einer Überschrift der 2. Kategorie.
Bsp.: <h2 align=center>Ausgabetext<h2>
Kommentare in HTML <!--Kommentar-->
Sonderzeichen im Ausgabetext wie z.B. „ä“ sollten für die international richtige Darstellung durch „ä“ ersetzt werden
Page 10
WS 2006/07 Prof. Dr. Andreas Schmietendorf 10
Hypermediale Informationssysteme
Vorgehensweise zur Erstellung von HTML-Systemen: Analyse der auszugebenden Daten (über was soll informiert werden)
Navigationsstruktur grob entwerfen (z.B. Baumstrukturen verwenden)
Grundgerüst der HTML-Datei erstellen
Maskierungsvorschriften für Umlaute, Sonderzeichen beachten
Seiten durch Zeilenumbrüche und Leerzeilen verwenden
Verwenden von mehreren kleinen HTML-Dateien- nicht größer als 64 KByte (typische Größen ca. 5 KByte)
- Audio/Video-Sequenzen sollten explizit angekündigt werden
Test der erstellten Seiten unter verschiedenen Browser-Systemen
Page 11
WS 2006/07 Prof. Dr. Andreas Schmietendorf 11
Hypermediale Informationssysteme
Übersicht zum HTML-Befehlsumfang (1): Textformatierung (Überschriften <H1>Text</H1>, Absätze <P>, Zentrieren
<CENTER>, Zeilenumbruch <BR>, Trennlienie <HR> ) Textattribute
- physikalische (<I>...</I>, <B>...</B>, <blink>...</blink>- logische <CITE>...</CITE>, <CODE>...</CODE>)
Listen (z.B. numerierte und unnumerierte Listen)<OL> <UL>
<LI> Äpfel </LI> <LI>… </LI> </OL> </UL>
Grafiken anzeigen (<IMG SRC=„Adresse des Bildes>, die Angabe einer alternativen Text-Ausgabe ist möglich)
Tabellen <TABLE> <TR> <TH>Kopfzeile der Tabelle</TH> </TR>
<TR> <TD>Datenzelle</TD></TR>
</TABLE>
Page 12
WS 2006/07 Prof. Dr. Andreas Schmietendorf 12
Hypermediale Informationssysteme
Übersicht zum HTML-Befehlsumfang (2): Frames für Teilung der Seite in z.B. linken und rechten Bereich
<frameset cols="20%,60%">
<frame src="cmgverw.htm" name="links">
<frame src="ov_cmg.htm" name="rechts">
</frameset>
Hypertextlinks (Start- und Zielpunkt) Links auf Dokumente: <A HREF = „Adresse des Zieldokuments“>...</A>
Link innerhalb der WWW-Seite: <A HREF = „#Marke“>...</A>
<A NAME = „Marke“>...</A>
Link auf Internetdienste: email, news, ftp, gopher, telnet Imagemaps Einteilung einer Grafik in anklickbare Bereiche
Page 13
WS 2006/07 Prof. Dr. Andreas Schmietendorf 13
Hypermediale Informationssysteme
Übersicht zum HTML-Befehlsumfang (3): Multimedia- und Fremdprogrammreferenzen (Browserabhängig)
Standard ist das OBJECT-Tag, bei MS Audio mit SOUND-Tag<OBJECT DATA=„test.avi“ TYPE=„video/x-msvideo></OBJECT>
Java-Applets mit APPLET-Tag Interaktive Formulare zur Dateneingabe
Formulardefinition: <FORM ACTION=mailto:...METHOD=POST>
Eingabefelder: <INPUT TYPE=„text“ NAME=„VARIABLE“>
Auswahlcheckboxen: <INPUT TYPE=„checkbox“ NAME=„VARIABLE“>
Auswahllisten (Scrollbar): <SELECT NAME="BenchmarkNutzung“SIZE=4
MULTIPLE>
<OPTION>Harwarekenndaten
Bestätigungsbutton: <INPUT TYPE=„submit“ [NAME=„OK-Button“]>
Page 14
WS 2006/07 Prof. Dr. Andreas Schmietendorf 14
Java Server Pages – JSP‘s
Page 15
WS 2006/07 Prof. Dr. Andreas Schmietendorf 15
Pendant zu folgenden Techniken:
- Microsofts Active Server Pages (kurz ASP)
- CGI-basierte Anwendungen oder auch PHP
Einbetten von Java-Code zwischen HTML-Anweisungen
Server-Seite, die dynamisch bei URL-Anforderung erzeugt wird
Bestandteile einer JSP
- HTML-Elemente
- Skriptlets: Skript-Elemente in Java
- Java Servlets
- Java Beans
Aus Bestandteilen der JSP wird ein Servlet generiert
Java Server Pages
Page 16
WS 2006/07 Prof. Dr. Andreas Schmietendorf 16
Bausteine einer JSP:
Ausdrücke der Form <%= Java-Ausdruck %>
Scriptlets der Form <% Java-Code %>
Deklarationen der Form <%! Java-Code %>
Kommentare:
- <%-- JSP-Kommentar %>
- <!-- HTML-Kommentar -->
Java-Anweisungen in JSP-Ausdrücken werden nicht mit einem Semikolon
abgeschlossen jeweils nur eine Anweisung!
Java Server Pages
Page 17
WS 2006/07 Prof. Dr. Andreas Schmietendorf 17
<html>
<body>
Hallo liebe Studenten der FHW Berlin!
<hr>
<p>
Es ist jetzt genau:
<%= new java.util.Date()%>
</body>
</html>
Vergleich:
System.out.print („Es ist jetzt genau „ + new java.util.Date());
Java Server Pages
Page 18
WS 2006/07 Prof. Dr. Andreas Schmietendorf 18
Java Server Pages
JSP-Seite unter JSP-examples:
Page 19
WS 2006/07 Prof. Dr. Andreas Schmietendorf 19
JSP liegt nicht in einem eigenen Verzeichnis
- Nicht günstig im Falle einer Neuinstallation
- Besser ist die Anlage eines eigenen Projektverzeichnis
- http://localhost:8080/eigenes_verzeichnis/*.jsp
Möglichkeiten zur Anlage eines solchen Verzeichnis:
- Verwendung des Sysdeo-Plugin unter Eclipse (GUI-Dialog)
- Editieren der Datei conf/server.xml im Tomcat Verzeichnis
Java Server Pages
Page 20
WS 2006/07 Prof. Dr. Andreas Schmietendorf 20
Erzeugen eines eigenen Arbeitsverzeichnisses & Unterverzeichnisse: css – Ablage von Cascading Stylesheets html – Aufnahme statischer HTML-Dokumente images – Aufnahme von Bildern jsp – Aufnahme von Java Server Pages (dynamische Dokumente) WEB-INF – enthält Web Deployement Descriptor web.xml
Eintrag in der server.xml-Datei unter Tomcat
<Context path="/schmiete"
docBase="C:\jakarta-tomcat-5\schmietendorf"
debug="0" reloadable="true" crossContext="true" />
Java Server Pages
Page 21
WS 2006/07 Prof. Dr. Andreas Schmietendorf 21
Vordefinierte Variablen in einer JSP (verwaltet im Servlet-Container):
request: javax.servlet.http.HTTPServletRequest
- Zugriff auf Informationen des Request-Header
- z.B. akzeptierte Dateiformate, Sprachen, Art des User-Agent
response: javax.servlet.http.HTTPServletResponse
- Modifikation der Antwort des Servers an den Client
- Status-Code setzen oder Response-Header modifizieren
out: javax.servlet.jsp.JspWriter
- Verwendet der Server um die Ausgabe an den Client zu senden
Java Server Pages
Page 22
WS 2006/07 Prof. Dr. Andreas Schmietendorf 22
<html><head>
<title>Eine dynamische JSP-Seite</title></head><body><h2>Verwendung vordefinierter Variablen</h2><p><hr><p><ul>
<li>Hallo liebe Studenten der FHW Berlin!</li><li>Es ist jetzt genau: <%= new java.util.Date()%> </li><li>Sie sind: <%= request.getParameter("name")%></li>
</ul></body></html>
Java Server Pages
Page 23
WS 2006/07 Prof. Dr. Andreas Schmietendorf 23
Java Server Pages
Page 24
WS 2006/07 Prof. Dr. Andreas Schmietendorf 24
Alternative Notation für JSP-Ausdrücke:
Ggf. besteht die Forderung XML-konformer JSP‘s
- Bisherige Form:
<%= Ausdruck %>
- XML-konforme Darstellung:
<jsp:expression>Ausdruck</jsp:expression>
Die XML-konforme Darstellung ist case-sensitiv
Auch hier wird nur eine Java-Anweisung verwendet
Java Server Pages
Page 25
WS 2006/07 Prof. Dr. Andreas Schmietendorf 25
Bisherige Einschränkungen der verwendeten JSP‘s
Nur jeweils eine Java-Anweisung
Keine definierbaren lokale Variablen zur Speicherung von Werten
Keine bedingten Entscheidungen (if-else)
Keine Schleifen zur Wiederholung von Anweisungen
Verwendung von sogenannten JSP-Scriptlets- Allg. Form: <% beliebiger Java-Code%>
- Def. Einer Folge von Java-Befehlen
- JSP-Scriptlet Ausgaben müssen explizit definiert werden
<% String userName = request.getParameter(“user“);
out.println (Sie sind“ + userName); %>
Java Server Pages
Page 26
WS 2006/07 Prof. Dr. Andreas Schmietendorf 26
Beispiele für JSP-Scriptlets Schleifen
<% for (int i=0; i<10; i++) { %>
HTML/JSP-Code
<% } %>
Switch-Abfrage<% switch (arg) {
case 0 : %> HTML/JSP-Code <%
case 1 : %> HTML/JSP-Code <%
braek;
case 2 : %> HTML/JSP-Code <%
default: %> HTML/JSP-Code <%
} %>
JSP-Scriplets werden jeweils durch HTML-Code unterbrochen
Java Server Pages
Page 27
WS 2006/07 Prof. Dr. Andreas Schmietendorf 27
JSP-Scriptlets zusammenhängende Java-Methode
Definiert den Ablauf der JSP
Vordefinierte Variablen request, response und out können als
Parameter der Methode verstanden werden
Servlet(Web)-Container sieht JSP als Java-Programm
Public classMyJsp {
public void response (Request req, Response, res) {
// JSP-Scriplets
// …
}
}
Java Server Pages
Page 28
WS 2006/07 Prof. Dr. Andreas Schmietendorf 28
<html><head>
<title>Eine dynamische JSP-Seite</title></head><% String userName = request.getParameter("name");%><body><h2>Verwendung vordefinierter Variablen - Beispiel 3</h2><p><hr><p><ul>
<li>Hallo liebe Studenten der FHW Berlin!</li><li>Es ist jetzt genau: <%= new java.util.Date()%></li><% if (userName != null) { %>
<li>Sie sind: <%= userName %></li><% } else { %>
<li>Sie sind: unbekannt</li><% } %>
</ul></body></html>
Java Server Pages
Page 29
WS 2006/07 Prof. Dr. Andreas Schmietendorf 29
Java Server Pages
else-Zweig
Page 30
WS 2006/07 Prof. Dr. Andreas Schmietendorf 30
JSP-Deklarationen:
Variablen innerhalb der JSP-Methoden pot. Probleme
- Lokale Variablen
- Verlieren Wert nach ausgeführten Request
Zählen der Zugriffe auf eine Seite
- Notwendige Speicherung des Anzahl Zugriffe
- Verwendung von JSP-Deklarationen (vgl. globale Variablen)
- Form: <%! Java-Code außerhalb des JSP-Scriplet %>
- JSP-Deklarationen sind nicht Bestandteil der JSP-Scriplet!
Java Server Pages
Page 31
WS 2006/07 Prof. Dr. Andreas Schmietendorf 31
<html><head> <title>Eine dynamische JSP-Seite</title></head><%! private int count =0;%><% String userName = request.getParameter("name");%><body><h2>Verwendung vordefinierter Variablen - Beispiel 4</h2><p><hr><p><ul>
<li>Hallo liebe Studenten der FHW Berlin!</li><li>Es ist jetzt genau: <%= new java.util.Date()%></li><% if (userName != null) { %>
<li>Sie sind: <%= userName %></li> <li>Besucher: <%= ++count %></li>
<% } else { %><li>Sie sind: unbekannt</li>
<% } %></ul></body></html>
Java Server Pages
Page 32
WS 2006/07 Prof. Dr. Andreas Schmietendorf 32
Java Server Pages
15. Aufruf
14. Aufruf
Page 33
WS 2006/07 Prof. Dr. Andreas Schmietendorf 33
Weiteres Beispiel einer möglichen JSP-Deklaration:
<%! Private boolean existUser
(javax.servlet.SerletRequest req, String userName){
// Test ob der User schon vorhanden ist
if (request.getParameter(userName) == null){
return false;
}
return true;
}%>
Java Server Pages
Page 34
WS 2006/07 Prof. Dr. Andreas Schmietendorf 34
Vordefinierte Variablen einer JSP:
HTTP als zustandsloses Protokoll
- Server bedient nur die aktuelle Anfrage
- Client ist dem Server danach unbekannt
Komplexe Applikationen bedingen:
- Client muss ggf. wieder erkannt werden
- Zwischenspeicherung bestimmter Zustände
Kontexte des Web Containers
- Stellen verschiedene Gültigkeitsbereiche für Variablen zur Verfügung
- 3 Speicherbereiche werden genutzt
Java Server Pages
Page 35
WS 2006/07 Prof. Dr. Andreas Schmietendorf 35
3 Speicherbereiche für Anfragen an den Webservers:
Application-Scope (Informationen über die Lebenszeit des Servers)
- Globale, statische Variablen
- Art der Applikationsnutzung
Session-Scope (Informationen ab dem 1. Aufruf)
- Speicherung einer Session-ID – z.B. eindeutige Kundennummer
- Time-out Parameter
Request-Scope (lokaler Gültigkeitsbereich)
- Sind nur während der Bearbeitung einer Antwort an den Client gültig
- Verfallen nach Beantwortung der Client-Anfrage
Java Server Pages
Page 36
WS 2006/07 Prof. Dr. Andreas Schmietendorf 36
Kontrolle von JSPs durch folgende Speicherbereiche:
request – Variable vom Typ javax.servlet.http.HTTPServletRequest
- Bezug zum Request-Scope
- Mittels Methode setAttribute() können Objekte hinzugefügt werden
response – Variable vom Typ javax.servlet.http.HTTPServletResponse
- Manipulation der Antwort an den Server
- Z.B. Cookies an den Browser senden oder Status-Code setzten
Java Server Pages
Page 37
WS 2006/07 Prof. Dr. Andreas Schmietendorf 37
Kontrolle von JSPs durch folgende Speicherbereiche:
out – Variable vom Typ javax.servlet.jsp.JspWriter
- Bezieht sich auf den Ausgabestrom zwischen Server und Client
- Ermöglicht die Ausgabe von beliebigen Objekten bzw. Basistypen
session - Variable vom Typ javax.servlet.http.HttpSession
- Bezug auf den Session-Scope (z.B. beim Login)
- Mit setAttribute() können Werte zur Sitzung abgespeichert werden
Nutzerspezifische Daten über mehrere Sitzungen Cookie-Technik
Java Server Pages
Page 38
WS 2006/07 Prof. Dr. Andreas Schmietendorf 38
Kontrolle von JSPs durch folgende Speicherbereiche:
application – globale Variable zwischen Applikationen eine Webservers
- Bezug auf den Application-Scope
- Parallel laufende Anwendungen können so Ressourcen teilen
config - Variable vom Typ javax.servlet.jsp.ServletConfig
- Bietet den Zugriff auf serverseitige Initialisierungsparameter der JSP
- Werte können aus der web.xml gelesen werden
- z.B. Konfigurationsdaten für den Zugriff auf Datenbanken
Java Server Pages
Page 39
WS 2006/07 Prof. Dr. Andreas Schmietendorf 39
Kontrolle von JSPs durch folgende Speicherbereiche:
pageContext - Variable vom Typ javax.servlet.jsp.PageServlet
- Realisiert den Zugriff auf Seitenattribute einer JSP
- Weiterleiten eines Requests
- Einfügen einer weiteren Seite
page – Synonym des Schlüsselwortes this in Java
- Ist vom Typ java.lang.Object
- Soll ggf. die Verwendung anderer Scriptsprachen unterstützen
Java Server Pages
Page 40
WS 2006/07 Prof. Dr. Andreas Schmietendorf 40
JSP Direktiven (Bezug zum Servlet-Container):
page (kein Bezug auf die gleichnamige Variable)
- Eigenschaften der JSP als Java-Klasse
- Angabe einer Superklasse, Verhalten im Fehlerfall, Ausgabepufferung
include
- Beschreibt den modularen Aufbau einer JSP-Anwendung
- Beziehung zu gemeinsam genutzten JSP-Seiten (z.B. Menüs)
taglib
- Verhalten des JSP-Dokumentes auf der markup-Ebene
- z.B. Möglichkeiten zur Definition eigener tags
Java Server Pages
Page 41
WS 2006/07 Prof. Dr. Andreas Schmietendorf 41
Page – Seitendirektiven 1: Klassen und Packages importieren
<%@ page import=“java.util.Date“ %>
<%@ page import=“java.util.Date“, “java.math.*“ %> JSP‘s ableiten von einer Superklasse (nicht generell unterstützt!)
Package ownjsp.fhwbln.jsp;
Import javax.servlet.jsp.HttpJspPage;
Public class MyJsp implements HttpJspPage {
// eigener Code
}
Nutzung:<%@ page import=“ownjsp.fhwbln.jsp.MyJsp“
extends=“MyJsp“ %>
Java Server Pages
Page 42
WS 2006/07 Prof. Dr. Andreas Schmietendorf 42
Page – Seitendirektiven 2:
Parallele Bearbeitung von Client-Anforderungen
<%@ page isThreadSafe=“true“ %> - Standardeinstellung
<%@ page isThreadSafe=“false“ %>
errorPage – Verweis auf eigene Fehlerseiten
<%@ page errorPage=“Fehlerseite.jsp“ %>
page-Attribut contentType (MIME-Type PlugIn Auswahl)
- Teilt dem Browser die Art des nachfolgenden Dokumentes mit
- Realisierung mehrsprachiger Applikationen
Java Server Pages
Page 43
WS 2006/07 Prof. Dr. Andreas Schmietendorf 43
Beispiel einer einfachen Login-Prozedur
Bestandteile eines komplexen Web-Auftritts
Login-Seite Login.jsp
Authentifizierung des Benutzers Einstieg.jsp
Inhalt des eigentlichen Portals (z.B. Frame) Content.jsp
Fehlerseite bei gescheiterter Anmeldung LoginError.jsp
Java Server Pages
Page 44
WS 2006/07 Prof. Dr. Andreas Schmietendorf 44
Java Server Pages
Page 45
WS 2006/07 Prof. Dr. Andreas Schmietendorf 45
Java Server Pages<html><head><title>Eine dynamische JSP-Seite</title></head><body><h2>Ein einfaches Login für Web-Anwendungen</h2><p><hr><p><form method="post" action="Einstieg.jsp"> Login: <INPUT type="text" name="user" />
<INPUT type="submit" value="Absenden" /> <img src="../images/fhw.jpg" >
</form><% if (request.getParameter("msg") !=null){
out.println (request.getParameter("msg"));} %>
</body></html>
Login.jsp
Page 46
WS 2006/07 Prof. Dr. Andreas Schmietendorf 46
Java Server Pages<%@ page session="true" %><%@ page contentType="text/html; charset=UTF-8" %><%@ page errorPage="LoginError.jsp" %>
<%
// Test ob noch eine entsprechende Session bestehtif (session.getAttribute("USER") == null) {
// Lesen des Parameters vom requestString userName = request.getParameter("user");
// Test ob der Parameter existiertif (userName == null) {throw new Exception ("Nutzername nicht vorhanden!");
}
// Test ob der Parameter gültig istif (! userName.equals("Thomas")) {
%>
Login.jsp
Page 47
WS 2006/07 Prof. Dr. Andreas Schmietendorf 47
Java Server Pages
<jsp:forward page="Login.jsp?msg=Benutzer nicht bekannt!" />
<%
}
// Hinzufügen des Parameters zur aktuellen Session
session.setAttribute ("USER", userName);
}
%>
<%-- keine Ausnahmefehler - weiter zu Content.jsp --%>
<jsp:forward page="Content.jsp" />
Fortsetzung - Login.jsp
Page 48
WS 2006/07 Prof. Dr. Andreas Schmietendorf 48
Java Server Pages
Page 49
WS 2006/07 Prof. Dr. Andreas Schmietendorf 49
Java Server Pages<html><head><title>Eine dynamische JSP-Seite</title></head><body><h2>Herzlich willkommen im Portal</h2><p><hr><p>Sie sind Benutzer:<%= session.getAttribute("USER") %></body></html>
Der Einstieg ins Portal
Page 50
WS 2006/07 Prof. Dr. Andreas Schmietendorf 50
JSP und JDBC
Page 51
WS 2006/07 Prof. Dr. Andreas Schmietendorf 51
1. Erstellen einer Instanz des JDBC-Treibers
2. Erstellen einer Verbindung zur DB über die JDBC-Treiberinstanz
3. Erstellen von Anweisungen die die DB-Verbindung verwenden
4. Ausführen der entsprechender SQL-Anweisungen
5. Prüfen auf vorhandenen Inhalt des ResultSet
6. Auswerten des ResultSet
7. Einfügen in die Felder der HTML-Tabelle
8. Beenden entsprechender Java-Anweisungen
9. Schließen des Statement und der Connection
JSP und JDBC
Page 52
WS 2006/07 Prof. Dr. Andreas Schmietendorf 52
<html>
<head>
<title>JSP - JDBC Zugriff</title>
</head>
<%@page language="java" import="java.sql.*" %>
<body>
<h2>Datenbankabfrage mittels JSP und JDBC</h2>
<table border="1" with="400">
<tr>
<td><b><i>ID</i></b></td>
<td><b><i>NAME</i></b></td>
<td><b><i>VORNAME</i></b></td>
<td><b><i>ORT</i></b></td>
</tr>
JSP und JDBC – Beispiel 1
Page 53
WS 2006/07 Prof. Dr. Andreas Schmietendorf 53
<% // Schritt 1 Class.forName("org.firebirdsql.jdbc.FBDriver"); // Schritt 2 Connection myConn =
DriverManager.getConnection("jdbc:firebirdsql:localhost/3050:
C:/Programme/Firebird/examples/employee.gdb","sysdba","masterkey");
// Schritt 3 Statement stmt = myConn.createStatement(); // Schritt 4 ResultSet myResultSet = stmt.executeQuery("select * from
mitarbeiter"); // Schritt 5 if (myResultSet != null) { // Schritt 6 while (myResultSet.next()) { String id = myResultSet.getString(1); String name = myResultSet.getString(2); String vorname = myResultSet.getString(3); String ort = myResultSet.getString(4);%>
JSP und JDBC – Beispiel 2
Page 54
WS 2006/07 Prof. Dr. Andreas Schmietendorf 54
// Schritt 7 <tr>
<td><%= id %></td><td><%= name %></td><td><%= vorname %></td><td><%= ort %></td>
</tr><%
// Schritt 8} /* Ende von while */
} /* Ende von if */ // Schritt 9 und 10 stmt.close(); // Schritt 11 MyConn.close();%>
</table></body></html>
JSP und JDBC – Beispiel 3
Page 55
WS 2006/07 Prof. Dr. Andreas Schmietendorf 55
Typische Probleme des aufgezeigten Vorgehens:
Keine Trennung von Darstellung und Anwendungslogik
Design der Oberfläche kann nicht separat entwickelt werden
Hohe Fehleranfälligkeit (schwer eingrenzbar)
Arbeitsteilige Softwareentwicklung ist schwierig
Geringe Lesbarkeit und daraus folgend schwer wartbar
Verbesserung der Situation mit Hilfe der JavaBeans
MVC – Model View Controller Pattern
JSP und JDBC
Page 56
WS 2006/07 Prof. Dr. Andreas Schmietendorf 56
JavaBeans
Page 57
WS 2006/07 Prof. Dr. Andreas Schmietendorf 57
Unterstützung der Idee einer arbeitsteiligen Softwareentwicklung
Spezialisierte Zulieferunternehmen
- IV-technische Komponenten
- Domain- bzw. fachspezifische Komponenten
Reduktion der Erstellungszeiten von Informationssystemen
Sprachumfang von Java wurde nicht erweitert!
Montage der Komponenten in entsprechenden Bean-Builder Tools
- Java-Studio (Entwicklung bei SUN aber eingestellt)
- VisualAge for Java (Umfangreiche Anwendung von JavaBeans)
- BDK Bean Development Kit (http://java.sun.com/beans/docs)
Java Beans
Page 58
WS 2006/07 Prof. Dr. Andreas Schmietendorf 58
SUN’s ursprüngliche Definition der JavaBeans
„JavaBeans components, or Beans, are reusable software
components that can be manipulated visually in a builder tool.
Beans can be combined to create traditional applications, or their
smaller web-oriented brethren, applets. In additional, applets can be
designed to work as reusable Beans.“
Java Beans
Page 59
WS 2006/07 Prof. Dr. Andreas Schmietendorf 59
Java Beans
Page 60
WS 2006/07 Prof. Dr. Andreas Schmietendorf 60
Introspection (Selbstbeobachtung) - Beans können zur Laufzeit Auskunft zu den gebotener Funktionen und Eigenschaften geben
- Auf den direkten Quellcode-Zugriff kann so verzichtet werden
- Implizite Introspection-Funktion bietet alle Methoden des Bean
- Explizite Introspection-Funktion über das BeanInfo Interface
Customisation (Anpassung) - Beans können über die Nutzung von Dialogen angepasst werden.
- Angebot an Standard-Dialogen
- Angebot an angepassten Dialogen
Event-Handling (Ereignisverarbeitung) - Verwendung des Delegation-Event-Handling-Model (Event-Sources und -Listener)
Persistenz - Möglichkeit der dauerhaften Abspeicherung alter und neuer Werte von Properties
Java Beans
Page 61
WS 2006/07 Prof. Dr. Andreas Schmietendorf 61
Methoden - werden genutzt um entsprechende Properties des Beans zu ändern. Alle als „public“ definierte Methoden werden in einem Bean-Builder-Tool angeboten.
- Einschränkung der angebotenen Methoden über BeanInfo-Klasse
- Einschränkung auch beim Import des Bean in ein Builder-Tool möglich
Properties - (Eigenschaften) - Kapseln Daten einer Instanz eines Bean und können von außen abgefragt und geändert werden
Signature pattern für Properties: getProperty() / setProperty()
- Simple Properties - repräsentieren einen einzelnen Wert
- Indexed Properties - Array gleichen Datentyps
- Bound Properties - Kombination eines Properties mit einem Event (z.B. ausgelöst nach der Änderung eines Properties)
- Constrained Properties - Zustimmung zur Änderung einer Propertie von z.B. einem anderen Bean holen
Java Beans
Page 62
WS 2006/07 Prof. Dr. Andreas Schmietendorf 62
Softwarekomponentenmodell JavaBeans (aber != EJB‘s)
Konfigurierbare Container
- Kapselung von Anwendungslogik
- Speicherung von Daten (persistieren)
Trennung von Anwendungslogik und Darstellung
- Auslagerung von Logik aus den JSP‘s
- Bessere Wartbarkeit
- Entkopplung der Schichten
Java Beans
Page 63
WS 2006/07 Prof. Dr. Andreas Schmietendorf 63
Eigenschaften:
Besitzen einen leeren Konstruktor
Sollten keine öffentlichen (public) Instanzvariablen besitzen
Zustände werden über Zugriffsmethoden manipuliert
Mögliche Methodensignaturen:
- setXxx
- getXxx
- isXxx (bei booleschen Attributen)
Java Beans
Page 64
WS 2006/07 Prof. Dr. Andreas Schmietendorf 64
Beispiel einer einfachen JavaBean:
package cs.j2ee.beans
/* Speicherung einer Fahrtroute */
public class RouteBean
/* Startpunkt der Fahrtroute */
private String start
public String getStart() {
return start;
}
public void setStart (String start) {
this.start = start;
}
Java Beans
Page 65
WS 2006/07 Prof. Dr. Andreas Schmietendorf 65
Verwendung von JavaBeans in JSP‘s:
<jsp:useBean id=“route“ class=“cs.j2ee.beans.RouteBean“ />
oder
<% cs.j2ee.beans.RouteBean route =
new cs.j2ee.beans.RouteBean (); %>
oder als Interface
<jsp:useBean id=“route“ type=„typ.Interface“
class=“cs.j2ee.beans.RouteBean“ />
bzw.
<% typ.Interface route =
new cs.j2ee.beans.RouteBean (); %>
Java Beans
Page 66
WS 2006/07 Prof. Dr. Andreas Schmietendorf 66
Zugriff auf Attribute der JavaBean:
Auslesen von Property-Werten
<jsp:getProperty name=“route“ property=“start“ />
oder
<%= route.getStart() %>
Setzen von Property-Werten
<jsp:setProperty name=“route“ property=“start“ value=
“Dresden“/>
Java Beans
Page 67
WS 2006/07 Prof. Dr. Andreas Schmietendorf 67
Steuerung des Gültigkeitsbereichs von JavaBean:
<jsp:useBean id=“route“
class=“cs.j2ee.beans.RouteBean“
scope=“session“ />
Steuerung über das scope-Attribut:
page – Variablen sind nur innerhalb der aktuellen Seite gültig
session – gültig bis Browser geschlossen wird
- Verwendung für die Nutzerauthentifizierung
- Ablage aktuell ausgewählter Datensätze
application – für den applikationsübergreifenden Datenaustausch
request – Variablen sind für die Dauer eines Request gebunden
Java Beans
Page 68
WS 2006/07 Prof. Dr. Andreas Schmietendorf 68
Vorteile von JavaBeans:
Wiederverwendung von Quellcode (JSP‘s & Java-Objekte)
Verständlichkeit
- Vereinfachung der Struktur von JSP‘s
- Darstellung getrennt von der Java-Implementierung
Kapselung
- JSP‘s interagieren mit dem Benutzer
- JavaBeans realisieren die Anwendungslogik
Verwaltung zusammengehöriger Daten
Java Beans
Page 69
WS 2006/07 Prof. Dr. Andreas Schmietendorf 69
Servlets
Page 70
WS 2006/07 Prof. Dr. Andreas Schmietendorf 70
„Server side applets, without face“
Bestandteile von Web Applicationen
Bieten die Funktionalität von CGI-Skripts
Kontext für Web Applikationen
- Unterstützung mehrerer Servlets
- Unterstützung mehrerer HTML-Seiten
- Unterstützung mehrerer Java Server Pages
Filter für bestimmte Datentypen
Java Servlets
Page 71
WS 2006/07 Prof. Dr. Andreas Schmietendorf 71
Das generierte Servlet unserer ersten JSP - 1:
Unter: C:\jakarta-tomcat-5\tomcat50-jwsdp\work\Catalina\localhost\schmiete\org\apache\jsp\jsppackage org.apache.jsp.jsp;
import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;
public final class beispiel1_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
private static java.util.Vector _jspx_dependants;
public java.util.List getDependants() { return _jspx_dependants; }
Java Servlets
Page 72
WS 2006/07 Prof. Dr. Andreas Schmietendorf 72
Das generierte Servlet unserer ersten JSP - 2:public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws java.io.IOException, ServletException {
JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
Java Servlets
Page 73
WS 2006/07 Prof. Dr. Andreas Schmietendorf 73
Das generierte Servlet unserer ersten JSP - 3:try {
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
Java Servlets
Page 74
WS 2006/07 Prof. Dr. Andreas Schmietendorf 74
Das generierte Servlet unserer ersten JSP - 4:out.write("<html>\r\n");
out.write("<body>\r\n");
out.write("Hallo liebe Studenten der FHW Berlin!\r\
n");
out.write("Es ist jetzt genau:\r\n");
out.print( new java.util.Date());
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>");
Java Servlets
Page 75
WS 2006/07 Prof. Dr. Andreas Schmietendorf 75
Das generierte Servlet unserer ersten JSP - 5:
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
out.clearBuffer();
if (_jspx_page_context != null)
_jspx_page_context.handlePageException(t);
}
} finally {
if (_jspxFactory != null)
_jspxFactory.releasePageContext(_jspx_page_context); }}}
Java Servlets
Page 76
WS 2006/07 Prof. Dr. Andreas Schmietendorf 76
Alles was mit JSPs realisiert werden kann, kann auch unter
Verwendung von Servlets erreicht werden
Potentielle Nachteile von JSPs:
- Mischung von JSP und HTML-Code wird bei komplexen Java-
Strukturen unübersichtlich
- Mittels der Variable out (Typ javax.servlet.jsp.JspWriter) können keine
Binärdaten ausgegeben werden (z.B. Bilder)
- JSP können HTML-Dokumente erzeugen, deutlich schwieriger ist es
bei anderen Datenformaten
- Fehler werden häufig erst zur Laufzeit erkannt
Servlets stärker in der Funktionalität, als in der Darstellung
Java Servlets
Page 77
WS 2006/07 Prof. Dr. Andreas Schmietendorf 77
Ein selbst erzeugtes Servlet - 1:package cs.j2ee.servlets;
import java.util.Date;import java.io.PrintWriter;import java.io.IOException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.ServletException;
public class HelloWorld extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException,
ServletException {
Java Servlets
Page 78
WS 2006/07 Prof. Dr. Andreas Schmietendorf 78
Ein selbst erzeugtes Servlet - 2:// set the contentType response.setContentType("text/html;charset=ISO-
8859-1");
// get the PrintWriter PrintWriter out = response.getWriter(); // create content StringBuffer content = new StringBuffer(); content.append("<!DOCTYPE html PUBLIC
\"-//w3c//dtd html 4.0 transitional//en\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">");
content.append("<HTML><HEAD><TITLE>Ein selbst geschriebens Servlet</TITLE></HEAD>");
Java Servlets
Page 79
WS 2006/07 Prof. Dr. Andreas Schmietendorf 79
Ein selbst erzeugtes Servlet - 3:content.append("<BODY><FONT color=\"green\"
face=\"arial\">");
content.append("<CENTER>Hallo Studenten der FHW Berlin</CENTER><UL>");
content.append("<LI>Es ist jetzt genau ");
content.append(new Date());
content.append("</LI></UL></FONT></BODY></HTML>");
// write out
out.print (content.toString());
}
}
Java Servlets
Page 80
WS 2006/07 Prof. Dr. Andreas Schmietendorf 80
Schritte zur Ausführung des Servlets:
Übersetzen des Servlets mittels eines Java-Compilers
- Verwendung einer entsprechende Entwicklungsumgebung
- Verwendung eines entsprechende Build-Files (Tool Ant)
Anlegen einer entsprechenden Verzeichnisstruktur im Web-Server
- /WEB-INF/sources – Java Quelldateien
- /WEB-INF/classes – Java Klassendateien
- /WEB-INF/lib – benötigte Klassenbibliotheken
- /deploy_lib – Klassen die nur zur Übersetzung benötigt werden
Web Deployment Decsiptor (web.xml) erstellen bzw. bearbeiten
Java Servlets
Page 81
WS 2006/07 Prof. Dr. Andreas Schmietendorf 81
Java Servlets
Page 82
WS 2006/07 Prof. Dr. Andreas Schmietendorf 82
Der Web Deployment Descriptor - 1:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>Client/Server-Programmierung</display-name>
<description>
FHW Berlin
</description>
Java Servlets
Page 83
WS 2006/07 Prof. Dr. Andreas Schmietendorf 83
Der Web Deployment Descriptor - 2:
Für jedes Servlet benötigen wir ein <servlet>-Tag
Servlet wird bereits bei der Initialisierung geladen
Prio 1-10 (1 - zuerst geladen, 10 – zuletzt geladen)
<!-- Bind Servlet to symbolic name -->
<servlet>
<servlet-name>WelcomeServlet</servlet-name>
<servlet-class>cs.j2ee.servlets.HelloWorld</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
Java Servlets
Page 84
WS 2006/07 Prof. Dr. Andreas Schmietendorf 84
Der Web Deployment Descriptor - 3:
Verknüpfen des Servlets mit einer URL
Servlets liegen physikalisch an einem anderen Ort!
Keine relativen Adressen innerhalb des HTML-Codes
Verweise relativ zur virtuellen Adresse des Servlet setzen!! <!-- Map servlet to URL -->
<servlet-mapping>
<servlet-name>WelcomeServlet</servlet-name>
<url-pattern>/servlets/HelloWorld</url-pattern>
</servlet-mapping>
</web-app>
Java Servlets
Page 85
WS 2006/07 Prof. Dr. Andreas Schmietendorf 85
Java ServletsJava Server Pages Servlets
Übersetzungszeitpunkt Zur Laufzeit von der JSP-Engine erzeugt, kann ggf. vorkompiliert werden.
Muss manuell übersetzt werden.
Bindung an URL Unter dem tatsächlichen Pfad, innerhalb der Web-Applikation erreichbar.
Wird über den Web Deployment Descriptor an eine oder mehrere symbolische URL‘s gebunden.
Vordefinierte Variablen Stehen direkt zur Verfügung. Müssen über Methoden aus dem Request bzw. Response gebunden werden.
HTML-Code Kann direkt eingefügt werden. Muss über print() und write() ausgegeben werden.
Dokumenttypen Beschränkt auf textbasierte Dokumente.
Unterstützt sowohl Text-, als auch Binärformate.
Services Beschränkt auf eine einzige Service-Methode.
Eigene Servicemethoden für jeden Request-Typ (PUT, GET, POST)
Page 86
WS 2006/07 Prof. Dr. Andreas Schmietendorf 86
Idee der Tag-Bibliotheken (Taglibs)
Page 87
WS 2006/07 Prof. Dr. Andreas Schmietendorf 87
Verwendung eigener Tags
Vorraussetzungen für eigen definierte Tags:
- Implementierung der Funktionalität Tag-Handler
- Package: javax.servlet.jsp.tagext.*
- Zusammenfassen in Tag-Bibliotheken
Steuerung des Lebenszyklus eines Tag
- doStartTag() – Aufruf bei einem öffnenden Tag (Initialisierung)
- doAfterBody() – Aufruf unmittelbar vor dem schließenden Tag
- doEndTag() – Aufruf nach dem schließenden Tag (Freigabe)
<TAG> Rumpf </TAG>
doStartTag() doAfterBody() doEndTag()Beginn der Bearbeitung
des Rumpfes
Page 88
WS 2006/07 Prof. Dr. Andreas Schmietendorf 88
package cs.j2ee.tags;
…import javax.servlet.jsp.JspWriter;import javax.servlet.jsp.tagext.TagSupport;
public class SimpleTag extends TagSupport(){
public int doStartTag(){
try {JspWriter out = pageContext.getOut();out.print (new Date());
} catch (IOException ioex){ioex.printStackTrace();
}return (SKIP_BODY);
}}
Beispiel eines Tag-Handlers
Page 89
WS 2006/07 Prof. Dr. Andreas Schmietendorf 89
Festlegung des zum Tag-Handler korrespondierenden Tags:
xml-Datei mit der Extension *.tld
- Festlegung der taglib-Version
- Festlegung der unterstützten JSP-Version
- Festlegung von Namensräumen für die Taglibs
- Mapping zwischen Java-Klasse und Tag herstellen
Reservierte Namensräume:
- Java, javax, jsp, jspx, servlet, sun, sunw
- Leere Präfixe sind ebenfalls nicht erlaubt
Tag Library Descriptor
Page 90
WS 2006/07 Prof. Dr. Andreas Schmietendorf 90
<taglib><tlib-version>1.0</tlib-version><jsp-version>1.2</jsp-version><short-name>j2ee</short-name><uri>www.masterclass.de/j2ee</uri><description>Example Tag</description>
<tag><name>date</name><tag-class>cs.j2ee.tags.SimpleTag</tag-
class><description>…</description>
</tag></taglib>
Tag Library Descriptor
Page 91
WS 2006/07 Prof. Dr. Andreas Schmietendorf 91
Einbinden des TLD in die eigene Webapplikation:
Direktes Einbinden in das Webverzeichnis
- Sichtbar unter der URL des Webauftritts
- http://localhost:8080/schmietendorf/tlds
Einbindung des TLD in den Deployment Descriptor
- Verfügbar unter einer virtuellen URL (WEB-INF-Ordner)
- Eintrag in die entsprechende web.xml
<taglib-uri> & <taglib-location>
- Tag-Bibliotheken bleiben dem Benutzer verborgen
Verwendung in der JSP
<%@ taglib uri=„/j2ee-tags“ prefix=„j2ee“ %>
Tag im HTML-Body: <j2ee:date />
Tag Library Descriptor
Page 92
WS 2006/07 Prof. Dr. Andreas Schmietendorf 92
JSTL – JavaServer Pages Standard Tag Library
- Standard-API für Tags von SUN
- URL: http://java.sun.com/products/jsp/jstl
Apache Jakarta Taglibs
- Benchmarking, Logging, Cache, JMS , …
- URL: http://jakarta.apache.org/taglibs
…
Verfügbare Taglibs