Web-Container Tomcat, Servlets und JavaServer Pages

Tomcat

Einführung in Tomcat

Neue Tomcat-Benutzer für die Admin-Oberfläche

In conf/tomcat-users.xml kommentiere die existieren Benutzer wieder ein und ergänze neue Rollen und Benutzer. Insgesamt soll die XML so aussehen:

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
 <role rolename="tomcat"/>
 <role rolename="role1"/>
 <user username="tomcat" password="tomcat" roles="tomcat"/>
 <user username="both" password="tomcat" roles="tomcat,role1"/>
 <user username="role1" password="tomcat" roles="role1"/>

 <role rolename="manager-gui"/>
 <role rolename="manager-script"/>
 <role rolename="manager-status"/>
 <role rolename="manager-jmx"/>
 <role rolename="admin-gui"/>
 <user username="admin" password="admin" roles="manager-gui,manager-script,manager-status,manager-jmx,admin-gui"/>
</tomcat-users>

Template Code

Die erste JSP-Seite

Schreibe eine JSP-Seite, die die Welt grüßt.

Ausdrücke

Lasse den Durchschnitt von 10 und 23 berechnen und gebe ihn aus.

Templates und EL

Formatierungsunabhängig bleiben

Eine Webseite sollte so wenig Formatierungsauszeichnungen wie nötig nutzen. Eine gute Möglichkeit bieten Cascading Style Sheets (CSS). Damit die Erstellung etwas vereinfacht wird, kann man ein Tool verwenden.

Scriptlets

Folgendes definiert eine Ganzzahlvariable stunden.

<jsp:scriptlet> 
request.setAttribute( "stunden", "12" ); 
</jsp:scriptlet> 
${stunden}

Schreibe einen EL-Ausdruck, der mit Hilfe des Bedienungsoperators (?:) entweder AM oder PM ausgibt (AM bei einer Stundenzahl unter 12).

Bedingungen in Scriptlets

Rufe die mathematische Methode Math.random() auf. Gibt bei einem Wert kleiner 0.5 die Ausgabe "Lustiges Wiesel" aus und sonst "Schlaue Lotte".

Formulare

Parameterübergaben

Prüfe die Übergabe bei den Suchmaschinen Google und Yahoo.

Parameter aus dem impliziten Objekt param nehmen

Erfrage die Parameter z1 und z2. Die Parameter sollen einfach in der URL-Zeile eingesetzt werden, etwa so

FirstRequest.jsp?z1=12&z2=123

Ein EL-Ausdruck soll den Durchschnitt ausgeben. Füge eine einfache Fehlerbehandlung hinzu. Es können folgende Fehler auftauchen: Ein Wert ist nicht da, beide Werte sind nicht da. (Den Fehler für eine unmögliche Konvertierung, können wir erst mit einer Exception-Behandlung testen, etwa wenn der Parameter keine Zahl war, also z1=12dxd).

Formulare

Teste z.B. mit FrontPage die angebotenen HTML-Formulare und lies in SelfHTML-Einführung die Tags nach.

Beispiel für ein Formular von der Folie:

<form action="parameter.jsp"> Name:
 <input type="text" name="name" value=""/>
 <input type="submit" value="Ab damit!"/>
</form> 

Was passiert, wenn man im Textfeld ein Leerzeichen, &-Zeichen oder <-Zeichen übergibt?

Visitenkarten-Fomulare * (40 Min.)

Nutze die folgende Visitenkarten-JSP, um Standardeingaben von Visitenkarten entgegenzunehmen.

Nach der Aktivierung des Links soll die nachfolgende Seite exemplarisch einige Formulardaten ausgeben. Zeige den Namen bold/italic, wenn die jeweiligen Schalter gesetzt sind.

Beobachte bei den Sendearten POST und GET die URL der Folgeseite.

Formvalidation *

Bevor die Daten aus dem Formular verarbeitet werden, sollten sie auf Plausibilität überprüft werden. Das kann clientseitig oder serverseitig gelöst werden. Eine clientseitige Überprüfung wird in der Regel mit JavaScript realisiert.

Lies dazu die SelfHTML-Einführung und realisiere eine E-Mail-Verifikation.

Beans

Klassen der Standardbibliothek als Bean nutzen (10 Min.)

Der useBean-Tag muss nicht nur eigene Implementierungen referenzieren. Es funktionieren natürlich auch fremde Beans. Vervollständige das bewusst beschädigt Programm.

<jsp:useBean id="uhr" class="GregorianCalendar"> 
  Aktuelle Zeit: ${uhr} 
  Zeitzone des Servers: 
<jsp:getProperty property="timeZone"/>.

Die Personen-Bean

Die Formular-Bean

JSTL

JSTL installieren

Lade unter https://jstl.java.net/download.html die beiden referenzierten Java-Archive herunter:

Setze die zwei Jars in das eigene Verzeichnis WEB-INF/lib.

Die Core-Tags über den Namensraum c werden wie folgt eingebunden:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

Mit Schleife einen Farbverlauf * (20 Min.)

