![]() |
CGI.pm - Eine Perl 5 Bibliothek
|
Im Kapitel "Doing it the hard way :-)" haben sie gesehen wie auf die an ein Perl-Skript übergebenen Parameter zugegriffen werden kann. Die ganze Angelegenheit ist ziemlich mühsam und muß zudem in jedem ihrer Perlskripte beinhaltet sein. Wie bei anderen Programmiersprachen, bietet es sich an, solche ständig benötigten Funktionalitäten in Form von Bibliotheksmodulen zusammenzufassen. In einem derartigen Modul (Bibliothek, Library) werden nach Möglichkeit alle artverwandten Funktionen zusammengefaßt, und dem Anwender zur Verfügung gestellt. Bei CGI.pm handelt es sich um ein derartiges Bibliotheksmodul. Es stellt eine Fülle an Funktionen zur Verfügung die den Bereich CGI-Programmierung, dynamische Formularerzeugung bzw. ganz allgemein dynamische HTML-Seitenerzeugung abdecken. Es handelt sich um ein sehr mächtiges Modul mit einer Fülle an Funktionen. Dieses Dokument behandelt nur einen Bruchteil der Möglichkeiten und soll ihnen ein bißchen Appetit auf diese Modul machen. Den gesamten Modulumfang beschreibt die Dokumentation von Lincoln Stein.
Nachfolgend also eine nicht erschöpfende Zusammenfassung der Moduldokumentation.
Das Modul kann auf zwei verschieden Arten benutzt werden. Sie können die einzelnen Funktionen in den Namensraum ihres Skripts importieren und sie anschließend direkt aufrufen. Bei der anderen Variante erstellen sie ein CGI-Objekt. Dieses beinhaltet dann die gesamten Funktionen des Moduls als Methoden und stellt ihnen alle Daten des aktuellen CGI-Aufrufs zur Verfügung. Obwohl der objektorientierte Ansatz ein bißchen mehr Schreibaufwand bedeutet, sollten sie im wegen der höheren Flexibilität und dem geringeren Hauptspeicherbedarf den Vorzug geben.
Nachdem sie mit use CGI; das Modul in ihr Skript eingebunden
haben, erzeugen sie sich durch $anfrage = new CGI; ein
CGI-Objekt.
#!/usr/bin/perl use CGI; $anfrage = new CGI; |
Das Objekt $anfrage wird dabei vom Modulkonstruktor mit den
aktuell übergebenen Aufrufdaten des Skripts (z.B. den ganzen
Umgebungsvariablen) initialisiert. Es wird überprüft ob dem Skript Daten
übergeben wurden. Falls ja werden diese wie im vorigen Kapitel beschrieben
wieder aufgetrennt und die MIME-Kodierung rückgängig gemacht. Es enthält
außerdem alle Methoden die zur Bearbeitung der Daten benötigt werden sowie
Methoden um die Antwort zu erzeugen.
Das "Hello world"-Beispiel mit CGI.pm
#!/usr/bin/perl
use CGI;
$anfrage = new CGI;
print $anfrage->header(),
$anfrage->start_html("Hello world"),
$anfrage->h1("Hello world"),
$anfrage->a({-href=>"index.html#bsp1"},"Zurück"),
$anfrage->end_html();
|
Diese Skript erzeugt den folgenden HTML-Output der direkt an den Client-Browser ausgegeben wird.
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> <HTML><HEAD><TITLE>Hello world</TITLE> </HEAD><BODY><H1>Hello world</H1> <A HREF="index.html#bsp1">Zurück</A> </BODY></HTML> |
Anhand dieses Beispiels wird der Aufruf der CGI.pm-Methoden bereits
deutlich. Ausgehend vom CGI-Objekt $anfrage wird mit Hilfe des
-> Operators die Methode aufgerufen. Je nach Methode können, bzw.
müssen noch Parameter übergeben werden. Der Syntax stellt sich damit so
dar:
$cgiobjekt->methoden_name(Parameterliste);
Ein Grund für die Verwendung von CGI.pm war der angeblich leichte Zugriff
auf die übergebenen Paramter. Dabei wird neben anderen Methoden vor allem
param() verwendet. Je nach Aufrufart liefert diese Methode
verschiedene Ergebnisse:
@names = $anfrage->param;
liefert eine Liste aller übergebenen Schlüsselwörter in Form eines Arrays. Bekanntlich kann mit
$anzahl = $#names
festgestellt werden wieviele Elemente das Array beinhaltet. Damit ist es z.B. einfach möglich festzustellen ob und wieviele Parameter an das Skript übergeben wurden.
$name = $anfrage->param("nachname");
der Parameterwert direkt bestimmt werden. Die MIME-Kodierung des Werts wurde bereits bei der Objektinitialisierung rückgängig gemacht.
Wird auf einen leeren oder nicht existenten Parameter zugegriffen, so
ist der Rückgabewert undefiniert. Dies kann mit defined()
überprüft werden.
if( defined($anfrage->param("nachname")) ){
$name = $anfrage->param("nachname");
}
Handelt es sich um die Daten eines Auswahlfelds mit Mehrfachselektion, so wird ein Array zurückgegeben.
@werte = $anfrage->param("multiauswahl");
CGI.pm erkennt selbständig die verwendete Übermittlungsmethode
(POST/GET), so dass auch dies vom Programmierer nicht mehr
berücksichtigt werden muß.
Ein CGI-Skript muß, wie bereits bei der CGI-Einführung beschrieben,
zumindest den Content-type des HTTP-Headers erzeugen und
übertragen. Der http-Server erzeugt dies bei CGI-Skripten nicht. Schließlich
kann ein Perl-Skript auch ein GIF-Grafik erstellen und als Output an den
Client-Browser liefern. Die einfachste Form ist hier
print $anfrage->header();
Dabei wird die Defaulteinstellung text/html als MIME-Typ
verwendet. Andere MIME-Typen müssen explizit als Parameter angegeben
werden.
print $anfrage->header('image/gif');
wäre also ein gültiger HTTP-Header falls unser Skript eine GIF-Grafik erzeugt (z.B. Zählergrafik, Meßwertplot, etc.).
Außer dem Content-type können noch eine Menge weiterer Zeilen
des HTTP-Headers gesetzt werden. So ist es z.B. möglich das Gültigkeitsdatum
des Dokuments zu setzen um auf das Caching von Proxy-Servern oder Clientcaches
Einfluß nehmen zu können. Dabei werden der header()-Methode
weitere Parameter übergeben. In diesem Fall müssen jedoch auch die
Parameternamen nach folgendem Syntax übergeben werden:
print $anfrage->header(-paramname1=>'paramwert1',
-paramname2=>'paramwert2',
-...);
Beispiel:
print $anfrage->header(-type=>'image/gif',
-status=>'200 OK',
-expires=>'+3d',
-cookie=>$my_cookie);
Damit wird eine GIF-Grafik beim Client angekündigt deren Gültigkeit in
3 Tagen abläuft. Außerdem wird versucht ein Cookie (der Wert muß vorher mit
cookie() erzeugt werden) auf die Platte des Benutzers zu
schreiben.
Das Grundgerüst der HTML-Datei läßt sich ebenfalls mit fertigen Methoden
erzeugen. Dazu dienen die Methoden start_html() und
end_html(). Sie erzeugen die vollständige Struktur einer
HTML-Datei die nur noch um den <BODY>-Teil ergänzt werden
muß.
Beispiel:
print $anfrage->start_html(-title=>'Sein oder nicht sein ...',
-author=>'grupp@elektronikschule.de',
-style=>{'src'=>'/styles/style1.css'},
-BGCOLOR=>'blue');
print "Und hier kommt noch ein BODY-Text
print $anfrage->end_html();
|
Für die Methode start_html() gibt es noch einige andere
Parameter (-title, -author, -base,
-xbase, -target, -meta,
-dtd, -style, -head,
-script, -noscript, -onLoad,
-onUnload) und die Möglichkeit beliebige Parameter im
BODY-Tag zu platzieren.
Auch die HTML-Tags im BODY-Bereich werden von CGI.pm
unterstützt. Beispiele:
print $anfrage->h1("Ich bin eine
&Uuuml;berschrift");print $anfrage->a({-href=>"http://www.nowhere.com"},
"Nowhere");Eine weiter Stärke von CGI.pm liegt in der einfachen Erzeugung von Formularen. Es gibt hier eine Fülle an verschiedenen Methoden. Formulare deren Auswahllisten aus einer Datenbank stammen, können damit auf eine sehr flexible Weise gestaltet werden. Nachfolgend nur ein kurzes Codebeispiel (für weitere Informationen lesen sie am besten gleich in der Originaldoku nach).
$method="POST";
$action="verarbeitung.pl";
$encoding="application/x-www-form-urlencoded";
print $anfrage->startform($method,$action,$encoding);
print $anfrage->textfield(-name=>'nachname',
-default=>'Bitte Nachname eingeben',
-size=>30,
-maxlength=>50);
print $anfrage->password_field(-name=>'passwort',
-value=>'',
-size=>10);
print $anfrage->submit(-name=>'abschicken',
-value=>'Ich haben fertig ...');
print $anfrage->reset;
print $anfrage->endform;
|
Lokal bzw. Remote-Zugriffe
seit dem 14. Juni 1999