Galileo Computing < openbook >
Galileo Computing - Programming the Net
Galileo Computing - Programming the Net


Java ist auch eine Insel (2. Aufl.) von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 1.4
Java ist auch eine Insel (2. Auflage)
gp Kapitel 17 Servlets und Java Server Pages
  gp 17.1 Dynamische Webseiten und Servlets
  gp 17.2 Vom Client zum Server und wieder zurück
    gp 17.2.1 Der bittende Client
    gp 17.2.2 Was erzeugt ein Webserver für eine Antwort?
    gp 17.2.3 Wer oder was ist MIME?
  gp 17.3 Servlets und Java Server Pages entwickeln und testen
    gp 17.3.1 Servlet-Container
    gp 17.3.2 Webserver mit Servlet-Funktionalität
    gp 17.3.3 Tomcat
  gp 17.4 Java Server Pages
    gp 17.4.1 JSP mit Tomcat nutzen
  gp 17.5 Skript-Elemente
    gp 17.5.1 Scriptlets
    gp 17.5.2 Ausdrücke
    gp 17.5.3 Deklarationen
    gp 17.5.4 Kommentare und Quoting
  gp 17.6 Webapplikationen
  gp 17.7 Implizite Objekte
  gp 17.8 Entsprechende XML-Tags
  gp 17.9 Was der Browser mit auf den Weg gibt – HttpServletRequest
    gp 17.9.1 Verarbeiten der Header
    gp 17.9.2 Hilfsfunktion im Umgang mit Headern
    gp 17.9.3 Übersicht der Browser-Header
  gp 17.10 Formulardaten
  gp 17.11 Das HttpServletResponse-Objekt
    gp 17.11.1 Automatisches Neuladen
    gp 17.11.2 Seiten umlenken
  gp 17.12 JSP-Direktiven
    gp 17.12.1 page-Direktiven im Überblick
    gp 17.12.2 include-Direktive
  gp 17.13 Aktionen
    gp 17.13.1 Aktion include
    gp 17.13.2 Aktion forward
    gp 17.13.3 Aktion plugin
  gp 17.14 Beans
    gp 17.14.1 Beans in JSP-Seiten anlegen, Attribute setzen und erfragen
    gp 17.14.2 Der schnelle Zugriff auf Parameter
  gp 17.15 Kleine Kekse: die Klasse Cookies
    gp 17.15.1 Cookies erzeugen und setzen
    gp 17.15.2 Cookies vom Servlet einlesen
    gp 17.15.3 Kleine Helfer für Cookies
    gp 17.15.4 Cookie-Status ändern
    gp 17.15.5 Langlebige Cookies
    gp 17.15.6 Ein Warenkorbsystem
  gp 17.16 Sitzungsverfolgung (Session Tracking)
    gp 17.16.1 Das mit einer Sitzung verbundene Objekt HttpSession
    gp 17.16.2 Werte mit einer Sitzung assoziieren und auslesen
    gp 17.16.3 URL-Rewriting
    gp 17.16.4 Zusätzliche Informationen
  gp 17.17 Tag-Libraries
    gp 17.17.1 Standard Tag Library (JSTL) der Apache-Gruppe
    gp 17.17.2 Beispiel mit einer Taglib-Direktive
  gp 17.18 Das erste Servlet kompilieren und ausführen
    gp 17.18.1 Servlets kompilieren
    gp 17.18.2 Wohin mit dem Servlet?
  gp 17.19 Der Lebenszyklus eines Servlets
    gp 17.19.1 Initialisierung in init()
    gp 17.19.2 Abfragen bei service()
    gp 17.19.3 Mehrere Anfragen beim Servlet und die Thread-Sicherheit
    gp 17.19.4 Das Ende eines Servlets
  gp 17.20 Das HttpServletResponse-Objekt
    gp 17.20.1 Wir generieren eine Webseite
    gp 17.20.2 Binärdaten senden
    gp 17.20.3 Komprimierte Daten mit Content-Encoding
    gp 17.20.4 Noch mehr über Header, die der Server setzt
  gp 17.21 Servlets und Sessions
  gp 17.22 Weiterleiten und Einbinden von Servlet-Inhalten
  gp 17.23 Inter-Servlet-Kommunikation
    gp 17.23.1 Daten zwischen Servlets teilen
  gp 17.24 Internationalisierung
    gp 17.24.1 Die Länderkennung des Anfragers auslesen
    gp 17.24.2 Länderkennung für die Ausgabe setzen
    gp 17.24.3 Westeuropäische Texte senden
  gp 17.25 Sonstiges zu den Servern
    gp 17.25.1 Den internen Compiler bei Tomcat für JSP ändern
  gp 17.26 Tomcat: Spezielles
    gp 17.26.1 Tomcat als Service unter Windows NT ausführen
    gp 17.26.2 MIME-Types mit Tomcat verbinden
    gp 17.26.3 Servlets beim Start laden
  gp 17.27 Ein Servlet generiert WAP-Seiten für das Handy
    gp 17.27.1 Ein WAP-Handy simulieren
    gp 17.27.2 Übersicht der wichtigsten Tags
    gp 17.27.3 Der Gateway
    gp 17.27.4 WML-Seiten aufbauen
    gp 17.27.5 Interessante Links zum Thema Servlets/JSP
  gp 17.28 Text in HTML-konformen Text umwandeln


