hi,
Ich freu mich aufs Lesen.
Ein Script habe ich schon fertig, kannst Du es mal testen und versuchen nachzuvollziehen, was ich mir dabei gedacht habe?
package main; steht hier für eine einfache Responseklasse und nur für diese eine Anwendung. Diese Klasse könnte genausogut als Basisklasse für alle möglichen Extensions dienen, guck mal, ob Du die Basismethoden erkennst ;)
Ansonsten ist das doch alles selbsterklärend.
Text::Template als einfache Template-Engine müsstest Du mal fix installieren.
#!/usr/bin/perl
use strict;
use warnings;
use Text::Template;
use HTTP::Headers;
require CGI;
use CGI::Carp qw(fatalsToBrowser);
package main;
# main control, das Response-Objekt als Instanz der Klasse main
my $mc = main->new() or die $@; # CGI::Carp würde hier einspringen
# Diese Klasse kennt nur einen Content-Type
$mc->set_header("Content-Type" => "text/html; charset=UTF-8");
# TRY-Block
eval{
# die Methoden init(), browse(), control() dürfen Exceptions werfen
$mc->init();
if($mc->param()) { $mc->control() }
else{ $mc->browse() }
};
# CATCH Exceptions, in Perl ist der dazugehörige Text in $@ zu finden
if(my $EVE = $@){
print $mc->header(), qq(<pre>Fehler: $EVE</pre>);
}
else{
print $mc->header(), $mc->bodybuild();
}
########################### Methods #######################################
# Erstelle eine Instanz der package (class) main
# Konstruktor
sub new{
my $class = shift;
my $self = bless{}, $class;
return eval{
$self->{HTTP_HEADERS} = HTTP::Headers->new();
$self->{TEXT_TEMPLATE} = Text::Template->new(TYPE => 'FILEHANDLE', SOURCE => *DATA ) or die $@;
$self->{CGI} = new CGI;
$self->{STASH} = {}; # Data-Hash für das Template
$self;
};
}
# Template-Prozess und Rückgabe des BODY
sub bodybuild{
my $self = shift;
return $self->{TEXT_TEMPLATE}->fill_in( HASH => $self->{STASH});
}
# Zusätzliche Funktion, steht über browse() und über control()
sub init{
my $self = shift;
$self->{STASH}{date} = localtime;
$self->{STASH}{url} = $ENV{SCRIPT_NAME};
}
# der Controller
sub control{
my $self = shift;
if($self->param('calc')){
# fülle das Formular wieder mit den eingegebenen Werten
$self->{STASH}{Zahl_a} = trim($self->param('Zahl_a'));
$self->{STASH}{Zahl_b} = trim($self->param('Zahl_b'));
# prüfe die Eingaben im STASH
if(! $self->{STASH}{Zahl_a}){
$self->{STASH}{mesg} = "Zahl a fehlt, bitte zwei Zahlen eingeben!";
return;
}
elsif(! $self->{STASH}{Zahl_b}){
$self->{STASH}{mesg} = "Zahl b fehlt, bitte zwei Zahlen eingeben!";
return;
}
elsif($self->{STASH}{Zahl_a} !~ /^\d+$/){
$self->{STASH}{mesg} = "Zahl a ist keine Ganze Zahl!";
return;
}
elsif($self->{STASH}{Zahl_b} !~ /^\d+$/){
$self->{STASH}{mesg} = "Zahl b ist keine Ganze Zahl!";
return;
}
else{ # Ergebnis kann ausgegeben werden
my $res = $self->{STASH}{Zahl_a} + $self->{STASH}{Zahl_b};
$self->{STASH}{mesg} = $res;
}
}
else{
# werfe eine Exception
die "Unbekannter Parameter!\n";
}
}
# Methode wird aufgerufen, wenn keine GET/POST Parameter im Request sind
sub browse{
my $self = shift;
$self->{STASH}{mesg} = "Bitte nur ganze Zahlen eingeben!";
}
# Leerzeichen am Anfang und am Ende entfernen
# Am Ende werden auch etwaige Zeilenumbrüche entfernt
sub trim{
my $s = shift;
$s =~ s/^\s+//;
$s = unpack "A*", $s;
return $s;
}
########################### Delegations ###################################
# HTTP::Headers
# die zu delegierenden Methoden bekommen hier andere Namen
sub set_header{
my $self = shift;
return $self->{HTTP_HEADERS}->header(@_);
}
# gibt alle gesetzten Header als String zurück
sub header{
my $self = shift;
return $self->{HTTP_HEADERS}->as_string(@_, "\n\n");
}
# CGI, delegiere die param()-Methode mit demselben Namen wie CGI::param()
sub param{
my $self = shift;
return $self->{CGI}->param(@_);
}
###########################################################################
# Das Template ist unterhalb des Tokens __DATA__ notiert
__DATA__
<h1>Ein einfaches Formular, Date: {$date}</h1>
<p>Hinweis/Ergebnis: {$mesg}</p>
<form action="{$url}">
<fieldset><legend><strong>Zahl a, Zahl b, Enter:</strong></legend>
<input name="Zahl_a" value="{$Zahl_a}" title="Zahl a">
<input name="Zahl_b" value="{$Zahl_b}" title="Zahl b">
<input type="submit" name="calc" value="Summe a+b berechnen">
</fieldset>
</form>
<p>
<a href="{$url}">Form ohne Parameter neu Laden</a>
</p>