Quattro Stagioni

Dynamische Seiten im World Wide Web haben in den letzten Jahren immer stĂ€rker an Bedeutung gewonnen. Kaum ein Unternehmen kann es sich heute noch leisten, auf Techniken zur ‘On the Fly’-Generierung seiner WebprĂ€senz zu verzichten. Welchen Vorteil die JavaServer Pages im Vergleich zu anderen bieten, zeigt iX in einem dreiteiligen Tutorial.

vorlesen Druckansicht 15 Kommentare lesen
Lesezeit: 21 Min.
Von
  • Lars Röwekamp
  • Peter Roßbach
Inhaltsverzeichnis

Vorbei die Zeit der statischen Internetseiten. Nur diejenigen Unternehmen können sich am Markt behaupten, die in der Lage sind, innerhalb kĂŒrzester Zeit auf eine geĂ€nderte Nachfrage der Kunden durch ein entsprechendes Angebot im WWW zu reagieren. Der Point of Sale der Unternehmen sind vermehrt Online-Auktionen, virtuelle BuchlĂ€den und komplette InternetversandhĂ€user. Dazu mĂŒssen stĂ€ndig sich Ă€ndernde Informationen und GeschĂ€ftsprozesse ‘up to date’ ins Internet.

Sun Microsystems hat die JavaServer Pages (JSP) fĂŒr die Realisierung der PrĂ€sentationsschicht einer Webanwendung entwickelt. Sie integrieren Businesskomponenten und existierende Systeme elegant ins Web. Die JSP-Technik basiert auf dem Java-Servlet-API und dient im Wesentlichen zur einfachen Erzeugung von HTML- und XML-Ausgaben eines Webservers. Wie PHP, ASP oder Perl können Autoren direkt HTML oder XML mit einer Skriptsprache mischen. NatĂŒrlich hat sich Sun hier fĂŒr Java entschieden, um so die Möglichkeiten der vorhandenen robusten und zahlreichen Java-APIs einzubringen.

Mehr Infos

Ein Entwicklerteam kann ausschließlich mit der Programmiersprache Java die Logik implementieren. Das Design kann dagegen weiterhin von einem HTML-Autor und Grafikern durchgefĂŒhrt werden. Damit das Beste der HTML- und Java-Welt zusammenkommen kann, sind in den JSP einige Tags zur VerfĂŒgung gestellt, die es erleichtern, ohne eine einzige Zeile Java kleine und spĂ€testens im dritten Teil dieses Tutorials auch große Anwendungen zu schreiben. Mit der JSP-Spezifikation 1.1 sind die Standard-Tags durch so genannte Taglibs sogar erweiterbar. Noch fehlt es zwar an einer Standard-Taglib fĂŒr FeldprĂŒfung, Ausgabeformatierung, for-, if- und switch-Anweisungen, aber dies soll die zurzeit in Arbeit befindliche Version 1.2 klĂ€ren. Einzelne Hersteller (Allaire, Unify, BEA) sind heute schon in der Lage, Entsprechendes zu liefern. Teil 2 und 3 beschĂ€ftigen sich mit der Programmierung einer solchen Taglib. Bevor es ans JSP-‘Eingemachte’ geht, sei hier noch einmal auf die Unterschiede von komponenten- und seitenzentrierter Webanwendungsentwicklung eingegangen.

Techniken wie Shellskripts, CGI/Perl, PHP oder ASP wurden schon entworfen und eingesetzt, als das Web in den Kinderschuhen steckte. Viele Unternehmen hatten noch nicht registriert, dass sie ihre GeschĂ€ftsablĂ€ufe und Informationen im Internet prĂ€sentieren mĂŒssen, um langfristig ĂŒberleben zu können. Die wenigen dynamischen Seiten waren schnell in einer Skriptsprache direkt in die Webseite programmiert. Das seitenzentrierte Modell hat gegenĂŒber anderen Modellen einen großen Vorteil - es ist einfach zu erlernen. Die Programmierung ist ĂŒbersichtlich, und jeder ist schnell erfolgreich.

Heute stellt sich die Aufgabe fĂŒr Entwickler nicht mehr so einfach dar. Ganze GeschĂ€ftsprozesse eines Unternehmens mĂŒssen durch das Web gefĂŒllt, ĂŒberwacht und gesteuert werden. Es entstehen große verteilte und skalierbare Anwendungen, die deutlich in ihrer KomplexitĂ€t von der einfachen Formularerfassung der ersten Tage abweichen. Die Logik, die in einer Seite programmiert wird, mĂŒssen nun wieder verwendbare Komponenten eventuell durch EJB, RMI, CORBA oder Host-Services von verschiedenen Anwendungen aus gleichzeitig nutzen.