Galileo Computing

17.27 Ein Servlet generiert WAP-Seiten für das Handy  downtop

Zum Schluss wollen wir noch ein kleines Beispiel für WAP-Handys ansehen. WAP (Wireless Application Protocol) ist ein Protokoll (aktuell ist Version 1.2), das drahtlosen Empfangsgeräten das Empfangen von Internet-Inhalten wie Text und Bilder ermöglicht.

Ein Handy kommuniziert mit dem WAP-Server über WAP wie ein Webbrowser mit einem Server HTTP spricht. Da ein Handy ein Mini-Browser ist (auch Micro-Browser genannt), versteht es ebenso wie ein Webbrowser eine Seitenbeschreibungssprache, die mit HTML verwandt ist. Sie heißt WML (die Version 1.3 ist in Vorbereitung), die Abkürzung steht für Wireless Markup Language. Die über Handy angebotenen Inhalte sollten sich jedoch kurz halten; die meisten Handys besitzen nur vier Zeilen mit Schwarzweiß-Grafiken. Der Klassiker auf dem WAP-Markt, das Nokia 7110, bringt es auf 96 x 65 Pixel. Daher sind WML-Seiten nicht vergleichbar mit chic aufgemachten Webseiten. Die Benutzer würden sich bei einem hohen Seitenpreis besonders über aufwändige Seiten besonders freuen. Zumal die Geschwindigkeit gerade mal einem alten 9600 Baud-Modem gleicht. In den nächsten Jahren sollen aber – laut Prognosen – Displays mit mehreren Textzeilen und 256 Farben vorhanden sein. Neben der Übertragungstechnik GSM, auf deren Basis heute die Informationen übertragen werden, gibt es viel versprechende Änderungen. Darunter Symbian, Bluetooth, SIM-Toolkits und UMTS (Universal Mobile Telecommunications System). UMTS mit einer Übertragungsrate von bis zu 2 MB/s (mindestens 384 KB/s) hat dabei die besten Chancen, das GSM abzulösen, da das Protokoll zu GSM abwärts kompatibel ist. Es soll in Europa etwa 2002 flächendeckend eingeführt werden. Dann können wir uns auch die Pizza zuerst von oben ansehen, bevor wir sie kaufen. Dafür geben wir doch gerne ein paar Euro mehr aus ...

In unserer Kurzeinführung interessieren wir uns aber weniger für die harten WAP-Fakten und die wirtschaftliche und soziale Bedeutung (wo ist die nächste Pommes-Bude in Paderborn, die keine pappigen Pommes macht?), als vielmehr für den Anteil, der nötig ist, damit ein Servlet eine WML-Datei erstellen kann. Sehr gute Einführungen finden sich wie immer im Internet, eine wichtige Seite dabei ist das WAP-Forum http://www.wapforum.org/.


Galileo Computing

17.27.1 Ein WAP-Handy simulieren  downtop

