Interaktive Webseiten mit Java Server Pages

Werbung
Interaktive Webseiten mit Java Server Pages
Michael Dienert
4. Juli 2013
Inhaltsverzeichnis
1
Was sind Java-Server-Pages
2
2
Eine bessere Definition
3
3
Was man alles benötigt, um Java Server Pages betreiben zu können
3
4
Tomcat und Jakarta
4
5
Installation von Tomcat
4
6
Die allerwichtigsten JSP-Elemente
6.1 Vordeklarierte Objekte des JSP-Systems . .
6.2 Ein einfaches JSP-Beispiel . . . . . . . . .
6.3 html-Formulare . . . . . . . . . . . . . . .
6.4 http-get und http-post . . . . . . .
6.5 Wie kommen die Formulardaten in die JSP?
.
.
.
.
.
7
7
9
9
10
10
7
JSP Standard Tag Library
7.1 Expression Language . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2 Weitere JST(L)-Bibliotheken . . . . . . . . . . . . . . . . . . . . . .
10
11
12
8
Beispiele
8.0.1 build.xml . . . . . . . . . . . . . . . . . .
8.0.2 taglib.tld . . . . . . . . . . . . . . . . . .
8.0.3 Java-Klassen: Reverse.java . . . . . . . . .
8.0.4 Java-Klassen: ToUpperCase.java . . . . . .
8.1 Ein rudimentärer Webshop . . . . . . . . . . . . .
8.1.1 Produkt-Datenbank . . . . . . . . . . . . .
8.1.2 Anzeige des Warenkorbs ohne Gesamtpreis
8.1.3 Anzeige des Katalogs als Tabelle . . . . .
13
13
15
16
17
17
17
18
19
A Craig McClanahans Rat
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
19
1
1
Was sind Java-Server-Pages
Der Name Java Server Pages verrät schon einiges über deren Funktionsweise: ursprünglich waren JSPs in Java und HTML geschriebene Programme, die auf der Serverseite ausgeführt werden und dort dynamisch Web-Seiten erzeugen.
Das waren jetzt eine Menge Begriffe, die noch ein bisschen näher erklärt werden
müssen:
Serverseite: Das Java-Programm, das aus einer Java Server Page erzeugt wird, läuft
auf der Serverseite! Es ist somit völlig unabhängig von den Einstellungen und
Fähigkeiten des Browsers auf der Clientseite. Der Browser bekommt vom Server
ausschließlich reinen html-Text serviert!
Java Server Pages - im Folgenden mit JSP abgekürzt - haben also absolut nichts
mit JavaScript zu tun. Bei JavaScript sind JavaScript-Befehle in html-Seiten eingebettet. Diese Befehle werden dann vom Browser auf der Clientseite interpretiert. Das setzt aber vorraus, daß der Benutzer in seinem Browser das Ausführen
von JavaScript-Code nicht ausgeschaltet hat.
Programm: Eine JSP sieht auf den ersten Blick aus wie eine reine html-Seite: es ist
html-Text mit eingebettetem Java-Quellcode. Diese Mischung wird aber auf der
Serverseite von einer speziellen Software in reinen Java-Quelltext übersetzt, der
anschließend in eine Klassendatei compiliert wird. Der Bytecode dieser Klassendatei wird dann in eine Java-VM (Virtuelle Maschine) geladen und dort ausgeführt.
dynamisch: Das ausführbare Java-Programm besteht zu einem grossen Teil aus Ausgabeanweisungen, die html-Text ausgeben. Das kann z.B. so aussehen:
out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD"+
" HTML 4.01 Transitional//EN\">\n\n");
...
out.write("<html>\n\t");
out.write("<head>\n\t ");
out.write("<title>Anmelden");
out.write("</title>\n\t");
out.write("</head>\n\t\n\t");
out.write("<body bgcolor=’white’>\n\t ");
...
out.write("</body>\n");
out.write("</html>");
Die Textstrings werden aber nicht auf den Bildschirm geschrieben, sondern zu
einem Webserver-Dienst weitergereicht, der auf der selben Maschine läuft. Der
Webserver-Dienst sendet sie schließlich zum Browser des Clients.
Der html-Text, der auf diese Weise beim Browser ankommt, wird also nicht aus
einer Datei gelesen, sondern wird dynamisch von einem Programm erzeugt:
Wenn das Java-Programm z.B. folgende Zeile enthält,
out.write(new java.util.Date());
wird auf der html-Seite auf der Clientseite die aktuelle Systemzeit des Servers
angezeigt. D.h. der Seiteninhalt ändert sich dynamisch.
Mit einer statischen Webseite, bei der der html-Text aus einer festen Datei ausgelesen wird, kann man solche sich dynamisch ändernden Inhalte nicht darstellen.
2
2
Eine bessere Definition
Die obige Definition JSP = html Java-Quellcode+ ist einfach und soll uns zunächst
genügen. Es sei jedoch jetzt schon verraten, dass das Einbetten von Java-Quellcode in
eine JSP unbedingt vermieden werden sollte (vgl. Anhang, Abschnitt A)! Stattdessen soll die Funktionalität der Seite mit JavaBeans oder sog. Custom Tags sowie einer
eigenen Expression Language erzeugt werden.
Eine bessere Definition für JSPs ist daher:
Eine JSP ist ein Textdokument, das zwei Arten von Text enthält:
1. Statischer Inhalt, der in Form von Z.b. HTML, XHTML, XML formuliert sein
kann.
2. JSP-Elementen, die den dynamischen Inhalt generieren.
Eine Einführung in die Verwendung von Custom Tags und der Expression Language
gibt das Kapitel 7.
3
Was man alles benötigt, um Java Server Pages betreiben zu können
Fassen wir nocheinmal das Zusammenspiel zwischen Client, Server, HTML und Java
zusammen:
• Als Entwickler möchten wir eine JSP schreiben, starten einen guten Programmiereditor wie z.B. jEdit und schreiben den html-Text mit den eingebetteten
Java-Anweisungen. Diese Datei wird mit der Endung .jsp gespeichert. Der
Verzeichnispfad zu dieser Datei darf nicht beliebig sein, eine detailliertere Beschreibung folgt weiter unten.
• Wie oben beschrieben, wird noch ein http-Server ( = Webserver) benötigt, der
die dynamisch erzeugten Webseiten an den anfragenden Browser sendet. Falls
dieser Server-Dienst noch nicht läuft, müssen wir ihn nun starten.
• Um die neue JSP zu testen, starten wir einen http-Browser und geben als URI den
Host an, auf dem der http-Server läuft. Natürlich muss die URI auch den Pfad zu
unserer JSP-Datei enthalten. Dieser Pfad hängt unmittelbar vom Speicherort der
JSP ab.
• Nach der Eingabe der URI sendet unser Browser eine http-GET-Anfrage (GETrequest) zum http-Serverdienst. Nach Erhalt der Anfrage ruft der Serverdienst
wiederum die Ausgabe des zur JSP gehörenden Java-Programms ab und sendet
diese zurück zum Browser.
• Wenn alles geklappt hat, müssten wir nun den vom Browser gerenderten htmlText, den unsere JSP erzeugt, sehen.
Leider hat der gerade beschriebene Ablauf einen Haken: wir haben unsere JSP neu
geschrieben und gespeichert. Es kann also noch gar kein Java-Programm und auch
keinen compilierten Bytecode geben. Ein wichtiger Prozessschritt fehlt noch:
3
Irgendeine Software muss die JSP in reinen Java-Quelltext übersetzen, den Quelltext
compilieren und das Compilat (schönes Wort, nicht wahr?) in den Speicher der JavaVM laden. Erst dann kann der http-Server die Ausgaben des Programms abrufen.
Ausserdem muss der verwendete Webserver das Zusammenspiel mit der Java-VM unterstützen.
Hat man eine solche Software installiert, wird beim Aufruf einer neuen oder geänderten
JSP jedesmal der Vorgang von übersetzen, compilieren und laden automatisch durchgeführt. Das dauert ein paar Sekunden, erfolgt aber nur beim ersten Aufruf der JSP.
Dann ist und bleibt der Programmcode geladen und weitere Aufrufe werden praktisch
verzögerunsfrei beantwortet.
4
Tomcat und Jakarta
Nun müssen wir uns also diese Software, die das Verwandeln einer JSP in lauffähigen
Code erledigt, besorgen. Ausserdem brauchen wir noch einen dazu passenden Webserver.
Natürlich wählen wir zu diesem Zweck ein Open Source Produkt: Tomcat vom Jakarta-Projekt der Apache Software Foundation. Erhältlich bei
http:\\www.jakarta.apache.org
Tomcat ist für die ersten Versuche mit JSPs besonders geeignet:
• Tomcat ist Open Source, man muss also keine Lizenz kaufen, sondern kann das
Paket herungerladen, installieren und sofort loslegen.
• Tomcat ist komplett in Java geschrieben 1 , d.h. das Paket lässt sich problemlos
auf beliebigen Architekturen einsetzen.
• Tomcat bringt den zusätzlich benötigten Webserver gleich mit. Dieser ist so voreingestellt, dass er über Port 8080 angesprochen wird.
• Das Jakarta-Team wird von SUN unterstützt. D.h. Tomcat ist stets an SUNs JSPSpezifikationen angepasst. SUN empfiehlt Tomcat sogar als Referenz Implementierung.
5
Installation von Tomcat
Das Tomcat-Paket ist in mehreren Versionen erhältlich. Für die Installation auf WindowsPlattformen gibt es ein selbst installierendes .exe Paket.
Da Tomcat aber eine reine Java-Anwendung ist, kann man auch problemlos auf jeder
Plattform die Java-Binaries installieren. Die Binaries sind in ein tar-Archiv gepackt,
das auf einem Linux/BSD/OSX-System so installiert wird:
tar -xvzf tomcat-4.1.27.tar.gz
Das tar-Kommando entpackt das Archiv im aktuellen Verzeichnis!
Das obige Kommando erzeut eine Verzeichnisstruktur wie in Abb. 1 gezeigt.
1 Jakarta
ist die Hauptstadt von Indonesien und liegt auf der Insel Java
4
Damit die Abbildung nicht zu gross wird, sind einige unwichtige Teile des Verzeichnisbaums gelöscht worden.
Sehr wichtig sind aber folgende Verzeichnisse:
bin: In diesem Verzeichnis stehen Shell (.sh) und Batch (.bat) Skripte, mit denen Tomcat gestartet und gestoppt werden kann. Je nach verwendeter Plattform muss man
eben die .sh oder die .bat Dateien ausführen.
Da Tomcat eine Java-Anwendung ist, muss Java selbstverständlich auf dem entsprechenden Rechner installiert sein. Die Start- und Stopp-Skripte versuchen
selbstständig den Pfad der Java-Installation zu ermitteln. Falls das schiefgeht,
muss man ihnen durch Setzen der Umgebungsvariablen JAVA_HOME den Pfad
zum Java-Stammverzeichnis mitteilen.
conf: In diesem Verzeichnis stehen xml-Dateien, mit denen der Tomcat-Server konfiguriert wird. Die den Server betreffenden Einstellungen stehen in der Datei
server.xml. Zunächst kann man diese Datei aber so lassen wie sie ist. Tomcat müsste mit den Default-Einstellungen funktionieren. Falls der Port 8080 auf
dem Rechner aber schon anderweitig belegt ist (evtl. durch einen Proxy-Server),
kann man durch Ändern der Portadresse in der server.xml Tomcat auf einen
anderen Port legen.
webapps: Hier stehen unsere JSPs. Unterhalb von webapps kann man weitere Verzeichnisse anlegen. Im Beispiel das Verzeichnis micha. Jedes dieser Verzeichnisse muss aber ein Verzeichnis WEB-INF enthalten! Möchte man ausschliesslich JSPs verwenden, kann dieses Verzeichnis leer sein. Es muss nur existieren!
work: Dieses Verzeichnis ist für die Anwendung von JSPs nicht, für das Verständnis
der Funktionsweise aber sehr wichtig: Im work-Verzeichnis legt Tomcat automatisch eine Verzeichnisstruktur ab, die die in webapps wiederspiegelt. In
diesen Verzeichnissen werden die in Java-Quellcode übersetzten JSPs (.java)
und deren Compilate (.class) gespeichert.
Bei jedem Aufruf einer JSP wird deren Zeitstempel mit dem Zeitstempel der
entsprechenden Bytecode-Datei verglichen. Ist die JSP aktueller als die zuletzt
compilierte Datei, wird die JSP neu übersetzt.
5
Abbildung 1: Die Struktur einer Tomcat-Installation
6
6
Die allerwichtigsten JSP-Elemente
Oben wurde gesagt, dass JSPs eine Mischung aus html- und Java-Quellcode sind. Dabei wird der Java-Quelltext innerhalb spezieller Tags plaziert, damit Tomcat die JSP
überhaupt in Quellcode übersetzen kann.
Tabelle 1 gibt eine Übersicht.
Tag
Bedeutung
Kommentar
<%-- kommentar --%>
Ein JSP-Kommentar. Im Unterschied zu html-Kommentaren,
werden diese Kommentare nicht an den Browser gesendet.
Page-Anweisung
<@page ... %>
Dieses Tag muss in jeder JSP-Datei enthalten sein. Innerhalb
dieses Tags wird z.B. der contentType und die verwendete Programmiersprache (page language = java), sowie einige andere Attribute wie z.B. das import-Attribut, mit
dem man festlegt, aus welchen Paketen der Klassenbibliothek
man Klassen verwendet, festgelegt.
Include-Anweisung
<%@include file="URL"%>
Zur Übersetzungszeit wird die angegebene Datei eingebunden.
Deklaration
<%! ... >
Das ist das Deklarations-Tag. Es nimmt z.B. die Deklaration
von Eigenschaften und Methoden auf.
Scriptlet
<% ... %>
Innerhalb dieser Klammern steht Java-Code. Wird die JSP in
eine reine Java-Datei übersetzt, steht dieser Code innerhalb der
Methode
public void jspService(HttpServletRequest request,
HttpServletResponse response)
Diese Methode wird von Tomcat immer dann aufgerufen,
wenn eine GET- oder POST-Anfrage an den Server gerichtet
wird. Eine genauere Erklärung der beiden Objekte request
und response folgt weiter unten.
Java-Ausdruck
Dieses Tag enthält einen Java-Ausdruck. Zur Laufzeit wird
das Tag durch den Wert des Ausdrucks ersetzt. D.h. der Wert
des Ausdrucks erscheint innerhalb des html-Texts. Oder anders gesagt: man kann sich das -Zeichen durch die Anweisung
out.println( ... ) ersetzt denken.
<%= ... >
Tabelle 1: Spezielle JSP-Tags
6.1
Vordeklarierte Objekte des JSP-Systems
Die JSP-Umgebung stellt eine Reihe von lokalen, vordeklarierten Eigenschaften zur
Verfügung. Selbstverständlich sind diese Eigenschaften Objekte und haben damit Methoden, die z.B. die Parameter des QUERY_STRINGs liefern. Die drei wichtigsten sind
in Tabelle 2 zusammengefasst.
7
Objektname
request
response
out
session
Klasse
javax.servlet.http.HttpServletRequest
Die
wichtigste
Methode
dieses
Objekts
getParameter("paramName")
ist
javax.servlet.http.HttpServletResponse
Wichtigste Methode: println("text")
javax.servlet.http.HttpSession Wichtigste Methoden:
• void session.putValue(String key, Object value)
• Object session.getValue(String key)
• void session.removeValue(String key)
Tabelle 2: Vordeklarierte Objekte in der JSP-Umgebung
8
6.2
Ein einfaches JSP-Beispiel
Hier eine einfache, dynamische Webseite:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Zweiter Test mit Parametern und Formular</title>
</head>
<body>
<h3> Bitte einen Parameter in das Formular eintragen </h3>
<table>
<form method="get" action="HalloUser.jsp">
<tr> <td>Vorname:</td> <td><input name="vname"></td> </tr>
<tr> <td>Name:</td> <td><input name="name"></td> </tr>
<tr> <td></td><td><input type="submit" value="hau wech!"></td> </tr>
</from>
</table>
<%
String name = request.getParameter("name");
String vname = request.getParameter("vname");
%>
<h3><%
out.println("Hallo " + vname +" "+ name +"!");
%></h3>
Wir haben heute
<% out.println(new java.util.Date()); %>.
oder alternativ mit ausdruck:
<%= new java.util.Date()%>
<address><a href="mailto:[email protected]">michael</a></address>
<!-- Created: Tue Jan 7 00:08:25 CET 2003 -->
<!-- hhmts start -->
Last modified: Tue Jan 7 00:10:40 CET 2003
<!-- hhmts end -->
</body>
</html>
Diese Datei muss im richtigen Verzeichnis plaziert werden. Zum Beispiel hier:
TOMCAT_HOME/webapps/micha/HalloUser.jsp
Dabei ist micha ein beliebiges Unterverzeichnis. Aufrufen kann man die Seite nun
mit dieser URL:
http://127.0.0.1:8080/micha/HalloUser.jsp
Zur Erinnerung: Das Verzeichnis micha muss ein Unterverzeichnis WEB-INF enthalten. Die Struktur der Tomcat-Installation ist in Kap. 5 beschrieben.
6.3
html-Formulare
Testet man das obige Beispiel, stellt der Browser zwei Textfelder, die der Benutzer
ausfüllen kann und eine Schaltfläche zum Senden der Felddaten dar. Diese Elemente
werden mit den html-Tags <form ...> und <input ... > erzeugt. In obiger
JSP liegen diese Tags nochmals innerhalb einer Tabellenumgebung, damit sie sauber
ausgerichtet werden.
Wie kommen die Felddaten aber zum Webserver?
9
Um das herauszufinden, muss man nur die JSP aufrufen, die Felder ausfüllen und abschicken: In der Adresszeile des Browsers erscheint ein Textstring, der alle Benutzereingaben enthält.
Der Browser sendet diesen Textstring zurück an den Server, der die Seite mit dem
Formular liefert.
Der Webserver sorgt anschließend dafür, daß der relevante Teil dieses Textstrings an
das mit dem Parameter action = "HalloUser.jsp" übergeben wird.
Dabei ist der relevante Teil derjenige, der nach dem ? - Zeichen folgt. Dieser Substring
wird oft als query-string bezeichnet. Der Name leitet sich von der Systemvariablen ab,
mit deren Hilfe dieser String übergeben wird (s.u.).
Die Daten vor dem ? - Zeichen sind Pfadinformationen, die ebenfalls dem Web-Server
übergeben werden. Sie können z.B. den Namen des mit dem Action-Parameter bezeichneten Programms enthalten.
6.4 http-get und http-post
Um die Daten- Übergabe zu bewerkstelligen, gibt es zwei verschiedene Methoden:
• http-get: die Daten werden über die Umgebungsvariable QUERY STRING
übergeben.
• http-post: die Daten werden vom Web-Server in die Standard-Eingabe geschrieben, von der das CGI-Programm sie lesen kann.
6.5
Wie kommen die Formulardaten in die JSP?
Mit der GET oder POST-Methode werden die Formulardaten zum Server geschickt.
Wie kann ich abe innerhalb meiner JSP auf die Daten zugreifen?
Hierfür bietet Tomcat ganz komfortabel das Objekt request an. Es wird automatisch
erzeugt und steht innerhalb der JSP zur Verfügung. Das Request-Objekt enthält eine
Art Hash-Table, die als Schlüssel die Namen der Formularfelder und als Werte eben
deren Inhalt enthält. Ausserdem stellt das Objekt Methoden zur Verfügung, mit denen
man die Daten aus dieser Tabelle auslesen kann. Die Methoden sind in der Tabelle 2
mit aufgeführt.
7
JSP Standard Tag Library
Wie oben schon erwähnt, sollte eine gute JSP keinen Java-Quellcode mehr enthalten.
Stattdessen soll die dynamische Funktionalität mit sog. Custom Tags erzeugt werden.
Custom Tags sind selbstdefinierte html-Tags, die als Java-Klasse in einer Bibliothek
stehen. Da man diese Klassen selbst schreiben kann, kann man damit beliebige Funktionen auf der JSP einbinden.
Damit aber nicht jeder das Rad neu erfinden muss, hat SUN für eine grosse Zahl von
Aufgaben bereits fertige Tags definiert. Diese sind in der Java Server Pages Standard
Tag Library, JSTL zusammengefasst. Abb. 2 zeigt einen Teil der html-Dokumentation
mit den sog. Core-Tags, mit denen man Kontrollstukturen erzeugen kann.
Hier eine Beispiel-JSP mit einer Schleife:
10
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" \
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language = "java" contentType = "text/html; charset=UTF-8" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<%-- <meta http-equiv="Content-type" context="text/html; charset=UTF-8"/> --%>
<title>Erster Test mit Parametern</title>
</head>
<body>
<h3> Bitte einen Parameter mit der Hand am Arm an das URI anhaengen </h3>
<p> Beispiel: http://localhost:8080/micha/HalloUser.jsp?name=micha </p>
<p> mal sehen, ob das mit dem zeichensatz hinhaut: äöüÄÖÜß </p>
Mit unsäglich scriptlet:
<%
String name = request.getParameter("name");
out.println("Hallo, salute " + name +"!");
%>
<br/>
Mit EL und jstl-core:
Hallo, grüss Dich, ${param.name} !
<br/>
Noch ein paar jstl-core-Kostproben:
<br/>
<c:choose>
<c:when test="${empty param.name}" >
wenn Du keinen QUERY_STRING anhängst,
wirst Du auch nicht richtig begrüsst!
</c:when>
<c:otherwise>
so ist’s schon viel besser!
<br/>
<c:forEach var="i" begin="1" end="10" step="1">
${i} ${param.name} <br/>
</c:forEach>
</c:otherwise>
</c:choose>
<hr>
<address><a href="mailto:[email protected]">michael</a></address>
<!-- Created: Tue Jan 7 00:08:25 CET 2003 -->
<!-- hhmts start -->
Last modified: Tue Jan 7 00:10:40 CET 2003
<!-- hhmts end -->
</body>
</html>
7.1
Expression Language
Ausser den core-Tags wird in diesem Beispiel auch die sog. Expression Language, EL
verwendet. Mit Hilfe der EL kann man sehr einfach auf Variablen (Objekte) innerhalb
der JSP zugreifen.
Im Beispiel wird mit
${param.name}
direkt auf den mit der GET- oder POST-Methode übergebenen Parameter zugegriffen.
11
Aussser dem Objekt param gibt es noch eine Reihe weiterer Objekte, die auf einer
JSP zur Verfügung stehen:
pageContext
servletContext
session
request
response
param
paramValues
header
headerValues
cookie
initParam
pageScope
requestScope
sessionScope
applicationScope
7.2
Weitere JST(L)-Bibliotheken
Die Core-JSTL ist nicht die einzige Bibliothek. Es gibt in weiteren Bibliotheken noch
Tags für SQL-Datenbankzugriffe, XML-Verarbeitung, Text-Formatierung und die Verwendung von Funktionen:
JSTL core Die bereits angesprochene Core-Bibliothek enthält Tags für wichtige Kontrollstrukturen.
JSTL fmt Tags für Zahlen- und Datumsformatierung, Zeitzonen und Internationalisierung
JSTL sql Tags für einfache Datenbankzugriffe via JDBC
JSTL XML Tags für die Bearbeitung von XML-Dokumenten; sehr komplex
JSTL functions Eine Sammlung wichtiger Funktionen für String-Verarbeitung
12
8
Beispiele
Ein Beispiel mit eigenen Custom-Tags. Die Bibliothek mit den eigenen Custom-Tags
(whisky.jar) liegt in diesem Beispiel in
jease/webapps/ROOT/WEB-INF/lib/whisky.jar
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib uri="http://localhost/whisky.tld" prefix="txt" %>
<form method="post">
<input type="text" name="textfeld"/>
<input type="submit" name="hau wech!"/>
</form>
Du hast <c:out value="${param.textfeld}" default="noch nix"/>
eingegeben.
<br/>
Jetzt kommt das eingegebene Wort rückwärts:
<txt:reverse>${param.textfeld}</txt:reverse>
<br/>
Und jetzt das Wort in Grossbuchstaben:
<txt:toUpperCase> ${param.textfeld} </txt:toUpperCase>
Hier die Quelltexte zur Erzeugung der eigenen Taglib:
8.0.1
build.xml
:
13
<project name="appendTag" default="dist" basedir=".">
<description>
einfaches build file fuer taglib
</description>
<!-- properties entsprechen variablen: -->
<property name="userName" value="micha"/>
<target name="init">
<!-- build-verzeichnis anlegen -->
<!-- wird nur ausgefuehrt, wenn build noch nicht vorhanden -->
<mkdir dir="build"/>
</target>
<target name="compile" depends="init"
description="quellen uebersetzen" >
<!-- Compile java-code von src nach build compilieren -->
<javac target="1.7" srcdir="src" destdir="build">
<classpath>
<pathelement path="lib/servlet-api.jar"/>
<pathelement path="lib/jsp-api.jar"/>
</classpath>
</javac>
</target>
<target name="dist" depends="compile"
description="die distribution erzeugen" >
<jar destfile="whisky.jar" basedir="build">
<include name="**/*.class"/>
<metainf dir=".">
<include name="taglib.tld"/>
</metainf>
</jar>
</target>
<target name="clean"
description="aufraeumen" >
<!-- build und dist verzeichnisse loeschen -->
<delete dir="build"/>
</target>
</project>
14
8.0.2
taglib.tld
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>0.1</tlibversion>
<jspversion>1.1</jspversion>
<shortname>txt</shortname>
<uri>http://localhost/whisky.tld</uri>
<info>
eine einfache taglib fuer div. textkonversionen
</info>
<tag>
<name>toUpperCase</name>
<tagclass>de.wara.micha.textTagLib.ToUpperCase</tagclass>
<info>alles in grossbuchstaben ausgeben</info>
<bodycontent>JSP</bodycontent>
</tag>
<tag>
<name>reverse</name>
<tagclass>de.wara.micha.textTagLib.Reverse</tagclass>
<info>alles rueckwaerts ausgeben</info>
<bodycontent>JSP</bodycontent>
</tag>
</taglib>
15
8.0.3
Java-Klassen: Reverse.java
package de.wara.micha.textTagLib;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class Reverse extends BodyTagSupport {
public int doStartTag()
throws JspException {
try {
return EVAL_BODY_BUFFERED;
}
catch( Exception e ) {
throw new JspException( "da stimmt was nicht! " + e.getMessage() );
}
}//doStartTag()
public int doAfterBody()
throws JspException {
try {
return SKIP_BODY;
}
catch( Exception e ) {
throw new JspException( "da stimmt was nicht! " + e.getMessage() );
}
}//doAfterBody()
public int doEndTag()
throws JspException {
JspWriter out = pageContext.getOut();
String text;
try {
if( bodyContent != null ) {
text = bodyContent.getString();
for( int i = text.length(); i > 0; i-- ) {
out.print( text.charAt( i - 1 ) );
}
}
return EVAL_PAGE;
}
catch( Exception e ) {
throw new JspException( "da stimmt was nicht! " + e.getMessage() );
}
}
}
16
8.0.4
Java-Klassen: ToUpperCase.java
package de.wara.micha.textTagLib;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class ToUpperCase extends BodyTagSupport {
public int doStartTag()
throws JspException {
try {
return EVAL_BODY_BUFFERED;
}
catch( Exception e ) {
throw new JspException( "da stimmt was nicht! " + e.getMessage() );
}
}//doStartTag()
public int doAfterBody()
throws JspException {
try {
return SKIP_BODY;
}
catch( Exception e ) {
throw new JspException( "da stimmt was nicht! " + e.getMessage() );
}
}//doAfterBody()
public int doEndTag()
throws JspException {
JspWriter out = pageContext.getOut();
String text;
try {
if( bodyContent != null ) {
text = bodyContent.getString().toUpperCase();
out.print( text );
}
return EVAL_PAGE;
}
catch( Exception e ) {
throw new JspException( "da stimmt was nicht! " + e.getMessage() );
}
}
}
8.1
Ein rudimentärer Webshop
Ein rudimentärer Webshop mit JSP und XML:
8.1.1
Produkt-Datenbank
Als Produkt-Datenbank wählen wir eine einfache XML-Datei. Diese liegt im Beispiel
im Verzeichnis
jease/webapps/ROOT/WEB-INF/xml/katalog.xml
17
<katalog>
<pos id="4242">
<sorte>Grauburgunder</sorte>
<jahr>2003</jahr>
<alc>16</alc>
<preis>8.00</preis>
<bestand>2</bestand>
</pos>
<pos id="1717">
<sorte>Riesling</sorte>
<jahr>2012</jahr>
<alc>12</alc>
<preis>6.00</preis>
<bestand>200</bestand>
</pos>
<pos id="3339">
<sorte>Mueller</sorte>
<jahr>2010</jahr>
<alc>12</alc>
<preis>3.00</preis>
<bestand>200</bestand>
</pos>
</katalog>
8.1.2
Anzeige des Warenkorbs ohne Gesamtpreis
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
<table>
<tr><th>Best.Nr.</th><th>Anzahl</th></tr>
<c:forEach var=’parameter’ items=’${param}’>
<tr>
<td><c:out value=’${parameter.key}’/></td>
<td><c:out value=’${parameter.value}’/></td>
</tr>
</c:forEach>
</table>
18
8.1.3
Anzeige des Katalogs als Tabelle
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
<%-- katalogdatei einlesen --%>
<c:catch var="ioError">
<c:import var="katalogDoc" url="/WEB-INF/xml/katalog.xml"/>
<x:parse var="doc" doc="${katalogDoc}"/>
</c:catch>
<c:if test="${not empty ioError}">
<h1>fehler: ${ioError.message}</h1>
</c:if>
<h1>Unser Angebot!</h1>
<h3>Legen Sie sich ordentlich was in den Warenkorb!</h3>
<form method="post" action="007">
<table>
<tr>
<th>Best.Nr.</th>
<th>Rebsorte</th>
<th>Jahr</th>
<th>Alc.(Vol-%)</th>
<th>Preis</th>
</tr>
<x:forEach select="$doc/katalog/pos" var="pos">
<c:set var="id">
<x:out select="$pos/@id"/>
</c:set>
<tr>
<td>${id}</td>
<td><x:out select="$pos/sorte"/></td>
<td><x:out select="$pos/jahr"/></td>
<td><x:out select="$pos/alc"/>%</td>
<td>EUR <x:out select="$pos/preis"/></td>
<td><input type="text" name="${id}"/></td>
</tr>
</x:forEach>
<tr><td/><td/><td/><td/><td/>
<input type="submit" value="in den Warenkorb"/></tr>
</table>
</form>
A
Craig McClanahans Rat
Folgendes Zitat stammt von Craig R. McClanahan, dem Tomcat-Chefentwickler bei
jakarta.apache.org. Es war die Antwort auf eine Frage an die Tomcat-User Mailingliste
am 14. August 2002:
In JSP 1.1 and 1.2, there sometimes isn’t a lot of choice about using runtime expressions <%= ... %> in tag attributes to grab some things
that are not otherwise accessible. In JSP 2.0, the advent of the expression language takes away that last excuse. And, fortunately, JSP 2.0 includes directives that can force the page compiler to prohibit scriptlets
– you can be sure that such directives will be used on any application
19
I’m in charge of, and that developers who try to undo this will be either
retrained or fired.
Besides the fact that people who start down this path succumb to spaghetti code (I’ve had people proudly show off their 5000-line JSP pages
– sheesh), embedding Java code in your page seriously reduces the
ability of the JSP page compiler to generate optimized code for you.
So, besides being less maintainable, your code will be at a competitive
performance disadvantage to that of developers who learn the correct
development habits – not good for career advancement :-).
Craig
20
Overview
FRAMES
Library
Tag Help
NO FRAMES
JSTL core
Standard Syntax:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
XML Syntax:
<anyxmlelement xmlns:c="http://java.sun.com/jsp/jstl/core" />
JSTL 1.1 core library
Tag Library Information
Display Name
JSTL core
Version
1.1
Short Name
c
URI
http://java.sun.com/jsp/jstl/core
Tag Summary
catch
Catches any Throwable that occurs in its body and optionally exposes it.
choose
Simple conditional tag that establishes a context for mutually exclusive conditional operations, marked by
<when> and <otherwise>
if
Simple conditional tag, which evalutes its body if the supplied condition is true and optionally exposes a
Boolean scripting variable representing the evaluation of this condition
import
Retrieves an absolute or relative URL and exposes its contents to either the page, a String in 'var', or a
Reader in 'varReader'.
forEach
The basic iteration tag, accepting many different collection types and supporting subsetting and other
functionality
forTokens
Iterates over tokens, separated by the supplied delimeters
out
Like <%= ... >, but for expressions.
otherwise
Subtag of <choose> that follows <when> tags and runs only if all of the prior conditions evaluated to 'false'
param
Adds a parameter to a containing 'import' tag's URL.
redirect
Redirects to a new URL.
remove
Removes a scoped variable (from a particular scope, if specified).
set
Sets the result of an expression evaluation in a 'scope'
url
Creates a URL with optional query parameters.
when
Subtag of <choose> that includes its body if its condition evalutes to 'true'
Tag Library Validator
org.apache.taglibs.standard.tlv.JstlCoreTLV Provides core validation features for JSTL tags.
Overview
FRAMES
Library
Tag Help
NO FRAMES
Java, JSP, and JavaServer Pages are trademarks or registered trademarks of Sun Microsystems, Inc. in the US and other countries. Copyright 2002-3
Abbildung 2: Die html-Documentation der JSTL
21
Herunterladen