Es ist notwendig, die PrĂ€sentation von der Business- und Datenzugriffslogik zu trennen. So kann ein Entwicklungsteam die verschiedenartigen Techniken voneinander getrennt entwickeln und testen. In großen Unternehmen existieren meist schon riesige Anwendungen, deren Komponenten nicht einfach fĂŒr eine weitere Anwendung neu entwickelt werden können. Webanwendungen werden ihre KomplexitĂ€t stetig steigern, und die Limitierungen des seitenzentrierten Modells werden immer offensichtlicher.

Architektur der JavaServer Pages: DatenbestÀnde kommen mit Hilfe von JavaBeans in die Webseiten (Abb. 1).

Die Zeit ist gekommen, sich nach besseren Möglichkeiten umzusehen, um Webanwendungen auch in Zukunft schnell und stabil zur VerfĂŒgung stellen zu können. JavaBeans bieten fĂŒr Java-Entwickler und die Werkzeugschmieden (IBM, Borland, Symantec/BEA, Oracle, Persistence, Sybase, Togethersoft et cetera) eine solche gemeinsame Basis. Ein Experte stellt die Anforderungen fĂŒr Komponenten, die der Entwickler in entsprechend unabhĂ€ngige JavaBeans umsetzen kann (siehe Abbildung 1). Java bietet eine umfassende Plattform fĂŒr die Integration bestehender Systeme (J2EE). Damit sind die sonst langatmigen und aufhaltenden technischen Hindernisse einer Systemverbindung einfacher, wenn auch nicht trivial geworden. Eine JSP kann nun durch Zugang zu solchen JavaBeans dem Webdesigner die Chance geben, mĂ€chtige Funktionen im Web zu prĂ€sentieren, ohne sich mit den Details der Business- und Datenzugriffslogik herumzuplagen.

Initialisierung einer JSP: die ‘Maschine’ bearbeitet Anfragen und sorgt fĂŒr die Bereitstellung der Dienste (Abb. 2).

Eine JSP ist eigentlich ein spezielles Servlet, das durch eine JSP-Engine erzeugt wird. Der Servlet-Container nimmt eine HTTP-Anfrage an und ermittelt anhand eines URL-Mapping, dass es sich um eine JavaServer Page handelt. Eine JSP-Engine wird aufgerufen und schaut in ihrer Verwaltung nach, ob vielleicht schon eine kompilierte aktuelle JSP fĂŒr die Anfrage vorliegt. Falls nicht, lĂ€dt sie aus dem Dateisystem die entsprechende Seite und erzeugt ein Servlet (mittels Java-Sourcecode) daraus (siehe die JSP-1.1-Spezifikation). Anschließend ĂŒbersetzt sie diesen Servlet-Source und lĂ€dt die resultierende Klasse mit einem ClassLoader. Abbildung 2 zeigt die Initialisierung einer JSP.

Sie erfolgt mit der Methode jspInit(). Hier können eigene Erweiterungen direkt durch Überschreiben der entsprechenden Methode in der eigenen JSP stattfinden. Solange sie bezĂŒglich des generierten Servlet nicht verĂ€ndert wurde, bearbeitet die Methode _jspService() jede Anfrage. Nach erfolgreicher Arbeit wird die Seite mit jspDestroy() von der bevorstehenden ‘Vernichtung’ informiert. Dies geschieht immer dann, wenn ein aktuellerer JSP-Source vorliegt oder der Servlet-Container bestimmt, ein oder alle Servlets runterzufahren.

Workflow des Pizza-Online-Dienstes: Zusammenspiel von Bestellung, Adresseingabe und BestÀtigung (Abb. 3).

Ein Beispiel zur Demonstration des Gelernten darf natĂŒrlich nicht fehlen. Wie jeder weiss, handelt es sich bei des Programmierers liebster Speise um die Pizza. Deshalb soll hier ein Pizza Service Online als durchgehendes Beispiel dienen.

4 Stadien des Pizza-Dienstes: die Eingangsseite, Auswahl von Pizza und Zutaten, Eingabe der Kundendaten und die BestÀtigung der Bestellung. Noch muss jedes Mal die eigene Adresse eingegeben werden, und es gibt leider nur eine virtuelle Pizza (Abb. 4 bis 7).

Da der Schwerpunkt dieses Teils auf den Grundlagen der JSP liegt, sind die Funktionen und das Pizza-Angebot des Online-Services zunĂ€chst bewusst gering gehalten. Es soll ja schließlich noch Potenzial fĂŒr Verbesserungen ĂŒbrig bleiben. Auch auf sonst ĂŒbliche Programmiertechniken wie Exception Handling und EingabeprĂŒfungen wird an einigen Stellen aus GrĂŒnden der Übersichtlichkeit verzichtet.