Da ich meinen Lesern nicht zumuten kann, nur zum Testen der WML-Seiten ein WAP-fähiges Handy zu kaufen, verlassen wir uns auf eine Softwareemulation. Die unterschiedlichen Handy-Hersteller bieten Toolkits zur Softwareentwicklung an. Ein ausgereiftes Toolkit mit dem Namen Mobile Internet Toolkit (früher Wap Toolkit) kommt von Nokia. Die Firma stellt wie viele andere Handy-Hersteller einen WML-Browser, einen Skript-Interpreter sowie Laufzeitbibliotheken zur Verfügung. Zur Entwicklung der Seiten steht ein einfacher WML- und WMLScript-Editor zur Verfügung. Wir können das Toolkit unter http://www.nokia.com/corporate/wap/sdk.html beziehen und ohne Umwege installieren. Das Toolkit selbst ist in Java programmiert, doch leider 15 MB groß. Es hat jedoch keine Zeitbeschränkung. Mit kleinen Umwegen lässt sich das Java-Programm auch unter Linux installieren. Dazu ist ein Blick auf die Seite http:// www.linux-magazin.de/ausgabe/2000/05/WAPux/wapux.html wertvoll.

Eine WML-Seite schreiben und betrachten

Nach der Installation können wir beim Nokia Toolkit Beispiele laden und auf dem Handy das Resultat sehen. Beispielprogramme werden unter »File/Open« geladen und durch Aktivieren der Schaltfläche »Show« angezeigt. Entscheiden wir uns für eine eigene kleine WML-Datei, so kann diese etwa so aussehen:

Listing 17.25   Saft.wml

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
  "http:///www.wapforum.org/DTD/wml_1.1.xml">

<wml>
  <card id="card">
 <p>
 Moege der Saft mit dir sein.
 </p>
  </card>
</wml>

Haben wir die Datei unter einem Namen wie c:\saft.wml gespeichert, dann müssen wir eine URL zusammensetzen, die wie folgt aussieht:

file:/c:/saft.wml

Dann lädt der Browser die Datei und stellt sie mit seinen Mitteln dar.

Zwei Handys bei Nokia

Das Toolkit von Nokia stellt ein zweites Handy bereit, welches wir nun einstellen wollen. Wir wählen dazu unter dem Menüpunkt »Toolkit/Select Device« den Eintrag »Blueprint Phone« und damit ein space-iges WAP 1.2-Handy. Dies ist notwendig, da eine spezielle Einstellung, die wir etwas später benötigen werden, mit dem anderen Handy nicht möglich ist.


Galileo Computing

17.27.2 Übersicht der wichtigsten Tags  downtop

Der strikte Tag-Gebrauch ist eines der herausragendsten Eigenschaften von WML. Alle Tags müssen zum Beispiel kleingeschrieben sein. Uns erinnert dabei vieles an HTML, etwa die Kommentare, die in <!-- eingeschlossen --> sind. Genauso die Tag-Kombination <b>mit dem Anschließenden</b>, welche Text fett anzeigt. Diese Darstellung unterstützen jedoch nicht alle Handys. Das Gleiche gilt für <i>italic</i>, <em>weitere Auszeichnung eines Textabschnittes</em>, <big>besonders großem Text</big>, <small>besonders klein darzustellenden Text</small>, <strong>fettes Schriftbild</strong> und <u>unterstrichen</u>. Konzentrieren wir uns auf die Tags, die besonders bei WML hervorzuheben sind:

gp  <?xml version="1.0"?>
Diese erste Zeile sagt aus, dass es sich bei allen WML-Dateien um XML-Code handelt. Damit kann jeder Code auch mit einem XML-Programm interpretiert und bearbeitet werden.
gp  <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN« >http://www.wapforum.org/DTD/wml_1.1.xml">
Diese zwingende Zeile muss am Anfang einer WML-Datei stehen. Sie definiert den Ort, an dem die Tags in WML definiert sind. Eine DTD definiert, wie die Tags heißen, und welche Attribute erlaubt sind. Unser Handy benutzt dazu die DTD für WML-Dateien in der Version 1.1. Vor dem <!DOCTYPE ...> sollte kein einziges Whitespace stehen.
gp  <wml>
Dieses Tag steht zu Beginn eines Quellcodes und ist bei Webseiten mit <html> vergleichbar. Es wird durch </wml> abgeschlossen.
gp  <card id="Cardname">
Jede WML-Datei besteht aus einem Deck, das in Cards unterteilt ist. Nur ein Deck kann in einer WML-Datei definiert werden. Das Card-Tag definiert eine im Deck eingesetzte Karte mit einem eindeutigen Namen. Dieser sollte nicht mehr als acht Zeichen umfassen. Das Tag </ card> beendet den Inhalt einer Card. Nach der Deklaration folgt eine weitere Card oder das Deck ist zu Ende – dann folgt </wml>.
gp  <title="Überschrift">
Bestimmt den Titel beziehungsweise die Überschrift. Kann auch zusammen in den Card-Tag geschrieben werden.   <card id="Cardname" title="Überschrift">.
gp  <p>
Definiert einen Absatz. Am Ende muss ein </p> den Absatz beenden. Eine Erweiterung ist <p align="Ausrichtung">, der den Text nach left, right oder center ausrichtet.
gp  <br/>
Bringt einen Zeilenvorschub ein. Der Slash am Ende fällt besonders auf. Dies bedeutet, dass es kein <br>-Tag gibt, und dass das Tag <br/> somit beginnender und endender Tag zugleich ist.
gp  <img src="Bildname.wbmp« alt="Bildname"/>
Bindet eine Grafik im WBMP-Format ein. Dies ist das einzige Bildformat, welches zurzeit definiert ist. Der Parameter alt muss mit einem Wert belegt werden (auch wenn es nur ein Leerzeichen ist).
gp  <a href="URL ">Link</a>
Zeigt auf eine externe Webseite.
gp  <a href="#Cardname">Link</a>
Eine Besonderheit des Links. Das Hash symbolisiert den Verweis innerhalb des WML-Decks auf eine andere Card, die alle durch eine ID gekennzeichnet sind.

