CGI.pm
| Andreas Grupp, Elektronikschule Tettnang |
Eine Perl 5 Bibliothek zur einfacheren
Erstellung von CGI-Skripten unter Perl
Der Zweck von CGI.pm
Bereits in den Online-News Nr. 10 wurde im Artikel "Das Common Gateway Interface (CGI)" die Erstellung von CGI-Skripten mit Perl grundsätzlich beschrieben. Es wurde prinzipiell erläutert, wie auf die an ein Perl-Skript übergebenen Formulat-Parameter zugegriffen werden kann. Die ganze Angelegenheit war ziemlich mühsam und muß zudem in jedem Ihrer Perlskripte beinhaltet sein.
Wie bei anderen Programmiersprachen auch, 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 Originaldokumentation von Lincoln Stein.
Nachfolgend also eine nicht erschöpfende Zusammenfassung der Moduldokumentation.
Einbindung von CGI.pm in ihre Skripte
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 ihm 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, erzeugenSsie 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<TITLEHello world</TITLE
</HEAD<BODY<H1Hello 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. Die Syntax stellt sich damit so dar:
$cgiobjekt-methoden_name(Parameterliste );
Zugriff auf die Übergabedaten
Ein Grund für die Verwendung von CGI.pm war der angeblich leichte Zugriff auf die übergebenen Parameter. Dabei wird neben anderen Methoden vor allem param() verwendet. Je nach Aufrufart liefert diese Methode verschiedene Ergebnisse:
1. @names = $anfrage-param;
liefert eine Liste aller übergebenen Schlüsselwörter in Form eines Arrays. Bekanntlich kann mit2. Ist der Name eines Parameters bekannt, so 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");
3. Wird auf einen leeren oder nicht-existenten Parameter zugegriffen, so ist der Rückgabewert undefiniert.
der Parameterwert direkt bestimmt werden. Die MIME-Kodierung des Werts wurde bereits bei der Objektinitialisierung rückgängig gemacht.
Dies kann mit defined() überprüft werden.
if (defined($anfrage-param("nachname")) ){Handelt es sich um die Daten eines Auswahlfelds mit Mehrfachselektion, so wird ein Array zurückgegeben.$name = $anfrage-param("nachname");
}
@werte = $anfrage-param("multiauswahl");Der HTTP-HeaderCGI.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 eine GIF-Grafik erstellen und als Output an den Client-Browser liefern. Die einfachste Form zur Erstellung des Content-Type ist:
print $anfrage-header();
Dabei wird die Defaulteinstellung text/html als MIME-Typ verwendet. Andere MIME-Typen müssen explizit als Parameter angegeben werden. Die Anweisung
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 folgender 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.
Die HTML-Datei selbst
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@est.fn.bw.schule.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");
* ...
Formulare
Eine weiter Stärke von CGI.pm liegt in der einfachen Erzeugung von Formularen. Es gibt hier eine Fülle an verschiedenen Methoden, um die diversen in HTML zur Verfügung stehenden Eingabeelemente zu erzeugen. Insbesondere Formulare, deren Auswahllisten aus einer Datenbank stammen, können so auf eine sehr flexible Weise gestaltet werden.
Nachfolgend nur ein kurzes Codebeispiel (für weitere Informationen lesen Sie am besten gleich in der Originaldokumentation 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;