Nach einer BegrĂŒĂŸungsseite gelangt der Kunde direkt zur Online-Bestellung. Neben einer Basis-Pizza kann er auf dieser Webseite zusĂ€tzlich beliebig viele Zutaten bestellen. Anschließend kann der Kunde die zu beliefernde Adresse eingeben, damit der Service weiß, an wen er die virtuelle Pizza via Internet versenden soll. Eine BestĂ€tigung ĂŒber seine Bestellung erhĂ€lt der Kunde natĂŒrlich auch. Wie das im Einzelnen aussieht, zeigen die folgenden Abbildungen.

Im ersten Teil können Kunden pro Bestellung jeweils nur eine Pizza angeben. Und auch auf GetrĂ€nke mĂŒssen sie zunĂ€chst verzichten. Ein hungriger Leser wird ĂŒbrigens schnell feststellen, dass neben diesen beiden Punkten noch einige weitere AnsĂ€tze fĂŒr Verbesserungen existieren. So muss er fĂŒr jede Bestellung die Lieferadresse erneut eingeben und fehlerhafte Eingaben werden ignoriert. All diese Aspekte sind Bestandteil des zweiten Artikels und wurden hier deshalb zunĂ€chst vernachlĂ€ssigt.

ZunĂ€chst stellt sich natĂŒrlich die Frage, wie eine JSP ĂŒberhaupt aufgerufen werden kann. Ein Webserver kann sie nur dann verarbeiten, wenn eine entsprechende Engine vorhanden ist, die fĂŒr die Übersetzung der JSP in ein Java-Servlet sorgt. Wir empfehlen, im ersten Schritt die tomcat-Referenzimplementierung aus dem Apache-Projekt zu verwenden, da sie alle grundlegenden Funktionen bietet, die eine solchen ‘Maschine’ gemĂ€ĂŸ der JSP-Spezifikation 1.1 enthalten sollte. NĂ€heres zur Installation findet sich im Kasten ‘Standalone-Installation tomcat’.

Mehr Infos

Standalone-Installation tomcat

Nach dem Download und der Installation der tomcat-Release wird die JspTutorial-Applikation im Verzeichnis %TOMCAT_HOME%webapps ausgepackt. In der Datei %TOMCAT_HOME%confserver.xml mĂŒssen folgende Zeilen innerhalb des ContextManager-Tags eingetragen werden:

<Context path="/jspTutorial" 
docBase="webapps/jsp-Tutorial-app"
debug="9" reloadable="true" >
</Context>

Danach kann tomcat mittels %TOMCAT_HOME%instartup.bat fĂŒr den Standalone-Betrieb gestartet werden. Das Jsp-Tutorial-Beispiel ist mit einem Webbrowser nun unter http://127.0.0.1:8080/jspTutorial/jspTutorial zu erreichen.

Es sei an dieser Stelle darauf hingewiesen, dass der professionelle Einsatz von JSP innerhalb einer Webapplikation in der Regel auch eine ‘professionelle’ Lösung im JSP-Engine-Umfeld benötigt. Hierbei geht es weniger um das Einhalten der Spezifikation an sich, als vielmehr um die vielen kleinen Added Values, die den tĂ€glichen Umgang mit den integrierten Tools erheblich vereinfachen.

Wie bereits weiter oben erwĂ€hnt, lassen sich JSPs als eine Art HTML-Seiten mit zusĂ€tzlichen, JSP-spezifischen Tags und Java-Code beschreiben. Generell sind vier Typen von gĂŒltigen JSP-Elementen unterscheidbar:

JSP-Direktiven
JSP-Skriptelemente
JSP-Kommentare
JSP-Aktionen

Die Aufgabe von Direktiven liegt in der Übermittlung von speziellen Seiteninformationen an die JSP-Engine. Mit ihrer Hilfe kann man angeben, wie im Fehlerfall weiter zu verfahren ist, welche Skriptsprachen unterstĂŒtzt werden oder dass die JSP eine Taglib einbindet. Die allgemeine Syntax der Direktiven lautet <%@ .... %>. Alternativ ist die XML-Syntax <jsp:directive.name ... /> erlaubt, wobei name fĂŒr eine der im Folgenden erlĂ€uterten Direktiventypen steht.

In diesem ersten Teil kommt hauptsĂ€chlich die so genannte page-Directive zum Einsatz. Sie dient einerseits dazu, fĂŒr die einzelnen JSP eine generelle Fehlerseite zu definieren und andererseits zum Import der innerhalb der Seiten benötigten Java-Klassen. Der in Listing 1 wiedergegebene Auszug aus choice.jsp zeigt ein typisches Beispiel fĂŒr die Nutzung von Seitendirektiven.

Mehr Infos

Listing 1: Seitendirektiven

<%-- choice.jsp --%>

<%-- Setting up an error page --%>
<%@ page errorPage="/jspTutorial/errorpage.htm" %>