Galileo Computing

17.27.3 Der Gateway  downtop

Das Handy ruft nicht direkt die Informationen von einem Webserver ab, sondern wendet sich an ein Gateway (auch WAP-Server genannt) eines Mobilfunkanbieters, zum Beispiel D1, D2, E-Plus oder Viag Intercom. Dieser sitzt als Vermittler zwischen dem Handy und dem Internet. Da das Handy keinen HTML- beziehungsweise WML-Quellcode im ASCII-Format anzeigen kann, übersetzt das Gateway die Internetseiten in ein spezielles Binärformat. Dieses ist viel kompakter als das ASCII-Format und spart somit Bandbreite. Damit das Gateway weiß, welche Datei es vom Server holen muss, schickt das Handy die Information mit auf den Weg. Dann kontaktiert das Gateway den Webserver, holt die Daten und komprimiert sie, falls nötig – das ASCII-Format für die normalen Seiten würde zu viel Bandbreite einnehmen. Die Übersetzung kann ausfallen, wenn auf dem Server schon die komprimierte Datei liegt. Dies sollte sie aus Geschwindigkeitsgründen auch, da dann das Gateway die Daten schneller an das Handy liefern kann.

Entwicklung von Seiten ohne Gateway

Das Nokia Toolkit übersetzt beim Testen die WML-Datei selbstständig in Binärcode. Daher ist dies zur Entwicklung der Seiten sehr praktisch, da wir nicht extra ein Gateway benötigen. Es gibt neben dem Nokia Toolkit noch andere Anbieter wie Motorola, Phone.com, Ericson, die neben der Visualisierung einen Compiler eingebunden haben. Diese Toolkits sind zwar nicht unbedingt kleiner, aber manchmal schneller. Dass die Nokia-Simulation in Java implementiert ist, wird schon am Speicherverbrauch und an der Geschwindigkeit deutlich. Die reinen Anzeigeprogramme gibt es im Internet etwas häufiger, doch diese implementieren keinen Compiler. Daher sind diese Anzeigeprogramme als Download wesentlich kleiner, benötigen aber immer ein Gateway, der dann die Seiten übersetzt, oder einen externen Compiler. Mit dieser Lösung ist die Entwicklung jedoch umständlicher.

Der Gateway WAPLite

Wenn wir eigene WML-Dateien für das Handy schreiben wollen, benötigen wir ein Gateway und dessen Funktion als Übersetzer. Das Toolkit allein reicht nicht aus. Dabei werden wir natürlich nicht auf einen Mobilfunkanbieter zurückgreifen, sondern uns einen Server lokal installieren. WAPLite der Firma Infinite Technologies ist ein einfaches, schnelles WAP-Gateway unter Windows, das kompatibel zur WML 1.1-Spezifikation arbeitet. Von der Webseite http://www.infinite.com/ sollten wir WAPLite beziehen und das Programm installieren. Es läuft nach dem Starten als Windows-Service, die Demo jedoch nur dreißig Tage. Nach der Installation müssen wir nur im Reiter Stats die Schaltfläche Install Service aktivieren, und das ist alles.

