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