<%-- import needed java classes --%>
<%@ page import="java.util.*" %>
<%@ page import="de.ix.jspTutorial.model.Pizza" %>
<%@ page import="de.ix.jspTutorial.model.PizzaList" %>
<%@ page import="de.ix.jspTutorial.model.Ingredient" %>
<%@ page import="de.ix.jspTutorial.model.IngredientList" %>

Neben den zwei gezeigten Seitendirektive-Attributen errorPage und import existieren eine ganze Anzahl weiterer erlaubter Attribute, die in der Tabelle unten erlÀutert sind.

Mögliche Attribute der Seitendirektive
Attribut Beschreibung Inhalt Standard
autoFlush beschreibt das Verhalten der Seite, falls der Ausgabe-Buffer ĂŒberlĂ€uft. Ist der Wert ‘true’, so wird der Buffer-Inhalt zum HTTP-Response geleitet. Bei ‘false’dagegen wirft die JSP eine Exception. Boolean true
buffer definiert die GrĂ¶ĂŸe des Ausgabe-Buffers. Soll die Ausgabe direkt zur HTTP-Response geleitet werden, sollte der Wert auf ‘none’ gesetzt werden. Buffer-GrĂ¶ĂŸe oder ‘none’ 8 KByte
contentType gibt an, welchen MIME Type die Response der aktuellen JSP hat; ĂŒbliche Werte fĂŒr eine JSP sind ‘text/html’, ‘text/xml’ und ‘text/plain’. MIME Type, Character Set
errorPage Fehlerdatei. lokale URL kein
extends gibt die Oberklasse der aktuellen JSP an; wird in der Regel nicht verwendet. Java Klasse kein
import entspricht der Java-Import-Anweisung. Klassen oder Package-Name(n) kein
info informatives Feld, das die JSP-Engine auswerten kann. reiner Text kein
isErrorPage Indikator dafĂŒr, ob die JSP eine Fehlerseite darstellt. Boolean false
isThreadSave gibt an, ob die JSP mehrere Requests gleichzeitig verarbeiten kann. Boolean true
language gibt die innerhalb der JSP erlaubten Skriptsprachen an. Da Java als Standard gesetzt ist, muss es nicht explizit angegeben werden. Name einer erlaubten Skriptsprache java
session mit Hilfe des session-Attributs kann festgelegt werden, ob die Seite Teil der aktuellen Session werden soll. Boolean true

Auch wenn es erlaubt ist, mehrere Attribute in einer Seitendirektive anzugeben, sollte aus GrĂŒnden der Lesbarkeit fĂŒr jedes Attribut eine eigene Direktive aufgefĂŒhrt werden. Dies erleichtert eine spĂ€tere Fehlersuche.

Neben der bisher beschriebenen Seitendirektive existieren die include- und die taglib-Direktiven. Wie die Namen nahe legen, dient die Include-Direktive zum EinfĂŒgen von Inhalten. Dabei wird die Direktive durch die entsprechende lokale Datei ersetzt, die zum Beispiel eine weitere JSP- oder aber eine HTML-Datei sein kann. Im Beispiel des Pizza Service Online dient diese Direktive dazu, das immer wiederkehrende ‘Copyright’ einzubinden.

<%@ include file="/jspTutorial/includes/copyright.html"%>

Die taglib-Direktive ist nicht Bestandteil dieses Artikels, aber sie kommt im dritten Teil zentral vor.

Deklarationen dienen, wie aus Java bekannt, zur Definition von Variablen und Methoden, die dann von anderen Elementen der JSP angesprochen werden können. Das ĂŒbersetzte Servlet generiert fĂŒr jede JSP- eine eigene Java-Methode. Die allgemeine Syntax der Deklarationen lautet:

<%! declaration(s) %>

Auch hier ist alternativ die XML-Syntax möglich:

<jsp:declaration> declaration(s) </jsp:declaration>

Innerhalb des Pizza-Dienstes finden die Deklarationen zum Beispiel bei der Definition einer Methode zur Formatierung der DM-BetrÀge Verwendung (siehe Listing 2).

Mehr Infos

Listing 2: Formatierung

<%! public String formatCurrency(double aCurrencyValue) {
DecimalFormat theFormat = new DecimalFormat();
theFormat.setGroupingUsed(true);
theFormat.setMinimumFractionDigits(2);
theFormat.setMaximumFractionDigits(2);
return theFormat.format(aCurrency) ;
}
%>

Da Deklarationen die Variablen und Methoden lediglich definieren, nicht aber verwenden, erzeugen sie keine Ausgaben innerhalb der JavaServer Pages. DafĂŒr sind die Scriptlets und JSP-AusdrĂŒcke verantwortlich. Will man die Variablen und Methoden direkt zur Erzeugung von HTML-Ausgabe verwenden, erreicht man dies mittels der so genannten JSP-Expressions. Mit Hilfe von AusdrĂŒcken wie