Beispiel   Jetzt können wir im elektronischen Telefon zum Beispiel die folgende URL eingeben:
gp  >http://wap.n-tv.de
gp  >http://wap.wubsch.de/index.wml
gp  >http://www.smartid.de/wap.wml

Das Handy wendet sich nun an WAPLite, der wiederum an den Webserver und dann fließen die Daten zurück an das Handy. Wenn später unser Webserver lokal läuft, können wir auch URLs der Form

http://localhost/trallala.wml

eingeben.

Der Gateway WAPLite stellt dabei auch die eigene Adresse local zur Verfügung. In diesem Fall liefert direkt das Gateway die Informationen, und der Weg über das Internet oder einen Webserver wird nicht gemacht. Im Handy können wir zum Beispiel http://local/waplite.wml eingeben, dann kommen wir auf eine lokale Standardseite, die jedoch sofort an ein Internet-Angebot weiterleitet. Das Basisverzeichnis und Wurzelverzeichnis für die WAP-Dateien steht nach der Installation auf E:\WAPLITE\WML. Unter dem Reiter »Advertising« lässt sich der Pfad nachträglich anpassen. Da wir aber mit einem Webserver arbeiten, benötigen wir im Folgenden local nicht weiter.

Ein freies WAP-Gateway für Linux ist zum Beispiel http://www.kannel.org/, der mit Quelltext vorliegt.


Galileo Computing

17.27.4 WML-Seiten aufbauen  downtop

Wenn wir ein Servlet programmieren, das eine WML-Seite generiert, dann müssen wir zunächst einen speziellen MIME-Typ senden:

response.setContentType( "text/vnd.wap.wml" );

Anschließend können wir normale WML-Tags mit Inhalt schicken. Das zwischengeschaltete Gateway übernimmt die Übersetzung in den Binärcode. Um das Ganze zu konkretisieren, betrachten wir folgendes Servlet.

Listing 17.26   WAPAngebot.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class WAPAngebot extends HttpServlet
{
  public void doGet( HttpServletRequest request,
                     HttpServletResponse response)
    throws IOException, ServletException
  {
    response.setContentType( "text/vnd.wap.wml" );

    PrintWriter out = response.getWriter();

    out.println( "<?xml version=\"1.0\"?>" +
      "<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\""+
      "\"http:///www.wapforum.org/DTD/wml_1.1.xml\">" +
      "<wml><card id=\"card\" title=\"Examples\"><p>"+
      new Date()+"<br/></p></card></wml>" );
  }
}

Haben wir das Servlet kompiliert, so kann abschließend im Handy die URL zum Servlet eingegeben werden. Sie lautet :

http://localhost:8080/examples/servlet/WAPAngebot

Die Anfrage läuft nun über das Gateway zu Tomcat. Dieser schickt die ASCII-Datei zu WAPLite zurück, der es kompiliert. Binär kodiert kommt es zum Handy, das es anzeigt.


Galileo Computing

17.27.5 Interessante Links zum Thema Servlets/JSP  toptop

gp  >http://www.jspin.com/
Links und ein »What's-New«.
gp  >http://www.servlets.com/
Mehr oder weniger eine Werbeseite von J. Hunter, dem Autor des bekannten Servlet- Buchs im O'Reilly Verlag.
gp  >http://www.coolservlets.com/
Hier werden freie Servlets vorgestellt.
gp  >http://theserverside.com/
Die Seite versteht sich als Portal für Enterprise JavaBeans. Es bietet Diskussionsforen für EJB und für Servlets beziehungsweise JSPs.
gp  >http://www.servletforum.com/
Ein Diskussionsforum rund um Servlets und JSP. Die Seite basiert auf Jive, einem Open-Source-Programm für Foren.





1   WAP 1.0 war SMS-basiert und ist nicht weit verbreitet. In Deutschland überhaupt nicht. WAP 1.1 ist der aktuelle Standard, auf dem die Dienste basieren. WAP 1.2 bietet unter anderem verschlüsselte Übertragung an, ist aber noch in der Vorbereitung.

2   Gruß an Dirk Holtwick.

3   Die Fehlermeldung »Too many concurrent JRun requests. JRun is busy. Please try again, or contact the system administrator for this web site.« ist schon peinlich …





Copyright © Galileo Press GmbH 2003
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de