Schreibe eine JSP-Seite, die die Welt grüßt.
Lasse den Durchschnitt von 10 und 23 berechnen und gebe ihn aus.
Eine Webseite sollte so wenig Formatierungsauszeichnungen wie nötig nutzen. Einen Weg sind XML-Dateien, die mit Hilfe eines XSLT visualisiert werden. Eine andere, viel einfachere Möglichkeit, sind Cascading Style Sheets. Damit die Erstellung etwas vereinfacht wird, kann man ein Tool verwenden.
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).
Rufe die mathematische Funktion Math.random()
auf. Gibt bei einem
Wert kleiner 0.5 die Ausgabe "Lustiges Wiesel" aus und sonst "Schlaue Lotte".
Prüfe die Übergabe bei den Suchmaschinen Google und Yahoo.
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).
Teste mit FrontPage die angebotenen HTML-Formulare und lies in SelfHTML-Einführung die Tags nach.
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.
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.
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"/>.
Person
in einem passenden Paket (nicht
das Default-Package). Die Klasse soll Properties für Vor- und Nachname beinhalten.
Die Properties heißen surname
und forname
. Mit einer
toString()
-Funktion soll die Bean alle Werte als kompakten String
zurückgeben. PersonForm
mit den gleichen Eigenschaften
wie die Person
, nur das alle Typen Strings sind. (Eclipse-Tipp:
Selektiere die Person-Klasse und drücke Strg+C, dann Strg+V. Die Kopie nennen
wie PersonForm. Aus dieser neuen Klasse löschen wir alle setXXX()/getXXX()-Methoden.
Wir ändern die Variablentypen dann alle auf String und generieren die Setter/Getter
neu.) Die JSP-Seite soll dann bei use-Bean nicht mehr Person, sondern PersonForm
nutzen. isValidXXX()
-Methode,
etwa isValidSurname()
. In der Bean gibt es dann für den Vornamen
folgende Funktionen:
public void setForname( String s ) { ... } public String getForname() { ... } public boolean isValidForname() { return ... }Teste die Methode über einen EL-Ausdruck.
Person getModelBean
, die ein
Person
-Objekt erzeugt, in dem die Eigenschaften der PersonForm
auf die neue Person
übertragen werden. 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.
<td bgcolor="rgb(12,34,222)>Farbe</td>
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.
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 auffagen? 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.
Was macht die folgende Implementierung?
String p = request.getServletPath(); String s = application.getRealPath(p.substring(0, p.lastIndexOf("/")) + "/");
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?
Betrachte ein von dem JSP-Compiler generiertes Servlet und identiziziere die impliziten Objekte.
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.
Ö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 Funktion unter helfen? (Den Quellcode gibt es beim Verfolgen des Links unter (view)).
Welche Bedeutung haben die Header pragma und expires?
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?
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?
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.
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.
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?
Schreibe eine JSP, die eine XML-Datei mit Quadratzahlen der Form
<zahl>i</zahl><quardrat />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.
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
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.
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.
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.
Schreibe zwei Klasen Customer
und Customers
. Ein
Customer
soll die Property name und adress besitzen. Die Customers
Klasse soll eine Funktion getCustomerList()
unterstützen und zum Testen
mit eingen Cursomer
-Objekten gefüllt sein. Iteriere mit dem passenen
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.
Bei sofotex 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?
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".)
Implementiere ein Programm, welches eine Grafik mit einem gewünschten Text verbindet, etwa in eine Sprechblase Text setzt.
Besonders für Content-Management-Systeme möchte man dem Benutzer eine Art "Textverarbeitung im Browser" ermöglichen. Eine TEXTAREA ist in diesem Fall zu unflexibel. Wirf einen Blick auf die Webseiten:
Baue eine Datenbankverbindung auf und erfrage Daten. Visualisiere sie in einer HTML-Tabelle.
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.
Implementiere eine BASIC-Authentication mit Hilfe der drei folgenden Dateien