<%= expression %>
[oder]
<jsp:expression> expression </jsp:expression>

können Entwickler auf einfache Art und Weise dynamisch die HTML-Ausgabe innerhalb einer JSP generieren. Da HTML bekanntlich nur Textelemente kennt, erfolgt eine automatische Konvertierung der verschiedenen Java-Typen in den Datentyp String. Hierzu wird die von der Klasse java.lang.Object geerbte Methode toString() herangezogen.

Ein Problem ergibt sich lediglich bei den primitiven Datentypen, da diese mangels einer zu Grunde liegenden Klasse ĂŒber keine toString()-Methode verfĂŒgen. Die Tabelle ‘Konvertierungssregeln’ zeigt die entsprechenden Methoden.

Konvertierungsregeln
Datentyp Konvertierungsregel
boolean java.lang.Boolean(boolean).toString()
byte java.lang.Byte(byte).toString()
char java.lang.Character(char).toString()
double java.lang.Double(double).toString()
int java.lang.Integer(int).toString()
float java.lang.Float(float).toString()
long java.lang.Long(long).toString()

Beispiele fĂŒr AusdrĂŒcke gibt es viele innerhalb des Pizza-Dienstes. Der in Listing 3 zu sehende Ausschnitt aus choice.jsp zeigt den dynamischen Aufbau der Pizza-Auswahlliste. Name, GrĂ¶ĂŸe, Preis und IdentitĂ€t der Pizzen werden jeweils mittels JSP-Expressions ermittelt.

Mehr Infos

Listing 3: Pizza-Auswahl

<!-- Table for choice of pizza -->
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0">

<!-- erzeuge Kopf der Tabelle -->
<TR BGCOLOR="#406E6E">
<TD WIDTH="150"><FONT FACE="Arial,Helvetica"
SIZE="2" COLOR="#FFFFFF">&nbsp;Name</TD>
<TD WIDTH="150"><FONT FACE="Arial,Helvetica"
SIZE="2" COLOR="#FFFFFF">&nbsp;GrĂ¶ĂŸe</TD>
<TD WIDTH="100"><FONT FACE="Arial,Helvetica"
SIZE="2" COLOR="#FFFFFF">&nbsp;Preis</TD>
<TD WIDTH="75"><FONT FACE="Arial,Helvetica"
SIZE="2" COLOR="#FFFFFF">&nbsp;</TD>
</TR>

<!-- Ausgabe ĂŒber alle Pizzas in der Pizzaliste
und generiere die Auswahltabelle-->

<%
Set entrySet = pizzaList.getPizzas().entrySet();

for (Iterator iter = entrySet.iterator(); iter.hasNext();) {

Map.Entry entry = (Map.Entry)iter.next();
Pizza pizza = (Pizza)entry.getValue();

%>

<TR>
<TD><FONT FACE="Arial,Helvetica"
SIZE="2">&nbsp;<%=pizza.getName()%></TD>
<TD><FONT FACE="Arial,Helvetica"
SIZE="2">&nbsp;<%=pizza.getSize()%></TD>
<TD><FONT FACE="Arial,Helvetica"
SIZE="2">&nbsp;DM&nbsp;<%=pizza.getBasePrice()%></TD>
<TD><FONT FACE="Arial,Helvetica"
SIZE="2"><INPUT NAME="ID_PIZZA" TYPE="radio
"VALUE="<%=pizza.getId()%>"></TD>
</TR>

<%
}
%>
</TABLE>

WĂ€hrend JSP-Deklarationen und -AusdrĂŒcke per Definition in ihrer Funktion relativ beschrĂ€nkt sind, wenn es darum geht, HTML-Ausgaben erzeugen und Ablauflogik zu implementieren, dienen Scriptlets genau zu diesem Zweck. Auch wenn die Verwendung von Scriptlets nicht automatisch mit HTML-Ausgaben gleichzusetzen ist, werden sie doch meistens direkt oder indirekt fĂŒr diesen Zweck herangezogen. Die allgemeine Syntax der Scriptlets lautet:

<% scriptlet %>
[oder]
<jsp:scriptlet> scriptlet </jsp:scriptlet>

Der Pizza-Dienst macht regen Gebrauch von Scriptlets. So wird zum Beispiel mit ihnen die Liste der möglichen Pizzen innerhalb der Seite choice.jsp durchlaufen (Listing 4). Wie es zeigt, lassen sich Scriptlets und HTML-Tags beliebig kombinieren - in etwa mit PHP vergleichbar.

Mehr Infos

Listing 4: Pizza-Durchlauf

<%
Set entrySet = pizzaList.getPizzas().entrySet();