Schreibe mit der JSTL-Schleife eine Tabelle, die 16 Graustufen von weiß nach schwarz anzeigt. Die Farbwerte sind von #000000 (schwarz) bis #ffffff (weiß). Sie werden mit dem Attribut bgcolor bei den Tabellenzellen (td) definiert (mit CSS gibt es eine Alternative).

 <td bgcolor="rgb(12,34,222)">Farbe</td>

Fonts aus der Bean * (30 Min.)

Implementiere eine Bean FontAttributes mit einer Methode getFontNames() und getFontSizes(), die eine java.util.List mit relevanten Fontnamen und -größen liefert.
Die Liste soll mit dem JSTL-for abgelaufen werden.

Fehlerbehandlung * (10 Min.)

Der Versuch, mit einem String über die EL zu rechnen, wird misslingen. So ist es nicht möglich, den Durchschnitt von zwei durch Parameter gegebene Argumente zu berechnen, wenn sie sich nicht in Zahlen konvertieren lassen.

Lässt sich mit der c:catch-Konstruktion auch dieser Fehler auffangen? Wenn ja, setzte eine Fallunterscheidung, in dem einmal der Durchschnitt von zwei Zahlen ausgegeben wird, im anderen Fall eine gut lesbare Meldung, dass ein Argument fehlerhaft war.

Ausdrücke, Scriptlets, Implizite Objekte

Die Methode getServletPath()

Was macht die folgende Implementierung?

String p = request.getServletPath();
String s = application.getRealPath( p.substring(0, p.lastIndexOf("/")) + "/" );

Loggen von Nachrichten

Mit den log()-Methoden aus javax.servlet.ServletContext lassen sich Informationen in eine Log-Datei schreiben. Schreibe etwas in die Log-Datei und teste den Dateiinhalt. Wann sollte man Logging einsetzen? Gibt es gute Gründe, auf das Logging zu verzichten?

Das Zusammenspiel der impliziten Objekte

Betrachte ein von dem JSP-Compiler generiertes Servlet und identifiziere die impliziten Objekte.

Initialisieren und Beenden einer JSP-Seite

Man könnte jspInit() und jspDestroy() mit dem Gedanken implementieren, dass eine statische Variable jeweils hoch und herunterzählt. Anhand der statischen Variablen soll man erkennen, wie viele Nutzer gleichzeitig eine JSP-Seite besuchen. Gelingt dies mit den Methoden so?

Merke in einer Bean die Anzahl der Benutzer. Serialisiere die Bean in jspDestroy() und deserialisiere sie in jspInit(). Unterstützt Tomcat das jspDestroy() bei einem Shutdown? Teste es vorher, indem eine Dummy-Datei angelegt wird.

Header

Content-Type RTF

Öffne Word und modelliere eine Visitenkarte. Speichere sie im Format RTF. Öffne anschließend die RTF-Datei in einem Text-Editor und finde die Textstellen; setzte jeweils eine Leerzeile davor und danach.

Binde die RFT-Seite mit der Dateiendung .jsp in die Webapplikation ein. Lade sie über Tomcat. Was sieht man?

Ändere den Content-Type auf RTF. Setzte dann noch ohne Leerzeile dahinter:

<jsp:scriptlet> 
  response.setHeader( "Content-Disposition", "inline; filename=visitenkarte.rtf" ); 
</jsp:scriptlet> 

Als Erweiterung: Wie reagiert RTF auf Sonderzeichen? Kann eine Methode unter helfen? (Den Quellcode gibt es beim Verfolgen des Links unter (view)).

Das Objekt response

Welche Bedeutung haben die Header pragma und expires?

Einbinden und Weiterleiten von JSP-Seiten

Direktive Include

Die Visitenkarten-Webseite besteht aus Teilen, die auch auf anderen Seiten auftauchen; dazu zählen Kopf- und Fußzeile. Erzeuge zwei Dateien kopf.jsp und fuss.jsp, die statisch eingebunden werden.

Wie sieht das generierte Servlet aus?

include

Die Orientierung (Quer- oder Hochformat) soll sich abhängig von einem Parameter ändern. Wie kann man dann unterschiedliche Visualisierungen einbinden, also für Querformat und Hochformat? Muss man hier die Include-Action oder die Include-Direktive nutzen?

Aktion forward

Lies den Parameter "User" aus. Ist er nicht definiert bzw. null oder leer, soll zur einer beliebigen Seite weitergegangen werden. Ist alles OK, soll die Seite den Benutzernamen ausgeben.

Cookies und Sessions

Das session-Objekt

Die JSPs liegen automatisch in einer Sitzung, sodass Cookies mitgesendet werden. Erfrage den Cookie und assoziiere mit ihm das aktuelle Personen-Objekt.

Setze eine Seite index.jsp an den Anfang. Sie soll einen Link anzeigen "Visitenkarten aufbauen". Wenn der Benutzer ein zweites Mal auf die Seite kommt, so soll er mit Namen begrüßt werden.

Sitzungen beenden

Eine Sitzung wird mit invalidate() beendet. Lege auf die index.jsp-Seite einen Verweis, dass der Benutzer die Verbindung beenden kann.

Welchen Einfluss auf Speicher/Performance hat eine Session?