for (Iterator iter = entrySet.iterator(); iter.hasNext();) {
Map.Entry entry = (Map.Entry)iter.next();
Pizza pizza = (Pizza)entry.getValue();
%>

<TR>
<TD><FONT FACE="Arial,Helvetica"
SIZE="2">&nbsp;<%=pizza.getName()%></TD>
<TD><FONT FACE="Arial,Helvetica"
SIZE="2">&nbsp;<%=pizza.getSize()%></TD>
<TD><FONT FACE="Arial,Helvetica"
SIZE="2">&nbsp;DM&nbsp;<%=pizza.getBasePrice()%></TD>
<TD><FONT FACE="Arial,Helvetica"
SIZE="2"><INPUT NAME="ID_PIZZA" TYPE="radio"
VALUE="<%=pizza.getId()%>"></TD>
</TR>
<%
}
%>

Mit Hilfe des Java Collection Framework und dem darin definierten Iterator wird die Liste aller Pizzen im Rahmen einer for-Schleife durchlaufen. Zu beachten ist dabei, dass sich die Schleife ĂŒber zwei JSP-Scriptlets erstreckt. Die eigentliche Ausgabe der einzelnen Pizzen erfolgt via HTML und JSP-Expressions.

Auch wenn Scriptlets aufgrund ihrer MĂ€chtigkeit einen gewissen Anreiz fĂŒr ihre Verwendung bieten, sollten Entwickler in der Regel - anders als in diesem ersten Teil des Tutorials - relativ sparsam mit ihnen umgehen. Besser ist es, Businesslogik und Ablaufsteuerung klar von der Ebene der Darstellung zu trennen. Dies lĂ€sst sich durch eine geschickte Kombination von JavaServer Pages (Design/View), Servlets (Controller), Taglibs und JavaBeans (Modell) erreichen. So kann der HTML/JSP-Designer sich um die Bereiche der Optik kĂŒmmern, wĂ€hrend Java-Entwickler den Part der Businesslogik und Ablaufsteuerung ĂŒbernehmen. Genau das wird einen Schwerpunkt des zweiten Tutorials bilden.

NatĂŒrlich darf in einer Technik wie JSP die Möglichkeit zur Quelltextdokumentation nicht fehlen. Dies ist gerade in Hinblick auf getrennte Rollen bei der Erstellung der JSP von besonderer Bedeutung. Generell lassen sich drei verschiedene Arten von Kommentaren unterscheiden:

Content Comment
JSP Comment
Scripting Language Comment

WĂ€hrend der inhaltliche Kommentar zurĂŒck an den Browser ĂŒbermittelt wird und somit auch in den HTML-Sourcen fĂŒr den Betrachter der HTML-Seiten sichtbar ist, können nur Entwickler die anderen beiden Typen einsehen. Bei dem erstgenannten handelt es sich um den Standard-HTML/XML-Kommentar mit der Syntax:

<!-- comment -->

Interessant aus Sicht der JSP ist dabei, dass inhaltliche Kommentare gĂŒltige JSP-Expressions beinhalten dĂŒrfen. So ist zum Beispiel ein Kommentar in der Art

<!-- Diese Seite ist Teil des 
iX-JSP-Tutorials, Version <%= getVersion() %>
-->

denkbar. JSP-Kommentare sind nur innerhalb der original JSP-Datei sichtbar und besitzen folgende Syntax:

<%-- comment --%>

Ein typisches Beispiel innerhalb des Pizza-Dienstes stellen die Kommentare zur ErlÀuterung des jeweiligen Seiteninhaltes einer JSP dar.

<%--
% choice.jsp
%
% Diese JSP ist Teil des iX-Tutorials.
% Anwender koennen Pizza und
% Zutaten bestellen
%
--%>

Der dritte Typ, der so genannte Skriptsprachenkommentar, ist abhĂ€ngig von der gewĂ€hlten Sprache und kann innerhalb von JSP-Scriptlets verwendet werden. Da es sich in unserem Falle um die Skriptsprache Java handelt, sind somit die Formen fĂŒr einzeiligen und mehrzeiligen Kommentar erlaubt:

// comment
/* comment */

Neben den bisher vorgestellten Direktiven, Skriptelementen und Kommentaren bilden die so genannten Aktionen den vierten und letzten Teil der gĂŒltigen JSP-Elemente. Im Rahmen dieses ersten Teils sollen lediglich drei verschiedene Bean-Tags

<jsp:useBean>
<jsp:getProperty>
<jsp:setProperty>

besprochen werden. Die anderen JSP-Actions sind dagegen Bestandteil des zweiten Artikels, wo auch ausfĂŒhrlicher auf die Möglichkeiten der Bean-Tags eingegangen wird.

Generell kommt ihnen die Aufgabe zu, mit serverseitigen JavaBeans zu interagieren. Dies bedeutet, dass mit ihrer Hilfe serverseitige Objekte erzeugt, gelesen und manipuliert werden können.

Der Zweck dieser Tags liegt hauptsĂ€chlich in der sauberen Trennung zwischen Design und Entwicklung der Businesslogik einer Webapplikation. Der HTML-Designer muss lediglich die neuen Tags sowie die notwendigen Attribute kennen, um Informationen in die oder aber aus den serverseitigen JavaBeans zu bekommen. Java-Kenntnisse sind nicht erforderlich. Um die Implementierung der JavaBeans kĂŒmmert sich ein Java-Entwickler. So kann sich jeder Beteiligte im Projekt mit der Thematik beschĂ€ftigen, fĂŒr die er ausgebildet ist, was bei ausreichender Kommunikation und Dokumentation automatisch zu besseren Webanwendungen fĂŒhren sollte.

Um mit einer JavaBean zu interagieren, muss die JSP natĂŒrlich zunĂ€chst wissen, wo die zu finden ist. Diese Informationen können mit Hilfe des <jsp:useBean>-Tags angegeben werden. WĂ€hrend dessen einfache Variante

<jsp:useBean id="beanName" 
class="full class name" ... />

lediglich ein id-Attribut angibt, unter der die Bean angesprochen werden kann, sowie die zur Bean gehörige Java-Klasse, lÀsst sich mit der zweiten Variante

<jsp:useBean id="beanName" 
class="full class name" ... >
[initialer Code]
</jsp:useBean>

zusĂ€tzlicher Code zur initialen Konfiguration der Bean definieren. Im Pizza-Dienst wird diese Tatsache zum Beispiel dafĂŒr genutzt, die Liste der Pizzen und Zutaten einmalig in die HttpSession einzulesen:

<%- initialize pizza list -%>
<jsp:useBean id="pizzaList"
class="de.ix.jspTutorial.model.PizzaList"
scope="session">
<% pizzaList.readList(application); %>
</jsp:useBean>

Das zusĂ€tzliche Attribut scope gibt innerhalb des <jsp:useBean>-Tags den Sichtbarkeitsbereich der Bean-Instanz an. Der Wert session signalisiert, dass die Bean unter der id ‘pizzaList’ innerhalb der aktuellen HttpSession von jeder beliebigen Seite aus angesprochen werden kann.

Wichtig dabei ist, dass die Bean-Instanz nur beim ersten Aufruf neu erzeugt und der Code zur initialen Konfiguration der Bean durchlaufen wird.

Bei jedem weiteren Aufruf wird auf die bereits bestehende Instanz innerhalb der Session zurĂŒckgegriffen. Im Falle des Pizza-Dienstes bedeutet dies konkret, dass die Liste der Pizzen nur einmal pro Session eingelesen wird und anschließend allen JSPs zur VerfĂŒgung steht.

Per Definition verfĂŒgt eine JavaBean ĂŒber eine Reihe von Attributen, die Entwickler mittels get- und set-Methoden setzen und lesen können. Das Pendant hierzu innerhalb der JSP stellen die beiden Bean-Tags

<jsp:getProperty name="beanName"
property="propertyName" />
<jsp:setProperty name="beanName"
property="propertyName" ... />

dar, wobei beanName fĂŒr die im <jsp:useBean>-Tag definierte id und propertyName fĂŒr das gewĂŒnschte Attribute der JavaBean steht. Zum Einsatz kommen diese beiden Tags innerhalb des Dienstes unter anderem in der Datei confirm.jsp (siehe Listing 5). Die Zeile

<jsp:setProperty name="order"
property="*" />

erreicht, dass alle Parameter innerhalb des aktuellen Request - also des Aufrufs aus der Seite order.jsp heraus - in die gleichnamigen Attribute der JavaBean-Instanz mit der id order geschrieben werden. Das anschließende Auslesen und Ausgeben der Informationen erfolgt wiederum durch die verschiedenen <jsp:getProperty>-Tags.

Mehr Infos

Listing 5: BestÀtigung

<HTML>
<HEAD>
<TITLE>Pizza Service online - confirm</TITLE>
</HEAD>

<BODY BGCOLOR="#FFFFFF" LINK="#406E6E" ALINK="#406E6E"
VLINK="#406E6E">

<jsp:setProperty name="order" property="*" />

<!-- [...] -->