Page Direktiven

Erzeugen einer Quadrattabelle

Schreibe eine JSP, die eine XML-Datei mit Quadratzahlen der Form <zahl>i</zahl><quadrat />i*i erzeugt. Es sollen die Zahlen von 1 bis 10 ausgegeben werden. Achte darauf, dass die JSP selbst wieder eine korrekte XML-Datei ist.

JSTL Format und Funktionen

Eine EL-Funktion für den Kreditkartentest

Schreibe eine eigene EL-Funktion einem Function-Descriptor, die testet, ob eine eingegebene Zahl eine korrekt aufgebaute Kreditkartennummer ist (suche unter Google nach luhn+java). Binde die Funktion der Klasse über einen TLD ein; nutze das folgende Gerüst.

<?xml version="1.0" encoding="UTF-8"?> 
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> 
 <tlib-version>1.0</tlib-version> 
 <function> 
 <description> </description> 
 <name> </name> 
 <function-class> </function-class> 
 <function-signature> </function-signature> 
 </function> 
</taglib>

Tipp: Anatomy of Credit Card Numbers, http://www.rgagnon.com/javadetails/java-0034.html oder http://www.merriampark.com/anatomycc.htm

Sonstiges

Tabellen

Gib in einer PRE-Umgebung eine Zahl und ihr Quadrat aus. Etwa so:

 Zahl Quadrat 
 1    1 
 2    4 
 3    9 
 ... 
 10   100

Erweitere das Programm, sodass man eine echte HTML-Tabelle generiert wird.

Verzeichnislisting

Gib den Inhalt des Servlet-Verzeichnisses als HTML-Tabelle aus. Visualisiere eine Datei mit einem kleinen Icon ebenso wie ein Verzeichnis.

Optional für schnelle Schreiber: Wie kann man einen Dateityp einem speziellen Icon zuordnen? Gibt es dafür Hilfe-Methoden? Suche kurz im Internet, ob die Bibliothek Entsprechendes bietet.

Fallunterscheidungen

Schreibe eine JSP, die testet, ob der Benutzer ein Eingabefeld gefüllt hat. Wenn ja, dann soll seine Ausgabe geschrieben werden, wenn nicht, soll ein Hinweis der Art "Bitte Eingabe tätigen" folgen.

Links

Schreibe zwei Klasen Customer und Customers. Ein Customer soll die Property name und adress besitzen. Die Customers Klasse soll eine Methode getCustomerList() unterstützen und zum Testen mit eigenen Customer-Objekten gefüllt sein. Iteriere mit dem passenden Core-Schleifen-Tag über alle Customers und erstelle dabei eine dreispaltige Tabelle. Als Ergänzung lasse die geraden und ungeraden Zeilen in unterschiedlichen Farben erscheinen.

Wie beliebt ist die Seite?

Bei vielen Webseiten findet man bei den unterschiedlichen Produkten eine Angabe, ob das Produkt gut ist oder nicht. Schreibe eine Bean Voting, die speichert, wie gut die Besucher die Seite fanden. Binde die Visualisierung über Include ein. Wie erreicht man dann eine solche Visualisierung?

Sprachen-Header auswerten

Erfrage, welche Sprache der Browser bevorzugt. Wie heißt der Header? Ändere die Sprache. Im IE geht das so: Tools, Internet Options, Languages .... Dann bekommt man eine Liste von Sprachen, die man auch in ihrem Vorzug ändern kann. Wie sieht der Header aus, wenn man mehr als eine Sprache einstellt? Definiere eine Variable Locale locale. Setze abhängig von der Sprache diese Variable, etwa auf Locale.GERMANY oder Locale.GB. Besorge dann mit NumberFormat.getCurrencyInstance(Locale) ein java.text.NumberFormat-Objekt und stelle eine Gleitkommazahl dar. (Im Konstruktor von Locale kann man auch gleich einen String angeben, nämlich denjenigen aus dem Typ, also zum Beispiel "en" oder "de".)

Bilder dynamisch erzeugen

Implementiere ein Programm, welches eine Grafik mit einem gewünschten Text verbindet, etwa in eine Sprechblase Text setzt.

Eine komfortable Texteingabe

Besonders für Content-Management-Systeme möchte man dem Benutzer eine Art "Textverarbeitung im Browser" ermöglichen. Eine HTML-TEXTAREA ist in diesem Fall zu unflexibel. Wirf einen Blick auf die Webseiten:

Datenbankverbindungen

Eine einfache Verbindung

Baue eine Datenbankverbindung auf und erfrage Daten. Visualisiere sie in einer HTML-Tabelle.

Connection-Pool

Bei Datenbankverbindungen ist es grob fahrlässig, beim Eintreten immer eine neue Verbindung aufzubauen. Man nutzt vielmehr Connection-Pools. Gehe auf Webseiten mit einer Implementierung und lade den Connection-Pool. Kopiere die zuständigen Klassen/das Jar-Archiv in das zugehörige Verzeichnis und teste den Pool.

Sicherheit

Sicherheit

Implementiere eine BASIC-Authentication mit Hilfe der drei folgenden Dateien