Die Bestellung wird an folgende Adresse geliefert:<BR>
<BR>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0">
<TR BGCOLOR="#406E6E">
<TD WIDTH="350"><FONT FACE="Arial,Helvetica" SIZE="2"
COLOR="#FFFFFF">&nbsp;Lieferadresse
</TD>
</TR>
<TR VALIGN="top">
<TD><FONT FACE="Arial,Helvetica"
SIZE="2">&nbsp;<jsp:getProperty name="order"
property="firstname"/>&nbsp;
<jsp:getProperty name="order"
property="lastname"/>
</TD>
</TR>
<TR VALIGN="top">
<TD><FONT FACE="Arial,Helvetica"
SIZE="2">&nbsp;<jsp:getProperty name="order"
property="address1"/>
</TD>
</TR>
<TR VALIGN="top">
<TD><FONT FACE="Arial,Helvetica"
SIZE="2">&nbsp;<jsp:getProperty name="order"
property="address2"/>
</TD>
</TR>
<TR VALIGN="top">
<TD><FONT FACE="Arial,Helvetica"
SIZE="2">&nbsp;<jsp:getProperty name="order"
property="zip"/>&nbsp;
<jsp:getProperty name="order"
property="town"/>
</TD>
</TR>
</TABLE>

Dieser erste Teil beschert mit dem gesamten Listing eine kleine Anwendung. Es ist der erste Schritt, um Komponenten fĂŒr dynamischen Webapplikationen zu verwenden. Das Potenzial der JSP ist erkennbar, wir mĂŒssen sie nun in den folgenden Teilen des Tutorials nutzen. Die Anbindung einer Datenbank, Anwendung von Templates, eine verbesserte NutzerfĂŒhrung sowie eine vernĂŒnftige Fehlerbehandlung sind unumgĂ€nglich. In der nĂ€chsten iX ...

Lars Röwekamp
ist als IT-Berater mit den Schwerpunkten Neue Technologien und OO/Java fĂŒr seine Firma openKnowledge tĂ€tig.

Peter Roßbach
ist freiberuflicher IT-Berater fĂŒr die Konzeption, Organisation und Entwicklung von Java-Web-Anwendungen.

[1] Peter Roßbach, Hendrik Schreiber; JavaServer und Servlets; MĂŒnchen (Addison-Wesley) 1999

[2] Duane K. Fields and Mark A. Kolb; Web Development with JavaServer Pages; Manning 1999; als eBook

Mehr Infos

iX-TRACT

  • Dynamische Websites gehören fĂŒr Unternehmen heute zu den SelbstverstĂ€ndlichkeiten.
  • Zu seitenzentrierten Lösungen von Perl- bis ASP-Scripts bieten JavaServer Pages eine Alternative: sie integrieren Businesskomponenten und existierende Daten ins Web.
  • Java-Programmierer können sich um die Logik der Webanwendung kĂŒmmern, wĂ€hrend HTML-Autoren sich um die PrĂ€sentation bemĂŒhen.
  • Dieses dreiteilige Tutorial fĂŒhrt in die JSP-Entwicklung ein.
Mehr Infos

Inhalt des Tutorials

Das in diesem Heft beginnende JSP-Tutorial besteht aus drei aufeinander aufbauenden Teilen:

Teil 1 dient vornehmlich zur Schaffung von Grundlagen. Ziel ist eine Einordnung der JavaServer-Page-Technik in die ‘Wunderwelt’ der Internet-(Skript-)Sprachen sowie eine ErlĂ€uterung der möglichen Einsatzgebiete von JSP und deren grundlegenden Syntaxelemente. Ein bewusst einfach gehaltenes Beispiel soll helfen, das Potential von JSP im Zusammenspiel mit der Programmiersprache Java zu verstehen, ohne von der eigentlichen Thematik abzulenken.

Teil 2 bietet eine Art ‘Advanced JSP Programming’. Hier geht es nicht um Grundlagen und Syntax, sondern vielmehr um Fragen der Softwarearchitektur: wie durch die Verwendung von Templates und Datenbankanbindungen sowie die ‘geschickte’ Kombination von JSP, Java Servlets und JavaBeans Webanwendungen entstehen können, die sich auch im professionellen Umfeld nicht zu verstecken brauchen. Ein wichtiger Aspekt ist dabei die Verwendung des Model-View-Controller-Paradigmas, mit dessen Hilfe eine bessere Skalier- und Wartbarkeit sowie eine erhöhte Sicherheit innerhalb von Webapplikationen erreicht werden kann.

Teil 3 schließlich geht einen Schritt weiter und erlĂ€utert den Aufbau, die Entwicklung und die Anwendung von so genannten Taglibs, die es ermöglichen, eine strikte Trennung von ZustĂ€ndigkeiten zwischen (HTML-)Designer und Java-Entwicklern innerhalb der Realisierung von JSP- und Java-basierten Webapplikationen zu erreichen. Auf diese Weise lassen sich relativ komplexe Strukturen und Kontrollelemente in Tags ‘verpacken’. So ermöglicht man eine deutlich sauberere Trennung zwischen Webseitendesign und Businesslogikprogrammierung.